$(document).ready(function() {
	
	$('#q').inputLabel('Find channel...');
	
	$('#loader').ajaxStart(function(){
	   $(this).show();
	 });
	
	 $('#loader').ajaxStop(function(){
		$(this).fadeOut();
	 });
	
	// Initialize login dialog
	var login = $('<div></div>').addClass('dialog')
		.dialog({ 
			autoOpen: false,
			modal: true,
			draggable: false,
			resizable: false,
			height: 'auto',
			width: 325,
			title: "Log in &amp; let's get started!"
	});
	
	// Initialize signup dialog
	var signup = $('<div></div>').addClass('dialog')
		.dialog({ 
			autoOpen: false,
			modal: true,
			draggable: false,
			resizable: false,
			height: 'auto',
			width: 325,
			title: "Signup &amp; let's get started!"
	});
	
	// Initialize forgotPassword dialog
	var changePassword = $('<div></div>').addClass('dialog')
		.dialog({ 
			autoOpen: false,
			modal: true,
			draggable: false,
			resizable: false,
			height: 'auto',
			width: 325,
			title: "Change Password"
	});
	
	// Initialize forgotPassword dialog
	var forgotPassword = $('<div></div>').addClass('dialog')
		.dialog({ 
			autoOpen: false,
			modal: true,
			draggable: false,
			resizable: false,
			height: 'auto',
			width: 325,
			title: "Forgot Password?"
	});
	
	// Initialize addFeed dialog
	var addFeed = $('<div></div>').addClass('dialog')
		.dialog({ 
			autoOpen: false,
			modal: true,
			draggable: false,
			resizable: false,
			height: 'auto',
			width: 325,
			title: "Add Feed"
	});
	
	// Initialize terms dialog
	var terms = $('<div></div>').addClass('dialog')
		.dialog({ 
			autoOpen: false,
			modal: true,
			draggable: false,
			resizable: false,
			height: 380,
			width: 600,
			title: "TVDeck Terms of Service"
	});
	
	// Open feed link in new window
	$('div.feedBlock ul li a').click(function() {
		window.open(this.href);
		return false;
	});
	
	// Login form dialog
	$('.loginLink') 
    	.livequery('click', function(event) {
			login.load('/ajax/login', function() {
				signup.dialog('close');
				changePassword.dialog('close');
				forgotPassword.dialog('close');
				login.dialog('open')
				addFeed.dialog('close');
			});
			return false; 
    	});

	// Signup form dialog
	$('.signupLink') 
    	.livequery('click', function(event) {
			signup.load('/ajax/signup', function() {
				login.dialog('close');
				changePassword.dialog('close');
				forgotPassword.dialog('close');
				signup.dialog('open')
				addFeed.dialog('close');
			});
			return false; 
    	});

	// Terms dialog
	$('#termsLink') 
    	.livequery('click', function(event) {
			terms.load('/ajax/terms', function() {
				terms.dialog('open');
			});
			return false; 
    	});
	
	// Change password form dialog
	$('.changePasswordLink') 
	   	.livequery('click', function(event) {
			changePassword.load('/ajax/changepassword', function() {
				login.dialog('close');
				signup.dialog('close');
				forgotPassword.dialog('close');
				changePassword.dialog('open')
				addFeed.dialog('close');
			});
			return false; 
	   	});
	
	// Forgot password form dialog
	$('.forgotPasswordLink') 
    	.livequery('click', function(event) {
			forgotPassword.load('/ajax/forgotpassword', function() {
				login.dialog('close');
				signup.dialog('close');
				changePassword.dialog('close');
				forgotPassword.dialog('open')
				addFeed.dialog('close');
			});
			return false; 
    	});

	// Add feed form dialog
	$('.addFeedLink') 
    	.livequery('click', function(event) {
			addFeed.load('/ajax/addfeed', function() {
				login.dialog('close');
				signup.dialog('close');
				changePassword.dialog('close');
				forgotPassword.dialog('close')
				addFeed.dialog('open');
			});
			return false; 
    	});
	
	// Adds a feed to users page
	$('a.addToMyDeck') 
    	.livequery('click', function(event) {
	
			var id = $(this).attr('id').replace('subscribeId', '');
			subscribeJson(id);
			$(this).removeClass().addClass('removeFromMyDeck').attr('id', 'unsubscribeId' + id);
			
			return false; 
    	});	
	
	// Removes a feed from a users page
	$('a.removeFromMyDeck') 
    	.livequery('click', function(event) {

			var id = $(this).attr('id').replace('unsubscribeId', '');
			unsubscribeJson(id);
			$(this).removeClass().addClass('addToMyDeck').attr('id', 'subscribeId' + id);

			return false; 
    	});
	
	
	// Close search results
	$('#closeResults') 
    	.livequery('click', function(event) {
			$(this).fadeOut(function() {
				$('#navigation a').removeClass('selected');
				$('#subNavigation a').removeClass('selected');
				$('#closeResults').fadeOut();
				$('#resultsContainer').slideUp();
			});
			return false; 
    	});
	
	// Navigation json search results
	$('#navigation ul li a') 
    	.livequery('click', function(event) {
			
			var slug = $(this).attr('rel');
			
			$('#navigation a').removeClass('selected');
			$('#subNavigation a').removeClass('selected');
			$('#closeResults').fadeOut();
			$('#resultsContainer').slideUp();

			if (!slug || slug == '') {
				return false;
			} else {
				getTopicsByCategoryJson(slug);
				$(this).addClass('selected');
			}
			return false; 
    	});
		
	// Popular and Newest json search results
	$('#linksGroup a') 
    	.livequery('click', function(event) {

			var type = $(this).attr('rel');

			$('#navigation a').removeClass('selected');
			$('#subNavigation a').removeClass('selected');
			$('#closeResults').fadeOut();
			$('#resultsContainer').slideUp();

			if (!type || type == '') {
				return false;
			} else {
				switch (type) {
					case 'popular':
					getTopicsByPopularJson();
					break;
					case 'new':
					getTopicsByNewestJson();
					break;
				}
				$(this).addClass('selected');
			}
			return false; 
    	});	
		
	// Alpha json search results
	$('#alpha a') 
    	.livequery('click', function(event) {
	
			var letter = $(this).attr('rel');
			
			$('#navigation a').removeClass('selected');
			$('#subNavigation a').removeClass('selected');
			$('#closeResults').fadeOut();
			$('#resultsContainer').slideUp();
			
			if (!letter || letter == '') {
				return false;
			} else {
				getTopicsByAlphaJson(letter);
				$(this).addClass('selected');
			}
			return false; 
    	});
	
	// Alpha json search results
	$('#searchForm form').submit(function() {
		
		var q = $('#q').val();
		
		$('#navigation a').removeClass('selected');
		$('#subNavigation a').removeClass('selected');
		$('#closeResults').fadeOut();
		$('#resultsContainer').slideUp();

		if (!q || q == 'Find channel...' || q == '') {
			$('#searchForm form').effect('shake');
			return false;
		} else {
			getTopicsBySearchJson(q);
		}
		return false; 
   	});

	$('div.feedBlock ul li a').tooltip({
		bodyHandler: function() {
			return $('.'+$(this).attr('id')).html();
		},
		showURL: false
	});
	
	// $('div.feedBlock ul li a').tooltip({
	// 		track: true,
	// 		delay: 0,
	// 		showURL: false,
	// 		showBody: " - ",
	// 		fade: 250
	// 	});
	
});

