/*! marionette-formview - v1.0.1 - 2015-02-02 */ !function(a,b){"use strict";"function"==typeof define&&define.amd?define(["marionette","jquery","underscore"],b):a.Marionette.FormView=b(a.Marionette,a.jQuery,a._)}(this,function(a,b,c){"use strict";var d=a.FormView=a.ItemView.extend({className:"formView",rules:{},fields:{},constructor:function(){if(a.ItemView.prototype.constructor.apply(this,arguments),!this.fields)throw new Error("Fields Must Be Provided");this.model||(this.model=new Backbone.Model),this.listenTo(this.model,"change",this.changeFieldVal,this),this.data&&this.model.set(this.data),this.template||this.runInitializers(),this.on("item:rendered",this.runInitializers,this)},changeFieldVal:function(a,b){if(!c.isEmpty(b)&&b.changes){var d=Object.keys(b.changes);this.inputVal(d,this.model.get(d))}else b.unset&&c(this.fields).each(function(a,b){var c=this.$('[data-field="'+b+'"]');this.inputVal(c,this.model.get(b))},this)},populateFields:function(){c(this.fields).each(function(a,b){var c=this.$('[data-field="'+b+'"]');this.inputVal(c,this.model.get(b)),a.autoFocus&&c.focus()},this)},serializeFormData:function(){var a={},b=this;return c(this.fields).each(function(c,d){a[d]=b.inputVal(d)}),a},beforeFormSubmit:function(a){var b=this.validate(),d=c.isEmpty(b);return d?c.isFunction(this.onSubmit)?this.onSubmit.apply(this,[a]):void 0:(c.isFunction(this.onSubmitFail)&&this.onSubmitFail.apply(this,[b]),a.stopImmediatePropagation(),!1)},onFieldEvent:function(a){this.handleFieldEvent(a,a.type)},handleFieldEvent:function(a,d){var e=a.target||a.srcElement,f=b(e).attr("data-field"),g=this.fields[f];if(g&&g.validateOn===d){var h=this.validateField(f);!c.isEmpty(h)&&c.isFunction(this.onValidationFail)&&this.onValidationFail(h)}},validate:function(){var a={},b=c(this.fields).keys();return c(b).each(function(b){var d=this.validateField(b);c.isEmpty(d)||(a[b]=d)},this),a},validateField:function(a){var b=this.fields[a],d=b&&b.validations?b.validations:{},e=[],f=!0,g=this.inputVal(a);if(b.required){f=this.validateRule(g,"required");var h="string"==typeof b.required?b.required:"This field is required";f||e.push(h)}if(f&&d&&c.each(d,function(a,c){f=this.validateRule(g,c,b),f||e.push(a)},this),!c.isEmpty(e)){var i={field:a,el:this.fields[a].el,error:e};return i}},inputVal:function(a,c){var d=a.jquery?a:this.$('[data-field="'+a+'"]'),e=this,f="undefined"==typeof c?"get":"set";if("object"===d.data("fieldtype"))"get"===f&&(c={}),d.find("[data-property]").each(function(){var a=b(this),d=a.attr("data-property");"get"===f?c[d]=e.inputVal(a):c&&e.inputVal(a,c[d])});else if("array"===d.data("fieldtype"))"get"===f&&(c=[]),d.find("[data-index]").each(function(){var a=b(this),d=a.data("index");"get"===f?c[d]=e.inputVal(a):c&&e.inputVal(a,c[d])});else if(d.is("input")){var g=d.attr("type")?d.attr("type").toLowerCase():"text";switch(g){case"radio":d.each(function(){var a=b(this);if("get"===f){if(a.is(":checked"))return c=a.val(),!1}else if(a.val()===c)return a.prop("checked",!0),!1});break;case"checkbox":"get"===f?c=d.is(":checked"):d.prop("checked",!!c);break;case"password":"get"===f?c=d.val():d.val(c);break;default:"get"===f?c=b.trim(d.val()):d.val(c)}}else"get"===f?c=b.trim(d.val()):d.val(c);return c},validateRule:function(a,b,d){var f;if(!b)throw new Error("Not passed a validation to test");return"required"===b?e.required(a):(-1!==b.indexOf(":")&&(f=b.split(":"),b=f.shift()),this.rules&&this.rules[b]?c(this.rules[b]).bind(this)(a,d):c(e.validate).bind(this)(b,a,f))},submit:function(){this.form.submit()},bindFormEvents:function(){var a=this.$el.is("form")?this.$el:this.$("form").first();this.form=a,this.$("input").blur(c(this.onFieldEvent).bind(this)).keyup(c(this.onFieldEvent).bind(this)).keydown(c(this.onFieldEvent).bind(this)).change(c(this.onFieldEvent).bind(this)),a.submit(c(this.beforeFormSubmit).bind(this))},runInitializers:function(){this.populateFields(),this.bindFormEvents(),c.isFunction(this.onReady)&&this.onReady()}}),e={regex:{email:/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i,alpha:/^[a-zA-Z]+$/,alphanum:/^[a-zA-Z0-9]+$/},validate:function(a,b,d){if(c.isFunction(e[a]))return c(e[a]).bind(this)(b,d);throw new Error("Validator does not exist : "+a)},matches:function(a,b){return a==this.inputVal(b)},min:function(a,b){return a.lengthb?!1:!0},numeric:function(a){return c.isNumber(a)},alpha:function(a){return e.regex.alpha.test(a)},alphanum:function(a){return e.regex.alphanum.test(a)},email:function(a){return e.regex.email.test(a)},required:function(a){return a===!1||c.isNull(a)||c.isUndefined(a)||c.isString(a)&&0===a.length?!1:!0},"boolean":function(a){return c.isBoolean(a)}};return d.FormValidator=e,d});