/* jQuery editable Copyright Dylan Verheul <dylan@dyve.net>
 * Licensed like jQuery, see http://docs.jquery.com/License
 */

$.fn.editable = function(url, options) {
	// Options
	options = arrayMerge({
		"url": url,
		"paramName": "q",
		"callback": null,
		"submit" : function(me) { },
		"saving": "Saving ...",
		"type": "text",
		"submitButton": false,
		"delayOnBlur": 0,
		"extraParams": {},
		"editClass": null
	}, options);
	// Set up
	
	this.click(function(e) {
			if (this.editing) return;
			if (!this.editable) this.editable = function() {
				var me = this;
				me.editing = true;
				me.orgHTML = $(me).html();
				me.innerHTML = "";
				if (options.editClass) $(me).addClass(options.editClass);
				var f = document.createElement("form");
				var i = createInputElement(me.orgHTML);
				var t = 0;
				f.appendChild(i);
				if (options.submitButton) {
					var b = document.createElement("input");
					b.type = "submit";
					b.value = "Save";
					b.className = "button";
					f.appendChild(b);
					//$(b).corner('3px');
				}
				me.appendChild(f);
				
				//$(i).corner('3px');
				
				i.select();
				if ($(i).val() == "No value")
				{
					$(i).val("")
				}
				
				var canceled = false;
				
				$(i).blur(function(e) { 
						if (canceled)
							return;
							
						if (t) clearTimeout(t);
						e.preventDefault();
						var v = $(i).val();
						$(me).html(options.saving);
						me.editing = false;
						options.submit($(me), i.name, v);
					})
				$(i).keydown(function(e) {
						if (e.keyCode == 27) { // ESC
							canceled = true;
							e.preventDefault;
							me.innerHTML = me.orgHTML;
							if (options.editClass) $(me).removeClass(options.editClass);
							me.editing = false;	
						}
					});
				$(f).submit(function(e) {
					alert("submit");
					if (t) clearTimeout(t);
					e.preventDefault();
					var v = $(i).val();
					$(me).html(options.saving);
					me.editing = false;
					options.submit($(me), i.name, v);
				});
				function reset() {
					me.innerHTML = me.orgHTML;
					if (options.editClass) $(me).removeClass(options.editClass);
					me.editing = false;					
				}
			};
			this.editable();
		})
	;
	// Don't break the chain
	return this;
	// Helper functions
	function arrayMerge(a, b) {
		if (a) {
			if (b) for(var i in b) a[i] = b[i];
			return a;
		} else {
			return b;		
		}
	};
	function createInputElement(v) {
		if (options.type == "textarea") {
			var i = document.createElement("textarea");
			options.submitButton = false;
			options.delayOnBlur = 0; // delay onBlur so we can click the button
		} else {
			var i = document.createElement("input");
			i.type = "text";
		}
		$(i).val(v);
		i.name = options.paramName;
		i.className = "editInput";
		return i;
	}
};

