var GowallaTools = {
	
	missing: [],
	spots: [],
	duplicates: 0,
	lat: 0,
	lng: 0,
	
	saveUsername: function(settings)
	{
		var _username = (settings) ? $('#settings-username') : $('#install-username');
		$.get('/_ajax/_user.php',{username:_username.val()},function(data) {
			if (data == 'error') {
				alert('That username could not be found - please try again');
				return false;
			} else {
				localStorage.setItem('username', _username.val());
				GowallaTools.loadHomeMissingCount();
				GowallaTools.loadHomeDuplicateCount();
				if (settings) {
					jQT.goBack();
				} else {
					jQT.goTo('#home', 'cube');
				}	
			}
		});
		
	},
	
	loadHomeMissingCount: function()
	{
		$.get('/_ajax/_missing.php', {username:localStorage.getItem('username')},function(data) {
			GowallaTools.missing = JSON.parse(data);
			$('#missing-link .counter').remove();
			$('#missing-link').append(' <small class="counter">'+GowallaTools.missing.length+'</small>');
		});
	},
	
	loadHomeDuplicateCount: function()
	{
		$.get('/_ajax/_duplicate_count.php', {username:localStorage.getItem('username')},function(data) {
			GowallaTools.duplicates = data;
			GowallaTools.updateHomeDuplicateCount();
		});
	},
	
	updateHomeDuplicateCount: function()
	{
		$('#duplicates-link .counter').remove();
		$('#duplicates-link').append(' <small class="counter">'+GowallaTools.duplicates+'</small>');
	},
	
	loadMissingList: function()
	{
		$('#missing-list').removeClass('textual');
		$('#missing-list').html('<div class="toolbar"><h1>Missing Items</h1><a href="#home" class="back">Home</a></div>');
		if (GowallaTools.missing.length) {
			$('#missing-list .toolbar').after('<ul class="rounded"></ul>');
			for (x in GowallaTools.missing) {
				$('#missing-list ul').append('<li class="arrow"><a href="#" class="icon" rel="'+x+'"><img src="'+GowallaTools.missing[x].image_url+'" alt="" />'+GowallaTools.missing[x].name+'</a></li>');
			}
			GowallaTools.addIconHandlers();
		} else {
			$('#missing-list').addClass('textual');
			$('#missing-list .toolbar').after('<div class="content congratulations"><p><strong>CONGRATULATIONS<br />YOU WIN!!</strong></p><p>You have collected every item that has been officially released within Gowalla!</p><img src="/_images/congratulations.png" class="item-image" />');
		}
	},
	
	loadDuplicatesList: function()
	{
		$.get('/_ajax/_duplicate_spots.php',{username:localStorage.getItem('username')},function(data) {
			$('#duplicates').removeClass('textual');
			$('#duplicates').html('<div class="toolbar"><h1>Duplicates</h1><a href="#home" class="back">Home</a></div>');
			data = JSON.parse(data);
			if (data.length) {
				$('#duplicates .toolbar').after('<ul class="rounded"></ul>');
				for (x in data) {
					$('#duplicates ul').append('<li class="arrow"><a href="#" class="icon" rel="'+x+'"><img src="'+data[x].image_url+'" alt="" />'+data[x].name+'</a><small class="counter">'+data[x].spot_id+'</small></li>');
				}
				GowallaTools.addDuplicateListHandlers(data);
			} else {
				$('#duplicates').addClass('textual');
				$('#duplicates .toolbar').after('<div class="content congratulations"><p>You don\'t have any duplicate spots saved - You can add some by going to "Nearby Spots" and choosing "Mark as Duplicate" next to any spot.</p><img src="/_images/duplicates.png" class="item-image" />');
			}
			
			jQT.goTo('#duplicates', 'slide');
		});
	},
	
	addDuplicateListHandlers: function(data)
	{
		$('#duplicates .icon').unbind('click').bind('click', function() {
			
			var id = $(this).attr('rel');
			var spot = data[id];
			$('#duplicate-information').removeClass('textual');
			$('#duplicate-information').html('<div class="toolbar"><h1>'+spot.name+'</h1><a href="#" class="back">Back</a></div>');
			
			$('#duplicate-information .toolbar').after('<ul class="rounded"><li><a href="#" class="grayButton" id="unmark-duplicate" rel="'+spot.spot_id+'">Remove from Duplicates</a></li></ul>');
			
			$('#duplicate-information .toolbar').after('<ul class="rounded spot-details"></ul>');
			$('#duplicate-information ul.spot-details').append('<li><a href="http://m.gowalla.com/#'+spot.url+'" target="_blank">ID<small class="counter">'+spot.spot_id+'</small></a></li>');
			$('#duplicate-information ul.spot-details').append('<li>Added to Duplicates <small class="counter">'+spot.date+'</small></li>');
			
			$('#duplicate-information .toolbar').after('<img src="'+spot.image_url+'" alt="" class="item-image" />');
			
			GowallaTools.addDuplicateInformationHandlers();
			
			jQT.goTo('#duplicate-information', 'slide');
			
			return false;
		});
	},
	
	addDuplicateInformationHandlers: function() {
		$('#duplicate-information #unmark-duplicate').unbind('click').bind('click',function() {
			var id = $(this).attr('rel');
			var username = localStorage.getItem('username');
			
			$.post('/_ajax/_duplicate.php',{username: username, id:id, action:'delete'}, function(data) {
				$('#duplicates ul .counter:contains("'+id+'")').parent().remove();
				GowallaTools.duplicates--;
				GowallaTools.updateHomeDuplicateCount();
				GowallaTools.addDuplicateInformationHandlers();
				if (!GowallaTools.duplicates) {
					$('#duplicates').addClass('textual');
					$('#duplicates ul').remove();
					$('#duplicates .toolbar').after('<div class="content congratulations"><p>You don\'t have any duplicate spots saved - You can add some by going to "Nearby Spots" and choosing "Mark as Duplicate" next to any spot.</p><img src="/_images/duplicates.png" class="item-image" />');
				}
				jQT.goBack();
			});
			
			return false;
		});
	},
	
	addIconHandlers: function()
	{
		$('#missing-list .icon').bind('click', function() {
			alert('Gowalla have blocked this functionality for the time being - follow @gowallatools for updates');
			$('.active').removeClass('active');
			/*
			var id = $(this).attr('rel');
			var item = GowallaTools.missing[id];
			$.post('/_ajax/_missing_categories.php',{tags: item.tags.join(',')}, function(data) {
				GowallaTools.loadMissingCategoryList(item,data);
				jQT.goTo('#missing-category-list', 'slide');
			});
			*/
		});
	},
	
	addItemHandlers: function()
	{
		$('#category-item-list .item img').bind('click', function() {
			var item = {
				name: $(this).parent().attr('rel'),
				image_url: $(this).attr('src')
			};
			var id = $(this).attr('rel');
			$.post('/_ajax/_missing_categories.php',{id: id}, function(data) {
				GowallaTools.loadMissingCategoryList(item,data);
				jQT.goTo('#missing-category-list', 'slide');
			});
			
		});
	},
	
	loadMissingCategoryList: function(item,data)
	{
		$('#missing-category-list').removeClass('textual');
		$('#missing-category-list').html('<div class="toolbar"><h1>'+item.name+'</h1><a href="#" class="back">Back</a></div>');
		if (data) {
			data = JSON.parse(data);
			if (data.unknowns) {
				$('#missing-category-list .toolbar').after('<p class="subtext">"Unknown locations" refer to spots that are not official categories.  They can range from single spots (such as <em>alamofire</em>) to internal categories for certain events (such as <em>conference</em>).  If an item is only available at an unknown location then it is very rare!</p>');
				$('#missing-category-list .toolbar').after('<h2>Unknown locations:</h2><ul class="rounded unknowns"></ul>');
				$('#missing-category-list ul.unknowns').append(data.unknowns);
			}
			if (data.categories) {
				$('#missing-category-list .toolbar').after('<h2>Available at:</h2><ul class="rounded categories"></ul>');
				$('#missing-category-list ul.categories').append(data.categories);
			}
		} else {
			$('#missing-category-list').addClass('textual');
			$('#missing-category-list .toolbar').after('<div class="content"><p>Apparently you will not find this item as a popup at any spot - you may be able to find one that somebody has dropped previously though.</p></div>');
		}
		$('#missing-category-list .toolbar').after('<img src="'+item.image_url+'" alt="" class="item-image" />');
	},
	
	loadCategoryItemList: function(gowalla_id,name)
	{
		$.get('/_ajax/_category_items.php',{id: gowalla_id,name: name},function(data) {
			$('#category-item-list').html(data);
			jQT.goTo('#category-item-list', 'slide');
			GowallaTools.addItemHandlers();
			setTimeout("highlightMissingItems()",1000);
		});
	},
	
	updateNearbySpots: function(position)
	{
		GowallaTools.lat = position.coords.latitude;
		GowallaTools.lng = position.coords.longitude;
		var username = localStorage.getItem('username');
				
		$.get('/_ajax/_nearby_spots.php', {lat: GowallaTools.lat, lng: GowallaTools.lng, username: username}, function(data) {
			if (data) {
				data = JSON.parse(data);
				GowallaTools.spots = data;
				$('#spots').html('<div class="toolbar"><h1>Nearby Spots</h1><a href="#" class="back">Back</a></div>');
				$('#spots .toolbar').after('<ul class="rounded spots"></ul>');
				for (x in data) {
					var reported = (data[x].reported) ? 'reported' : '';
					$('#spots ul.spots').append('<li class="arrow"><a href="spot-information" class="icon '+reported+'" rel="'+data[x].id+'"><img src="'+data[x].image_url+'" alt="" />'+data[x].name+'</a><small class="counter">'+data[x].distance+'</small></li>');
				}
				GowallaTools.addNearbyHandlers();
				jQT.goTo('#spots', 'slide');
			}
		});
	},
	
	addNearbyHandlers: function()
	{
		$('#spots .icon').unbind('click').bind('click', function() {
			var id = $(this).attr('rel');
			var spot = GowallaTools.spots[id];
			$('#spot-information').removeClass('textual');
			$('#spot-information').html('<div class="toolbar"><h1>'+spot.name+'</h1><a href="#" class="back">Back</a></div>');
			
			var reported = $(this).hasClass('reported');
			var toggle_id = (reported) ? 'unmark-duplicate' : 'mark-duplicate';
			var toggle_text = (reported) ? 'Unmark as duplicate' : 'Mark as duplicate';
			$('#spot-information .toolbar').after('<ul class="rounded"><li><a href="#" class="grayButton duplicate-toggle" id="'+toggle_id+'" rel="'+spot.id+'">'+toggle_text+'</a></li></ul>');
			
			$('#spot-information .toolbar').after('<ul class="rounded spot-details"></ul>');
			$('#spot-information ul.spot-details').append('<li><a href="http://m.gowalla.com/#'+spot.url+'" target="_blank">ID <small class="counter">'+spot.id+'</small></a></li>');
			$('#spot-information ul.spot-details').append('<li>Visitors <small class="counter">'+spot.users_count+'</small></li>');
			$('#spot-information ul.spot-details').append('<li>Check-ins <small class="counter">'+spot.checkins_count+'</small></li>');
			$('#spot-information ul.spot-details').append('<li>Items <small class="counter">'+spot.items_count+'</small></li>');
			$('#spot-information ul.spot-details').append('<li>Radius <small class="counter">'+spot.radius_meters+'m</small></li>');
			
			$('#spot-information .toolbar').after('<img src="'+spot.image_url+'" alt="" class="item-image" />');
			
			GowallaTools.addDuplicateSpotHandlers();
			
			jQT.goTo('#spot-information', 'slide');
		});
	},
	
	addDuplicateSpotHandlers: function() {
		$('#spot-information .duplicate-toggle').unbind('click').bind('click',function() {
			var _obj = $(this);
			var id = $(this).attr('rel');
			var username = localStorage.getItem('username');
			if ($(this).attr('id') == 'mark-duplicate') {
				var spot = GowallaTools.spots[id];
				$.post('/_ajax/_duplicate.php',{username: username, id:id, name: spot.name, image_url: spot.image_url, url: spot.url, action:'add'}, function(data) {
					_obj.attr('id','unmark-duplicate').text('Unmark as duplicate').removeClass('active');
					$('#spots ul.spots a[rel="'+id+'"]').addClass('reported');
					alert('This spot has been added to your list of duplicates');
					GowallaTools.duplicates++;
					GowallaTools.updateHomeDuplicateCount();
					GowallaTools.addDuplicateSpotHandlers();
				});
			} else {
				$.post('/_ajax/_duplicate.php',{username: username, id:id, action:'delete'}, function(data) {
					_obj.attr('id','mark-duplicate').text('Mark as duplicate').removeClass('active');
					$('#spots ul.spots a[rel="'+id+'"]').removeClass('reported');
					alert('This spot has been removed from your list of duplicates');
					GowallaTools.duplicates--;
					GowallaTools.updateHomeDuplicateCount();
					GowallaTools.addDuplicateSpotHandlers();
				});
			}
			
			return false;
		});
	},
	
	failNearbySpots: function() {
		alert('Your location could not be determined.');
		return false;
	}

};

