(function($) {
	var HC = {
		Config : {
			sImgPath : "/-/img/"
			,sHTMLtag : "can-has-js"
			,searchConfig : {
				fOnSlideUp: function() {}
				,iDuration: 400
				,iTypeLag: 300
				,sId: "live-search"
				,sLoadClass: "loading"
				,sChooseClassDefault : "default"
				,sUrl: "/songs/live/"
				,sUrlOpen: "/songs/live-open/"
			}
		}

		/*
			STOP EDITING HERE
		*/
		,init : function() {
			var c = HC;
			var p = c.Project;
			var attrSource;

			$(document).ready(function() {
				p.liveSearch("#song-choice");
				p.tagIt();
				p.matrixIt();
				p.showGroupies();
				p.helpLinks();
				p.inputHover();
				p.loadLogin();
				p.filled();
				p.submitViewersChoice();
			});
		}

		/*
			CLIENT-SPECIFIC FUNCTIONS
		*/
		,Project : {
			filled : function() {
				var filled = $('.filled');

				if (filled.length > 0){
					for (var i = 0; i < filled.length; i++){
						$(filled[i]).addClass("empty");
						filled[i].initialValue = filled[i].value;

						filled[i].onclick = filled[i].onfocus = function() {
							$(this).removeClass("empty");
							$(this).addClass("filled");
							if(this.value == this.initialValue){
								this.value= "";
							}
						}

						filled[i].onblur = function() {
							if(this.value == this.initialValue || this.value == ""){
								$(this).addClass("empty");
								$(this).removeClass("filled");
								this.value = this.initialValue;
							}else{
								$(this).addClass("empty");
								$(this).removeClass("filled");
							}
						}
					}
				} else {
					return;
				}
			}
			,liveSearch : function(sSel) {
				var c = HC, $els = $(sSel), config = c.Config.searchConfig, sClass = config.sChooseClassDefault;

				$els.each(function() {
					var $input = $(this).attr('autocomplete', 'off'), $form = $input.parents(".song-chooser"), $note = $form.children(".note"), bOpenReg = $form.hasClass("cogaoke-open");

					if ($note.length) {
						// INITIATE THE DEFAULT STATE
						var sText = $note.text();
						$input.attr("default", sText);
						$input.attr("value", sText);
						$input.addClass(sClass);
						if ($form.attr("action")) {
							$form.attr("action", "/register/" + $note.attr("class").split("id-")[1]);
						}

						// WE NO LONGER NEED THIS LOUSY PARAGRAPH THING
						$note.remove();
					}

					// Insert the container if it doesn't exist.
					var $container = $("#" + config.sId);

					var hideIt = function() {
						$container.slideUp(config.iDuration, function () {
							config.fOnSlideUp();
						});
					};

					if ($container.length == 0) {
						$container = $('<div id="' + config.sId + '"></div>').appendTo($form).hide().slideUp(0);

						// Hide the container if anything else gets clicked on / gains focus
						$(document.body).click(function(event) {
							var $src = $(event.target);

							if (!($src.is('#' + config.sId) || $src.parents('#' + config.sId).length || $src.is('input'))) {
								hideIt();
							}
						});
					}

					// DANGER CAN HAPPEN
					$input
						.focus(function() {
							// Are we still in the default state?
							if ($input.hasClass(sClass)) {
								$input.attr("value", "");
								$input.removeClass(sClass);
							}
							this.select();
						})
						.blur(function() {
							if ($.trim($input.attr("value")).length == 0) {
								$input.attr("value", $input.attr("default"));
								$input.addClass(sClass);
							} else if (($input.attr("value").length == 0) && ($input.attr("default") == 0)) {
								$input.attr("default", sText);
								$input.attr("value", sText);
								$input.addClass(sClass);
							} else {
								$input.attr("default", $input.attr("value"));
							}
						})
						.keyup(function() {
							if ($input.attr("value") != $input.attr("default")) {
								var q = $.trim($input.attr("value"));

								// Stop previous ajax-request
								if (this.timer) {
									clearTimeout(this.timer);
								}

								// Establish timer
								this.timer = setTimeout(function () {
									var sFullURL = (bOpenReg) ? config.sUrlOpen : config.sUrl;
									sFullURL += escape(q);

									// Make the request
									$.get(sFullURL, function(oData) {
										// Show live-search if results and search-term aren't empty
										if (oData.length && q.length) {
											$container.html(oData);
											$container.find("span").html(q);
											$container.slideDown(config.iDuration);
											$container.find("ul.songs a").click(function() {
												$input.attr("value", $(this).text());
												if ($form.attr("action")) {
													$form.attr("action", $(this).attr("href"));
												}
												hideIt();
												return false;
											});
											if (!bOpenReg) {
												$container.find("p a").click(function() {
													$input.attr("value", "Request: " + $(this).children("span").text());
													hideIt();
													return false;
												});
											}
										} else {
											hideIt();
										}
									});
								}, config.iTypeLag);
								$input.attr("default", $input.attr("value"));
							}
						});
				});
			}
			,tagIt : function() {
				var c = HC;
				$("html").addClass(c.Config.sHTMLtag);
			}
			,matrixIt : function() {
				$('textarea[name="links"], textarea[name="groupies"]').each(function() {
					var $textarea = $(this);
					var name = $textarea.attr('name');
					var data = $textarea.val();
					if (data) {
						data = data.split(/[\r\n]+/);
						for (var i=0; len=data.length,i<len; i++) {
							data[i] = data[i].replace(/^\*\s+"?/, '');
							data[i] = data[i].split(/":/);
						}
					}

					var $links = $('<ul class="links half"></ul>');
					$textarea.after($links);

					for (var i=0; len=data.length,i<len+1; i++) {
						$li = $('<li></li>');
						$links.append($li);

						className = data[i]?'':'filled';
						link = data[i]?data[i][0]:(name=='links'?'link text':'First');
						url = data[i]?data[i][1]:(name=='links'?'link URL':'Last');

						$li.append('<input type="text" name="mh_link[]" value="'+link+'" class="'+className+'" />');
						$li.append('<input type="text" name="mh_url[]" value="'+url+'" class="'+className+'" />');
						$li.append('<a href="#" class="remove">Remove Row</a>');
						$li.append('<a href="#" class="add">Add Row</a>');
					}

					$('.remove').click(function() {
						var $li = $(this).parents('li:eq(0)');
						var $ul = $li.parents('ul:eq(0)');

						if ($ul.find('li').size() == 1) {
							return false;
						}

						$li.remove();
						return false;
					});
					$('.add').click(function() {
						var $li=$(this).parents('li:eq(0)');
						var $clone = $li.clone(true);
						$clone.find('input').val('');

						$li.after($clone);

						return false;
					});

					$textarea.parents('form:eq(0)').submit(function() {
						var serialized = [];

						var $links = $('input[name^="mh_link"]');
						var $urls = $('input[name^="mh_url"]');

						for (var i=0; len=$links.size(),i<len; i++)
						{
							if (!$links[i].value || $links[i].value == 'First' || $links[i].value == 'link text' || !$urls[i].value || $urls[i].value == 'Last' || $urls[i].value == 'link URL')
							{
								continue;
							}

							serialized.push('"'+$links[i].value.replace('"', "'")+'":'+$urls[i].value);
						}

						if (serialized.length)
						{
							serialized = '* '+serialized.join("\r\n* ");
						}

						$(this).append('<textarea style="position:absolute; left:-9999px;" name="'+name+'">'+serialized+'</textarea>');
					});

					$textarea.remove();
				});
			}
			,loadLogin : function() {
				if ($('a.login-link').size()) {

					var str = '<div class="login-wrap"></div>';

					$('li.nav-login').append(str);

					$("div.login-wrap").hide();

					$('a.login-link').click(function(){

						if ($('div.login-wrap form').size()) {

							$('div.login-wrap').show();

							$('a.login-link').addClass('on');

							$('a.close-login').click(function(){
								$('div.login-wrap').hide();
								$('a.login-link').removeClass('on');
								return false;
							});
						}

						else {

							$('div.login-wrap').load($(this).attr('href')+' #login-form',{},function(){

								var closeStr = '<a href="#" class="close-login">close</a>';

								$("form#login-form").append(closeStr);

								$("div.login-wrap").show();

								$('a.login-link').addClass('on');

								$('a.close-login').click(function(){
									$('div.login-wrap').hide();
									$('a.login-link').removeClass('on');
									return false;
								});

							});
						}

						return false;
					});
				}
			}
			,helpLinks : function() {
				$('strong.help').each(function() {
					var $a = $('<a href="#" class="more '+$(this).attr('class')+'">' + $(this).text() + '</a>');
					$a.click(function()
					{
						var $answer = $a.parents('.q-wrap').find('.answer-wrap');
						
						if ($answer.css('display') == 'none')
						{
							$answer.fadeIn();
						}
						else
						{
							$answer.fadeOut();
						}
						
						return false;
					});
					
					$(this).replaceWith($a);
				});
				
				$('div.answer').each(function() {
					var $close = $('<a href="#" class="close">Close</a>');
					$close.click(function()
					{
						$(this).parents('.answer-wrap').fadeOut();
						return false;
					});
					$(this).prepend($close);
					$(this).wrap('<div class="answer-wrap" />');
				});
			}
			,inputHover : function() {	
				$('input.hover-on').hover(function() {
					attrSource = $(this).attr('src').split('.gif');
					
					$(this).attr('src',attrSource[0]+'-hover.gif');
						}, function() {
					$(this).attr('src',attrSource[0]+'.gif');
				});			
			}
			,showGroupies : function() {
				$('select[name="performing"]').change(function() {
					if ($(this).val() == 'As a group') {
						$('.groupies').show();
					} else {
						$('.groupies').hide();
					}
				});

				if ($('select[name="performing"]').val() == 'Solo') {
					$('.groupies').hide();
				}
			}
			,submitViewersChoice : function() {
				function hijackForm($action)
				{
					$action.find('form').submit(function()
					{
						$('.last-spot').fadeOut('fast');
						$('#action').css('background', 'transparent url(/m/widgets/ajax-loader.gif) no-repeat 600px 210px');
						
						var $form = $(this);
						$.post($form.attr('action'), {
							 'XID' : $form.find('input[name="XID"]').val()
							,'ACT' : $form.find('input[name="ACT"]').val()
							,'RET' : $form.find('input[name="RET"]').val()
							,'site_id' : $form.find('input[name="site_id"]').val()
						}, updateAction);
						return false;
					});
				}
				
				function hijackLink($action)
				{
					$action.find('.sweet-vote-again').click(function()
					{
						$('.last-spot-confirm').fadeOut('fast');
						$('#action').css('background', 'transparent url(/m/widgets/ajax-loader.gif) no-repeat 600px 210px');
						
						$.get('/', updateAction);
						return false;
					});
				}
				
				function updateAction(data)
				{
					var $action = $(data).find('#action');
					hijackLink($action);
					hijackForm($action);
					$action.find('.last-spot, .last-spot-confirm').hide();
					
					$('#action').replaceWith($action);
					$action.find('.last-spot, .last-spot-confirm').fadeIn('fast');
				}
				
				hijackForm($('#action'));
			}
		}
	};

	HC.init();
})(jQuery);
