(function($){function AssetType(opts)
{var obj=this;var path='';this.path=$('<div class="asset-path" />').appendTo(opts.form);this.filebrowser=$('<div class="clearfix" />').filebrowser({root:'/assets/'+(opts.root?opts.root:''),show_info:true,show_actions:false,show_upload:false,enable_drag:false,select:function(node)
{path=node.get_path()
obj.path.text(path);}}).appendTo(opts.form);this.val=function(val)
{if(typeof(val)=='undefined')
{return path;}
else if(preview)
{preview(val);}};this.isValid=function()
{if(path=='/assets/')
{return'An asset must be selected';}
if(opts.def.fileTypes)
{var ext=os.path.ext(new_path);for(k in opts.def.fileTypes)
{if(ext==opts.def.fileTypes[k])
{path=new_path;return null;}}
return'Wrong type of file.';}
return null;}}
function AttrType(opts)
{TextType.call(this,opts);this.fromMarkup=function()
{this.val(opts.markup.attr(opts.def.attr));}
this.toMarkup=function()
{opts.markup.attr(opts.def.attr,this.val());}}
function TextType(opts)
{this.input=$('<input type="text" />').appendTo(opts.form);this.val=function(val)
{return this.input.val(val);};this.isValid=function()
{if(!opts.def.allowEmpty)
{return this.val()?null:'Must not be empty';}};this.fromMarkup=function()
{this.val(opts.markup.text());};this.toMarkup=function()
{opts.markup.text(this.val());};}
function CheckType(opts)
{this.input=$('<input type="checkbox" />').appendTo(opts.form);this.val=function(val)
{if(val!=undefined){this.input.attr('checked',val);}
return this.input.attr('checked');};this.isValid=function()
{return null;};this.fromMarkup=function()
{console.log(opts.markup.css("display"));this.val(opts.markup.css("display")!='none');};this.toMarkup=function()
{opts.markup.css('display',this.val()?'inline':'none');};}
function MarkdownType(opts)
{var obj=this;var loaded=false;this.textarea=$('<textarea />').appendTo(opts.form).markupEditor(markdown_settings);this.val=function(val)
{return this.textarea.val(val);};this.isValid=function()
{return opts.def.allowEmpty||this.val()?null:'Must not be empty';};this.fromMarkup=function()
{this.val(opts.markup.text());}
this.toMarkup=function()
{opts.markup.text(this.val());}}
function ImageType(opts)
{var obj=this;this.image=$('<img />').appendTo(opts.form);var buttons=$('<div class="buttons" />').appendTo(opts.form);button({message:'Select',silk:'pencil',click:function()
{image_picker({root:opts.def.root,'default':obj.val(),accept:function(src)
{obj.val(src);}});}}).appendTo(buttons);if(opts.def.allowEmpty)
{button({message:'Clear',silk:'bin_closed',click:function()
{console.log('clear');obj.val('');}}).appendTo(buttons);}
this.val=function(val)
{if(val!=undefined)
{this.image.attr('src',val);return this;}
return this.image.attr('src');};this.fromMarkup=function()
{this.val(opts.markup.attr('src'));}
this.toMarkup=function()
{opts.markup.attr('src',this.val());}}
function DateType(opts)
{TextType.call(this,opts);this.input.addClass("date-picker").datepicker({dateFormat:'yy-mm-dd',changeMonth:true,changeYear:true});this.isValid=function()
{if(!this.val().match(/^(\d{4})-(\d{2})-(\d{2})$/))
{return'Must be YYYY-MM-DD'}
return null;}}
var type_mapping={text:TextType,markdown:MarkdownType,image:ImageType,date:DateType,attr:AttrType,asset:AssetType,check:CheckType}
$.fn.easyForm=function(opts)
{if(this.length>1)
{this.each(function()
{$(this).easyForm(opts);});return;}
opts=$.extend({initField:null},opts);var $$=this;$$.data('easyForm-opts',opts);var form=$('<ul class="easyForm"/>').appendTo($$);var fields={}
$$.data('easyForm-fields',fields);$.each(opts.fields,function(i,def)
{var key=def.key;key=typeof(key)=='undefined'?i:key;var type=type_mapping[def.type];var title=def.title?def.title:key;fields[key]={key:key,title:title,opts:opts,def:def,label:$('<li class="label" />').addClass("label-"+key).text(title).appendTo(form),form:$('<li class="form type-'+def.type+'" />').addClass('item-'+key).appendTo(form)};fields[key].obj=new type(fields[key]);if(opts.initField)
{opts.initField(fields[key]);}
else if(def['default']!=undefined)
{fields[key].obj.val(def['default']);}});return this;};$.fn.easyForm_validate=function(showUser)
{var $$=this;var opts=$$.data('easyForm-opts');var fields=$$.data('easyForm-fields');if(!(opts||fields))
{throw"Not an easyForm.";}
var count=0;$.each(fields,function(key,field)
{var invalid_reason=field.obj.isValid?field.obj.isValid():null;count+=invalid_reason?1:0;if(showUser)
{if(!invalid_reason)
{field.label.removeClass('invalid');field.label.text(field.title);field.form.removeClass('invalid');}
else
{field.label.addClass('invalid');if(invalid_reason)
{field.label.text(field.title).append($('<span class="reason" />').text('<'+invalid_reason+'>'));}
field.form.addClass('invalid');}}});return!count;};$.fn.easyForm_val=function(val)
{var $$=this;var opts=$$.data('easyForm-opts');var fields=$$.data('easyForm-fields');if(!(opts||fields))
{throw"Not an easyForm.";}
if(val!=undefined)
{$.each(val,function(k,v)
{if(fields[k])
{fields[k].obj.val(v);}});return this;}
var ret={};$.each(fields,function(k,f)
{ret[k]=f.obj.val();});return ret;};$.fn.easyForm_destroy=function()
{this.find('.easyForm').remove();return this;};})(jQuery);