function getTopicsByCategoryJson(category) 
{
	$.get(
		'/ajax/categories',
		{ 'category' : category },
		function(data) {
			
			var count = 0;
			
			$('#results ul li').remove();
			$('#closeResults').remove();
			
			if (data.length != 0) {
				for (var i = 0; i < data.length; i++) {
					count++;
					if (count == 6) {
						var count = 0;
						var thisClass = ' class="end"';
					} else {
						var thisClass = ''
					}
					$('#results ul').append('<li' + thisClass + '><a href="http://' + data[i].slug + '.tvdeck.com" title="Videos on ' + data[i].name + '">' + data[i].name + '</a></li>');
				}
			} else {
				$('#results ul').append('<li>No results! Try again.</li>');
			}
			$('#results h3').html('Channels in "' + formatTitleString(category) + '"');
			$('#results').append('<a id="closeResults" style="display: none;" href="#close" title="Close results">&nbsp;</a>');
			$('#resultsContainer').slideDown('slow', function(){
				$('#closeResults').show();
			});	
		}
	,'json');
}

function getTopicsByAlphaJson(letter) 
{
	$.get(
		'/ajax/alpha',
		{ 'letter' : letter },
		function(data) {
			var count = 0;
			
			$('#results ul li').remove();
			$('#closeResults').remove();
			
			if (data.length != 0) {
				for (var i = 0; i < data.length; i++) {
					count++;
					if (count == 6) {
						var count = 0;
						var thisClass = ' class="end"';
					} else {
						var thisClass = ''
					}
					$('#results ul').append('<li' + thisClass + '><a href="http://' + data[i].slug + '.tvdeck.com" title="Videos on ' + data[i].name + '">' + data[i].name + '</a></li>');
				}
			} else {
				$('#results ul').append('<li>No results! Try again.</li>');
			}
			$('#results h3').html('Channels that begin with "' + stringToUpper(letter) + '"');
			$('#results').append('<a id="closeResults" style="display: none;" href="#close" title="Close results">&nbsp;</a>');
			$('#resultsContainer').slideDown(function(){
				$('#closeResults').show();
			});	
		}
	,'json');
}

