;(function($){var
_errorHandlers={},_submitHandlers={},_validators={},_defaultConfig={useClassAsType:true,useTitleAsError:true,validateOnBlur:false,validateOnBlurAfterSubmit:false,focus:true,filter:':enabled',ignore:':hidden',errorHandler:'default',blurHandler:'default',submitHandler:'default',errorWrapper:'label',errorClass:'error'};function form(){return this;}
form.setErrorHandler=function(name,callback){_errorHandlers[name]=callback;return this;}
form.setSubmitHandler=function(name,callback){_submitHandlers[name]=callback;return this;}
form.setValidator=function(type,callback,defaultMessage){_validators[type]={};_validators[type]['validator']=callback;_validators[type]['message']=defaultMessage;return _validators[type];},form.removeValidator=function(type){_validators=$(_validators).filter(function(){$(this).get(0).type!=='type';});return _validators;},form.prototype={init:function(config){var self=this;var forms=$(this).filter('form');forms.each(function(){var form=$(this);var config=form.form().config($.extend({},_defaultConfig,config)).config();if(config.validateOnBlur&&!config.validateOnBlurAfterSubmit){_setBlurHandler.apply(this);}
form.unbind('submit.form').bind('submit.form',function(){if(config.validateOnBlurAfterSubmit){_setBlurHandler.apply(this);}
if(self.validate().hasErrors()){self.handleErrors();return false;}
return self.handleSubmit();});function _setBlurHandler(){if(config.validateOnBlur){_getFields.apply(form).each(function(){var field=$(this);if(!field.data('form.hasBlurHandler')){field.data('form.hasBlurHandler',true).unbind('blur.form').bind('blur.form',function(){$(this).form().validate().handleErrors(config.blurHandler);});}});}}});},handleErrors:function(name){var
form=_getForm.apply(this),errors=this.getErrors(),func=typeof name!=='undefined'?name:form.form().config().errorHandler;return $.isFunction(func)?func.apply(form,[errors]):_errorHandlers[func].apply(form,[errors]);},handleSubmit:function(name){var
$form=_getForm.apply(this),$fields=_getFields.apply(this),func=typeof name!=='undefined'?name:$form.form().config().submitHandler;return $.isFunction(func)?func.apply($form,[$fields]):_submitHandlers[func].apply($form,[$fields]);},getFields:function(filterBy){var
$form=_getForm.apply(this),filterBy=typeof filterBy==='string'?[filterBy]:filterBy,selectors=[];$.each(filterBy,function(i,el){selectors[selectors.length]=':input[@name="'+el+'"]';});return $form.find(selectors.join(', '));},setTypes:function(types){return $(this).each(function(i,field){var types=typeof types==='string'?[types]:types;$.each(types,function(ii,type){_add(field,'type',type);});});},removeTypes:function(str){return $(this).each(function(i,field){var types=typeof types==='string'?[types]:types;$.each(types,function(ii,type){_remove(field,'type',type);});});},getTypes:function(){return _get(this,'type');},isType:function(type){var arr=$(this).eq(0).data('form.type');return typeof arr!=='undefined'&&$.inArray(type,arr)!==-1;},filterByType:function(type){return $(this).filter(function(){return $(this).form().isType(type);});},getErrors:function(){var errors=[];_getFields.apply(this).each(function(i,field){var fieldErrors=_get(field,'errors')||[];if(typeof fieldErrors!=='undefined'){$.each(fieldErrors,function(ii,error){errors[errors.length]={field:$(field),message:error};});}});return errors;},hasErrors:function(){return $(this).form().getErrors().length>0?true:false;},setErrorMessage:function(type,message){return _getFields.apply(this).each(function(index,field){var $field=$(field);if($field.form().isType(type))
_add($(field),'errorMessages.'+type,message);});},getErrorMessage:function(type){var $form=_getForm.apply(this);var $field=_getFields.apply(this).eq(0);var msg=_get($field,'errorMessages.'+type);msg=typeof msg!=='undefined'&&msg!==''?msg:$form.form().config().useTitleAsError?$field.attr('title'):undefined;msg=typeof msg!=='undefined'&&msg!==''?msg:_validators[type].message;return msg;},validate:function(){var errors=0;var $this=$(this);var form=_getForm.apply(this);var fields=_getFields.apply(this);var options=form.form().config();fields.filter(options.filter).each(function(i,field){var field=$(field);var curerrors=0;field.removeData('form.errors');for(ii in _validators){if((form.form().config().useClassAsType&&field.hasClass(ii))||field.form().isType(ii)){if(!_validators[ii].validator.apply(form,[field])){_add(field,'errors',field.form().getErrorMessage(ii));curerrors++;errors++;}}}});fields.each(function(i,field){var field=$(field);var dependencies=_get(field,'dependencies');if(typeof dependencies!=='undefined'){$.each(dependencies,function(ii,dependency){if($.isFunction(dependency.callback)&&!dependency.callback.apply(field)){var msg=typeof dependency.errorMessage!=='undefined'?dependency.errorMessage:field.form().getErrorMessage(ii);_add(field,'errors',msg);errors++;}});}});return this;},setDependency:function(fn,msg){_getFields.apply(this).each(function(i,field){_add(field,'dependencies',{callback:fn,errorMessage:msg});});return this;},removeDependency:function(fn){_getFields.apply(this).each(function(i,field){if(typeof fn==='undefined'){$(field).removeData('form.dependencies');}else{_remove(field,'dependencies',fn);}});return this;}}
$.fn.plugin.add('form',form);function _add(el,key,val){return $(el).each(function(index,field){var $field=$(field);var c=$field.data('form.'+key);c=typeof c==='undefined'?[]:c;c[c.length]=val;$field.data('form.'+key,c);});};function _remove(el,key,val){return $(el).each(function(index,field){var $field=$(field);var currentTypes=$field.data('form.'+key);if(typeof currentTypes==='object'){var filtered=currentTypes.filter(function(t,i,arr){return t!==val;});$field.data('form.'+key,filtered);}});};function _get(el,key){return $(el).eq(0).data('form.'+key);};function _isForm(){var form=$(this).get(0);return form&&form.tagName.toLowerCase()==='form';}
function _getForm(){return _isForm.apply(this)?$(this).eq(0):$(this).closest('form').eq(0);}
function _getFields(){var form=_getForm.apply(this);if(!form.length){return $();}
var config=form.form().config();var fields=form.find(':input');if(config.ignore){fields=fields.not(config.ignore);}
if(config.filter){fields=fields.filter(config.filter);}
return fields;}
form.setErrorHandler('default',function(fields){var form=$(this);var options=form.form().config();var errors=form.form().getErrors();fields.removeClass(options.errorClass);fields.each(function(){field.siblings('.'+options.errorClass).remove();});for(var i in errors){var field=errors[i].field;var forAttr=options.errorWrapper==='label'?' for="'+field.attr('id')+'"':'';var fieldName=field.attr('name');var fieldsWithSameName=$('[name="'+fieldName+'"]');var index=fieldsWithSameName.index(field);if(fieldsWithSameName.length-1==index){field.after('<'+options.errorWrapper+forAttr+' class="'+options.errorClass+'">'+errors[i].message+'</'+options.errorWrapper+'>');field.addClass(options.errorClass);}}
if(options.focus){errors[0].field.focus();}});form.setSubmitHandler('default',function(fields){var form=$(this);var options=form.form().config();form.find(options.errorWrapper+'.'+options.errorClass).remove();fields.removeClass(options.errorClass);return true;});form.setValidator('required',function(field){var form=$(this);if(field.is(form.form().config().ignoreSelector)){return true;}
if(field.is(':checkbox, :radio')){return otherFields=$('[name="'+field.attr('name')+'"]:checked').length?true:false;}else{if(/^\s*$/g.test((field.val()||'').toString())){return false;}}
return true;},'This field is required');form.setValidator('email',function(field){var form=$(this);var field=$(field);return field.is(form.form().config().ignoreSelector)||field.val()===''||/[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+\.[a-zA-Z]+/.test(field.val());},'Please enter a valid email address');form.setValidator('number',function(field){var $field=$(field);return $field.val()===''||/\d/.test($field.val());},'Value must contain a number');form.setValidator('min',function(field){var field=$(field);var val=parseFloat((field.val()||'').toString().replace(/[^\.^\-\d]/g,'')||0);var min=field.data('form.validators.min.number');min=parseFloat(typeof min==='number'?min:$(min).val());return val>=min;},'Value is too small');form.setValidator('max',function(field){var $field=$(field);var val=parseFloat(($field.val()||'').toString().replace(/[^\.^\-\d]/g,'')||0);var max=$field.data('form.valiators.max.number');max=parseFloat(typeof max==='number'?max:$(max).val());return val<=max;},'Value is to large');})(jQuery);