function changeStatus(id, status) {
	$.ajax({
        	url: 'index.php?section=item_list',
		data: 'ajax=1&setstatus=true&status=' + status + '&id=' + id,
		type: 'POST',

         	success: function(response) {
			if (response) {
				if (!status) {
					$("#item_" + id + " span").removeClass("item_done").addClass("item_pending");
					$("#item_" + id + " input[type=checkbox]").removeAttr("checked");
				} else {
					$("#item_" + id + " span").removeClass("item_pending").addClass("item_done");
					$("#item_" + id + " input[type=checkbox]").attr("checked", "checked");
				}
			} else {
				$("#item_" + id + " input[type=checkbox]").blur();
			}
         	},

		error: function(response) {
			alert("Error setting status!");
		}
     	});
}

function insertItem(list, text) {
	text = jQuery.trim(text);

	$.ajax({
		url: 'index.php?section=item_list&list=' + list,
		data: 'ajax=1&insert=1&item=' + encodeURIComponent(text),
		type: 'POST',
		dataType: 'json',

		success: function(item) {
			if (item) {
				var id = item.id;

				exit_edit_mode();

				var newitem = 
					'<li id="item_' + id + '" class="item">' +
                                		'<form name="form_' + id + '" action="index.php?section=item_list&amp;list=' + list + '#item_' + id + '" method="post">' +
                                        	'<input type="hidden" id="item_id" name="id" value="' + id + '" />' +
						'<input type="hidden" id="order" value="' + item.order + '" />';

				newitem +=
					'<div class="list-controls">' +
                                        	' <img class="reorder" src="img/updown4.png" alt="(Reorder)" title="Drag to reorder" />' +

						' <a class="delete-link" title="Click to delete item" href="index.php?section=item_list&amp;page=confirm_delete&amp;list=' + list + '&amp;id=' + id + '"><img src="img/delete_icon.png" alt="(Delete)" /></a>' +
						' <a class="edit-button" title="Click to edit item" href="index.php?section=item_list&amp;list=' + list + '&amp;edit=' + id + '#itemid"><img src="img/edit.png" alt="(Edit)" /></a>' +
					'</div>' +
					'<div class="text-with-status">';

				if (list == "NULL") {
                	        	newitem += 
						'<span>' +
							'<a href="index.php?section=item_list&amp;list=' + id + '">' + text + '</a>' +
						'</span>';
	                        } else {
        	                	newitem +=
						'<input name="done" type="checkbox" />' + 
                	                	'<span class="item_pending"> ' + 
							text + 
						'</span>';
	                        }
				newitem += '</div></form></li>';
				$("#items_list").append(newitem);

				$("#newitem input[type=text]").val("");

				item_add_hover ($("#item_" + id));

				$("#item_" + id + " input[type=checkbox]").
                			click(function(event) {
	                        	        event.preventDefault();
	        	                        var id = this.form.name.split("_")[1];
        	        	                var status = this.checked;
                	        	        changeStatus(id, status);
	                        	}
        		        );

				$("#item_" + id + " .edit-button").
			                click(function(event) {
						event.preventDefault();
						var id = this.href.split("edit=")[1].split("#")[0];
						var list = this.href.split("list=")[1].split("&")[0];
						var item_done_status = $("#item_" + id + " span").hasClass("item_done");
                		                editMode(list, id, item_done_status);
                		        }
		                );

				$("#item_" + id + " .delete-link").
			                click(function(event) {
                        		        event.preventDefault();
						var id = this.href.split("id=")[1].split("#")[0];
		                                if (confirm("Are you sure you want to delete it?"))
                		                        deleteItem(id);
		                        }
		                );
			
				focus_default();
			} else {
				alert("Error inserting new item!");
			}
		},
		
		error: function (response) {
			alert("Error trying to communicate with the server");
		}
	});
}

function editItem(id, list, newtext, done) {
	newtext = jQuery.trim(newtext);

	$.ajax({
		url: 'index.php?section=item_list&list=' + list,
		data: 'ajax=1&id=' + id + '&insert=1&item=' + encodeURIComponent(newtext) + '&done=' + done,
		type: 'POST',

		success: function(result) {
			if (!result) {
				alert("Cannot update item");
			} else {
				$(".editing .edit_form").remove();
				if (list == 'NULL') {
				        $(".editing span a").text(newtext);
				} else {
					$(".editing span").text(newtext);
				}
				$(".editing span").show();
			        $(".editing").removeClass("editing");
			}
		},
		
		error: function (response) {
			alert("Error trying to communicate with the server");
		}
	});
}

function deleteItem(id) {
	$.ajax({
                url: 'index.php?section=item_list',
                data: 'ajax=1&delete=1&id=' + id,
                type: 'POST',

                success: function(response) {
			if (response) {
				exit_edit_mode();
				$("#item_" + id).remove();
			} else {
				alert("Error deleting item!");	
			}
                },

                error: function(response) {
			alert("Error trying to communicate with the server");
                }
        });
}

function exit_edit_mode () {
	$(".editing .edit_form").remove();
	$(".editing span").show();
	$(".editing").removeClass("editing");
}

