var AjaxList = Base.extend({
	items: {},
	interval: 60,
	list_name: null,

    constructor: function(_list_name, _interval) {
		this.interval = _interval || this.interval;
		this.list_name = _list_name;

        this.get_local_list_datasource();
		new PeriodicalExecuter(this.update_local_list_datasource.bind(this), this.interval);
    },

	passcode: null,
	get_passcode: function(){return passcode;},

	get_item: function(id) {
		return this.items[id];
	},
    
	get_local_list_url: 'todo/get_todo_list.php',
	get_local_list_datasource: function() {
		var pars = 'ajax_list_name=' + this.list_name;
		var myAjax = new Ajax.Request(this.get_local_list_url, { method: 'post', parameters: pars, onComplete: this.handle_get_local_list_response.bind(this) });
	},
	handle_get_local_list_response: function(req) {
		if(this.handle_response(req)) {
			var items_array = eval(req.responseText);
			this.update_list(items_array);
		}
	},

    update_local_list_url: 'todo/get_todo_list.php',
	update_local_list_datasource: function() {
		var pars = 'ajax_list_name=' + this.list_name;
		var myAjax = new Ajax.Request(this.update_local_list_url, { method: 'post', parameters: pars, onComplete: this.handle_update_local_list_response.bind(this) });
	},
	handle_update_local_list_response: function(req) {
		if(this.handle_response(req)) {
			var items_array = eval(req.responseText);
			this.update_list(items_array);
		}
	},

	add_item_url: 'todo/add_todo.php',
	add_item_datasource: function(new_item, passcode) {
		var pars = $H(new_item).toQueryString() + '&ajax_list_name=' + this.list_name + '&ajax_list_passcode=' + passcode;
		var myAjax = new Ajax.Request(this.add_item_url, { method: 'post', parameters: pars, onComplete: this.handle_add_item_response.bind(this) });
	},
	handle_add_item_response: function(req) {
		if(this.handle_response(req)) {
			var item = eval('(' + req.responseText + ')'); //why does it fail without the ()
			this.add_item(item);
		}
	},

	delete_item_url: 'todo/delete_todo.php',
	delete_item_datasource: function(old_item, passcode)
	{
		var pars = $H(old_item).toQueryString() + '&ajax_list_name=' + this.list_name + '&ajax_list_passcode=' + passcode;
		var myAjax = new Ajax.Request(this.delete_item_url, { method: 'post', parameters: pars, onComplete: this.handle_delete_item_response.bind(this) });
	},
	handle_delete_item_response: function(req) {
		if(this.handle_response(req)) {
			var item = eval('(' + req.responseText + ')'); //why does it fail without the ()
			this.delete_item(item);
		}
	},

	edit_item_url: 'todo/edit_todo.php',
	edit_item_datasource: function(edited_item, passcode)
	{
		var pars = $H(edited_item).toQueryString() + '&ajax_list_name=' + this.list_name + '&ajax_list_passcode=' + passcode;
		var myAjax = new Ajax.Request(this.edit_item_url, { method: 'post', parameters: pars, onComplete: this.handle_edit_item_response.bind(this) });
	},
	handle_edit_item_response: function(req) {
		if(this.handle_response(req)) {
			var item = eval('(' + req.responseText + ')'); //why does it fail without the ()
			this.edit_item(item);
		}
	},

	handle_response: function(req) {
		var response_lines = req.responseText.split("\n");
		if(response_lines[0] == "false"){this.error(response_lines[1]); return false;}
		else{return true;}
	},

	error: function(msg) {alert(msg);},

	add_item: function(item) {this.items[item.id] = item; this.item_added(item);},
	delete_item: function(item) {var item = this.items[item.id]; delete this.items[item.id]; this.item_deleted(item);},
	update_list: function(items_array) {
		this.items = {};
		$A(items_array).each(function(item){
				this.items[item.id] = item;
			}.bind(this));
		this.list_updated();
	},
	update_item: function(item) {
		if(item.modified > this.items[item.id].modified){
			this.items[item.id] = item; this.item_updated(item);
		}
	},
	
	edit_item: function(item) {
		if(item.modified > this.items[item.id].modified){
			this.items[item.id] = item; this.item_edited(item);
		}
	},

	//events
	list_initiated: function(){},
	list_updated: function(){},

	item_updated: function(item){},
	item_added: function(item){},
	item_deleted: function(item){},
	item_edited: function(item){},
});