// Font replacement
Cufon.replace('h2, #scavengerhunt_feature .join, .winner_badge, ul.tabs a');

/**
 * Event bindings/global vars
 */
	var rollover_timer = null;
	var rollout_timer = null;
	var tab = null;
	var page = 1;
	var per_page;

	$(document).ready(function()
	{
		// text field placeholder
		$('input.default').applyDefault();
		
		// Search form
		$('#search_form #q').autocomplete({url: WWW_ROOT + 'tags.text', cacheLength: 25});
	
		// Home page: drop downs
		$('.dropdown').dropdown();
		$('#watch_look_listen .dropdown ul.options a, #define_header .dropdown ul.options a').click(didChangeSort);
		$('#content_header .dropdown ul.options a').click(changePage);
	
	  // Setup star ratings
		$('.ratings').rating();
	
		// Photo rollover
		$('.photo').hover(showPhotoRollover, hidePhotoRollover);
	
		$('.photo .fave').live('click', didClickFave);
	
		// Autocomplete form
		$('#tag_form #name').autocomplete({url: WWW_ROOT + 'tags.text', multiple: true, cacheLength: 25});
	
		// individual item
		$('.item').live('click', didClickItem);
		$('#item_detail').click(itemClick);
	
		// Submit events for item
		$('#tag_form').live('submit', shouldAddTag);
		$('#comment_form').live('submit', shouldAddComment);
		
		// Widget creation
		$('#create_widget_form, #add_widget_form').live('submit', createWidget);
		$('.add_widget').live('click', showWidgetModal);
		
		$('#items .pagination a').live('click', changePage);
	
		$('ul.tabs a').click(switchTabs);
	
		$('.scavengerhunt .upload_photo').click(togglePhotoUpload);
	
		$('.scavengerhunt .make_winner').live('click', makeScavengerHuntWinner);
	
		$('#scavengerhunt_feature').click(redirectToScavengerHunt);
	
	
		// Autocomplete form
		$('#associated_tags_form #tag_name, #tag_form #name, #associated_tags_form #name').autocomplete({url: WWW_ROOT + 'tags.text', multiple: true, cacheLength: 25});

		// Tag.show - associated tags
		$('#associated_tags_form').submit(shouldAddAssociatedTag);

		// Handle adding new definition
		$('#new_definition').submit(shouldAddDefinition);

		// Delete definition
		$('a.delete_definition').live('click', shouldDeleteDefinition);

		$('a.show_all_definitions').click(function(){
			$('.definition').not(':visible').fadeIn();
			return false;
		});
	
	
		/**
		 * Members
		 */
			// Member.profile - add service
			$('#services .service').submit(addService);

			// Member.profile - destroy service
			$('a.destroy_service').live('click', destroyService);

			// Member.profile - Change password
			$('a.change_password').click(function(){
				$('#change_password').modal();
				return false;
			});

			// Member.profile - Change Photo
			$('a.change_photo').click(changePhoto);

			// Member.profile - Delete friend
			$('a.delete_friend').click(removeFriend);

			// Member.view - Add friend
			$('a.add_friend').click(addFriend);

			// Cancel service
			$('a.cancel').live('click', function()
			{
				$(this).parents('form').clear();
				return false;
			});

			$('a.help').live('click', function(event){ return false; });
	
	
	  $('a.connect_foursquare').live('click', connectFoursquare);
	
		if (tab !== null)
		{
			tab.trigger('click');
		}
	});


