var AjaxTodoList = AjaxList.extend({
	constructor: function(list_name, interval){this.base(list_name, interval);}
})

var SimpleGraphicAjaxTodoList = AjaxTodoList.extend({
	todo_container: null,
	done_container: null,	
	input_node: null,

	constructor: function(list_name, elements, interval) {
		this.base(list_name, interval);
        	
		this.todo_container = $(elements[0]);
		this.done_container = $(elements[1] || elements[0] + "_done");
		this.input_node = $(elements[2] || elements[0] + "_input");

		this.input_node.value = "author>assignees:title";
    },

	get_passcode: function() {
		if(!this.passcode){this.passcode = prompt("Please enter your passcode.", "");}
		return this.passcode;
	},

	list_updated: function(){this.refresh_todo_list_gui();},
	item_edited: function(item){this.refresh_todo_item_gui(item);},
	item_added: function(item){this.create_todo_item_gui(item);},
	item_deleted: function(item){this.undisplay_todo_item_gui(item);},

	refresh_todo_list_gui: function() {//TODO: should stop update while drawing.

		$H(this.items).each(function(item){
				item = item.value;
				if($('ajax_list_item_node_' + item.id)){this.refresh_todo_item_gui(item);}
				else{this.create_todo_item_gui(item);}
			}.bind(this));
	},

	undisplay_todo_item_gui: function() {
		$H(this.items).each(function(item){
				item = item.value;
				this.undisplay_todo_item(item);
			}.bind(this));
	},

	update_todo_list: function(item) {

	},

	create_todo_item_gui: function(item) {
		var item_node =  Builder.node('div', {className:'ajax_list_item_node', id:'ajax_list_item_node_' + item.id});
	
		var assignee_span = //(item.assignee)?
					Builder.node('span', {style:'color:#9e009e', id:'ajax_list_item_assignee_node_' + item.id}, '(' + item.assignee + ') ')
					//:Builder.node('span');
	
		var author_span = //(item.author && item.author != 'anonymous')?
					Builder.node('span', {style:'color:#CC3333;font-style:italic', id:'ajax_list_item_author_node_' + item.id}, [ item.author, Builder.node('img', {src:'todo/images/comment.png'}) ] )
					//:Builder.node('span');

		var check_box_node = Builder.node('input', {style:'float:left',id:'ajax_list_item_checkbox_node_'+item.id, type:'checkbox', align:'middle'});
		check_box_node.onclick = function() {
				var checked = $F('ajax_list_item_checkbox_node_'+item.id);
				item.done = (checked)?1:0;
				this.edit_item_datasource(item, this.get_passcode());
		}.bind(this);
		
		var delete_a = Builder.node('a', {href:'#'}, [Builder.node('img', {src:'todo/images/tag_blue_delete.png', title:item.author + ' : ' + item.created})]);
		delete_a.onclick = function(){this.delete_item_datasource(this.get_item(item.id), this.get_passcode()); return false;}.bind(this);
		
		var item_text_node = Builder.node('span', {style:'display:block',id:'ajax_list_item_title_node_'+item.id}, [author_span, assignee_span, item.title]);
		item_text_node.onclick = function(event){this.start_todo_item_edit(event, item.id);}.bind(this);

		item_node.appendChild( Builder.node('span', {style:'float:right'}, [delete_a]) );
		item_node.appendChild(check_box_node);
		item_node.appendChild(item_text_node);
		
		if(item.done == 1){this.done_container.appendChild(item_node); check_box_node.checked = true;}
		else{this.todo_container.appendChild(item_node);}
	},

	update_item_in_container: function(item) {
		var item_node = $('ajax_list_item_node_' + item.id);

		var item_container = null;
		if(item.done == 1 && item_node.parentNode !=  this.done_container){item_container = this.done_container;}
		else if(item.done == 0 && item_node.parentNode !=  this.todo_container){item_container = this.todo_container;}

		if(item_container != null) {
			var item_nodes = item_container.childNodes;
			
			//find the first item bigger than us, and insert us before it.
			var following_item_node = $A(item_nodes).find(function(node){
					if(node.id.replace('ajax_list_item_node_', '') > item.id) { return node;}
					return false;
				});
		}

		if(following_item_node){following_item_node.parentNode.insertBefore(item_node, following_item_node);}
		else{item_container.appendChild(item_node);}
	},

	refresh_todo_item_gui: function(item) {
		$('ajax_list_item_assignee_node_' + item.id).innerHTML = '(' + item.assignee + ') ';
		$('ajax_list_item_author_node_' + item.id).childNodes[0].data = item.author;
		$('ajax_list_item_title_node_' + item.id).childNodes[2].data = item.title;
		$('ajax_list_item_checkbox_node_'+item.id).checked = (item.done == 1);

		this.update_item_in_container(item);
	},

	update_todo_item: function(item) {

	},

	undisplay_todo_item_gui: function(item) {
		var item_node = $('ajax_list_item_node_' + item.id);
		item_node.parentNode.removeChild(item_node);
	},
	
	start_todo_item_edit: function(e, item_id) {
		var item = this.get_item(item_id);
		var item_node = $('ajax_list_item_node_' + item.id);
		
		var input_node = Builder.node('input', {id:'ajax_list_item_edit_input_' + item.id, type:'text', size:'37', value: item.author + '>' +  item.assignee + ':' +item.title});
		input_node.onblur = function(event){this.end_todo_item_edit(event, item.id);}.bind(this);
		
		var form_node = Builder.node('form', [input_node]);
		form_node.onsubmit = function(event){this.end_todo_item_edit(event, item.id);}.bind(this);
		
		Element.hide( item_node );
		item_node.parentNode.insertBefore(form_node, item_node);

		if(input_node){input_node.focus();};
	},

	end_todo_item_edit: function(e, item_id) {
		if($('ajax_list_item_edit_input_' + item_id) != null)
		{
			var item = this.get_item(item_id);
			var item_node = $('ajax_list_item_node_' + item.id);
	
			var text = $F('ajax_list_item_edit_input_' + item.id);
			var author_terminator = text.indexOf('>');
			var assignee_terminator = text.indexOf(':');
	
			item.author = text.substring(0, author_terminator);
			item.assignee = text.substring(author_terminator + 1, assignee_terminator);
			item.title = text.substring(assignee_terminator + 1);
	
			var input_node = $('ajax_list_item_edit_input_' + item.id);
			var form_node = input_node.parentNode;
	
			Element.show( item_node );
			item_node.parentNode.removeChild(form_node);
	
			this.edit_item_datasource(item, this.get_passcode());
	
			$(this.input_node).value = item.author + '>' + item.assignee + ':';
		}
		return false;
	},

	add_todo_item_from_string: function(text) {
		var item = {};

		var author_terminator = text.indexOf('>');
		var assignee_terminator = text.indexOf(':');

		item.author = text.substring(0, author_terminator);
		item.assignee = text.substring(author_terminator + 1, assignee_terminator);
		item.title = text.substring(assignee_terminator + 1);

		this.add_item_datasource(item, this.get_passcode())

		this.input_node.value = item.author + ">" + item.assignee + ":";
	}
});	