function editMode(list, id, done) {

	var item_text = $("#item_" + id + " span").text();
	var item_html = $("#item_" + id + " span").html();
	item_text = jQuery.trim(item_text);

	exit_edit_mode();
	
	// Put this item in "edition" mode
	$("#item_" + id).addClass("editing");
	
	// Put input box and buttons
	list_type = (list == "NULL")? "list" : "item";
	done_class = done? "item_done" : "item_pending";
	var input_box = 
	' <span style="display: none;"';

	if (list != 'NULL') 
		input_box += ' class="' + done_class + '"';

	input_box += '>' + item_html + '</span>' +
	'<span class="edit_form">' + 
		'<!-- Fix for IE bug (One text input and submit, disables submit on pressing "Enter") -->' +
		' <input type="text" style="display:none;" name="iebug-solver" />' + 
              	' <input name="item" id="editing_text" type="text" value="' + htmlspecialchars(item_text, 'ENT_QUOTES') + '" class="item" />' +
                ' <input type="submit" name="insert" value="Done" />' +
                ' <input type="submit" name="cancel" value="Cancel" />' +
	'</span> ';
	$("#item_" + id + " span").replaceWith(input_box);
	$("#editing_text").focus();

	$("#item_" + id + " input[name=cancel]").
			click(function(event) {
				event.preventDefault();
				exit_edit_mode();
			}
		);

	$("#item_" + id + " input[name=insert]").
		click(function(event) {
				event.preventDefault();
				var newtext = $("#item_" + id + " #editing_text").val();
				var done = $("#item_" + id + " span").hasClass("item_done");
				if (newtext == '')
					alert ("You cannot have an empty item. To remove it, use the \"delete\" option");
				else
					editItem (id, list, newtext, done);
			}
		);
}

function focus_default() {

	if ($("#editing_text").length)		// Edit item focus
		$("#editing_text").focus();
	else if ($("#newitem input[type=text]").length)         // Newitem focus
                $("#newitem input[type=text]").focus();
	else if ($("#login_form input[type=text]").length)	// Login form focus
		$("#login_form input[type=text]").focus();
	else if ($("#new-user-form #username").length)			// Newuser form focus
		$("#new-user-form #username").focus();

}

// Adds hover/leave events to items
function item_add_hover (item) {
	item.hover(
		function(event) {
			var id = $("#item_id", this).val();
			$("#item_" + id + " .delete-link").show();
			$("#item_" + id + " .edit-button").show();
			$("#item_" + id + " .reorder").show();
                },

		function(event) {
			var id = $("#item_id", this).val();
			$("#item_" + id + " .delete-link").hide();
			$("#item_" + id + " .edit-button").hide();
			$("#item_" + id + " .reorder").hide();
                }
	);
}

function save_ordering(id, newpos) {
        $.ajax({
                url: 'index.php?section=item_list&list=' + list_id,
                data: 'ajax=1&reorder=1&id=' + id + '&newpos=' + newpos,
                type: 'POST',
                dataType: 'json',

                success: function(neworder) {
                        if (neworder) {
                                for (order in neworder) {
                                        var id = neworder[order].id;
                                        $("#item_" + id + " #order").val(order);
                                }
			} else {
                                alert ("Can't save new order");
                        }
                },

                error: function(response) {
			alert("Error trying to communicate with the server");
                }
        });
}

function update_sortable (list, ui) {
        var id = $("#item_id", ui.item).val();

        // Find the correct new order for this element
        var order = $(list).sortable('toArray');
        var prev, value;
        for (i in order) {
                value = order[i];
                if (!value) continue;
                if (value == "item_" + id) {
                        break;
                }
                prev = value;
        }

        var newpos_id = order[1];
        if (prev)
                newpos_id = prev;

	newpos_id = newpos_id.split("_")[1];
        var newpos_order = $("#item_" + newpos_id + " #order").val();
        if (prev)
                newpos_order++;
        else
                newpos_order = 0;
        
	save_ordering(id, newpos_order);
}

$(document).ready(function() {

	if (typeof list_owner != 'undefined') {
		// Show and hide management icons on hover / leave
		item_add_hover($(".item"));

		// Set status by clicking in the item checkbox
		$(".item input[type=checkbox]").
			removeAttr("disabled").
			click(function(event) {
					event.preventDefault();
					var id = this.form.name.split("_")[1];
					var status = this.checked;
					changeStatus(id, status);
				}
			);
	
		// Insert a new item by pressing enter or clicking in the 'Add' button
		$("#newitem").
			submit(function(event) {
					event.preventDefault();
					var text = this.item.value;
					var list = this.list.value;
					insertItem(list, text);
				}
			);
	
		// Go to "edit" mode
		$(".edit-button").
			click(function(event) {
       	                         event.preventDefault();
					var id = this.href.split("edit=")[1].split("#")[0];
					var list = this.href.split("list=")[1].split("&")[0];
					var item_done_status = $("#item_" + id + " span").hasClass("item_done");
       	                         editMode(list, id, item_done_status);
       	                 }
       	         );
	
		$(".delete-link").
       	        click(function(event) {
       	                         event.preventDefault();
					var id = this.href.split("id=")[1].split("#")[0];
       	                         if (confirm("Are you sure you want to delete it?"))
       	                                 deleteItem(id);
       	                 }
       	    	);
	
		$("#items_list").
      		sortable ({
       	                // handle: '.item_pending',
			delay: '0.2',
       	                opacity: '0.8',
       	                tolerance: 'pointer',
			handle: '.reorder',
       	                update: function(event, ui) {
       	                		update_sortable(this, ui);
       	                	}
       	                }
       	        );
	} else {
		focus_default();
	}
}).
keyup(function(event) {
	if (event.keyCode == 27) { exit_edit_mode(); }   // ESC
});

