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'};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');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 data={};data[settings.id]=self.id;jQuery.ajax({type:settings.loadtype,url:settings.loadurl,data:data,success:function(str){setInputContent(str);}});}else if(settings.data){setInputContent(settings.data);}else{setInputContent(self.revert);}
i.name=settings.name;f.appendChild(i);if(settings.submit){var b=document.createElement('input');b.type='submit';b.value=settings.submit;f.appendChild(b);}
if(settings.cancel){var b=document.createElement('input');b.type='button';b.value=settings.cancel;jQuery(b).click(function(){reset();});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 p={};p[i.name]=jQuery(i).val();p[settings.id]=self.id;jQuery(self).html(settings.indicator);jQuery.post(settings.target,p,function(str){self.innerHTML=str;self.editing=false;callback.apply(self,[self.innerHTML,settings]);});}
return false;});function reset(){self.innerHTML=self.revert;self.editing=false;};function setInputContent(str){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;default:i.value=str;break;}}});return(this);};