/**
 * Event Handlers
 */
	function switchTabs(event)
	{
		if (!$(this).hasClass('selected'))
		{
			var tab = $(this).attr('href');
			$('ul.tabs a.selected').removeClass('selected');
			$(this).addClass('selected');
			$('.tab').hide();
			$('.item.selected').removeClass('selected');
			$(tab).show();
			$('.item', tab).slice(0,1).trigger('click').addClass('selected');
			Cufon.replace('ul.tabs a');
		}

		return false;
	}


	function showPhotoRollover(event)
	{
		if (rollover_timer !== null)
		{
			clearTimeout(rollover_timer);
			rollover_timer = null;
		}

		var rollover = $(this).children('.photo_rollover');
		var top = (50 - rollover.innerHeight()) / 2;
		rollover_timer = setTimeout(function()
		{
			rollover.fadeIn(200, function()
			{
				rollout_timer = setTimeout(function()
				{
					rollover.stop().fadeOut(200);
				}, 5000);
			});
			
			rollover_timer = null;
		}, 1000);
	}
	
	
	function hidePhotoRollover()
	{
		var rollover = $(this).find('.photo_rollover');
		clearTimeout(rollover_timer);
		clearTimeout(rollout_timer);
		rollover.stop().hide();
	}


	function togglePhotoUpload()
	{
		var upload_form = $('#upload_photo_form');
		
		if (upload_form.is(':visible'))
		{
			$(this).parent().css('zIndex', '0');
			upload_form.hide();
		}
		else
		{
			$(this).parent().css('zIndex', '1000');
			upload_form.show();
		}

		return false;
	}
	

	function changePage(event)
	{
		event.preventDefault();
		var url = $(this).attr('href');
		var container;
	
		if ($(this).parents('.items').length === 0)
		{
			container = $('.items');
		}
		else
		{	
			container = $(this).parents('.items');
		}
	
		$.alert.loading();
	
		$.get(url, function(html)
		{
			$(container).html(html);
			$.alert.hide();
		});
	
		return false;
	}


	// When a sort option is changed on the home page
	function didChangeSort(event)
	{
		var url = $(this).attr('href');
		var container = $(this).parents('.header').nextAll('.body');
	
		$.alert.loading();
	 
		// request updated items
		$.getJSON(url, function(json)
		{
			$.alert.hide();
		
			if (json.status == 'ok')
			{
				$(container).html(json.html);
			}
			else
			{
				$.alert(json.message);
			}
		});
	
		return false;
	}
	

	// Member.show event handlers
	function didClickItem(event)
	{
		if ($(event.target).is('a') && !$(event.target).hasClass('thumbnail'))
		{
			return true;
		}
	
		var item = $(this);
		var container = item.parents('.items');
		var url;
	
		if (item.hasClass('selected'))
		{
			return false;
		}

		$.alert.loading();
	
		if (item.is('a'))
		{
			url = item.attr('href');
		}
		else
		{
			url = WWW_ROOT + 'items/show/' + item.attr('id').substr(5);
		}

		$.get(url, function(html)
		{
			$('#items .selected').removeClass('selected');
			item.addClass('selected');
		
			$('#item_detail').html(html);
		
			$.glue.setData('item_num', getCurrentItemIndex(container));
			$.glue.update('total');
		
			// rebind events
			$('.ratings').rating();
		
			// Autocomplete form
			$('#tag_form #name').autocomplete({url: WWW_ROOT + 'tags.text', multiple: true, cacheLength: 25});
		
			$.alert.hide();
		});

		return false;
	}


	function getCurrentItemIndex(container)
	{
		var item_num = 0;
	
		if (typeof(container) == 'undefined')
		{
			item_num = $('.item').index($('#items .selected'));
		}
		else
		{
			item_num = $('.item', container).index($('.item.selected', container));
		}
	
		return (item_num + 1) + ((page - 1) * per_page);
	}


	// Event delegation to handle all clicks in item detail
	function itemClick(event)
	{
		var target = $(event.target);
	
		if (target.is('a'))
		{
			if (target.hasClass('add_friend'))
			{
				addFriend(event);
				return false;
			}
			else if (target.hasClass('feature_item'))
			{
				makeItemFeatured(event);
				return false;
			}
			else if (target.hasClass('fave'))
			{
				didClickFave(event);
				return false;
			}
			else if (target.hasClass('next_item'))
			{
				nextItem();
				return false;
			}
			else if (target.hasClass('previous_item'))
			{
				previousItem();
				return false;
			}
			else if (target.hasClass('delete_comment'))
			{
				shouldDeleteComment(event);
				return false;
			}
			else if (target.hasClass('delete_item'))
			{
				deleteItem(event);
				return false;
			}
			else if (target.hasClass('remove_tags'))
			{
				editTags();
				return false;
			}
			else if (target.hasClass('untag'))
			{
				removeTag(event);
				return false;
			}
		}
	
		return true;
	}


	function shouldAddTag(event)
	{
		event.preventDefault();
	
		// Don't prompt user for confirmation if form is blank
		if ($('#name').val() === '')
		{
			return false;
		}		
			
		$.confirm('Are you sure you want to tag this item?', event, function()
		{
			var form = $(event.target);
		
			$.alert.loading();
			var url = form.attr('action');
		
			$.post(url, form.serialize(), function(json)
			{
				if (json.status == 'ok')
				{
					var item_id = json.item_id;
					form.clear();
					var tags = [];
				
					for (i = 0; i < json.tags.length; i++)
					{
						var tag_id = json.tags[i].id;
					  tags.push('<a href="' + WWW_ROOT + 'tags/' + tag_id + '" id="tag_' + tag_id + '" rel="item_' + item_id + '">' + json.tags[i].name + '</a>');
					}
				
					if (tags.length > 0)
					{
						if ($('#tags a').length === 0)
						{
							$('#tags').append(tags.join(', '));
						}
						else
						{
							$('#tags').append(', ' + tags.join(', '));
						}
					}
				
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			
			}, 'json');
		});
	
		return false;
	}


	// Save an item to your favorites
	function didClickFave(event)
	{
		var url = $(event.target).attr('href');
		$.confirm('Are you sure you want to fave this item?', event, function(){
			$.alert(null, {loading: true, duration: false});
		
			$.getJSON(url, function(json){
				if (json.status == 'ok')
				{
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			});
		});
	
		return false;
	}


	function addFriend(event)
	{
		var url = $(event.target).attr('href');
		
		$.confirm('Are you sure you want to add this member to \'Your People\'?', event, function()
		{
			$.alert.loading();
		
			$.getJSON(url, function(json){
				if (json.status == 'ok')
				{
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			});
		});

		return false;
	}


	function makeItemFeatured(event)
	{
		var url = $(event.target).attr('href');
		$.confirm('Are you sure you want to make this item featured?', event, function(){
			$.alert.loading();
		
			$.getJSON(url, function(json){
				if (json.status == 'ok')
				{
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			});
		});
	}


	function makeScavengerHuntWinner(event)
	{
		var url = $(event.target).attr('href');
		$.confirm('Are you sure you want to make this item the winner?', event, function(){
			$.alert.loading();
		
			$.getJSON(url, function(json){
				if (json.status == 'ok')
				{
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			});
		});
	
		return false;
	}


	function shouldAddComment(event)
	{
		event.preventDefault();
	
		// Ignore if comment is empty
		if($('#message').val() === '')
		{
			return false;
		}
	
		$.confirm('Are you sure you want to post this comment?', event, function()
		{
			var form = $(event.target);
			var url = form.attr('action');
		
			$.post(url, form.serialize(), function(json)
			{
				if (json.status == 'ok')
				{
					form.clear();
					$('#comments').prepend(json.html);
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			}, 'json');
		});
	
		return false;
	}


	function shouldDeleteComment(event)
	{
		var url = $(event.target).attr('href');
		var $comment = $(event.target).parents('.comment');
	
		$.confirm('Are you sure you want to delete this comment?', event, function(){
			$.alert.loading();
		
			$.getJSON(url, function(json){
				if (json.status == 'ok')
				{
					$comment.fadeOut(500, function(){
						$(this).remove();
					});
				
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			});
		});

		return false;
	}


	function removeTag(event)
	{
		var target = $(event.target);
		
		$.confirm('Are you sure you want to remove this tag?', event, function()
		{
			var url = target.attr('href');
			$.alert.loading();
			$.getJSON(url, function(json)
			{
				if (json.status == 'ok')
				{
					target.parent('li').fadeOutAndRemove();
					$('#tags').html(json.tags);
					$.alert.success();
				}
				else
				{	
					$.alert.error(json.message);
				}
			});
		});
	}


	function editTags()
	{
		if ($('#remove_tags').is(':visible'))
		{
			$('.tags_header small a').html('Click to remove tags');
		
			$('#remove_tags').html('').hide();
			$('#tags').show();
		}
		else
		{
			// Dynamically build HTML to delete tags
			var html = '<ul>';

			$('#tags a').each(function()
			{
				var tag_id = $(this).attr('id').substr(4);
				var item_id = $(this).attr('rel').substr(5);
				html += '<li><a href="' + WWW_ROOT + 'items/untag/' + item_id + '/' + tag_id + '" class="untag" title="">' + $(this).html() + '</a></li>';
			});

			html += '</ul>';
		
			$('#remove_tags').html(html).show();
			$('#tags').hide();
			$('.tags_header small a').html('Click when finished editing');
		}

	}


	function showWidgetModal(event)
	{
		$('#widget').modal();
	
		return false;
	}


	function createWidget(event)
	{
		event.preventDefault();
		var form = $(event.target);
	
		$.alert.loading();
	
		$.post(form.attr('action'), form.serialize(), function(json)
		{
			if (json.status == 'ok')
			{
				$.alert.success();
				$('#widget').fadeOut();
			}
			else
			{
				$.alert.error(json.message);
			}
		}, 'json');
	
		return false;
	}


	function previousItem()
	{	
		var item = $('.item.selected').prevAll('.item').slice(0,1);
		var container;
	
		if (item.length > 0)
		{
			container = $('.item.selected').parents('.items');
			item.trigger('click');
		}
		else
		{
			container = $('.items:visible');
			var url = $('a.prev_page', container).attr('href');
			if (url === undefined)
			{
				$('a.prev_page', container).trigger('click');
			}
		}
	}
	

	function nextItem()
	{
		if ($('.item.selected').length === 0)
		{
			$('.items:visible .item').slice(0, 1).trigger('click');
		
			return;
		}
	
		var item = $('.item.selected').nextAll('.item').slice(0,1);
		var container = $('.item.selected').parents('.items');
	
		if (item.length > 0)
		{
			item.trigger('click');
		}
		else
		{	
			var url = $('a.next_page', container).attr('href');
			if (url === undefined)
			{
				$('a.next_page', container).slice(0, 1).trigger('click');
			}
		}
	}
	

	function deleteItem(event)
	{
		var url = $(event.target).attr('href');
		var item = $('#items .selected');
	
		$.confirm('Are you sure you want to delete this item?', event, function()
		{
			$.getJSON(url, function(json)
			{
				if (json.status == 'ok')
				{
					nextItem();	
					item.remove();
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			});
		});
	}
	
	
	function redirectToScavengerHunt()
	{
		window.location = $(this).find('p.join a').attr('href');
	}
	
	
	function shouldAddDefinition(event)
	{
		// Ignore submission if definition is empty
		if ($('#definition_definition').val() == '')
		{
			$.alert('Definition is empty!', {duration: 500});
			return false;
		}

		var form = $(this);
		$.confirm('Are you sure you want to add this definition?', event, function(){
			$.alert.loading()

			var url = form.attr('action');
			$.post(url, form.serialize(), function(json){
				if (json.status == 'ok')
				{
					form.clear();

					if($('.definition').size() == 0)
					{
						$('#definitions').html('<p class="definitions_header">Showing 1 of 1</p>');
					}

					$('#definitions').append(json.html);

					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			}, 'json');
		});

		return false;
	}


	function shouldDeleteDefinition(event)
	{
		var url = $(this).attr('href');
		var auth_token = $(this).attr('rel');
		var $definition = $(this).parents('.definition');

		$.confirm('Are you sure you want to delete this definition?', event, function(){
			$.alert.loading()
			$.post(url, '_method=DELETE&authenticity_token=' + auth_token ,function(json){
				if (json.status == 'ok')
				{
					$definition.fadeOut(500, function(){
						$(this).remove();
					});

					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			}, 'json');
		});

		return false;
	}

	function shouldAddAssociatedTag(event)
	{
		var form = $(this);
		
		$.confirm('Are you sure you want to associate this tag?', event, function()
		{
			$.alert.loading()
			var url = form.attr('action');
			
			$.post(url, form.serialize(), function(json)
			{
				if (json.status == 'ok')
				{
					$('#tag_name').val('');
					tags = [];

					for (i=0; i < json.tags.length; i++)
					{
					  tags.push('<a href="' + WWW_ROOT + 'tags/' + json.tags[i].id + '">' + json.tags[i].name + '</a>');
					}

					if (tags.length > 0)
					{
						if ($('p.associated_tags').children().size() == 0)
						{
							$('p.associated_tags').append(tags.join(', '));
						}
						else
						{
							$('p.associated_tags').append(', ' + tags.join(', '));
						}
					}

					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			}, 'json');
		});

		return false;
	}
	
	
	function changePhoto()
	{
		$('#change_photo').modal();
		return false;
	}

	function addService(event)
	{
		var form = $(event.target);
		var service = form.parents('.service');

		if (form.find('input[name=identifier]').val() === '')
		{
			$.alert.error('Please fill in a username');
			return false;
		}

		$.alert.loading();

		$.post(form.attr('action'), form.serialize(), function(json){
			if (json.status == 'ok')
			{
				service.html(json.html);
				$.alert.success();
			}
			else
			{
				$.alert.error(json.message);
			}

		}, 'json');

		return false;
	}


	function destroyService(event)
	{
		var url = $(this).attr('href');
		var $service = $(this).parents('.service');

		$.confirm("Are you sure you want to remove this service and all its items?", event, function()
		{
			$.getJSON(url, function(json){
				if (json.status == 'ok')
				{
					$service.html(json.html);
					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);	
				}
			});
		});

		return false;
	}


	function removeFriend(event)
	{
		var url = $(this).attr('href');
		var friend = $(this).parents('.friend');
		$.confirm('Are you sure you want to remove this member from \'Your People\'?', event, function()
		{
			$.getJSON(url, function(json)
			{
				if (json.status == 'ok')
				{
					$(friend).fadeOut(500, function(){ $(this).remove(); });
					var friend_count = $('#people h3 .count').html();
					$('#people h3 .count').html(friend_count - 1);

					$.alert.success();
				}
				else
				{
					$.alert.error(json.message);
				}
			});
		});

		return false;
	}
	
	
	function connectFoursquare()
	{
	  $.getJSON(WWW_ROOT + 'api/foursquare_request_token', function(json)
	  {
	    if (json.status == 'ok')
	    {
	      window.location = json.url;
	    }
	    else
	    {
	      alert('There was an error connecting to Foursquare. Please try again!');
	    }
	  });
	  
	  return false;
	}
	
	