﻿var DynamicEdit = Class.extend
({
	servicePath: null,
	methodName: "Rename",
	className: "rcontent",
	backColor: "#ffffff",
	backColorActive: "#ffffe0",
	width: "300px",
	editor: null,
	einput: null,
	jobId: null,
	afterUpdate: function() { },

	init: function(config) {
		jQuery.extend(this, config);

		this.editor = null;

		this.registerEvents();
		//"#rhide>span>table>tbody>tr>td>p"
	},

	htmlDecode: function(text) {
		var str = new String(text);
		str = str.replace(/&amp;/g, "&");
		str = str.replace(/&lt;/g, "<");
		str = str.replace(/&gt;/g, ">");
		return str;
	},

	registerEvents: function(parent) {
		var de = this;
		var predicat = "span.";
		if (parent) {
			predicat = parent + ">span.";
			this.editor = null;
		}
		var labels = $(predicat + this.className);

		labels.bind("click.de", function(event) { de.onShowEdit(event, $(this)) });
		labels.bind("mouseover.de", function(event) { de.onMouseOver(event, $(this)) });
		labels.bind("mouseout.de", function(event) { de.onMouseOut(event, $(this)) });
	},

	onShowEdit: function(event, control) {
		control.css("display", "none").css("background", this.backColor);

		var previous = null;
		var de = this;

		if (this.editor == null) {
			this.editor = document.createElement("span");
			this.einput = document.createElement("input");
			$(this.einput).css("width", this.width);
			$(this.einput).bind("keypress", function(event) { de.onKeyPressed(event) });
			this.einput.type = "text";

			var saveButton = document.createElement("a");
			$(saveButton).text("Save");
			$(saveButton).css("borderWidth", "0px");
			$(saveButton).css("paddingLeft", "5px");
			$(saveButton).attr("href", "javascript://");
			$(saveButton).bind("click.save.de", function(event) { de.onSaveClick(event) });

			var cancelButton = document.createElement("a");
			$(cancelButton).text("Cancel");
			$(cancelButton).css("borderWidth", "0px");
			$(cancelButton).css("paddingLeft", "5px");
			$(cancelButton).attr("href", "javascript://");
			$(cancelButton).bind("click.cancel.de", function(event) { de.onCancelClick(event) });


			$(this.editor).append(this.einput);
			$(this.editor).append(saveButton);
			$(this.editor).append(cancelButton);
		}
		else {
			previous = $(this.editor).prev();
		}

		$(this.einput).val(this.htmlDecode(control.text()));
		$(this.editor).css("display", "")
		control.after(this.editor);
		this.einput.select();
		this.jobId = control.attr("jobId");

		if (previous == null || previous.get()[0] == control.get()[0])
			return;

		previous.css("display", "");
	},

	onSaveClick: function(event) {
		if (this.servicePath) {
			var proxy = new JsonProxy();
			var de = this;

			proxy.load({ url: de.servicePath + de.methodName,
				params: { "accountId": de.accountId, "jobId": de.jobId, "text": $(this.einput).val() },
				success: function(data, textStatus) {
					$(de.editor).prev().text(data.d);
					de.afterUpdate(de.jobId, data.d);
					de.onCancelClick(null);
				},
				error: function(msg, error, full) {
					de.onCancelClick(null);
				},
				timeout: de.defaultTimeout
			});
		}
	},

	onKeyPressed: function(evt) {
		if (evt.keyCode == 27) // Esc
		{
			this.onCancelClick(evt);
			evt.stopPropagation();
		}
		if (evt.keyCode == 13 || evt.keyCode == 2) // Enter and Mac Enter need to test under MAC
		{
			this.onSaveClick(evt);
			evt.stopPropagation();

            $('#aspnetForm').bind('submit', function() { 
                $(this).unbind('submit'); 
                return false;
            });
		}
	},

	onCancelClick: function(event) {
		$(this.editor).prev().css("display", "");
		$(this.editor).css("display", "none");
		this.jobId = null;
	},

	onMouseOver: function(event, control) {
		control.css("background", this.backColorActive);
	},

	onMouseOut: function(event, control) {
		control.animate({ "backgroundColor": this.backColor }, 200);
	}
})
