(function($){$.fn.editable=function(opts)
{opts=$.extend({baseClass:'editable',hoverClass:'hover',editingClass:'editing',allowDelete:true,saveHandler:null},opts);if(this.length>1)
{this.each(function()
{$(this).editable(opts);});return;}
var $$=$(this);$$.data('editable-opts',opts);if(opts.baseClass)
{$$.addClass(opts.baseClass);}
if(opts.hoverClass)
{$$.hoverClass(opts.hoverClass);}
$$.editable_addEditButton();return this;};$.fn.editable_addEditButton=function()
{var $$=this;var edit_button=button({message:'Edit',silk:'pencil',click:function()
{edit_button.remove();$$.editable_edit();}}).appendTo(this);return this;};$.fn.editable_edit=function()
{var $$=this;var opts=$$.data('editable-opts');if($$.data('editable_edit-editing'))
{return;}
$$.data('editable_edit-editing',true);if(opts.editingClass)
{$$.addClass(opts.editingClass);}
try
{var id=$$.attr('id').match(/\d+/)[0];}
catch(e)
{var id=0;}
var contents=$$.children();var form=$('<div />').easyForm(opts);var fields=form.data('easyForm-fields');var markdown_keys=[];var markdown_loaded=false;$.each(fields,function(k,field)
{var selector=field.def.selector?field.def.selector:'.'+k;field.selector=selector;field.markup=$$.find(selector);switch(field.def.type)
{case'markdown':markdown_keys.push(k);field.obj.val(id?'LOADING FROM SERVER... Please wait.':(field.def['default']?field.def['default']:''));break;default:if(field.def.fromMarkup)
{field.def.fromMarkup(field)}
else
{field.obj.fromMarkup();}
break;}});contents.remove();form.children().appendTo($$);if(id&&markdown_keys)
{api({method:'db.get',type:opts.apiType,id:id},function(res)
{$.each(res,function(key,value)
{if(fields[key]&&fields[key].def.type=='markdown')
{fields[key].obj.val(value);fields[key].obj.textarea.resizable({minHeight:100,handles:'s'});}});markdown_loaded=true;});}
else
{markdown_loaded=true;}
function restore_markup()
{form.easyForm_destroy();form.remove();$$.empty()
contents.appendTo($$);$$.removeClass('editing hover');$$.data('editable_edit-editing',null);$$.editable_addEditButton();$$.trigger({type:'editabledone',markup:$$});}
var save=function()
{if(!form.easyForm_validate(true))
{alert('The new data is incomplete in some way. Please see where'+' it has been marked for more information.');return;}
if(!markdown_loaded)
{alert('Markdown has not loaded from server yet. Please wait...');return;}
var new_data=form.easyForm_val();var markdown={};$.each(fields,function(key,field)
{switch(field.def.type)
{case'markdown':markdown[key]=field.obj.val();field.obj.val('PARSING... Please wait.');default:if(field.def.toMarkup)
{field.def.toMarkup(field);}
else
{field.obj.toMarkup();}}});if(markdown)
{markdown.method='markdown';api(markdown,function(res)
{$.each(res,function(key,value)
{if(fields[key]&&fields[key].def.type=='markdown')
{fields[key].markup.html(value);}});});}
if(opts.saveHandler)
{opts.saveHandler(new_data);}
else
{new_data.method='db.set';new_data.type=opts.apiType;if(id)
{new_data.id=id;}
api(new_data,function(res)
{if(!id)
{$$.attr('id','new-editable-'+res.id)}});}
restore_markup();if(opts.onSave||opts.save)
{new_data.markup=$$;(opts.onSave?opts.onSave:opts.save)(new_data);}}
var cancel=function()
{restore_markup();}
var delete_=function()
{if(id)
{if(!confirm('Are you sure you want to delete this?'))
{return;}
api({method:'db.delete',type:opts.apiType,id:id});}
$$.remove();if(opts.onDelete||opts['delete'])
{(opts.onDelete?opts.onDelete:opts['delete'])($$);}}
var buttons=$('<div class="buttons" />').appendTo($$);button({message:'Save',silk:'tick',click:save}).appendTo(buttons);button({message:'Cancel',silk:'cross',click:id?cancel:delete_}).appendTo(buttons);if(opts.allowDelete&&id)
{button({message:'Delete',silk:'delete',click:delete_}).appendTo(buttons);}
return this;};})(jQuery);