1 (function($){$.fn
.editable=function(target
,options
){if('disable'==target
){$(this).data('disabled.editable',true);return;}
2 if('enable'==target
){$(this).data('disabled.editable',false);return;}
3 if('destroy'==target
){$(this).unbind($(this).data('event.editable')).removeData('disabled.editable').removeData('event.editable');return;}
4 var settings
={target
:target
,name
:'value',id
:'id',type
:'text',width
:'auto',height
:'auto',event
:'click',onblur
:'cancel',loadtype
:'GET',loadtext
:'Loading...',placeholder
:'Click to edit',loaddata
:{},submitdata
:{},ajaxoptions
:{}};if(options
){$.extend(settings
,options
);}
5 var plugin
=$.editable
.types
[settings
.type
].plugin
||function(){};var submit
=$.editable
.types
[settings
.type
].submit
||function(){};var buttons
=$.editable
.types
[settings
.type
].buttons
||$.editable
.types
['defaults'].buttons
;var content
=$.editable
.types
[settings
.type
].content
||$.editable
.types
['defaults'].content
;var element
=$.editable
.types
[settings
.type
].element
||$.editable
.types
['defaults'].element
;var reset
=$.editable
.types
[settings
.type
].reset
||$.editable
.types
['defaults'].reset
;var callback
=settings
.callback
||function(){};var onedit
=settings
.onedit
||function(){};var onsubmit
=settings
.onsubmit
||function(){};var onreset
=settings
.onreset
||function(){};var onerror
=settings
.onerror
||reset
;if(settings
.tooltip
){$(this).attr('title',settings
.tooltip
);}
6 settings
.autowidth
='auto'==settings
.width
;settings
.autoheight
='auto'==settings
.height
;return this.each(function(){var self
=this;var savedwidth
=$(self
).width();var savedheight
=$(self
).height();$(this).data('event.editable',settings
.event
);if(!$.trim($(this).html())){$(this).html(settings
.placeholder
);}
7 $(this).bind(settings
.event
,function(e
){if(true===$(this).data('disabled.editable')){return;}
8 if(self
.editing
){return;}
9 if(false===onedit
.apply(this,[settings
,self
])){return;}
10 if(settings
.tooltip
){$(self
).removeAttr('title');}
11 if(0==$(self
).width()){settings
.width
=savedwidth
;settings
.height
=savedheight
;}else{if(settings
.width
!='none'){settings
.width
=settings
.autowidth
?$(self
).width():settings
.width
;}
12 if(settings
.height
!='none'){settings
.height
=settings
.autoheight
?$(self
).height():settings
.height
;}}
13 if($(this).html().toLowerCase().replace(/(;|")/g,'')==settings
.placeholder
.toLowerCase().replace(/(;|")/g,'')){$(this).html('');}
14 self
.editing
=true;self
.revert
=$(self
).html();$(self
).html('');var form
=$('<form />');if(settings
.cssclass
){if('inherit'==settings
.cssclass
){form
.attr('class',$(self
).attr('class'));}else{form
.attr('class',settings
.cssclass
);}}
15 if(settings
.style
){if('inherit'==settings
.style
){form
.attr('style',$(self
).attr('style'));form
.css('display',$(self
).css('display'));}else{form
.attr('style',settings
.style
);}}
16 var input
=element
.apply(form
,[settings
,self
]);var input_content
;if(settings
.loadurl
){var t
=setTimeout(function(){input
.disabled
=true;content
.apply(form
,[settings
.loadtext
,settings
,self
]);},100);var loaddata
={};loaddata
[settings
.id
]=self
.id
;if($.isFunction(settings
.loaddata
)){$.extend(loaddata
,settings
.loaddata
.apply(self
,[self
.revert
,settings
]));}else{$.extend(loaddata
,settings
.loaddata
);}
17 $.ajax({type
:settings
.loadtype
,url
:settings
.loadurl
,data
:loaddata
,async
:false,success:function(result
){window
.clearTimeout(t
);input_content
=result
;input
.disabled
=false;}});}else if(settings
.data
){input_content
=settings
.data
;if($.isFunction(settings
.data
)){input_content
=settings
.data
.apply(self
,[self
.revert
,settings
]);}}else{input_content
=self
.revert
;}
18 content
.apply(form
,[input_content
,settings
,self
]);input
.attr('name',settings
.name
);buttons
.apply(form
,[settings
,self
]);$(self
).append(form
);plugin
.apply(form
,[settings
,self
]);$(':input:visible:enabled:first',form
).focus();if(settings
.select
){input
.select();}
19 input
.keydown(function(e
){if(e
.keyCode
==27){e
.preventDefault();reset
.apply(form
,[settings
,self
]);}});var t
;if('cancel'==settings
.onblur
){input
.blur(function(e
){t
=setTimeout(function(){reset
.apply(form
,[settings
,self
]);},500);});}else if('submit'==settings
.onblur
){input
.blur(function(e
){t
=setTimeout(function(){form
.submit();},200);});}else if($.isFunction(settings
.onblur
)){input
.blur(function(e
){settings
.onblur
.apply(self
,[input
.val(),settings
]);});}else{input
.blur(function(e
){});}
20 form
.submit(function(e
){if(t
){clearTimeout(t
);}
21 e
.preventDefault();if(false!==onsubmit
.apply(form
,[settings
,self
])){if(false!==submit
.apply(form
,[settings
,self
])){if($.isFunction(settings
.target
)){var str
=settings
.target
.apply(self
,[input
.val(),settings
]);$(self
).html(str
);self
.editing
=false;callback
.apply(self
,[self
.innerHTML
,settings
]);if(!$.trim($(self
).html())){$(self
).html(settings
.placeholder
);}}else{var submitdata
={};submitdata
[settings
.name
]=input
.val();submitdata
[settings
.id
]=self
.id
;if($.isFunction(settings
.submitdata
)){$.extend(submitdata
,settings
.submitdata
.apply(self
,[self
.revert
,settings
]));}else{$.extend(submitdata
,settings
.submitdata
);}
22 if('PUT'==settings
.method
){submitdata
['_method']='put';}
23 $(self
).html(settings
.indicator
);var ajaxoptions
={type
:'POST',data
:submitdata
,url
:settings
.target
,success:function(result
,status
){$(self
).html(result
);self
.editing
=false;callback
.apply(self
,[self
.innerHTML
,settings
]);if(!$.trim($(self
).html())){$(self
).html(settings
.placeholder
);}},error:function(xhr
,status
,error
){onerror
.apply(form
,[settings
,self
,xhr
]);}}
24 $.extend(ajaxoptions
,settings
.ajaxoptions
);$.ajax(ajaxoptions
);}}}
25 $(self
).attr('title',settings
.tooltip
);return false;});});this.reset=function(form
){if(this.editing
){if(false!==onreset
.apply(form
,[settings
,self
])){$(self
).html(self
.revert
);self
.editing
=false;if(!$.trim($(self
).html())){$(self
).html(settings
.placeholder
);}
26 if(settings
.tooltip
){$(self
).attr('title',settings
.tooltip
);}}}}});};$.editable
={types
:{defaults
:{element:function(settings
,original
){var input
=$('<input type="hidden"></input>');$(this).append(input
);return(input
);},content:function(string
,settings
,original
){$(':input:first',this).val(string
);},reset:function(settings
,original
){original
.reset(this);},buttons:function(settings
,original
){var form
=this;if(settings
.submit
){if(settings
.submit
.match(/>$/)){var submit=$(settings.submit).click(function(){if(submit.attr("type")!="submit"){form.submit();}});}else{var submit=$('<button type="submit" />');submit.html(settings.submit);}
27 $(this).append(submit);}
28 if(settings.cancel){if(settings.cancel.match(/>$/)){var cancel=$(settings.cancel);}else{var cancel=$('<button type
="cancel" />');cancel.html(settings.cancel);}
29 $(this).append(cancel);$(cancel).click(function(event){if($.isFunction($.editable.types[settings.type].reset)){var reset=$.editable.types[settings.type].reset;}else{var reset=$.editable.types['defaults
'].reset;}
30 reset.apply(form,[settings,original]);return false;});}}},text:{element:function(settings,original){var input=$('<input
/>');if(settings.width!='none
'){input.width(settings.width);}
31 if(settings.height!='none
'){input.height(settings.height);}
32 input.attr('autocomplete
','off
');$(this).append(input);return(input);}},textarea:{element:function(settings,original){var textarea=$('<textarea
/>');if(settings.rows){textarea.attr('rows
',settings.rows);}else if(settings.height!="none"){textarea.height(settings.height);}
33 if(settings.cols){textarea.attr('cols
',settings.cols);}else if(settings.width!="none"){textarea.width(settings.width);}
34 $(this).append(textarea);return(textarea);}},select:{element:function(settings,original){var select=$('<select
/>');$(this).append(select);return(select);},content:function(data,settings,original){if(String==data.constructor){eval('var json
= '+data);}else{var json=data;}
35 for(var key in json){if(!json.hasOwnProperty(key)){continue;}
36 if('selected
'==key){continue;}
37 var option=$('<option
/>').val(key).append(json[key]);$('select
',this).append(option);}
38 $('select
',this).children().each(function(){if($(this).val()==json['selected
']||$(this).text()==original.revert){$(this).attr('selected
','selected
');};});}}},addInputType:function(name,input){$.editable.types[name]=input;}};})(jQuery);