function getTopicsBySearchJson(q) 
{
	$.get(
		'/ajax/search',
		{ 'q' : q },
		function(data) {
			var count = 0;
			
			$('#results ul li').remove();
			$('#closeResults').remove();
			
			if (data.length != 0) {
				for (var i = 0; i < data.length; i++) {
					count++;
					if (count == 6) {
						var count = 0;
						var thisClass = ' class="end"';
					} else {
						var thisClass = ''
					}
					$('#results ul').append('<li' + thisClass + '><a href="http://' + data[i].slug + '.tvdeck.com" title="Videos on ' + data[i].name + '">' + data[i].name + '</a></li>');
				}
			} else {
				$('#results ul').append('<li>No results! Try again.</li>');
			}
			$('#results h3').html('Search results for "' + q + '"');
			$('#results').append('<a id="closeResults" style="display: none;" href="#close" title="Close results">&nbsp;</a>');
			$('#resultsContainer').slideDown(function(){
				$('#closeResults').show();
			});	
		}
	,'json');
	
	return false;
}

function getTopicsByPopularJson() 
{
	$.get(
		'/ajax/popular',
		{},
		function(data) {
			var count = 0;
			
			$('#results ul li').remove();
			$('#closeResults').remove();
			
			if (data.length != 0) {
				for (var i = 0; i < data.length; i++) {
					count++;
					if (count == 6) {
						var count = 0;
						var thisClass = ' class="end"';
					} else {
						var thisClass = ''
					}
					$('#results ul').append('<li' + thisClass + '><a href="http://' + data[i].slug + '.tvdeck.com" title="Videos on ' + data[i].name + '">' + data[i].name + '</a></li>');
				}
			} else {
				$('#results ul').append('<li>No results! Try again.</li>');
			}
			$('#results h3').html('Popular Channels');
			$('#results').append('<a id="closeResults" style="display: none;" href="#close" title="Close results">&nbsp;</a>');
			$('#resultsContainer').slideDown(function(){
				$('#closeResults').show();
			});	
		}
	,'json');
	
	return false;
}

function getTopicsByNewestJson() 
{
	$.get(
		'/ajax/newest',
		{},
		function(data) {
			var count = 0;
			
			$('#results ul li').remove();
			$('#closeResults').remove();
			
			if (data.length != 0) {
				for (var i = 0; i < data.length; i++) {
					count++;
					if (count == 6) {
						var count = 0;
						var thisClass = ' class="end"';
					} else {
						var thisClass = ''
					}
					$('#results ul').append('<li' + thisClass + '><a href="http://' + data[i].slug + '.tvdeck.com" title="Videos on ' + data[i].name + '">' + data[i].name + '</a></li>');
				}
			} else {
				$('#results ul').append('<li>No results! Try again.</li>');
			}
			$('#results h3').html('Newest Channels');
			$('#results').append('<a id="closeResults" style="display: none;" href="#close" title="Close results">&nbsp;</a>');
			$('#resultsContainer').slideDown(function(){
				$('#closeResults').show();
			});	
		}
	,'json');
	
	return false;
}

function subscribeJson(id) 
{
	$.get(
		'/ajax/subscribe',
		{ 'id' : id },
		function(data) {
			if (data == 1) {
				return true;
			} else {
				alert('Whoops... there was an error. The site administrator has been notified of this issue.');
				return false;
			}
		}
	,'json');
}

function unsubscribeJson(id) 
{
	$.get(
		'/ajax/unsubscribe',
		{ 'id' : id },
		function(data) {
			if (data == 1) {
				return true;
			} else {
				alert('Whoops... there was an error. The site administrator has been notified of this issue.');
				return false;
			}
		}
	,'json');
}

function stringToUpper(strObj) 
{
	return(strObj.charAt(0).toUpperCase()+strObj.substr(1).toLowerCase());
}

/* To Title Case 1.1.1
 * David Gouch <http://individed.com>
 * 23 May 2008
 * License: http://individed.com/code/to-title-case/license.txt
 *
 * In response to John Gruber's call for a Javascript version of his script: 
 * http://daringfireball.net/2008/05/title_case
 */

String.prototype.toTitleCase = function() {
    return this.replace(/([\w&`'‘’"“.@:\/\{\(\[<>_]+-? *)/g, function(match, p1, index, title) {
        if (index > 0 && title.charAt(index - 2) !== ":" &&
        	match.search(/^(a(nd?|s|t)?|b(ut|y)|en|for|i[fn]|o[fnr]|t(he|o)|vs?\.?|via)[ \-]/i) > -1)
            return match.toLowerCase();
        if (title.substring(index - 1, index + 1).search(/['"_{(\[]/) > -1)
            return match.charAt(0) + match.charAt(1).toUpperCase() + match.substr(2);
        if (match.substr(1).search(/[A-Z]+|&|[\w]+[._][\w]+/) > -1 || 
        	title.substring(index - 1, index + 1).search(/[\])}]/) > -1)
            return match;
        return match.charAt(0).toUpperCase() + match.substr(1);
    });
};

function formatTitleString(strObj) 
{	
	return(strObj.replace('-', ' ').toTitleCase());
}