var highlightMissingItems = function()
{
	$('#category-item-list .item').each(function() {
		for (x in GowallaTools.missing) {
			if ($(this).attr('rel') == GowallaTools.missing[x].name) {
				$(this).addClass('highlight');
			}
		}
	});
};


$(document).ready(function() {
	
	//localStorage.clear();
	
	// if no username set, then go to the installation screen!
	if (!localStorage.getItem('username') && $('.fullscreen').length) {
		jQT.goTo('#install');
	}
	
	// add slide animations
	$('.slide').bind('touchstart',function() {
		jQT.goTo($(this).attr('href'), 'slide');
	});
	
	// remove active states once animations end
	$('div').bind('pageAnimationEnd', function(event, info){
		if (info.direction == 'out') {
			$('.active').removeClass('active');
		}
	});
	
	// installation screen
	$('#install-form').submit(function() {
		GowallaTools.saveUsername(false);
		return false;
	});
	$('#install-form .grayButton').bind('click',function() {
		$(this).removeClass('active');
		$('#install-form').trigger('submit');
		return false;
	});
	
	// settings panel
	$('#settings').bind('pageAnimationStart', function(event, info){
		if (info.direction == 'in') {
			$('#settings-username').val(localStorage.getItem('username'));
		}
	});
	$('#settings-form').submit(function() {
		GowallaTools.saveUsername(true);
		return false;
	});
	$('#settings-form .grayButton').bind('click',function() {
		$(this).removeClass('active');
		$('#settings-form').trigger('submit');
		return false;
	});
	
	// home screen
	$('#home').ready(function() {
		if (localStorage.getItem('username')) {
			GowallaTools.loadHomeMissingCount();
			GowallaTools.loadHomeDuplicateCount();
		}
	});
	
	// missing list screen
	$('#missing-link a').unbind('click').bind('click', function(){
		GowallaTools.loadMissingList();
		jQT.goTo($(this).attr('href'), 'slide');
	});
	
	// category list screen
	$('#category-link a').unbind('click').bind('click', function(){		
		$.get('/_ajax/_categories.php',{id: 0,name: 'Categories', next: 'subcategory-list'},function(data) {
			$('#category-list').html(data);
			$('#category-list li a').bind('click',function() {
				$.get('/_ajax/_categories.php',{id: $(this).attr('rel'),name: $(this).text(), next: 'subsubcategory-list'},function(data) {
					$('#subcategory-list').html(data);
					$('#subcategory-list li a[href="#subsubcategory-list"]').bind('click',function() {
						$.get('/_ajax/_categories.php',{id: $(this).attr('rel'),name: $(this).text()},function(data) {
							$('#subsubcategory-list').html(data);
							$('#subsubcategory-list li a[href="#category-item-list"]').bind('click',function() {
								GowallaTools.loadCategoryItemList($(this).attr('rel'),$(this).text());
							});
							jQT.goTo('#subsubcategory-list', 'slide');
						});
					});
					$('#subcategory-list li a[href="#category-item-list"]').bind('click',function() {
						GowallaTools.loadCategoryItemList($(this).attr('rel'),$(this).text());
					});
					jQT.goTo('#subcategory-list', 'slide');
				});
			});
			jQT.goTo('#category-list', 'slide');
		});
	});
	
	// spots
	$('#nearby-link a').unbind('click').bind('click',function() {
		navigator.geolocation.getCurrentPosition(GowallaTools.updateNearbySpots, GowallaTools.failNearbySpots);
	});
	
	// duplicates
	$('#duplicates-link a').unbind('click').bind('click',function() {
		GowallaTools.loadDuplicatesList();
		return false;		
	});

	// admin stuffs
	$('#admin-update-categories').bind('click',function() {
		$(this).removeClass('active');
		$.get('/_ajax/_admin_categories.php',{},function() {
			alert('Category lists have been updated!');
		});
		return false;
	});
	
});

