var list;

$(document).ready(function()
{
	list = new List();

	// hide the textbox until we have a mod_url
	$('#add').hide();
	
	// do we have a hash?
	var mod_url = getHash();
	
	if(mod_url.length == 0) // get a new mod_url
	{
		$.get('actions.php?random=' + list.random_number + '&action=create_mod_url', function(data)
		{
			var urls = data.split('#');
			list.mod_url = urls[0];
			list.read_url = urls[1];
			setHash(list.mod_url);
			list.fetch();
			list.updateLinks();
		});
	}
	else // we already have a hash
	{
		// get read_url
		list.mod_url = mod_url;
		$.get('actions.php?random=' + list.random_number + '&action=get_read_url&mod_url=' + list.mod_url, function(data)
		{
			list.read_url = data;
			list.fetch();
			list.updateLinks();
		});
	}
	
});

var List = function()
{
	this.mod_url;
	this.read_url;
	this.random_number = Math.floor(Math.random()*500);
	this.throttle = false;
	
	this.fetch = function()
	{
		// fetch the lists, show the add bar (and set focus), and make the lists sortable
		$.get('actions.php?random=' + this.random_number + '&action=get_lists&mod_url=' + this.mod_url, function(data)
		{
			$('#lists').html(data);
			$('#add').show();
			list.focus();	
			list.makeSortable();
		})
	}
	
	this.updateLinks = function()
	{
		// undate the navigation links (bookmark, print, email)
		var url_element = $('#url');
		var url = 'http://listmoz.com#' + list.mod_url;
		url_element.attr({'href' : url});
		url_element.text(url);
		$('#mail').attr({'href' : 'mailto:?subject=My List&body=Check out ' + url});
		
		url_element = $('#read-only');
		url = 'http://listmoz.com/view/' + list.read_url;
		url_element.attr({'href' : url});
		
		url_element = $('#print');
		url = 'http://listmoz.com/view/' + list.read_url + "#print";
		url_element.attr({'href' : url});	
	}
	
	this.add = function()
	{
		if(this.throttle === true)
			return;
		this.throttle = true
			
		var description = $('#add-field').val();
		$.post('actions.php', {'action': 'add', 'mod_url': this.mod_url, 'description': description}, function(data)
		{
			var unchecked = $('#unchecked');
			unchecked.html(data + unchecked.html());
			$('#unchecked li:first').show();
			// prevents UI issues
			list.throttle = false;
			list.makeSortable();						
			list.focus();
		});
	}
	
	this.remove = function(itemID)
	{
		if(this.throttle === true)
			return;
		this.throttle = true
		
		$.get('actions.php?random=' + this.random_number + '&action=delete&mod_url=' + this.mod_url + '&itemID=' + itemID, function(data)
		{
			$('#item' + itemID).fadeOut(function()
			{
				$(this).remove();
				list.makeSortable();	
				list.throttle = false;			
			});

		});
	}
	
	this.edit = function(itemID)
	{
		if(this.throttle === true)
			return;
		this.throttle = true
			
		var element = $('#edit' + itemID);
		var settings = {'submit'  : 'OK', 'width' : 500, 'height' : 'none', 'event' : 'dblclick'};
		element.editable(function(value, settings)
		{
			$.post('actions.php', {'action': 'edit', 'mod_url': list.mod_url, 'description': value, 'itemID': itemID}, function(data)
			{
				// nothing to do
				
			});
			return htmlspecialchars(value); // encode to prevent nasty stuff
			
		}, settings);
		//$('#edit' + itemID).(); // click the field to enable the editor
		element.dblclick();
		list.throttle = false;
	}
	
	this.check = function(itemID)
	{
		if(this.throttle === true)
			return;
		this.throttle = true
		
		$.get('actions.php?random=' + this.random_number + '&action=check&mod_url=' + this.mod_url + '&itemID=' + itemID, function(data)
		{
			$('#item' + itemID).slideUp(function()
			{
				list.throttle = false;
				$(this).remove();
				var checked = $('#checked');
				checked.html(data + checked.html());
				$('#item' + itemID).slideDown();
				list.makeSortable();				
			});	
		});
	}

	this.uncheck = function(itemID)
	{
		if(this.throttle === true)
			return;
		this.throttle = true
		
		$.get('actions.php?random=' + this.random_number + '&action=uncheck&mod_url=' + this.mod_url + '&itemID=' + itemID, function(data)
		{			
			$('#item' + itemID).slideUp(function()
			{
				list.throttle = false;
				$(this).remove();
				var unchecked = $('#unchecked');
				unchecked.html(data + unchecked.html());
				$('#item' + itemID).slideDown();
				list.makeSortable();				
			});
		});
	}
	
	this.makeSortable = function()
	{
		$("#unchecked, #checked").sortable({
			handle : '.handle',
			axis : 'y',
			update : function (event, ui) 
			{				
				var list_element = $(ui.item).parent();
				var order = list_element.sortable('toArray'); // returns an array like [item8, item5, item4]
				var status = (list_element.attr('id') == 'unchecked') ? 0 : 1;
				var elementID = $(ui.item).attr('id'); // something like "item8"
				var orderID = order.indexOf(elementID); // figure out the elements order on the page
				elementID = elementID.substr(4); // chop off the "item" part of "item9"
				$.get("actions.php?random=" + list.random_number + "&action=set_position&mod_url=" + list.mod_url + "&itemID=" + elementID + "&orderID=" + orderID + "&status=" + status, function(data)
				{
					// move along, nothing to see here
				});
			}
		});
	}	
	
	this.focus = function()
	{
		var add_field = $('#add-field');
		add_field.val('Add new item');
		add_field.focus();
		add_field.select()		
	}
}

