jQuery.fn.editable=function(target,options,callback){if(this.length==0){return(this)}var settings={target:target,name:"value",id:"id",type:"text",width:"auto",height:"auto",event:"click",onblur:"cancel",loadtype:"GET",loadtext:"Loading...",loaddata:{},submitdata:{},nl2br:false,on_cancel:false,on_submit:false};if(options){jQuery.extend(settings,options)}var callback=callback||function(){};jQuery(this).attr("title",settings.tooltip);jQuery(this)[settings.event](function(e){var self=this;if(self.editing){return}var width=("auto"==settings.width)?jQuery(self).width():settings.width;var height=("auto"==settings.height)?jQuery(self).height():settings.height;self.editing=true;self.revert=jQuery(self).html();self.innerHTML="";var f=document.createElement("form");var wrapper=null;if(settings.cssclass){if("inherit"==settings.cssclass){jQuery(f).attr("class",jQuery(self).attr("class"))}else{jQuery(f).attr("class",settings.cssclass)}}if(settings.style){if("inherit"==settings.style){jQuery(f).attr("style",jQuery(self).attr("style"));jQuery(f).css("display",jQuery(self).css("display"))}else{jQuery(f).attr("style",settings.style)}}var i;switch(settings.type){case"textarea":i=document.createElement("textarea");if(settings.rows){i.rows=settings.rows}else{jQuery(i).height(height)}if(settings.cols){i.cols=settings.cols}else{jQuery(i).width(width)}break;case"select":i=document.createElement("select");break;default:i=document.createElement("input");i.type=settings.type;jQuery(i).width(width);jQuery(i).height(height);i.setAttribute("autocomplete","off")}if(settings.getload){settings.loadurl=settings.getload;settings.loadtype="GET"}else{if(settings.postload){settings.loadurl=settings.postload;settings.loadtype="POST"}}if(settings.loadurl){var t=setTimeout(function(){setInputContent(settings.loadtext,true)},100);var loaddata={};loaddata[settings.id]=self.id;if(jQuery.isFunction(settings.loaddata)){jQuery.extend(loaddata,settings.loaddata.apply(self,[self.revert,settings]))}else{jQuery.extend(loaddata,settings.loaddata)}jQuery.ajax({type:settings.loadtype,url:settings.loadurl,data:loaddata,success:function(str){window.clearTimeout(t);setInputContent(str)}})}else{if(settings.data){setInputContent(settings.data)}else{setInputContent(self.revert)}}i.name=settings.name;f.appendChild(i);if(settings.wrapper&&(settings.submit||settings.cancel)){wrapper=$(settings.wrapper);wrapper.appendTo(f)}if(settings.cancel){var b=document.createElement("input");b.type="button";b.value=settings.cancel;jQuery(b).click(function(){reset()});if(wrapper!=null){wrapper.append(b)}else{f.appendChild(b)}}if(settings.submit){var b=document.createElement("input");b.type="submit";b.value=settings.submit;if(wrapper!=null){wrapper.append(b)}else{f.appendChild(b)}}self.appendChild(f);i.focus();if(settings.select){i.select()}jQuery(i).keydown(function(e){if(e.keyCode==27){e.preventDefault();reset()}});var t;if("cancel"==settings.onblur){jQuery(i).blur(function(e){t=setTimeout(reset,500)})}else{if("submit"==settings.onblur){jQuery(i).blur(function(e){jQuery(f).submit()})}else{jQuery(i).blur(function(e){})}}jQuery(f).submit(function(e){if(t){clearTimeout(t)}e.preventDefault();if(jQuery.isFunction(settings.target)){var str=settings.target.apply(self,[jQuery(i).val(),settings]);self.innerHTML=str;self.editing=false;callback.apply(self,[self.innerHTML,settings])}else{var submitdata={};submitdata[i.name]=jQuery(i).val();submitdata[settings.id]=self.id;if(jQuery.isFunction(settings.submitdata)){jQuery.extend(submitdata,settings.submitdata.apply(self,[self.revert,settings]))}else{jQuery.extend(submitdata,settings.submitdata)}jQuery(self).html(settings.indicator);jQuery.post(settings.target,submitdata,function(str){self.innerHTML=str;self.editing=false;callback.apply(self,[self.innerHTML,settings])})}if(settings.on_submit!=false){eval(settings.on_submit)}return false});function reset(){self.innerHTML=self.revert;self.editing=false;if(settings.on_cancel!=false){eval(settings.on_cancel)}}function setInputContent(str,disabled){i.disabled=disabled||false;if(jQuery.isFunction(str)){var str=str.apply(self,[self.revert,settings])}switch(settings.type){case"select":if(String==str.constructor){eval("var json = "+str);for(var key in json){if("selected"==key){continue}o=document.createElement("option");o.value=key;var text=document.createTextNode(json[key]);o.appendChild(text);if(key==json.selected){o.selected=true}i.appendChild(o)}}break;case"textarea":if(settings.nl2br){if($.browser.msie){i.value=str.replace(/<br>/gi,"\n")}else{i.value=str.replace(/<br>/gi,"")}break}default:i.value=str;break}}});return(this)};