(function($){
	jQuery.fn.extend({
		inlineEdit: function() {
			this.live("click", function() {
				var $this = $(this),
				data = $this.data("inlineeditdata");
				if (!data) {
					var html =
					'<div>'+
					'<div class="inlineEditInputContainer">'+
					'<div class="item"><div class="field">'+
					'<textarea name="inlineEditValue" style="width: 180px; height: 40px;"></textarea>'+
					'</div></div>'+
					'<div class="buttons">'+
					'<span class="button primary"><span>'+
					'<strong><input type="submit" name="submit" value="Save" /></strong>'+
					'</span></span>'+
					'<span class="button secondary"><span>'+
					'<a href="javascript:void(0);" class="cancel">Cancel</a>'+
					'</span></span>'+
					'</div>'+
					'</div>';
					if(document.all) {
						html += '<iframe></iframe>';
					}
					html += '</div>';
					data = {
						opts: $this.ParseClass(true),
						container: $(html),
						hide: function() {
							data.parent.css("zIndex", '');
							data.container.hide();
							return false;
						},
						show: function() {
							data.parent.css("zIndex", 1);
							data.textarea.val(data.value);
							data.container.show();
							data.textarea.focus();
							
							if (data.iframe) {
								data.iframe.width(data.container.find(".inlineEditInputContainer").outerWidth());
								data.iframe.height(data.container.find(".inlineEditInputContainer").outerHeight());
							}
							return false;
						},
						sendData: function() {
							$.post(data.opts.saveURL, {'inlineEditValue':data.textarea.val()}, data.receiveData, "json");
							return false;
						},
						receiveData: function(returnedData, textStatus, XMLHttpRequest) {
							if (returnedData.success === true) {
								data.value = returnedData.value;
								data.parent.find("span.inlineEditReplace").html(returnedData.value);
								data.hide();
								
								if (returnedData.editHTML) {
									$this.find("a.edit").html(returnedData.editHTML);
								}
								
								var td = data.parent.parents("td:first"),
								table = td.parents("table.datatable:first");
								if (table.length && table[0].dataTableObject) {
									var oTable = table[0].dataTableObject,
									pos = oTable.fnGetPosition(td[0]);
									oTable.fnUpdate(td.html(), pos[0], pos[2]);
									if (oTable.fnClearCacheObject) {
										oTable.fnClearCacheObject();
									}
								}
							} else {
								$.ConfirmDialog({
									confirmTitle: returnedData.title || 'Alert',
									confirmMessage: returnedData.message,
									cancelText: false,
									continueText: 'Okay'
								});
							}
						},
						parent: $this.find("span.inlineEditContainer")
					};
					data.textarea = data.container.find("textarea");
					data.value = data.opts.value;
					
					data.iframe = data.container.find("iframe");
					
					data.container.find("a.cancel").click(data.hide);
					data.container.find("input[type='submit']").click(data.sendData);
					data.container.click(function() {
						data.textarea.focus();
						return false;
					});
					$(document).click(function(e) {
						var parents = $(e.target).parents().filter(function() {
							return ($this[0] == this);
						});
						if (e.target != $this[0] && parents.length == 0) {
							data.hide();
						}
					}).keydown(function(e) {
						if (e.keyCode == '27') {
							data.hide();
						}
					});
					data.parent.append(data.container);
					$this.data("inlineeditdata", data);
				}
				
				data.show();
				
				return false;
			});
		}
	});
	$(".inlineEdit").inlineEdit();
})(jQuery);
