{"version":3,"sources":["../../../config-wrap-start-default.js","../lib/almond.js","models/fieldErrorModel.js","models/fieldErrorCollection.js","models/fieldModel.js","models/fieldCollection.js","models/formErrorModel.js","models/formErrorCollection.js","models/formModel.js","models/formCollection.js","controllers/formData.js","controllers/fieldError.js","controllers/changeField.js","controllers/changeEmail.js","controllers/fieldCheckbox.js","controllers/fieldCheckboxList.js","controllers/fieldRadio.js","controllers/fieldNumber.js","controllers/mirrorField.js","controllers/confirmField.js","controllers/updateFieldModel.js","controllers/submitButton.js","controllers/submitDebug.js","controllers/getFormErrors.js","controllers/validateRequired.js","controllers/submitError.js","controllers/actionRedirect.js","controllers/actionSuccess.js","controllers/fieldSelect.js","controllers/coreSubmitResponse.js","controllers/fieldProduct.js","controllers/fieldTotal.js","controllers/fieldQuantity.js","models/calcModel.js","models/calcCollection.js","controllers/calculations.js","controllers/fieldDate.js","controllers/fieldRecaptcha.js","controllers/helpText.js","controllers/fieldTextareaRTE.js","controllers/fieldStarRating.js","controllers/fieldTerms.js","controllers/formContentFilters.js","views/fieldItem.js","views/beforeField.js","views/fieldErrorItem.js","views/fieldErrorCollection.js","views/inputLimit.js","views/afterField.js","views/fieldLayout.js","controllers/loadViews.js","controllers/formErrors.js","controllers/submit.js","views/fieldCollection.js","controllers/defaultFilters.js","controllers/loadControllers.js","views/beforeForm.js","views/formErrorItem.js","views/formErrorCollection.js","views/honeyPot.js","views/afterFormContent.js","views/beforeFormContent.js","views/formLayout.js","views/afterForm.js","views/mainLayout.js","main.js"],"names":["requirejs","require","define","undef","hasProp","obj","prop","hasOwn","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","config","starMap","charAt","length","nodeIdCompat","jsSuffixRegExp","test","replace","slice","concat","splice","join","indexOf","substring","makeRequire","relName","forceSync","args","aps","arguments","push","req","apply","makeNormalize","makeLoad","depName","value","defined","callDep","waiting","defining","main","Error","splitPrefix","prefix","index","makeConfig","makeMap","handlers","Object","prototype","hasOwnProperty","plugin","parts","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","model","Backbone","Model","extend","errorModel","collection","Collection","fieldErrorCollection","defaults","placeholder","label_pos","classes","reRender","mirror_field","confirm_field","clean","disabled","visible","initialize","this","set","options","formModel","get","listenTo","nfRadio","channel","resetModel","bind","changeModel","changeValue","trigger","formLoaded","beforeSubmit","addWrapperClass","cl","removeWrapperClass","fieldModel","comparator","models","validateFields","_","each","showFields","invoke","hideFields","FieldCollection","ErrorCollection","beforeForm","afterForm","beforeFields","afterFields","wrapper_class","element_class","hp","fieldErrors","extra","setting","formContentData","formContentLoadFilters","request","sortedArray","without","first","reply","getFieldByKey","addError","removeError","getExtra","addExtra","removeExtra","getForm","key","findWhere","msg","errors","add","remove","extraData","FormModel","FormCollection","controller","Marionette","nfForms","getForms","getField","form","fieldErrorModel","getError","targetID","targetError","changeField","blurField","el","val","radioChannel","emailReg","errorID","onChangeModelValue","emailKeyup","onBlurField","fieldID","emailChange","changeEmailErrorMsg","keyCode","registerRenderClasses","validateRequired","validateModelData","beforeUpdateField","getCalcValue","checked","addClass","closest","find","removeClass","calcValue","customClasses","customLabelClasses","maybeChecked","default_value","register","renderOptions","renderOtherText","selected","filter","opt","html","valueFound","option","isSelected","testValues","toString","template","show_other","data","currentValue","calc_value","tmp_opt","math","calc","parent","clone","changeModelValue","updateCheckedClass","attr","maybeMinDefault","validateMinMax","min","$el","parseFloat","max","step","fieldNumberNumMinError","fieldNumberNumMaxError","testValue","parseInt","testStep","fieldNumberIncrementBy","listeningModel","registerMirror","targetModel","registerConfirm","confirmKeyup","confirmModel","formModal","registerConfirmListeners","console","log","confirmID","confirmFieldErrorMsg","compareValue","confirmValue","updateField","isArray","submitButton","registerHandlers","click","resetLabel","maybeEnable","maybeDisable","processingLabel","size","response","submitDebug","textStatus","jqXHR","formID","debug","debugMessages","message","style","getFormErrors","error","field","validateKeyup","customReqValidation","defaultReqValidation","maskPlaceholder","trim","valid","maybeError","validateRequiredField","submitErrors","fields","slug","last","show","actionRedirect","halt","redirect","window","location","actions","actionSubmit","success_message","form_id","animate","scrollTop","offset","top","renderOtherAttributes","label","otherAttributes","type","settings","clear_complete","reset","hide_complete","renderProductQuantity","renderProduct","product_type","product_use_quantity","that","product_price","product_quantity","totalModel","productTotals","registerShipping","onFormLoaded","onChangeProduct","onChangeQuantity","shippingModel","shippingCost","fieldModels","productFields","quantityFields","productID","product","productPrice","Number","updateTotal","productQuantity","newTotal","productField","quantity","toFixed","registerQuantity","on","changeCalc","targetCalcModel","CalcModel","getCalc","CalcCollection","calcs","displayFields","registerCalcs","nfFrontEnd","use_merge_tags","calculations","fieldType","initDisplayField","updateDisplayFields","init","calcCollection","calcModel","setupCalc","eq","eqValues","match","RegExp","updateCalcFields","replaceKey","eval","isNumeric","tag","reTag","calcTag","reCalcTag","replaceAllKeys","re","calcName","rounding","initDatepicker","view","dateObject","pikadayResponsive","format","outputFormat","pikadayOptions","yearRange","getYearRange","setDate","moment","yearRangeStart","yearRangeEnd","initRecaptcha","resetRecaptcha","updateResponse","grecaptcha","initHelpText","jBox","theme","content","initTextareaRTEs","clickExtra","meta_image_frame","currentContext","summernote","icons","align","alignCenter","alignJustify","alignLeft","alignRight","indent","outdent","bold","caret","close","code","eraser","italic","link","unlink","magic","minus","orderedlist","redo","square","table","underline","undo","unorderedlist","linkButton","context","mediaButton","toolbar","userSettings","uid","buttons","height","codemirror","lineNumbers","prettifyHtml","callbacks","onChange","linkMenu","next","replaceWith","class","innerHTML","ui","linkDropdown","buttonGroup","button","className","contents","tooltip","nfi18n","fieldTextareaRTEInsertLink","clickLinkButton","toggle","dropdown","children","render","fieldTextareaRTEInsertMedia","openMediaManager","open","wp","media","frames","title","fieldTextareaRTESelectAFile","text","media_attachment","state","toJSON","insertMedia","range","target","focus","textEl","urlEl","isNewWindowEl","hasClass","url","isNewWindow","filename","initRating","renderRatings","rating","default","num","keyUpExtra","currentTarget","addOption","new_option","viewFilters","loadFilters","addViewFilter","addLoadFilter","getViewFilters","getLoadFilters","priority","ItemView","tagName","onRender","unwrap","setElement","mask","isInteger","isFinite","Math","floor","templateHelpers","renderElement","tmpl","element_templates","renderLabel","renderLabelClasses","renderPlaceholder","customPlaceholder","renderWrapClass","wrapClass","old_classname","customWrapClass","renderClasses","maybeDisabled","disable_input","maybeDisableAutocomplete","disable_browser_autocomplete","maybeInputLimit","input_limit_type","input_limit","getHelpText","help_text","maybeRenderHelp","check_text","renderDescText","desc_text","renderCurrencyFormatting","number","replacedDecimal","replacedThousands","thousands_sep","formattedNumber","decimal_point","currency_symbol","events","change .nf-element","keyup .nf-element","click .nf-element","click .extra","blur .nf-element","fieldChange","fieldKeyup","fieldClick","extraClick","fieldBlur","onAttach","fieldErrorItem","CollectionView","childView","updateCount","count","regex","words","wordCount","charCount","limit","currentCount","InputLimitView","changeError","errorEl","errorCollectionView","inputLimitEl","inputLimitView","fieldItem","beforeField","afterField","LayoutView","regions","getTemplate","renderContainerClass","containerClass","desc_pos","container_class","fieldItemView","fieldLayoutView","getFieldItem","getFieldLayout","errorMsg","formErrorsCorrectErrors","omit","registerSubmitHandler","submit","validate","fieldDataDefaults","formData","JSON","stringify","action","security","ajaxNonce","ajax","adminAjax","cache","success","parseJSON","errorThrown","responseText","fieldLayout","FieldCollectionView","registerDefaultDataFilter","defaultFormContentLoad","defaultFormContentView","fieldCollection","currentFieldCollection","resetFields","FormData","FieldError","ChangeField","ChangeEmail","FieldCheckbox","FieldCheckboxList","FieldRadio","FieldNumber","MirrorField","ConfirmField","UpdateFieldModel","SubmitButton","SubmitDebug","GetFormErrors","ValidateRequired","SubmitError","ActionRedirect","ActionSuccess","FieldSelect","CoreSubmitResponse","FieldProduct","FieldTotal","FieldQuantity","Calculations","FieldDate","FieldRecaptcha","HelpText","FieldTextareaRTE","FieldStarRating","FieldTerms","FormContentFilters","LoadViews","FormErrors","Submit","DefaultFilters","formErrorItem","keyup .nf-field-hp","change .nf-field-hp","honeypotHoneypotError","HoneyPot","onShow","renderFieldsMarkedRequired","requiredFields","required","fieldsMarkedRequired","AfterFormContent","BeforeFormContent","beforeFormContent","formContent","afterFormContent","getEl","hide","formContentViewFilters","formContentView","BeforeForm","FormLayout","AfterForm","responseMsg","formLayout","originalVal","fn","prev","result","change","document","ready","$","formCollection","LoadControllers","mainLayout","NinjaForms","Application","forms","Renderer","urlParameters","object","compact","search","item","nf_resume","restart","onStart","layoutView","evaluate","interpolate","escape","variable","ninjaForms","start"],"mappings":"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","file":"front-end.js","sourcesContent":["(function () {\n","/**\n * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/almond for details\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*jslint sloppy: true */\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n var main, req, makeMap, handlers,\n defined = {},\n waiting = {},\n config = {},\n defining = {},\n hasOwn = Object.prototype.hasOwnProperty,\n aps = [].slice,\n jsSuffixRegExp = /\\.js$/;\n\n function hasProp(obj, prop) {\n return hasOwn.call(obj, prop);\n }\n\n /**\n * Given a relative module name, like ./something, normalize it to\n * a real name that can be mapped to a path.\n * @param {String} name the relative name\n * @param {String} baseName a real name that the name arg is relative\n * to.\n * @returns {String} normalized name\n */\n function normalize(name, baseName) {\n var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n foundI, foundStarMap, starI, i, j, part,\n baseParts = baseName && baseName.split(\"/\"),\n map = config.map,\n starMap = (map && map['*']) || {};\n\n //Adjust any relative paths.\n if (name && name.charAt(0) === \".\") {\n //If have a base name, try to normalize against it,\n //otherwise, assume it is a top-level require that will\n //be relative to baseUrl in the end.\n if (baseName) {\n name = name.split('/');\n lastIndex = name.length - 1;\n\n // Node .js allowance:\n if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n }\n\n //Lop off the last part of baseParts, so that . matches the\n //\"directory\" and not name of the baseName's module. For instance,\n //baseName of \"one/two/three\", maps to \"one/two/three.js\", but we\n //want the directory, \"one/two\" for this normalization.\n name = baseParts.slice(0, baseParts.length - 1).concat(name);\n\n //start trimDots\n for (i = 0; i < name.length; i += 1) {\n part = name[i];\n if (part === \".\") {\n name.splice(i, 1);\n i -= 1;\n } else if (part === \"..\") {\n if (i === 1 && (name[2] === '..' || name[0] === '..')) {\n //End of the line. Keep at least one non-dot\n //path segment at the front so it can be mapped\n //correctly to disk. Otherwise, there is likely\n //no path mapping for a path starting with '..'.\n //This can still fail, but catches the most reasonable\n //uses of ..\n break;\n } else if (i > 0) {\n name.splice(i - 1, 2);\n i -= 2;\n }\n }\n }\n //end trimDots\n\n name = name.join(\"/\");\n } else if (name.indexOf('./') === 0) {\n // No baseName, so this is ID is resolved relative\n // to baseUrl, pull off the leading dot.\n name = name.substring(2);\n }\n }\n\n //Apply map config if available.\n if ((baseParts || starMap) && map) {\n nameParts = name.split('/');\n\n for (i = nameParts.length; i > 0; i -= 1) {\n nameSegment = nameParts.slice(0, i).join(\"/\");\n\n if (baseParts) {\n //Find the longest baseName segment match in the config.\n //So, do joins on the biggest to smallest lengths of baseParts.\n for (j = baseParts.length; j > 0; j -= 1) {\n mapValue = map[baseParts.slice(0, j).join('/')];\n\n //baseName segment has config, find if it has one for\n //this name.\n if (mapValue) {\n mapValue = mapValue[nameSegment];\n if (mapValue) {\n //Match, update name to the new value.\n foundMap = mapValue;\n foundI = i;\n break;\n }\n }\n }\n }\n\n if (foundMap) {\n break;\n }\n\n //Check for a star map match, but just hold on to it,\n //if there is a shorter segment match later in a matching\n //config, then favor over this star map.\n if (!foundStarMap && starMap && starMap[nameSegment]) {\n foundStarMap = starMap[nameSegment];\n starI = i;\n }\n }\n\n if (!foundMap && foundStarMap) {\n foundMap = foundStarMap;\n foundI = starI;\n }\n\n if (foundMap) {\n nameParts.splice(0, foundI, foundMap);\n name = nameParts.join('/');\n }\n }\n\n return name;\n }\n\n function makeRequire(relName, forceSync) {\n return function () {\n //A version of a require function that passes a moduleName\n //value for items that may need to\n //look up paths relative to the moduleName\n var args = aps.call(arguments, 0);\n\n //If first arg is not require('string'), and there is only\n //one arg, it is the array form without a callback. Insert\n //a null so that the following concat is correct.\n if (typeof args[0] !== 'string' && args.length === 1) {\n args.push(null);\n }\n return req.apply(undef, args.concat([relName, forceSync]));\n };\n }\n\n function makeNormalize(relName) {\n return function (name) {\n return normalize(name, relName);\n };\n }\n\n function makeLoad(depName) {\n return function (value) {\n defined[depName] = value;\n };\n }\n\n function callDep(name) {\n if (hasProp(waiting, name)) {\n var args = waiting[name];\n delete waiting[name];\n defining[name] = true;\n main.apply(undef, args);\n }\n\n if (!hasProp(defined, name) && !hasProp(defining, name)) {\n throw new Error('No ' + name);\n }\n return defined[name];\n }\n\n //Turns a plugin!resource to [plugin, resource]\n //with the plugin being undefined if the name\n //did not have a plugin prefix.\n function splitPrefix(name) {\n var prefix,\n index = name ? name.indexOf('!') : -1;\n if (index > -1) {\n prefix = name.substring(0, index);\n name = name.substring(index + 1, name.length);\n }\n return [prefix, name];\n }\n\n /**\n * Makes a name map, normalizing the name, and using a plugin\n * for normalization if necessary. Grabs a ref to plugin\n * too, as an optimization.\n */\n makeMap = function (name, relName) {\n var plugin,\n parts = splitPrefix(name),\n prefix = parts[0];\n\n name = parts[1];\n\n if (prefix) {\n prefix = normalize(prefix, relName);\n plugin = callDep(prefix);\n }\n\n //Normalize according\n if (prefix) {\n if (plugin && plugin.normalize) {\n name = plugin.normalize(name, makeNormalize(relName));\n } else {\n name = normalize(name, relName);\n }\n } else {\n name = normalize(name, relName);\n parts = splitPrefix(name);\n prefix = parts[0];\n name = parts[1];\n if (prefix) {\n plugin = callDep(prefix);\n }\n }\n\n //Using ridiculous property names for space reasons\n return {\n f: prefix ? prefix + '!' + name : name, //fullName\n n: name,\n pr: prefix,\n p: plugin\n };\n };\n\n function makeConfig(name) {\n return function () {\n return (config && config.config && config.config[name]) || {};\n };\n }\n\n handlers = {\n require: function (name) {\n return makeRequire(name);\n },\n exports: function (name) {\n var e = defined[name];\n if (typeof e !== 'undefined') {\n return e;\n } else {\n return (defined[name] = {});\n }\n },\n module: function (name) {\n return {\n id: name,\n uri: '',\n exports: defined[name],\n config: makeConfig(name)\n };\n }\n };\n\n main = function (name, deps, callback, relName) {\n var cjsModule, depName, ret, map, i,\n args = [],\n callbackType = typeof callback,\n usingExports;\n\n //Use name if no relName\n relName = relName || name;\n\n //Call the callback to define the module, if necessary.\n if (callbackType === 'undefined' || callbackType === 'function') {\n //Pull out the defined dependencies and pass the ordered\n //values to the callback.\n //Default to [require, exports, module] if no deps\n deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n for (i = 0; i < deps.length; i += 1) {\n map = makeMap(deps[i], relName);\n depName = map.f;\n\n //Fast path CommonJS standard dependencies.\n if (depName === \"require\") {\n args[i] = handlers.require(name);\n } else if (depName === \"exports\") {\n //CommonJS module spec 1.1\n args[i] = handlers.exports(name);\n usingExports = true;\n } else if (depName === \"module\") {\n //CommonJS module spec 1.1\n cjsModule = args[i] = handlers.module(name);\n } else if (hasProp(defined, depName) ||\n hasProp(waiting, depName) ||\n hasProp(defining, depName)) {\n args[i] = callDep(depName);\n } else if (map.p) {\n map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n args[i] = defined[depName];\n } else {\n throw new Error(name + ' missing ' + depName);\n }\n }\n\n ret = callback ? callback.apply(defined[name], args) : undefined;\n\n if (name) {\n //If setting exports via \"module\" is in play,\n //favor that over return value and exports. After that,\n //favor a non-undefined return value over exports use.\n if (cjsModule && cjsModule.exports !== undef &&\n cjsModule.exports !== defined[name]) {\n defined[name] = cjsModule.exports;\n } else if (ret !== undef || !usingExports) {\n //Use the return value from the function.\n defined[name] = ret;\n }\n }\n } else if (name) {\n //May just be an object definition for the module. Only\n //worry about defining if have a module name.\n defined[name] = callback;\n }\n };\n\n requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n if (typeof deps === \"string\") {\n if (handlers[deps]) {\n //callback in this case is really relName\n return handlers[deps](callback);\n }\n //Just return the module wanted. In this scenario, the\n //deps arg is the module name, and second arg (if passed)\n //is just the relName.\n //Normalize module name, if it contains . or ..\n return callDep(makeMap(deps, callback).f);\n } else if (!deps.splice) {\n //deps is a config object, not an array.\n config = deps;\n if (config.deps) {\n req(config.deps, config.callback);\n }\n if (!callback) {\n return;\n }\n\n if (callback.splice) {\n //callback is an array, which means it is a dependency list.\n //Adjust args if there are dependencies\n deps = callback;\n callback = relName;\n relName = null;\n } else {\n deps = undef;\n }\n }\n\n //Support require(['a'])\n callback = callback || function () {};\n\n //If relName is a function, it is an errback handler,\n //so remove it.\n if (typeof relName === 'function') {\n relName = forceSync;\n forceSync = alt;\n }\n\n //Simulate async callback;\n if (forceSync) {\n main(undef, deps, callback, relName);\n } else {\n //Using a non-zero value because of concern for what old browsers\n //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n //If want a value immediately, use require('id') instead -- something\n //that works in almond on the global level, but not guaranteed and\n //unlikely to work in other AMD implementations.\n setTimeout(function () {\n main(undef, deps, callback, relName);\n }, 4);\n }\n\n return req;\n };\n\n /**\n * Just drops the config on the floor, but returns req in case\n * the config return value is used.\n */\n req.config = function (cfg) {\n return req(cfg);\n };\n\n /**\n * Expose module registry for debugging and tooling\n */\n requirejs._defined = defined;\n\n define = function (name, deps, callback) {\n if (typeof name !== 'string') {\n throw new Error('See almond README: incorrect module build, no module name');\n }\n\n //This module may not have dependencies\n if (!deps.splice) {\n //deps is not an array, so probably means\n //an object literal or factory function for\n //the value. Adjust args.\n callback = deps;\n deps = [];\n }\n\n if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n waiting[name] = [name, deps, callback];\n }\n };\n\n define.amd = {\n jQuery: true\n };\n}());\n\ndefine(\"../lib/almond\", function(){});\n\n","define( 'models/fieldErrorModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\n\t} );\n\t\n\treturn model;\n} );\n","define( 'models/fieldErrorCollection',['models/fieldErrorModel'], function( errorModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: errorModel\n\t} );\n\treturn collection;\n} );\n","define( 'models/fieldModel',['models/fieldErrorCollection'], function( fieldErrorCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tplaceholder: '',\n\t\t\tvalue: '',\n\t\t\tlabel_pos: '',\n\t\t\tclasses: 'ninja-forms-field',\n\t\t\treRender: false,\n\t\t\tmirror_field: false,\n\t\t\tconfirm_field: false,\n\t\t\tclean: true,\n\t\t\tdisabled: '',\n\t\t\tvisible: true\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.set( 'formID', this.collection.options.formModel.get( 'id' ) );\n\t\t\tthis.listenTo( nfRadio.channel( 'form-' + this.get( 'formID' ) ), 'reset', this.resetModel );\n\n \t\tthis.bind( 'change', this.changeModel, this );\n \t\tthis.bind( 'change:value', this.changeValue, this );\n \t\tthis.set( 'errors', new fieldErrorCollection() );\n\n \t\t/*\n\t\t\t * Trigger an init event on two channels:\n\t\t\t * \n\t\t\t * fields\n\t\t\t * field-type\n\t\t\t *\n\t\t\t * This lets specific field types modify model attributes before anything uses them.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'init:model', this );\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'init:model', this );\n\t\t\tnfRadio.channel( 'fields-' + this.get( 'type' ) ).trigger( 'init:model', this );\n\n\t\t\tif( 'undefined' != this.get( 'parentType' ) ){\n\t\t\t\tnfRadio.channel( this.get( 'parentType' ) ).trigger( 'init:model', this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * When we load our form, fire another event for this field.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'form-' + this.get( 'formID' ) ), 'loaded', this.formLoaded );\n\t\t\n\t\t\t/*\n\t\t\t * Before we submit our form, send out a message so that this field can be modified if necessary.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'form-' + this.get( 'formID' ) ), 'before:submit', this.beforeSubmit );\n\t\t},\n\n\t\tchangeModel: function() {\n\t\t\tnfRadio.channel( 'field-' + this.get( 'id' ) ).trigger( 'change:model', this );\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'change:model', this );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'change:model', this );\n\t\t},\n\n\t\tchangeValue: function() {\n\t\t\tnfRadio.channel( 'field-' + this.get( 'id' ) ).trigger( 'change:modelValue', this );\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'change:modelValue', this );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'change:modelValue', this );\n\t\t},\n\n\t\taddWrapperClass: function( cl ) {\n\t\t\tthis.set( 'addWrapperClass', cl );\n\t\t},\n\n\t\tremoveWrapperClass: function( cl ) {\n\t\t\tthis.set( 'removeWrapperClass', cl );\n\t\t},\n\n\t\tformLoaded: function() {\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'formLoaded', this );\n\t\t\tnfRadio.channel( 'fields-' + this.get( 'type' ) ).trigger( 'formLoaded', this );\n\t\t},\n\n\t\tbeforeSubmit: function( formModel ) {\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'before:submit', this );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'before:submit', this );\n\t\t}\n\n\t} );\n\n\treturn model;\n} );\n\n","define( 'models/fieldCollection',['models/fieldModel'], function( fieldModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: fieldModel,\n\t\tcomparator: 'order',\n\n\t\tinitialize: function( models, options ) {\n\t\t\tthis.options = options;\n\t\t},\n\n\t\tvalidateFields: function() {\n\t\t\t_.each( this.models, function( fieldModel ) {\n\t\t\t\tnfRadio.channel( 'submit' ).trigger( 'validate:field', fieldModel );\n\t\t\t}, this );\n\t\t},\n\n\t\tshowFields: function() {\n\t\t\tthis.invoke( 'set', { visible: true } );\n\t\t},\n\n\t\thideFields: function() {\n\t\t\tthis.invoke( 'set', { visible: false } );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","define( 'models/formErrorModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\n\t} );\n\t\n\treturn model;\n} );\n","define( 'models/formErrorCollection',['models/formErrorModel'], function( errorModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: errorModel\n\t} );\n\treturn collection;\n} );\n","define( 'models/formModel',[\n\t'models/fieldCollection',\n\t'models/formErrorCollection'\n\t], function(\n\t\tFieldCollection,\n\t\tErrorCollection\n\t) {\n\tvar model = Backbone.Model.extend({\n\t\tdefaults: {\n\t\t\tbeforeForm: '',\n\t\t\tafterForm: '',\n\t\t\tbeforeFields: '',\n\t\t\tafterFields: '',\n\t\t\twrapper_class: '',\n\t\t\telement_class: '',\n\t\t\thp: '',\n\t\t\tfieldErrors: {},\n\t\t\textra: {}\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Loop over settings and map to attributes\n\t\t\t_.each( this.get( 'settings' ), function( value, setting ) {\n\t\t\t\tthis.set( setting, value );\n\t\t\t}, this );\n\n\t\t\tthis.set( 'loadedFields', this.get( 'fields' ) );\n\t\t\tthis.set( 'fields', new FieldCollection( this.get( 'fields' ), { formModel: this } ) );\n\t\t\tthis.set( 'errors', new ErrorCollection() );\n\n\t\t\t/*\n\t\t\t * Send out a radio message so that anyone who wants to filter our content data can register their filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'form' ).trigger( 'before:filterData', this );\n\n\t\t\t/*\n\t\t\t * Set our formContentData to our form setting 'formContentData'\n\t\t\t */\n\t\t\tvar formContentData = this.get( 'formContentData' );\n\n\t\t\t/*\n\t\t\t * The formContentData variable used to be fieldContentsData.\n\t\t\t * If we don't have a 'formContentData' setting, check to see if we have an old 'fieldContentsData'.\n\t\t\t * \n\t\t\t * TODO: This is for backwards compatibility and should be removed eventually. \n\t\t\t */\n\t\t\tif ( ! formContentData ) {\n\t\t\t\tformContentData = this.get( 'fieldContentsData' );\n\t\t\t}\n\t\t\t\n\t\t\tvar formContentLoadFilters = nfRadio.channel( 'formContent' ).request( 'get:loadFilters' );\n\t\t\t/* \n\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t*/\n\t\t\tvar sortedArray = _.without( formContentLoadFilters, undefined );\n\t\t\tvar callback = _.first( sortedArray );\n\t\t\tformContentData = callback( formContentData, this, this );\n\t\t\t\n\t\t\tthis.set( 'formContentData', formContentData );\n\n\t\t\tnfRadio.channel( 'forms' ).trigger( 'init:model', this );\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).trigger( 'init:model', this );\n\n\t\t\t// Fields\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).reply( 'get:fieldByKey', this.getFieldByKey, this );\n\n\t\t\t// Form Errors\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).reply( 'add:error', this.addError, this );\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).reply( 'remove:error', this.removeError, this );\n\n\t\t\t// Extra Data\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).reply( 'get:extra', this.getExtra, this );\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).reply( 'add:extra', this.addExtra, this );\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).reply( 'remove:extra', this.removeExtra, this );\n\t\t\n\t\t\t// Respond to requests to get this model.\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).reply( 'get:form', \t this.getForm, \t this );\n\n\t\t\tnfRadio.channel( 'form' ).trigger( 'loaded', this );\n\t\t\tnfRadio.channel( 'form' ).trigger( 'after:loaded', this );\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).trigger( 'loaded', \t this );\n\t\t},\n\n\t\t/*\n\t\t |--------------------------------------------------------------------------\n\t\t | Fields\n\t\t |--------------------------------------------------------------------------\n\t\t */\n\n\t\tgetFieldByKey: function( key ) {\n\t\t\treturn this.get( 'fields' ).findWhere( { key: key } );\n\t\t},\n\n\t\t/*\n\t\t |--------------------------------------------------------------------------\n\t\t | Form Errors\n\t\t |--------------------------------------------------------------------------\n\t\t */\n\n\t\taddError: function( id, msg ) {\n\t\t\tvar errors = this.get( 'errors' );\n\t\t\terrors.add( { id: id, msg: msg } );\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).trigger( 'add:error', this, id, msg );\n\t\t},\n\n\t\tremoveError: function( id ) {\n\t\t\tvar errors = this.get( 'errors' );\n\t\t\tvar errorModel = errors.get( id );\n\t\t\terrors.remove( errorModel );\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).trigger( 'remove:error', this, id );\n\t\t},\n\n\t\t/*\n\t\t |--------------------------------------------------------------------------\n\t\t | Extra Data\n\t\t |--------------------------------------------------------------------------\n\t\t */\n\n\t\tgetExtra: function( key ) {\n\t\t\tvar extraData = this.get( 'extra' );\n\t\t\tif( 'undefined' == typeof key ) return extraData;\n\t\t\treturn extraData[ key ];\n\t\t},\n\n\t\taddExtra: function( key, value ) {\n\t\t\tvar extraData = this.get( 'extra' );\n\t\t\textraData[ key ] = value;\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).trigger( 'add:extra', this, key, value );\n\t\t},\n\n\t\tremoveExtra: function( key ) {\n\t\t\tvar extraData = this.get( 'extra' );\n\t\t\tdelete extraData[ key ];\n\t\t\tnfRadio.channel( 'form-' + this.get( 'id' ) ).trigger( 'remove:extra', this, key );\n\t\t},\n\n\t\t/*\n\t\t |--------------------------------------------------------------------------\n\t\t | Get this form\n\t\t |--------------------------------------------------------------------------\n\t\t */\n\t\tgetForm: function() {\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\treturn model;\n} );\n","define( 'models/formCollection',['models/formModel'], function( formModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: formModel\n\t} );\n\treturn collection;\n} );\n","/*\n * Handles setting up our form.\n *\n * Holds a collection of our fields.\n * Replies to requests for field data.\n * Updates field models.\n */\ndefine('controllers/formData',['models/formModel', 'models/formCollection', 'models/fieldCollection', 'models/formErrorCollection'], function( FormModel, FormCollection, FieldCollection, ErrorCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\t/*\n\t\t\t * Setup our field collections.\n\t\t\t */\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Initialize our form collection (incase we have multiple forms on the page)\n\t\t\t */\n\t\t\tthis.collection = new FormCollection( nfForms );\n\n\t\t\tnfRadio.channel( 'forms' ).trigger( 'loaded', this.collection );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'forms:loaded', this.collection );\n\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:form', this.getForm, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:forms', this.getForms, this );\n\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:field', this.getField, this );\n\t\t},\n\n\t\tgetForm: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\tgetForms: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetField: function( id ) {\n\t\t\tvar model = false;\n\t\t\t\n\t\t\t_.each( this.collection.models, function( form ) {\n\t\t\t\tif ( ! model ) {\n\t\t\t\t\tmodel = form.get( 'fields' ).get( id );\t\n\t\t\t\t}\t\t\t\n\t\t\t} );\n\t\t\treturn model;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/fieldError',['models/fieldErrorModel'], function( fieldErrorModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fields' ).reply( 'add:error', this.addError );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'remove:error', this.removeError );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:error', this.getError );\n\t\t},\n\n\t\taddError: function( targetID, id, msg ) {\n\t\t\tvar model = nfRadio.channel( 'fields' ).request( 'get:field', targetID );\n\n\t\t\tif( 'undefined' == typeof model ) return;\n\n\t\t\tvar errors = model.get( 'errors' );\n\t\t\terrors.add( { 'id': id, 'msg' : msg } );\n\t\t\tmodel.set( 'errors', errors );\n\t\t\tmodel.trigger( 'change:errors', model );\n\t\t\tmodel.set( 'clean', false );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'add:error', model, id, msg );\n\t\t},\n\n\t\tremoveError: function( targetID, id ) {\n\t\t\tvar model = nfRadio.channel( 'fields' ).request( 'get:field', targetID );\n\n\t\t\tif( 'undefined' == typeof model ) return;\n\n\t\t\tvar errors = model.get( 'errors' );\n\t\t\tvar targetError = errors.get( id );\n\t\t\tif ( 'undefined' != typeof targetError ) {\n\t\t\t\terrors.remove( targetError );\n\t\t\t\tmodel.set( 'errors', errors );\n\t\t\t\tmodel.trigger( 'change:errors', model );\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'remove:error', model, id );\n\t\t\t}\n\t\t},\n\n\t\tgetError: function( targetID, id ) {\n\t\t\tvar model = nfRadio.channel( 'fields' ).request( 'get:field', targetID );\n\t\t\tvar errors = model.get( 'errors' );\n\t\t\tvar targetError = errors.get( id );\n\t\t\tif ( 'undefined' != targetError ) {\n\t\t\t\treturn targetError;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Controller responsible for replying to a Radio request stating that a field has been changed.\n *\n * This controller sends out a message to the field-specific channel, the field type channel,\n * and the public fields channel so that the data model can be updated.\n */\n\ndefine('controllers/changeField',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Reply to our request for changing a field.\n\t\t\t */\n\t\t\tnfRadio.channel( 'nfAdmin' ).reply( 'change:field', this.changeField );\n\n\t\t\t/*\n\t\t\t * If we blur our field, set the model attribute of 'clean' to false.\n\t\t\t * 'clean' tracks whether or not the user has every interacted with this element.\n\t\t\t * Some validation, like required, uses this to decide whether or not to add an error.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'blur:field', this.blurField );\n\t\t},\n\n\t\tchangeField: function( el, model ) {\n\t\t\t// Get our current value.\n\t\t\tvar value = nfRadio.channel( model.get( 'type' ) ).request( 'before:updateField', el, model );\n\t\t\tvalue = ( 'undefined' != typeof value ) ? value : nfRadio.channel( model.get( 'parentType' ) ).request( 'before:updateField', el, model );\n\t\t\tvalue = ( 'undefined' != typeof value ) ? value : jQuery( el ).val();\n\n\t\t\t// Set our 'isUpdated' flag to false.\n\t\t\tmodel.set( 'isUpdated', false );\n\n\t\t\t// Set our 'clean' flag to false.\n\t\t\tmodel.set( 'clean', false );\n\n\t\t\t/*\n\t\t\t * Send out a message saying that we've changed a field.\n\t\t\t * The first channel is field id/key specific.\n\t\t\t * The second channel is the field type, i.e. text, email, radio\n\t\t\t * The third channel is a generic 'field' channel.\n\t\t\t *\n\t\t\t * If the submitted value you wish to store in the data model isn't the same as the value received above,\n\t\t\t * you can set that model in the actions below and set the 'isUpdated' model attribute to true.\n\t\t\t * i.e. model.set( 'isUpdated', true );\n\t\t\t */\n\t\t\tnfRadio.channel( 'field-' + model.get( 'id' ) ).trigger( 'change:field', el, model );\n\t\t\tnfRadio.channel( model.get( 'type' ) ).trigger( 'change:field', el, model );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'change:field', el, model );\n\n\t\t\t/*\n\t\t\t * Send a request out on our nfAdmin channel to update our field model.\n\t\t\t * If the field model has a 'isUpdated' property of false, nothing will be updated.\n\t\t\t */\n\t\t\tnfRadio.channel( 'nfAdmin' ).request( 'update:field', model, value );\n\t\t},\n\n\t\tblurField: function( el, model ) {\n\t\t\t// Set our 'clean' flag to false.\n\t\t\tmodel.set( 'clean', false );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/changeEmail',[], function() {\n\tvar radioChannel = nfRadio.channel( 'email' );\n\t// var emailReg = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i;\n\tvar emailReg = /^.+@.+\\..+/i;\n\tvar errorID = 'invalid-email';\n\n\tvar controller = Marionette.Object.extend( {\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( radioChannel, 'change:modelValue', this.onChangeModelValue );\n\t\t\tthis.listenTo( radioChannel, 'keyup:field', this.emailKeyup );\n\t\t\tthis.listenTo( radioChannel, 'blur:field', this.onBlurField );\n\t\t},\n\n\t\tonChangeModelValue: function( model ) {\n\t\t\tvar value = model.get( 'value' );\n\t\t\tvar fieldID = model.get( 'id' );\n\t\t\tthis.emailChange( value, fieldID );\n\t\t},\n\n\t\tonBlurField: function( el, model ) {\n\t\t\tvar value = jQuery( el ).val();\n\t\t\tvar fieldID = model.get( 'id' );\n\t\t\tthis.emailChange( value, fieldID );\n\t\t},\n\n\t\temailChange: function( value, fieldID ) {\n\t\t\tif ( 0 < value.length ) {\n\t\t\t\tif( emailReg.test( value ) ) {\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', fieldID, errorID );\n\t\t\t\t} else {\n\t\t\t\t\tvar fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', fieldID );\n\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:error', fieldID, errorID, formModel.get( 'settings' ).changeEmailErrorMsg );\n\t\t\t\t}\t\t\t\t\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', fieldID, errorID );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a user types inside of an email field, track their keypresses and add the appropriate class.\n\t\t * If the value validates as an email, add a class of nf-pass\n\t\t * If the value does not validate as email, add a class of nf-fail\n\t\t * \n\t\t * @since 3.0\n\t\t * @param {object} el Element that triggered the keyup event.\n\t\t * @param {object} model Model connected to the element that triggered the event\n\t\t * @return {void}\n\t\t */\n\t\temailKeyup: function( el, model, keyCode ) {\n\t\t\t\n\t\t\t/*\n\t\t\t * If we pressed the 'tab' key to get to this field, return false.\n\t\t\t */\n\t\t\tif ( 9 == keyCode ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t/*\n\t\t\t * Get the current value from our element.\n\t\t\t */\n\t\t\tvar value = jQuery( el ).val();\n\n\t\t\t/*\n\t\t\t * Get our current ID\n\t\t\t */\n\t\t\tvar fieldID = model.get( 'id' );\n\n\t\t\t/*\n\t\t\t * Check our value to see if it is a valid email.\n\t\t\t */\n\t\t\n\t\t\t\n\t\t\tif ( 0 == value.length ) {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', fieldID, errorID );\n\t\t\t} else if ( ! emailReg.test( value ) && ! model.get( 'clean' ) ) {\n\n\t\t\t\tvar fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', fieldID );\n\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:error', fieldID, errorID, formModel.get( 'settings' ).changeEmailErrorMsg );\n\n\t\t\t\tmodel.removeWrapperClass( 'nf-pass' );\n\t\t\t} else if ( emailReg.test( value ) ) {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', fieldID, errorID );\n\t\t\t\t/*\n\t\t\t\t * Add nf-pass class to the wrapper.\n\t\t\t\t */\n\t\t\t\tmodel.addWrapperClass( 'nf-pass' );\n\t\t\t\tmodel.set( 'clean', false );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/fieldCheckbox',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When we init our checkbox model, register our renderClasses() function\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'checkbox' ), 'init:model', this.registerRenderClasses );\n\n\t\t\tnfRadio.channel( 'checkbox' ).reply( 'validate:required', this.validateRequired );\n\t\t\tnfRadio.channel( 'checkbox' ).reply( 'validate:modelData', this.validateModelData );\n nfRadio.channel( 'checkbox' ).reply( 'before:updateField', this.beforeUpdateField, this );\n nfRadio.channel( 'checkbox' ).reply( 'get:calcValue', this.getCalcValue, this );\n\t\t},\n\n\t\tbeforeUpdateField: function( el, model ) {\n\t\t\tvar checked = jQuery( el ).prop( 'checked' );\n\t\t\tif ( checked ) {\n\t\t\t\tvar value = 1;\n\t\t\t\tjQuery( el ).addClass( 'nf-checked' );\n\t\t\t\tjQuery( el ).closest( '.field-wrap' ).find( 'label[for=\"' + jQuery( el ).prop( 'id' ) + '\"]' ).addClass( 'nf-checked-label' );\n\t\t\t} else {\n\t\t\t\tvar value = 0;\n\t\t\t\tjQuery( el ).removeClass( 'nf-checked' );\n\t\t\t\tjQuery( el ).closest( '.field-wrap' ).find( 'label[for=\"' + jQuery( el ).prop( 'id' ) + '\"]' ).removeClass( 'nf-checked-label' );\n\t\t\t}\n\n\t\t\treturn value;\n\t\t},\n\n\t\tvalidateRequired: function( el, model ) {\n\t\t\treturn el[0].checked;\n\t\t},\n\n\t\tvalidateModelData: function( model ) {\n\t\t\treturn model.get( 'value' ) != 0;\n\t\t},\n\n\t\tgetCalcValue: function( fieldModel ) {\n\t\t\tif ( 1 == fieldModel.get( 'value' ) ) {\n\t\t\t\tcalcValue = fieldModel.get( 'checked_calc_value' );\n\t\t\t} else {\n\t\t\t\tcalcValue = fieldModel.get( 'unchecked_calc_value' );\n\t\t\t}\n\n\t\t\treturn calcValue;\n\t\t},\n\n\t\tregisterRenderClasses: function( model ) {\n\t\t\tif ( 'checked' == model.get( 'default_value' ) ) {\n\t\t\t\tmodel.set( 'value', 1 );\n\t\t\t} else {\n\t\t\t\tmodel.set( 'value', 0 );\n\t\t\t}\n\t\t\tmodel.set( 'customClasses', this.customClasses );\n\t\t\tmodel.set( 'customLabelClasses', this.customLabelClasses );\n\t\t\tmodel.set( 'maybeChecked', this.maybeChecked );\n\t\t},\n\n\t\tcustomClasses: function( classes ) {\n\t\t\tif ( 1 == this.value || ( this.clean && 'undefined' != typeof this.default_value && 'checked' == this.default_value ) ) {\n\t\t\t\tclasses += ' nf-checked';\n\t\t\t} else {\n\t\t\t\tclasses.replace( 'nf-checked', '' );\n\t\t\t}\n\t\t\treturn classes;\n\t\t},\n\n\t\tcustomLabelClasses: function( classes ) {\n\t\t\tif ( 1 == this.value || ( this.clean && 'undefined' != typeof this.default_value && 'checked' == this.default_value ) ) {\n\t\t\t\tclasses += ' nf-checked-label';\n\t\t\t} else {\n\t\t\t\tclasses.replace( 'nf-checked-label', '' );\n\t\t\t}\n\t\t\treturn classes;\n\t\t},\n\n\t\tmaybeChecked: function() {\n\t\t\tif ( 1 == this.value || ( this.clean && 'undefined' != typeof this.default_value && 'checked' == this.default_value ) ) {\n\t\t\t\treturn ' checked';\n\t\t\t} else {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/fieldCheckboxList',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'listcheckbox' ), 'init:model', this.register );\n this.listenTo( nfRadio.channel( 'terms' ), 'init:model', this.register );\n nfRadio.channel( 'listcheckbox' ).reply( 'before:updateField', this.beforeUpdateField, this );\n nfRadio.channel( 'terms' ).reply( 'before:updateField', this.beforeUpdateField, this );\n nfRadio.channel( 'listcheckbox' ).reply( 'get:calcValue', this.getCalcValue, this );\n nfRadio.channel( 'terms' ).reply( 'get:calcValue', this.getCalcValue, this );\n },\n\n register: function( model ) {\n model.set( 'renderOptions', this.renderOptions );\n model.set( 'renderOtherText', this.renderOtherText );\n model.set( 'selected', [] );\n\n /*\n * When we init a model, we need to set our 'value' to the selected option's value.\n * This is the list equivalent of a 'default value'.\n */ \n if ( 0 != model.get( 'options' ).length ) {\n var selected = _.filter( model.get( 'options' ), function( opt ) { return 1 == opt.selected } );\n selected = _.map( selected, function( opt ) { return opt.value } );\n model.set( 'value', selected );\n }\n\n },\n\n renderOptions: function() {\n var html = '';\n\n if ( '' == this.value ) {\n var valueFound = true;\n } else {\n var valueFound = false;\n }\n\n _.each( this.options, function( option, index ) {\n if ( option.value == this.value ) {\n valueFound = true;\n }\n\n /*\n * TODO: This is a bandaid fix for making sure that each option has a \"visible\" property.\n * This should be moved to creation so that when an option is added, it has a visible property by default.\n */\n if ( 'undefined' == typeof option.visible ) {\n option.visible = true;\n }\n\n option.fieldID = this.id;\n option.classes = this.classes;\n option.index = index;\n\n if( ( option.selected && \"0\" != option.selected ) && this.clean ){\n option.isSelected = true;\n } else {\n var testValues = _.map( this.value, function( value ) {\n return value.toString();\n } ); \n \n option.isSelected = ( -1 != testValues.indexOf( option.value.toString() ) );\n }\n\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-listcheckbox-option' );\n html += template( option );\n }, this );\n\n if ( 1 == this.show_other ) {\n if ( 'nf-other' == this.value ) {\n valueFound = false;\n }\n var data = {\n fieldID: this.id,\n classes: this.classes,\n currentValue: this.value,\n renderOtherText: this.renderOtherText,\n valueFound: valueFound\n };\n\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-listcheckbox-other' );\n html += template( data );\n\n }\n\n return html;\n },\n\n renderOtherText: function() {\n if ( 'nf-other' == this.currentValue || ! this.valueFound ) {\n if ( 'nf-other' == this.currentValue ) {\n this.currentValue = '';\n }\n var data = {\n fieldID: this.fieldID,\n classes: this.classes,\n currentValue: this.currentValue\n };\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-listcheckbox-other-text' );\n return template( data );\n }\n },\n\n getCalcValue: function( fieldModel ) {\n var calc_value = 0;\n var options = fieldModel.get( 'options' );\n if ( 0 != options.length ) {\n _.each( fieldModel.get( 'value' ), function( val ) {\n var tmp_opt = _.find( options, function( opt ) { return opt.value == val } );\n calc_value = math.add( calc_value, tmp_opt.calc );\n } );\n }\n return calc_value;\n },\n\n beforeUpdateField: function( el, model ) {\n var selected = model.get( 'value' ) || [];\n if ( typeof selected == 'string' ) selected = [ selected ];\n\n var value = jQuery( el ).val();\n var checked = jQuery( el ).prop( 'checked' );\n if ( checked ) {\n selected.push( value );\n jQuery( el ).addClass( 'nf-checked' );\n jQuery( el ).parent().find( 'label[for=\"' + jQuery( el ).prop( 'id' ) + '\"]' ).addClass( 'nf-checked-label' );\n } else {\n jQuery( el ).removeClass( 'nf-checked' );\n jQuery( el ).parent().find( 'label[for=\"' + jQuery( el ).prop( 'id' ) + '\"]' ).removeClass( 'nf-checked-label' );\n var i = selected.indexOf( value );\n if( -1 != i ){\n selected.splice( i, 1 );\n }\n }\n\n // if ( 1 == model.get( 'show_other' ) ) {\n // model.set( 'reRender', true );\n // }\n\n return _.clone( selected );\n }\n });\n\n return controller;\n} );\n","define('controllers/fieldRadio',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'listradio' ), 'change:modelValue', this.changeModelValue );\n\t\t\tthis.listenTo( nfRadio.channel( 'listradio' ), 'init:model', this.register );\n\t\t\tnfRadio.channel( 'listradio' ).reply( 'get:calcValue', this.getCalcValue, this );\n\t\t\t\n\t\t\tthis.listenTo( nfRadio.channel( 'listradio' ), 'change:field', this.updateCheckedClass, this );\n\t\t},\n\n\t\tregister: function( model ) {\n\t\t\tmodel.set( 'renderOptions', this.renderOptions );\n\t\t\tmodel.set( 'renderOtherText', this.renderOtherText );\n\t\t\t/*\n\t\t\t * When we init a model, we need to set our 'value' to the selected option's value.\n\t\t\t * This is the list equivalent of a 'default value'.\n\t\t\t */ \n\t\t\tif ( 0 != model.get( 'options' ).length ) {\n\t\t\t\t/*\n\t\t\t\t * Check to see if we have a selected value.\n\t\t\t\t */\n\t\t\t\tvar selected = _.find( model.get( 'options' ), function( opt ) { return 1 == opt.selected } );\n\n\t\t\t\tif ( 'undefined' != typeof selected ) {\n\t\t\t\t\tmodel.set( 'value', selected.value );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tchangeModelValue: function( model ) {\n\t\t\tif ( 1 == model.get( 'show_other' ) ) {\n\t\t\t\t// model.set( 'reRender', true );\n\t\t\t\tmodel.trigger( 'reRender');\n\t\t\t}\n\t\t},\n\n\t\trenderOptions: function() {\n\t\t\tvar html = '';\n\t\t\tif ( '' == this.value ) {\n\t\t\t\tvar valueFound = true;\n\t\t\t} else {\n\t\t\t\tvar valueFound = false;\n\t\t\t}\n\t\t\t\n\t\t\t_.each( this.options, function( option, index ) {\n\t\t\t\tif ( option.value == this.value ) {\n\t\t\t\t\tvalueFound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n * TODO: This is a bandaid fix for making sure that each option has a \"visible\" property.\n * This should be moved to creation so that when an option is added, it has a visible property by default.\n */\n if ( 'undefined' == typeof option.visible ) {\n option.visible = true;\n }\n\n option.selected = false;\n\t\t\t\toption.fieldID = this.id;\n\t\t\t\toption.classes = this.classes;\n\t\t\t\toption.currentValue = this.value;\n\t\t\t\toption.index = index;\n\n\t\t\t\t/*\n\t\t\t\t * If we haven't edited this field yet, use the default checked\n\t\t\t\t */\n\t\t\t\tif ( this.clean && 1 == this.selected ) {\n\t\t\t\t\toption.selected = true;\n\t\t\t\t} else if ( this.value == option.value ) {\n\t\t\t\t\toption.selected = true;\n\t\t\t\t} else {\n\t\t\t\t\toption.selected = false;\n\t\t\t\t}\n\n\t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-listradio-option' );\n\n\t\t\t\thtml += template( option );\n\t\t\t}, this );\n\n\t\t\tif ( 1 == this.show_other ) {\n\t\t\t\tif ( 'nf-other' == this.value ) {\n\t\t\t\t\tvalueFound = false;\n\t\t\t\t}\n\t\t\t\tvar data = {\n\t\t\t\t\tfieldID: this.id,\n\t\t\t\t\tclasses: this.classes,\n\t\t\t\t\tcurrentValue: this.value,\n\t\t\t\t\trenderOtherText: this.renderOtherText,\n\t\t\t\t\tvalueFound: valueFound\n\t\t\t\t};\n\t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-listradio-other' );\n\t\t\t\thtml += template( data );\n\t\t\t}\n\n\t\t\treturn html;\n\t\t},\n\n\t\trenderOtherText: function() {\n\t\t\tif ( 'nf-other' == this.currentValue || ! this.valueFound ) {\n\t\t\t\tif ( 'nf-other' == this.currentValue ) {\n\t\t\t\t\tthis.currentValue = '';\n\t\t\t\t}\n\t\t\t\tvar data = {\n\t\t\t\t\tfieldID: this.fieldID,\n\t\t\t\t\tclasses: this.classes,\n\t\t\t\t\tcurrentValue: this.currentValue\n\t\t\t\t};\n\t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-listradio-other-text' );\n\t\t\t\treturn template( data );\n\t\t\t}\n\t\t},\n\n\t\tgetCalcValue: function( fieldModel ) {\n\t\t\tvar calc_value = 0;\n\t\t\tif ( 0 != fieldModel.get( 'options' ).length ) {\n\t\t\t\t/*\n\t\t\t\t * Check to see if we have a selected value.\n\t\t\t\t */\n\t\t\t\tvar selected = _.find( fieldModel.get( 'options' ), function( opt ) { return fieldModel.get( 'value' ) == opt.value } );\n\t\t\t\t/*\n\t\t\t\t * We don't have a selected value, so use our first option.\n\t\t\t\t */\n\t\t\t\tif ( 'undefined' == typeof selected ) {\n\t\t\t\t\tselected = fieldModel.get( 'options' )[0];\n\t\t\t\t}\n\n\t\t\t\tvar calc_value = selected.calc;\n\t\t\t}\n\t\t\treturn calc_value;\n\t\t},\n\n\t\tupdateCheckedClass: function( el, model ) {\n\t\t\tjQuery( '[name=\"' + jQuery( el ).attr( 'name' ) + '\"]' ).removeClass( 'nf-checked' );\n\t\t\tjQuery( el ).closest( 'ul' ).find( 'label' ).removeClass( 'nf-checked-label' );\n\t\t\tjQuery( el ).addClass( 'nf-checked' );\n\t\t\tjQuery( el ).closest( 'li' ).find( 'label[for=\"' + jQuery( el ).prop( 'id' ) + '\"]' ).addClass( 'nf-checked-label' );\n\n\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define('controllers/fieldNumber',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'number' ), 'init:model', this.maybeMinDefault );\n this.listenTo( nfRadio.channel( 'number' ), 'keyup:field', this.validateMinMax );\n },\n\n maybeMinDefault: function( model ) {\n\n if( '' == model.get( 'value' ) ){\n var min = model.get( 'num_min' );\n model.set( 'value', min );\n }\n },\n\n validateMinMax: function( el, model ) {\n var $el = jQuery( el );\n var value = parseFloat( $el.val() );\n var min = $el.attr( 'min' );\n var max = $el.attr( 'max' );\n var step = parseFloat( $el.attr( 'step' ) );\n\n if( min && value < min ){\n var fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', model.get( 'id' ) );\n var formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n nfRadio.channel( 'fields' ).request( 'add:error', model.get( 'id' ), 'number-min', formModel.get( 'settings' ).fieldNumberNumMinError );\n } else {\n nfRadio.channel( 'fields' ).request( 'remove:error', model.get( 'id' ), 'number-min' );\n }\n\n if ( max && value > max ){\n var fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', model.get( 'id' ) );\n var formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n nfRadio.channel( 'fields' ).request( 'add:error', model.get( 'id' ), 'number-max', formModel.get( 'settings' ).fieldNumberNumMaxError );\n } else {\n nfRadio.channel( 'fields' ).request( 'remove:error', model.get( 'id' ), 'number-max' );\n }\n\n var testValue = parseInt( value * 1000000000 );\n var testStep = parseInt( step * 1000000000 );\n\n if( value && 0 !== testValue % testStep ){\n var fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', model.get( 'id' ) );\n var formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n nfRadio.channel( 'fields' ).request( 'add:error', model.get( 'id' ), 'number-step', formModel.get( 'settings' ).fieldNumberIncrementBy + step );\n } else {\n nfRadio.channel( 'fields' ).request( 'remove:error', model.get( 'id' ), 'number-step' );\n }\n }\n\n });\n\n return controller;\n} );\n","define( 'controllers/mirrorField',[], function() {\n\tvar radioChannel = nfRadio.channel( 'fields' );\n\n\tvar controller = Marionette.Object.extend( {\n\t\tlisteningModel: '',\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( radioChannel, 'init:model', this.registerMirror );\n\t\t},\n\n\t\tregisterMirror: function( model ) {\n\t\t\tif ( model.get( 'mirror_field' ) ) {\n\t\t\t\tthis.listeningModel = model;\n\t\t\t\tvar targetID = model.get( 'mirror_field' );\n\t\t\t\tthis.listenTo( nfRadio.channel( 'field-' + targetID ), 'change:modelValue', this.changeValue );\n\t\t\t}\n\t\t},\n\n\t\tchangeValue: function( targetModel ) {\n\t\t\tthis.listeningModel.set( 'value', targetModel.get( 'value' ) );\n\t\t\t// this.listeningModel.set( 'reRender', true );\n\t\t\tthis.listeningModel.trigger( 'reRender' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define( 'controllers/confirmField',[], function() {\n\tvar radioChannel = nfRadio.channel( 'fields' );\n\tvar errorID = 'confirm-mismatch';\n\n\tvar controller = Marionette.Object.extend( {\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( radioChannel, 'init:model', this.registerConfirm );\n\t\t\tthis.listenTo( radioChannel, 'keyup:field', this.confirmKeyup );\n\t\t},\n\n\t\tregisterConfirm: function( confirmModel ) {\n\t\t\tif ( ! confirmModel.get( 'confirm_field' ) ) return;\n\n\t\t\tthis.listenTo( nfRadio.channel( 'form' ), 'loaded', function( formModal ){\n\t\t\t\tthis.registerConfirmListeners( confirmModel );\n\t\t\t});\n\t\t},\n\n\t\tregisterConfirmListeners: function( confirmModel ) {\n\t\t\t\n\t\t\tvar targetModel = nfRadio.channel( 'form-' + confirmModel.get( 'formID' ) ).request( 'get:fieldByKey', confirmModel.get( 'confirm_field' ) );\n\n\t\t\tconsole.log( targetModel );\n\n\t\t\ttargetModel.set( 'confirm_with', confirmModel.get( 'id' ) );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'field-' + targetModel.get( 'id' ) ), 'change:modelValue', this.changeValue );\n\t\t\tthis.listenTo( nfRadio.channel( 'field-' + confirmModel.get( 'id' ) ), 'change:modelValue', this.changeValue );\n\t\t},\n\n\t\tchangeValue: function( model ) {\n\t\t\tif ( 'undefined' == typeof model.get( 'confirm_with' ) ) {\n\t\t\t\tvar confirmModel = model;\n\t\t\t\tvar targetModel = nfRadio.channel( 'form-' + model.get( 'formID' ) ).request( 'get:fieldByKey', confirmModel.get( 'confirm_field' ) );\n\t\t\t} else {\n\t\t\t\tvar targetModel = model;\n\t\t\t\tvar confirmModel = radioChannel.request( 'get:field', targetModel.get( 'confirm_with' ) );\n\t\t\t}\n\t\t\tvar targetID = targetModel.get( 'id' );\n\t\t\tvar confirmID = confirmModel.get( 'id' );\n\n\t\t\tif ( '' == confirmModel.get( 'value' ) || confirmModel.get( 'value' ) == targetModel.get( 'value' ) ) {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', confirmID, errorID );\n\t\t\t} else {\n\t\t\t\tvar fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', confirmID );\n\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:error', confirmID, errorID, formModel.get( 'settings' ).confirmFieldErrorMsg );\n\t\t\t}\n\t\t},\n\t\t\n\t\tconfirmKeyup: function( el, model, keyCode ) {\n\n\t\t\tvar currentValue = jQuery( el ).val();\n\t\t\tif ( model.get( 'confirm_field' ) ) {\n\t\t\t\tvar confirmModel = model;\n\t\t\t\tvar confirmID = model.get( 'id' );\n\t\t\t\tvar targetModel = nfRadio.channel( 'form-' + model.get( 'formID' ) ).request( 'get:fieldByKey', confirmModel.get( 'confirm_field' ) );\n\t\t\t\tvar compareValue = targetModel.get( 'value' );\n\t\t\t\tvar confirmValue = currentValue;\n\t\t\t} else if ( model.get( 'confirm_with' ) ) {\n\t\t\t\tvar confirmModel = nfRadio.channel( 'fields' ).request( 'get:field', model.get( 'confirm_with' ) );\n\t\t\t\tvar confirmID = confirmModel.get( 'id' );\n\t\t\t\tvar confirmValue = confirmModel.get( 'value' );\n\t\t\t\tvar compareValue = confirmValue;\n\t\t\t}\n\n\t\t\tif ( 'undefined' !== typeof confirmModel ) {\n\t\t\t\tif ( '' == confirmValue ) {\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', confirmID, errorID );\n\t\t\t\t} else if ( currentValue == compareValue ) {\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', confirmID, errorID );\n\t\t\t\t} else {\n\t\t\t\t\tvar fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', confirmID );\n\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:error', confirmID, errorID, formModel.get( 'settings' ).confirmFieldErrorMsg );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/updateFieldModel',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'nfAdmin' ).reply( 'update:field', this.updateField );\n\t\t},\n\n\t\tupdateField: function( model, value ) {\n\t\t\tif ( ! model.get( 'isUpdated' ) ) {\n\t\t\t\tmodel.set( 'value', value );\n\t\t\t\tmodel.set( 'isUpdated', true );\n\t\t\t\t/*\n\t\t\t\t * If we're working with an array, it won't trigger a change event on the value attribute.\n\t\t\t\t * Instead, we have to manually trigger a change event.\n\t\t\t\t */ \n\t\t\t\tif ( _.isArray( value ) ) {\n\t\t\t\t\tmodel.trigger( 'change:value', model );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/submitButton',['controllers/submitButton'], function( submitButton ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'submit' ), 'init:model', this.registerHandlers );\n\t\t},\n\n\t\tregisterHandlers: function( fieldModel ) {\n\t\t\tthis.listenTo( nfRadio.channel( 'field-' + fieldModel.get( 'id' ) ), 'click:field', this.click, this );\n\t\t\t/*\n\t\t\t * Register an interest in the 'before:submit' event of our form.\n\t\t\t */\n\t\t\tfieldModel.listenTo( nfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ), 'before:submit', this.beforeSubmit, fieldModel );\n\t\t\tfieldModel.listenTo( nfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ), 'submit:failed', this.resetLabel, fieldModel );\n\t\t\tfieldModel.listenTo( nfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ), 'submit:response', this.resetLabel, fieldModel );\n\t\t\tfieldModel.listenTo( nfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ), 'enable:submit', this.maybeEnable, fieldModel );\n\t\t\tfieldModel.listenTo( nfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ), 'disable:submit', this.maybeDisable, fieldModel );\n\t\t\tfieldModel.listenTo( nfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ), 'processingLabel', this.processingLabel, fieldModel );\n\n\t\t\tfieldModel.listenTo( nfRadio.channel( 'fields' ), 'add:error', this.maybeDisable, fieldModel );\n\t\t\tfieldModel.listenTo( nfRadio.channel( 'fields' ), 'remove:error', this.maybeEnable, fieldModel );\n\t\t},\n\n\t\tclick: function( e, fieldModel ) {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n\t\t\tnfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ).request( 'submit', formModel );\n\t\t},\n\n\t\tbeforeSubmit: function() {\n\t\t\tthis.set( 'disabled', true );\n\t\t\tnfRadio.channel( 'form-' + this.get( 'formID' ) ).trigger( 'processingLabel', this );\n\t\t},\n\n\t\tmaybeDisable: function( fieldModel ) {\n\n\t\t\tif( 'undefined' != typeof fieldModel && fieldModel.get( 'formID' ) != this.get( 'formID' ) ) return;\n\n\t\t\tthis.set( 'disabled', true );\n\t\t\tthis.trigger( 'reRender' );\n\t\t},\n\n\t\tmaybeEnable: function( fieldModel ) {\n\t\t\t/*\n\t\t\t * If the field reporting the error is not on the same form as the submit button, return false;\n\t\t\t */\n\t\t\tif ( 'undefined' != typeof fieldModel && fieldModel.get( 'formID' ) != this.get( 'formID' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', this.get( 'formID' ) );\n\t\t\tif ( 0 == _.size( formModel.get( 'fieldErrors' ) ) ) {\n\t\t\t\tthis.set( 'disabled', false );\n\t\t\t\tthis.trigger( 'reRender' );\n\t\t\t}\n\t\t},\n\n\t\tprocessingLabel: function() {\n\t\t\tif ( this.get( 'label' ) == this.get( 'processing_label' ) ) return false;\n\n\t\t\tthis.set( 'oldLabel', this.get( 'label' ) );\n\t\t\tthis.set( 'label', this.get( 'processing_label' ) );\n\t\t\tthis.trigger( 'reRender' );\n\t\t},\n\n\t\tresetLabel: function( response ) {\n\t\t\tif ( 'undefined' != typeof this.get( 'oldLabel' ) ) {\n\t\t\t\tthis.set( 'label', this.get( 'oldLabel' ) );\n\t\t\t}\n\t\t\tthis.set( 'disabled', false );\n\t\t\tthis.trigger( 'reRender' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define('controllers/submitDebug',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'forms' ), 'submit:response', this.submitDebug );\n },\n\n submitDebug: function( response, textStatus, jqXHR, formID ) {\n\n if( 'undefined' == typeof response.debug ) return;\n\n /* Form Debug Messages */\n if( 'undefined' != typeof response.debug.form ) {\n var debugMessages = '';\n _.each(response.debug.form, function (message, index) {\n debugMessages += message + '
';\n });\n jQuery('.nf-debug-msg').html(debugMessages);\n }\n\n /* Console Debug Messages */\n if( 'undefined' != typeof response.debug.console ) {\n var style = '';\n console.log( '%c%s', style, 'NINJA SUPPORT' );\n _.each(response.debug.console, function (message, index) {\n console.log( message );\n });\n console.log( '%c%s', style, 'END NINJA SUPPORT' );\n }\n }\n\n });\n\n return controller;\n} );\n","define('controllers/getFormErrors',[], function() {\n\tvar radioChannel = nfRadio.channel( 'fields' );\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function( model ) {\n\t\t\tnfRadio.channel( 'form' ).reply( 'get:errors', this.getFormErrors );\n\t\t},\n\n\t\tgetFormErrors: function( formID ) {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', formID );\n\t\t\tvar errors = false;\n\t\t\t\n\t\t\tif ( formModel ) {\n\t\t\t\t/*\n\t\t\t\t * Check to see if we have any errors on our form model.\n\t\t\t\t */\n\t\t\t\tif ( 0 !== formModel.get( 'errors' ).length ) {\n\t\t\t\t\t_.each( formModel.get( 'errors' ).models, function( error ) {\n\t\t\t\t\t\terrors = errors || {};\n\t\t\t\t\t\terrors[ error.get( 'id' ) ] = error.get( 'msg' );\n\t\t\t\t\t} );\t\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t_.each( formModel.get( 'fields' ).models, function( field ) {\n\t\t\t\t\tif ( field.get( 'type' ) != 'submit' && field.get( 'errors' ).length > 0 ) {\n\t\t\t\t\t\terrors = errors || {};\n\t\t\t\t\t\terrors[ field.get( 'id' ) ] = field.get( 'errors' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn errors;\n\t\t},\n\t});\n\n\treturn controller;\n} );\n","define('controllers/validateRequired',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'blur:field', this.validateRequired );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'change:field', this.validateRequired );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'keyup:field', this.validateKeyup );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'change:modelValue', this.validateModelData );\n\t\t\tthis.listenTo( nfRadio.channel( 'submit' ), 'validate:field', this.validateModelData );\n\t\t},\n\t\t\n\t\tvalidateKeyup: function( el, model, keyCode ) {\n\t\t\tif ( 1 != model.get( 'required' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( ! model.get( 'clean' ) ) {\n\t\t\t\tthis.validateRequired( el, model );\n\t\t\t}\n\t\t},\n\n\t\tvalidateRequired: function( el, model ) {\n\t\t\tif ( 1 != model.get( 'required' ) || ! model.get( 'visible' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar currentValue = jQuery( el ).val();\n\t\t\tvar customReqValidation = nfRadio.channel( model.get( 'type' ) ).request( 'validate:required', el, model );\n\t\t\tvar defaultReqValidation = true;\n\n\t\t\tvar maskPlaceholder = model.get( 'mask' );\n\t\t\tif ( maskPlaceholder ) {\n\t\t\t\tmaskPlaceholder = maskPlaceholder.replace( /9/g, '_' );\n\t\t\t\tmaskPlaceholder = maskPlaceholder.replace( /a/g, '_' );\n\t\t\t\tmaskPlaceholder = maskPlaceholder.replace( /\\*/g, '_' );\n\t\t\t}\n\n\t\t\tif ( ! jQuery.trim( currentValue ) || currentValue == maskPlaceholder ) {\n\t\t\t\tdefaultReqValidation = false;\n\t\t\t}\n\n\t\t\tif ( 'undefined' !== typeof customReqValidation ) {\n\t\t\t\tvar valid = customReqValidation;\n\t\t\t} else {\n\t\t\t\tvar valid = defaultReqValidation;\n\t\t\t}\n\n\t\t\tthis.maybeError( valid, model );\n\t\t},\n\n\t\tvalidateModelData: function( model ) {\n\t\t\tif ( 1 != model.get( 'required' ) || ! model.get( 'visible' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * If we already have a required error on this model, return false\n\t\t\t */\n\t\t\tif ( model.get( 'errors' ).get( 'required-error' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tcurrentValue = model.get( 'value' );\n\n\t\t\tvar defaultReqValidation = true;\n\n\t\t\tif ( ! jQuery.trim( currentValue ) ) {\n\t\t\t\tdefaultReqValidation = false;\n\t\t\t}\n\n\t\t\tvar customReqValidation = nfRadio.channel( model.get( 'type' ) ).request( 'validate:modelData', model );\n\t\t\tif ( 'undefined' !== typeof customReqValidation ) {\n\t\t\t\tvar valid = customReqValidation;\n\t\t\t} else {\n\t\t\t\tvar valid = defaultReqValidation;\n\t\t\t}\n\n\t\t\tthis.maybeError( valid, model );\n\n\t\t},\n\n\t\tmaybeError: function( valid, model ) {\n\t\t\tif ( ! valid ) {\n\n\t\t\t\tvar formModel = nfRadio.channel( 'form-' + model.get( 'formID' ) ).request( 'get:form' );\n\n\t\t\t\tif( 'undefined' != typeof formModel ) {\n\t\t\t\t\tnfRadio.channel('fields').request('add:error', model.get('id'), 'required-error', formModel.get('settings').validateRequiredField);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', model.get( 'id' ), 'required-error' );\n\t\t\t}\t\t\t\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/submitError',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'forms' ), 'submit:response', this.submitErrors );\n\t\t},\n\n\t\tsubmitErrors: function( response, textStatus, jqXHR, formID ) {\n\n\t\t\tif ( _.size( response.errors.fields ) > 0 ) {\n\t\t\t\t_.each( response.errors.fields, function( data, fieldID ) {\n if ( typeof( data ) === 'object' ) {\n nfRadio.channel( 'fields' ).request( 'add:error', fieldID, data.slug, data.message );\n } else {\n nfRadio.channel( 'fields' ).request( 'add:error', fieldID, 'required-error', data );\n }\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( _.size( response.errors.form ) > 0 ) {\n\t\t\t\t_.each( response.errors.form, function( msg, errorID ) {\n\t\t\t\t\tnfRadio.channel( 'form-' + formID ).request( 'remove:error', errorID );\n\t\t\t\t\tnfRadio.channel( 'form-' + formID ).request( 'add:error', errorID, msg );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( 'undefined' != typeof response.errors.last ) {\n\t\t\t\tif( 'undefined' != typeof response.errors.last.message ) {\n\t\t\t\t\tvar style = 'background: rgba( 255, 207, 115, .5 ); color: #FFA700; display: block;';\n\t\t\t\t\tconsole.log( '%c NINJA FORMS SUPPORT: SERVER ERROR', style );\n\t\t\t\t\tconsole.log( response.errors.last.message );\n\t\t\t\t\tconsole.log( '%c END SERVER ERROR MESSAGE', style );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * TODO: This needs to be re-worked for backbone. It's not dynamic enough.\n\t\t\t */\n\t\t\t/*\n\t\t\t * Re-show any hidden fields during a form submission re-start.\n\t\t\t */\n\t\t\tjQuery( '#nf-form-' + formID + '-cont .nf-field-container' ).show();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n\n","define('controllers/actionRedirect',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'forms' ), 'submit:response', this.actionRedirect );\n\t\t},\n\n\t\tactionRedirect: function( response ) {\n\n\t\t\tif ( 'undefined' != typeof response.data.halt && 'undefined' != typeof response.data.halt.redirect && '' != response.data.halt.redirect ) {\n\t\t\t\twindow.location = response.data.halt.redirect;\n\t\t\t}\n\n\t\t\tif ( _.size( response.errors ) == 0 && 'undefined' != typeof response.data.actions ) {\n\n\t\t\t\tif ( 'undefined' != typeof response.data.actions.redirect && '' != response.data.actions.redirect ) {\n\t\t\t\t\twindow.location = response.data.actions.redirect;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define('controllers/actionSuccess',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'forms' ), 'submit:response', this.actionSubmit );\n\t\t},\n\n\t\tactionSubmit: function( response ) {\n\t\t\tif ( _.size( response.errors ) == 0 && 'undefined' != typeof response.data.actions ) {\n\t\t\t\tif ( 'undefined' != typeof response.data.actions.success_message && '' != response.data.actions.success_message ) {\n\t\t\t\t\tvar form_id = response.data.form_id;\n\t\t\t\t\tjQuery( '#nf-form-' + form_id + '-cont .nf-response-msg' ).html( response.data.actions.success_message ).show();\n\n\t\t\t\t\tjQuery('html, body').animate({\n\t\t\t\t\t\tscrollTop: ( jQuery( '#nf-form-' + form_id + '-cont .nf-response-msg' ).offset().top - 50 )\n\t\t\t\t\t}, 0 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define('controllers/fieldSelect',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'init:model', function( model ){\n\t\t\t\tif( 'list' == model.get( 'parentType' ) ) this.register( model );\n\t\t\t}, this );\n\n\t\t\tnfRadio.channel( 'listselect' ).reply( 'get:calcValue', this.getCalcValue, this );\n\t\t\tnfRadio.channel( 'listmultiselect' ).reply( 'get:calcValue', this.getCalcValue, this );\n\t\t},\n\n\t\tregister: function( model ) {\n\t\t\tmodel.set( 'renderOptions', this.renderOptions );\n\t\t\tmodel.set( 'renderOtherAttributes', this.renderOtherAttributes );\n\t\t\t/*\n\t\t\t * When we init a model, we need to set our 'value' to the selected option's value.\n\t\t\t * This is the list equivalent of a 'default value'.\n\t\t\t */ \n\t\t\tif ( 0 != model.get( 'options' ).length ) {\n\t\t\t\t/*\n\t\t\t\t * Check to see if this is a multi-select list.\n\t\t\t\t */\n\t\t\t\tif ( 'listmultiselect' == model.get( 'type' ) ) {\n\t\t\t\t\t/*\n\t\t\t\t\t * We're using a multi-select, so we need to check out any selected options and add them together.\n\t\t\t\t\t */\n\t\t\t\t\tvar selected = _.filter( model.get( 'options' ), function( opt ) { return 1 == opt.selected } );\n\t\t\t\t\tselected = _.map( selected, function( opt ) { return opt.value } );\n\t\t\t\t\tvar value = selected;\n\t\t\t\t} else if ( 'listradio' !== model.get( 'type' ) ) {\n\t\t\t\t\t/*\n\t\t\t\t\t * Check to see if we have a selected value.\n\t\t\t\t\t */\n\t\t\t\t\tvar selected = _.find( model.get( 'options' ), function( opt ) { return 1 == opt.selected } );\n\t\t\t\t\t/*\n\t\t\t\t\t * We don't have a selected value, so use our first option.\n\t\t\t\t\t */\n\t\t\t\t\tif ( 'undefined' == typeof selected ) {\n\t\t\t\t\t\tselected = _.first( model.get( 'options' ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'undefined' != typeof selected && 'undefined' != typeof selected.value ) {\n\t\t\t\t\t\tvar value = selected.value;\n\t\t\t\t\t} else if ( 'undefined' != typeof selected ) {\n\t\t\t\t\t\tvar value = selected.label;\n\t\t\t\t\t}\t\n\t\t\t\t}\n\n\t\t\t\tif ( 'undefined' != typeof selected ) {\n\t\t\t\t\tmodel.set( 'value', value );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\trenderOptions: function() {\n\t\t\tvar html = '';\n\t\t\t_.each( this.options, function( option ) {\n\t\t\t\t\n\n\t\t\t\tif ( ( 1 == option.selected && this.clean ) ) {\n\t\t\t\t\tvar selected = true;\n\t\t\t\t} else if ( _.isArray( this.value ) && -1 != _.indexOf( this.value, option.value ) ) {\n\t\t\t\t\tvar selected = true;\n\t\t\t\t} else if ( ! _.isArray( this.value ) && option.value == this.value ) {\n\t\t\t\t\tvar selected = true;\n\t\t\t\t} else {\n\t\t\t\t\tvar selected = false;\n\t\t\t\t}\n\n\t\t\t\t/*\n * TODO: This is a bandaid fix for making sure that each option has a \"visible\" property.\n * This should be moved to creation so that when an option is added, it has a visible property by default.\n */\n if ( 'undefined' == typeof option.visible ) {\n option.visible = true;\n }\n\n\t\t\t\toption.selected = selected;\n\t\t\t\toption.fieldID = this.id;\n\t\t\t\toption.classes = this.classes;\n\t\t\t\toption.currentValue = this.value;\n\n\t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-listselect-option' );\n\t\t\t\thtml += template( option );\n\t\t\t}, this );\n\n\t\t\treturn html;\n\t\t},\n\n\t\trenderOtherAttributes: function() {\n\t\t\tvar otherAttributes = '';\n\n\t\t\tif( 'listmultiselect' == this.type ){\n\t\t\t\totherAttributes = otherAttributes + ' multiple';\n\t\t\t}\n\n\t\t\treturn otherAttributes;\n\t\t},\n\n\t\tgetCalcValue: function( fieldModel ) {\n\t\t\tvar calc_value = 0;\n\t\t\tvar options = fieldModel.get( 'options' );\n\t\t\tif ( 0 != options.length ) {\n\t\t\t\t/*\n\t\t\t\t * Check to see if this is a multi-select list.\n\t\t\t\t */\n\t\t\t\tif ( 'listmultiselect' == fieldModel.get( 'type' ) ) {\n\t\t\t\t\t/*\n\t\t\t\t\t * We're using a multi-select, so we need to check out any selected options and add them together.\n\t\t\t\t\t */\n\t\t\t\t\t_.each( fieldModel.get( 'value' ), function( val ) {\n\t\t\t\t\t\tvar tmp_opt = _.find( options, function( opt ) { return opt.value == val } );\n\t\t\t\t\t\tcalc_value = math.add( calc_value, tmp_opt.calc );\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\t/*\n\t\t\t\t\t * We are using a single select, so our selected option is in the 'value' attribute.\n\t\t\t\t\t */\n\t\t\t\t\tvar selected = _.find( options, function( opt ) { return fieldModel.get( 'value' ) == opt.value } );\n\t\t\t\t\t/*\n\t\t\t\t\t * We don't have a selected value, so use our first option.\n\t\t\t\t\t */\n\t\t\t\t\tif ( 'undefined' == typeof selected ) {\n\t\t\t\t\t\tselected = fieldModel.get( 'options' )[0];\n\t\t\t\t\t}\t\t\n\t\t\t\t\tcalc_value = selected.calc;\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn calc_value;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define('controllers/coreSubmitResponse',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'forms' ), 'submit:response', this.actionSubmit );\n\t\t},\n\n\t\tactionSubmit: function( response ) {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', response.data.form_id );\n\t\t\t/*\n\t\t\t * If we have errors, don't hide or clear.\n\t\t\t */\n\t\t\tif ( 0 != _.size( response.errors ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( 1 == response.data.settings.clear_complete ) {\n\t\t\t\t// nfRadio.channel( 'form-' + response.data.form_id ).trigger( 'reset' );\n\t\t\t\tformModel.get( 'fields' ).reset( formModel.get( 'loadedFields' ) );\n\t\t\t}\n\n\t\t\tif ( 1 == response.data.settings.hide_complete ) {\n\t\t\t\t/**\n\t\t\t\t * TODO: This needs to be re-worked for backbone. It's not dynamic enough.\n\t\t\t\t */\n\t\t\t\tformModel.trigger( 'hide' );\n\t\t\t\t// jQuery( '.nf-fields' ).hide();\n\t\t\t\t// jQuery( '.nf-form-title' ).hide();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define('controllers/fieldProduct',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'product' ), 'init:model', this.register );\n nfRadio.channel( 'product' ).reply( 'get:calcValue', this.getCalcValue, this );\n },\n\n register: function( model ) {\n model.set( 'renderProductQuantity', this.renderProductQuantity );\n model.set( 'renderProduct', this.renderProduct );\n model.set( 'renderOptions', this.renderOptions );\n },\n\n renderProduct: function(){\n switch( this.product_type ) {\n case 'user':\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-textbox' );\n return template( this );\n break;\n case 'hidden':\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-hidden' );\n return template( this );\n break;\n\n case 'dropdown':\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-product-dropdown' );\n return template( this );\n break;\n default:\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-product-single' );\n return template( this );\n }\n },\n\n renderProductQuantity: function(){\n if ( 1 == this.product_use_quantity ) {\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-product-quantity' );\n return template( this );\n }\n },\n\n renderOptions: function() {\n var that = this;\n var html = '';\n _.each( this.options, function( option ) {\n if ( 1 == option.selected ) {\n var selected = true;\n } else {\n var selected = false;\n }\n\n option.selected = selected;\n option.fieldID = that.id;\n option.classes = that.classes;\n option.currentValue = that.value;\n\n var template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-product-' + that.product_type + '-option' );\n html += template( option );\n } );\n\n return html;\n },\n\n getCalcValue: function( fieldModel ) {\n\n var product_price = fieldModel.get( 'product_price' );\n var product_quantity = fieldModel.get( 'value' );\n\n return product_price * product_quantity;\n }\n });\n\n return controller;\n} );\n\n","define('controllers/fieldTotal',[], function() {\n var controller = Marionette.Object.extend( {\n\n totalModel: {},\n\n productTotals: {},\n\n initialize: function() {\n this.listenTo( nfRadio.channel( 'total' ), 'init:model', this.register );\n this.listenTo( nfRadio.channel( 'shipping' ), 'init:model', this.registerShipping );\n },\n\n register: function( totalModel ){\n this.totalModel = totalModel;\n\n var formID = totalModel.get( 'formID' );\n this.listenTo( nfRadio.channel( 'form-' + formID ), 'loaded', this.onFormLoaded );\n\n this.listenTo( nfRadio.channel( 'product' ), 'change:modelValue', this.onChangeProduct );\n this.listenTo( nfRadio.channel( 'quantity' ), 'change:modelValue', this.onChangeQuantity );\n },\n\n registerShipping: function( shippingModel ){\n this.shippingCost = shippingModel.get( 'shipping_cost' );\n },\n\n onFormLoaded: function( formModel ){\n\n var fieldModels = formModel.get( 'fields' ).models;\n\n var productFields = {};\n var quantityFields = {};\n\n for( var model in fieldModels ){\n\n var field = fieldModels[ model ];\n var fieldID = field.get( 'id' );\n\n // TODO: Maybe use switch\n if( 'product' == field.get( 'type' ) ){\n productFields[ fieldID ] = field;\n } else if( 'quantity' == field.get( 'type' ) ){\n var productID = field.get( 'product_assignment' );\n quantityFields[ productID ] = field;\n }\n }\n\n for( var productID in productFields ){\n\n var product = productFields[ productID ];\n\n var productPrice = Number( product.get( 'product_price' ) );\n\n if( quantityFields[ productID ] ){\n\n productPrice *= quantityFields[ productID ].get( 'value' );\n\n } else if( 1 == product.get( 'product_use_quantity' ) ){\n\n productPrice *= product.get( 'value' );\n\n }\n\n this.productTotals[ productID ] = productPrice;\n }\n\n this.updateTotal();\n },\n\n onChangeProduct: function( model ){\n var productID = model.get( 'id' );\n var productPrice = Number( model.get( 'product_price' ) );\n var productQuantity = Number( model.get( 'value' ) );\n var newTotal = productQuantity * productPrice;\n this.productTotals[ productID ] = newTotal;\n\n this.updateTotal();\n },\n\n onChangeQuantity: function( model ){\n var productID = model.get( 'product_assignment' );\n var productField = nfRadio.channel( 'fields' ).request( 'get:field', productID );\n var productPrice = Number( productField.get( 'product_price' ) );\n\n var quantity = Number( model.get( 'value' ) );\n\n var newTotal = quantity * productPrice;\n\n this.productTotals[ productID ] = newTotal;\n\n this.updateTotal();\n },\n\n updateTotal: function(){\n\n var newTotal = 0;\n\n for( var product in this.productTotals ){\n newTotal += Number( this.productTotals[ product ] );\n }\n\n if( newTotal && this.shippingCost ) {\n // Only add shipping if there is a cost.\n newTotal += Number(this.shippingCost);\n }\n\n this.totalModel.set( 'value', newTotal.toFixed( 2 ) );\n this.totalModel.trigger( 'reRender' );\n }\n });\n\n return controller;\n});\n","define('controllers/fieldQuantity',[], function() {\n var controller = Marionette.Object.extend( {\n\n initialize: function() {\n this.listenTo( nfRadio.channel( 'quantity' ), 'init:model', this.registerQuantity );\n },\n\n registerQuantity: function( model ){\n var productID = model.get( 'product_assignment' );\n var product = nfRadio.channel( 'fields' ).request( 'get:field', productID );\n\n if( product ) {\n product.set('product_use_quantity', 0);\n }\n },\n\n });\n\n return controller;\n});\n","/**\n * Model that represents a calculation.\n *\n * On init, we trigger a radio message so that controllers can do things when a calc model inits.\n */\ndefine( 'models/calcModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\t// Set our form id\n\t\t\tthis.set( 'formID', this.collection.options.formModel.get( 'id' ) );\n\t\t\t// Set our initial fields object to empty. This will hold our key/value pairs.\n\t\t\tthis.set( 'fields', {} );\n\t\t\t// Trigger a radio message to let controllers know we've inited this model.\n\t\t\tnfRadio.channel( 'calc' ).trigger( 'init:model', this );\n\t\t\t// When we change the value of this calculation, send out a radio message\n\t\t\tthis.on( 'change:value', this.changeValue, this );\n\t\t},\n\n\t\t/**\n\t\t * Trigger a radio message when a field present in our calculation changes\n\t\t *\n\t\t * The listener that triggers/calls this function is in controllers/calculations\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeField: function( fieldModel ) {\n\t\t\tnfRadio.channel( 'calc' ).trigger( 'change:field', this, fieldModel );\n\t\t},\n\n\t\tchangeCalc: function( targetCalcModel ) {\n\t\t\tnfRadio.channel( 'calc' ).trigger( 'change:calc', this, targetCalcModel );\n\t\t},\n\n\t\tchangeValue: function() {\n\t\t\tnfRadio.channel( 'calc' ).trigger( 'change:value', this );\n\t\t}\n\t} );\n\n\treturn model;\n} );\n\n","define( 'models/calcCollection',['models/calcModel'], function( CalcModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: CalcModel,\n\t\tcomparator: 'order',\n\n\t\tinitialize: function( models, options ) {\n\t\t\tthis.options = options;\n\t\t\t/*\n\t\t\t * Respond to requests for our calc model\n\t\t\t */\n\t\t\tnfRadio.channel( 'form-' + options.formModel.get( 'id' ) ).reply( 'get:calc', this.getCalc, this );\n\t\t},\n\n\t\tgetCalc: function( key ) {\n\t\t\treturn this.findWhere( { name: key } );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Controller responsible for keeping up with calculations.\n */\ndefine('controllers/calculations',['models/calcCollection'], function( CalcCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.calcs = {};\n\t\t\tthis.displayFields = {};\n\t\t\t// When our form initialises, check to see if there are any calculations that need to be tracked.\n\t\t\tthis.listenTo( nfRadio.channel( 'form' ), 'loaded', this.registerCalcs );\n\n\t\t\t// When a calc model is initialised, run a setup function.\n\t\t\t// this.listenTo( nfRadio.channel( 'calc' ), 'init:model', this.setupCalc );\n\n\t\t\t// When a field referenced by a calc model changes, update our calc.\n\t\t\tthis.listenTo( nfRadio.channel( 'calc' ), 'change:field', this.changeField );\n\n\t\t\t// When a calculation referenced by a calc model changes, update our calc.\n\t\t\tthis.listenTo( nfRadio.channel( 'calc' ), 'change:calc', this.changeCalc );\n\n\t\t\t/*\n\t\t\t * Listen to our field model init for fields that want to display calc values.\n\t\t\t * If that field has a calc merge tag, replace it with the default calc value.\n\t\t\t */\n\t\t\tvar that = this;\n\t\t\t_.each( nfFrontEnd.use_merge_tags.calculations, function( fieldType ) {\n\t\t\t\tthat.listenTo( nfRadio.channel( 'fields-' + fieldType ), 'init:model', that.initDisplayField );\n\t\t\t} );\n\t\t\t\n\t\t\t// When we change our calc value, update any display fields.\n\t\t\tthis.listenTo( nfRadio.channel( 'calc' ), 'change:value', this.updateDisplayFields );\n\n\t\t\t// Set an init variable so that we only call reRender on the display field on change, not on init.\n\t\t\tthis.init = {};\n\t\t},\n\n\t\t/**\n\t\t * When our form loads, create a collection out of any calculations.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model formModel\n\t\t * @return void\n\t\t */\n\t\tregisterCalcs: function( formModel ) {\n\t\t\tvar calcCollection = new CalcCollection( formModel.get( 'settings' ).calculations, { formModel: formModel } );\n\t\t\tthis.calcs[ formModel.get( 'id' ) ] = calcCollection;\n\t\t\tvar that = this;\n\n\t\t\t_.each( calcCollection.models, function( calcModel ) {\n\t\t\t\t/*\n\t\t\t\t * We set a property on our init variable for the calc model we're looping over.\n\t\t\t\t * This property is set to true so that when we make changes to the calc model on the next line\n\t\t\t\t * the field view doesn't try to redraw itself.\n\t\t\t\t * If we don't do this, the 'reRender' attribute of the model will be set before the view is initialized,\n\t\t\t\t * which means that setting 'reRender' to true will never re-render the view.\n\t\t\t\t */\n\t\t\t\tthat.init[ calcModel.get( 'name' ) ] = true;\n\t\t\t\t// Setup our calculation models with initial values and register listeners for calc-related fields.\n\t\t\t\tthat.setupCalc( calcModel );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * When a calculation model is instantiated from the registerCalcs function:\n\t\t *\n\t\t * Use a regex to get an array of the field keys\n\t\t * Setup an initial key/values array\n\t\t * Check for any references to other calculations\n\t\t * Set the initial value of our calculation\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model calcModel\n\t\t * @return void\n\t\t */\n\t\tsetupCalc: function( calcModel ) {\n\t\t\t// Setup our that var so we can access 'this' context in our loop.\n\t\t\tvar that = this;\n\t\t\t// Get our equation\n\t\t\tvar eq = calcModel.get( 'eq' );\n\t\t\t// We want to keep our original eq intact, so we use a different var for string replacment.\n\t\t\tvar eqValues = eq;\n\n\t\t\t/* TODO:\n\t\t\t * It might be possible to refactor these two if statements.\n\t\t\t * The difficulty is that each has a different method of retreiving the specific data model.\n\t\t\t */\n\t\t\t// Check to see if we have any field merge tags in our equation.\n\t\t\tvar fields = eq.match( new RegExp( /{field:(.*?)}/g ) );\n\t\t\tif ( fields ) {\n\t\t\t\t/*\n\t\t\t\t * fields is now an array of field keys that looks like:\n\t\t\t\t * ['{field:key'], ['{field:key'], etc.\n\t\t\t\t *\n\t\t\t\t * We need to run a function with each of our field keys to setup our field key array and hook up our field change listner.\n\t\t\t\t */\n\t\t\t\t\n\t\t\t\tfields = fields.map( function( field ) {\n\t\t\t\t\t// field will be {field:key}\n\t\t\t\t\tvar key = field.replace( ':calc}', '' ).replace( '}', '' ).replace( '{field:', '' );\n\n\t\t\t\t\t// Get our field model\n\t\t\t\t\tfieldModel = nfRadio.channel( 'form-' + calcModel.get( 'formID' ) ).request( 'get:fieldByKey', key );\n\n\t\t\t\t\tif( 'undefined' == typeof fieldModel ) return;\n\t\t\t\t\t// Register a listener in our field model for value changes.\n\t\t\t\t\tfieldModel.on( 'change:value', calcModel.changeField, calcModel );\n\t\t\t\t\t// Get our calc value from our field model.\n\t\t\t\t\tvar calcValue = that.getCalcValue( fieldModel );\n\t\t\t\t\t// Add this field to our internal key/value object.\n\t\t\t\t\tthat.updateCalcFields( calcModel, key, calcValue );\n\t\t\t\t\t// Update the string tracking our merged eq with the calc value.\n\t\t\t\t\teqValues = that.replaceKey( 'field', key, calcValue, eqValues );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check to see if we have any calc merge tags in our equation.\n\t\t\tvar calcs = eq.match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\tif ( calcs ) {\n\t\t\t\t/*\n\t\t\t\t * calcs is now an array of calc keys that looks like:\n\t\t\t\t * ['{calc:key'], ['{calc:key'], etc.\n\t\t\t\t *\n\t\t\t\t * We need to run a function with each of our calc keys to setup our calc key array and hook up our calc change listner.\n\t\t\t\t */\n\t\t\t\t\n\t\t\t\tcalcs = calcs.map( function( calc ) {\n\t\t\t\t\t// calc will be {calc:name}\n\t\t\t\t\tvar name = calc.replace( '}', '' ).replace( '{calc:', '' );\n\t\t\t\t\t// Get our calc model\n\t\t\t\t\tvar targetCalcModel = calcModel.collection.findWhere( { name: name } );\n\t\t\t\t\t// Listen for changes on our calcluation, since we need to update our calc when it changes.\n\t\t\t\t\ttargetCalcModel.on( 'change:value', calcModel.changeCalc, calcModel );\n\t\t\t\t\t// // Get our calc value from our calc model.\n\t\t\t\t\tvar calcValue = targetCalcModel.get( 'value' );\n\t\t\t\t\t// Update the string tracking our merged eq with the calc value.\n\t\t\t\t\teqValues = that.replaceKey( 'calc', name, calcValue, eqValues );\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\t// Evaluate the equation and update the value of this model.\n\t\t\ttry {\n\t\t\t\tcalcModel.set('value', math.eval(eqValues));\n\t\t\t} catch( e ) {\n\t\t\t\tconsole.log( e );\n\t\t\t}\n\n\t\t\t// Debugging console statement.\n\t\t\t// console.log( eqValues + ' = ' + calcModel.get( 'value' ) );\n\t\t},\n\n\t\t/**\n\t\t * Update an item in our key/value pair that represents our fields and calc values.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tcalcModel\n\t\t * @param string \t\t\tkey\n\t\t * @param string \t\t\tcalcValue\n\t\t * @return void\n\t\t */\n\t\tupdateCalcFields: function( calcModel, key, calcValue ) {\n\t\t\tvar fields = calcModel.get( 'fields' );\n\t\t\tfields[ key ] = calcValue;\n\t\t\tcalcModel.set( 'fields', fields );\n\t\t},\n\n\t\t/**\n\t\t * Get a calc value from a field model.\n\t\t *\n\t\t * Sends a request to see if there's a special calc value\n\t\t * Uses the value of the field if there is not.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model fieldModel\n\t\t * @return value\n\t\t */\n\t\tgetCalcValue: function( fieldModel ) {\n\t\t\t/*\n\t\t\t * Send out a request on the field type and parent type channel asking if they need to modify the calc value.\n\t\t\t * This is helpful for fields like lists that can have a different calc_value than selected value.\n\t\t\t */\n\t\t\tvar value = nfRadio.channel( fieldModel.get( 'type' ) ).request( 'get:calcValue', fieldModel );\n\n\t\t\t// If value is 'undefined', then we got no response. Set value to field model value.\n\t\t\tif ( 'undefined' == typeof value ) {\n\t\t\t\tif ( jQuery.isNumeric( fieldModel.get( 'value' ) ) ) {\n\t\t\t\t\tvalue = fieldModel.get( 'value' );\n\t\t\t\t} else {\n\t\t\t\t\tvalue = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! fieldModel.get( 'visible' ) ) {\n\t\t\t\tvalue = 0;\n\t\t\t}\n\n\t\t\treturn ( jQuery.isNumeric( value ) ) ? value : 0;\n\t\t},\n\n\t\t/**\n\t\t * Replace instances of key with calcValue. This is used to replace one key at a time.\n\t\t *\n\t\t * If no eq is passed, use calcModel eq.\n\t\t *\n\t\t * Returns a string with instances of key replaced with calcValue.\n\t\t * \n\t\t * @since version\n\t\t * @param string \tkey \n\t\t * @param string \tcalcValue \n\t\t * @param string \teq \n\t\t * @return string \teq \n\t\t */\n\t\treplaceKey: function( type, key, calcValue, eq ) {\n\t\t\teq = eq || calcModel.get( 'eq' );\n\n\t\t\ttag = '{' + type + ':' + key + '}';\n\t\t\tvar reTag = new RegExp( tag, 'g' );\n\n\t\t\tcalcTag = '{' + type + ':' + key + ':calc}';\n\t\t\tvar reCalcTag = new RegExp( calcTag, 'g' );\n\n\t\t\teq = eq.replace( reTag, calcValue );\n\t\t\teq = eq.replace( reCalcTag, calcValue );\n\n\t\t\treturn eq;\n\t\t},\n\n\t\t/**\n\t\t * Takes a calcModel and returns a string eq with all keys replaced by their appropriate calcValues.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tcalcModel\n\t\t * @return string\t\t\teq\n\t\t */\n\t\treplaceAllKeys: function( calcModel ) {\n\t\t\tvar eq = calcModel.get( 'eq' );\n\t\t\tvar that = this;\n\t\t\t_.each( calcModel.get( 'fields' ), function( value, key ) {\n\t\t\t\teq = that.replaceKey( 'field', key, value, eq );\n\t\t\t} );\n\n\t\t\t// If we have any calc merge tags, replace those as well.\n\t\t\tvar calcs = eq.match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\tif ( calcs ) {\n\t\t\t\t_.each( calcs, function( calc ) {\n\t\t\t\t\t// calc will be {calc:key}\n\t\t\t\t\tvar name = calc.replace( '}', '' ).replace( '{calc:', '' );\n\t\t\t\t\tvar targetCalcModel = calcModel.collection.findWhere( { name: name } );\n\t\t\t\t\tvar re = new RegExp( calc, 'g' );\n\t\t\t\t\teq = eq.replace( re, targetCalcModel.get( 'value' ) );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn eq;\n\t\t},\n\n\t\t/**\n\t\t * Function that's called when a field within the calculation changes.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model calcModel\n\t\t * @param backbone.model fieldModel\n\t\t * @return void\n\t\t */\n\t\tchangeField: function( calcModel, fieldModel ) {\n\t\t\tvar key = fieldModel.get( 'key' );\n\t\t\tvar value = this.getCalcValue( fieldModel );\n\t\t\tthis.updateCalcFields( calcModel, key, value );\n\t\t\tvar eqValues = this.replaceAllKeys( calcModel );\n\t\t\tcalcModel.set( 'value', math.eval( eqValues ) );\n\n\t\t\t// Debugging console statement.\n\t\t\t// console.log( eqValues + ' = ' + calcModel.get( 'value' ) );\t\t\n\t\t},\n\n\t\tinitDisplayField: function( fieldModel ) {\n\n\t\t\tif( ! fieldModel.get( 'default' ) || 'string' != typeof fieldModel.get( 'default' ) ) return;\n\n\t\t\tvar calcs = fieldModel.get( 'default' ).match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\tif ( calcs ) {\n\t\t\t\t_.each( calcs, function( calcName ) {\n\t\t\t\t\tcalcName = calcName.replace( '{calc:', '' ).replace( '}', '' ).replace( ':2', '' );\n\t\t\t\t\tthis.displayFields[ calcName ] = this.displayFields[ calcName ] || [];\n\t\t\t\t\tthis.displayFields[ calcName ].push( fieldModel );\n\t\t\t\t}, this );\n\t\t\t}\n\t\t},\n\n\t\tupdateDisplayFields: function( calcModel ) {\n\t\t\tvar that = this;\n\t\t\tif ( 'undefined' != typeof this.displayFields[ calcModel.get( 'name' ) ] ) {\n\t\t\t\t_.each( this.displayFields[ calcModel.get( 'name' ) ], function( fieldModel ) {\n\t\t\t\t\tvar value = fieldModel.get( 'default' );\n\t\t\t\t\tvar calcs = value.match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\t\t\t_.each( calcs, function( calc ) {\n\t\t\t\t\t\tvar rounding = false;\n\t\t\t\t\t\t// calc will be {calc:key} or {calc:key:2}\n\t\t\t\t\t\tvar name = calc.replace( '}', '' ).replace( '{calc:', '' );\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * TODO: Bandaid for rounding calculations to two decimal places when displaying the merge tag.\n\t\t\t\t\t\t * Checks to see if we have a :2. If we do, remove it and set our rounding variable to true.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( -1 != name.indexOf( ':2' ) ) {\n\t\t\t\t\t\t\trounding = true;\n\t\t\t\t\t\t\tname = name.replace( ':2', '' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar calcModel = that.calcs[ fieldModel.get( 'formID' ) ].findWhere( { name: name } );\n\t\t\t\t\t\tvar re = new RegExp( calc, 'g' );\n\t\t\t\t\t\tvar calcValue = calcModel.get( 'value' ) ;\n\t\t\t\t\t\tif ( rounding ) {\n\t\t\t\t\t\t\tcalcValue = calcValue.toFixed( 2 );\n\t\t\t\t\t\t\trounding = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalue = value.replace( re, calcValue );\n\t\t\t\t\t} );\n\t\t\t\t\tfieldModel.set( 'value', value );\n\t\t\t\t\tif ( ! that.init[ calcModel.get( 'name' ) ] ) {\n\t\t\t\t\t\t// fieldModel.set( 'reRender', true );\n\t\t\t\t\t\tfieldModel.trigger( 'reRender' );\n\t\t\t\t\t}\n\t\t\t\t\tthat.init[ calcModel.get( 'name' ) ] = false;\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tgetCalc: function( name, formID ) {\n\t\t\treturn this.calcs[ formID ].findWhere( { name: name } );\n\t\t},\n\n\t\tchangeCalc: function( calcModel, targetCalcModel ) {\n\t\t\tvar eqValues = this.replaceAllKeys( calcModel );\n\t\t\teqValues = eqValues.replace( '[', '' ).replace( ']', '' );\n\t\t\tcalcModel.set( 'value', math.eval( eqValues ) );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/fieldDate',[], function() {\n var controller = Marionette.Object.extend({\n\n initialize: function () {\n this.listenTo( nfRadio.channel( 'date' ), 'render:view', this.initDatepicker );\n },\n\n initDatepicker: function ( view ) {\n\n var el = jQuery( view.el ).find( '.nf-element' )[0];\n var dateObject = pikadayResponsive( el, {\n format: view.model.get( 'date_format' ),\n outputFormat: view.model.get( 'date_format' ),\n classes: jQuery( el ).attr( \"class\" ),\n pikadayOptions: {\n yearRange: this.getYearRange( view.model )\n }\n } );\n if ( 1 == view.model.get( 'date_default' ) ) {\n dateObject.setDate( moment() ); \n }\n\n nfRadio.channel( 'pikaday' ).trigger( 'init', dateObject, view.model );\n },\n\n getYearRange: function( fieldModel ) {\n var yearRange = 10;\n var yearRangeStart = fieldModel.get( 'year_range_start' );\n var yearRangeEnd = fieldModel.get( 'year_range_end' );\n\n if( yearRangeStart && yearRangeEnd ){\n return [ yearRangeStart, yearRangeEnd ];\n } else if( yearRangeStart ) {\n yearRangeEnd = yearRangeStart + yearRange;\n return [ yearRangeStart, yearRangeEnd ];\n } else if( yearRangeEnd ) {\n yearRangeStart = yearRangeEnd - yearRange;\n return [ yearRangeStart, yearRangeEnd ];\n }\n\n return yearRange;\n }\n });\n\n return controller;\n});\n","define('controllers/fieldRecaptcha',[], function() {\n var controller = Marionette.Object.extend({\n\n initialize: function () {\n this.listenTo( nfRadio.channel( 'recaptcha' ), 'init:model', this.initRecaptcha );\n this.listenTo( nfRadio.channel( 'forms' ), 'submit:response', this.resetRecaptcha );\n },\n\n \tinitRecaptcha: function ( model ) {\n \t\tthis.model = model;\n \tnfRadio.channel( 'recaptcha' ).reply( 'update:response', this.updateResponse, this );\n },\n\n updateResponse: function( response ) {\n \tthis.model.set( 'value', response );\n nfRadio.channel( 'fields' ).request( 'remove:error', this.model.get( 'id' ), 'required-error' );\n },\n\n resetRecaptcha: function() {\n try {\n grecaptcha.reset();\n } catch( e ){\n console.log( 'Notice: Error trying to reset grecaptcha.' );\n }\n }\n });\n\n return controller;\n} );\n\n","/**\n * When a form is loaded, enable any help text that appears on the page.\n */\ndefine('controllers/helpText',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'form' ), 'render:view', this.initHelpText );\n\n\t\t\tnfRadio.channel( 'form' ).reply( 'init:help', this.initHelpText );\n\t\t},\n\n\t\tinitHelpText: function( view ) {\n\t\t\tjQuery( view.el ).find( '.nf-help' ).each( function() {\n\t\t\t\tvar jBox = jQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\tcontent: jQuery( this ).data( 'text' )\n\t\t\t\t});\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * When a form is loaded, enable any rtes in textareas.\n */\ndefine('controllers/fieldTextareaRTE',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'textarea' ), 'render:view', this.initTextareaRTEs );\n\t\t\tthis.listenTo( nfRadio.channel( 'textarea' ), 'click:extra', this.clickExtra );\n\n\t\t\t// Instantiates the variable that holds the media library frame.\n\t\t\tthis.meta_image_frame;\n\n\t\t\tthis.currentContext = {};\n\n\t\t\tif( 'undefined' == typeof jQuery.summernote ) return;\n\n\t\t\tjQuery.summernote.options.icons = {\n\t\t 'align': 'dashicons dashicons-editor-alignleft',\n\t\t 'alignCenter': 'dashicons dashicons-editor-aligncenter',\n\t\t 'alignJustify': 'dashicons dashicons-editor-justify',\n\t\t 'alignLeft': 'dashicons dashicons-editor-alignleft',\n\t\t 'alignRight': 'dashicons dashicons-editor-alignright',\n\t\t 'indent': 'dashicons dashicons-editor-indent',\n\t\t 'outdent': 'dashicons dashicons-editor-outdent',\n\t\t // 'arrowsAlt': 'dashicons fa-arrows-alt',\n\t\t 'bold': 'dashicons dashicons-editor-bold',\n\t\t 'caret': 'dashicons dashicons-arrow-down',\n\t\t // 'circle': 'dashicons fa-circle',\n\t\t 'close': 'dashicons dashicons-dismiss',\n\t\t 'code': 'dashicons dashicons-editor-code',\n\t\t 'eraser': 'dashicons dashicons-editor-removeformatting',\n\t\t // 'font': 'dashicons fa-font',\n\t\t // 'frame': 'dashicons fa-frame',\n\t\t 'italic': 'dashicons dashicons-editor-italic',\n\t\t 'link': 'dashicons dashicons-admin-links',\n\t\t 'unlink': 'dashicons dashicons-editor-unlink',\n\t\t 'magic': 'dashicons dashicons-editor-paragraph',\n\t\t // 'menuCheck': 'dashicons fa-check',\n\t\t 'minus': 'dashicons dashicons-minus',\n\t\t 'orderedlist': 'dashicons dashicons-editor-ol',\n\t\t // 'pencil': 'dashicons fa-pencil',\n\t\t // 'picture': 'dashicons fa-picture-o',\n\t\t // 'question': 'dashicons fa-question',\n\t\t 'redo': 'dashicons dashicons-redo',\n\t\t 'square': 'dashicons fa-square',\n\t\t // 'strikethrough': 'dashicons fa-strikethrough',\n\t\t // 'subscript': 'dashicons fa-subscript',\n\t\t // 'superscript': 'dashicons fa-superscript',\n\t\t 'table': 'dashicons dashicons-editor-table',\n\t\t // 'textHeight': 'dashicons fa-text-height',\n\t\t // 'trash': 'dashicons fa-trash',\n\t\t 'underline': 'dashicons dashicons-editor-underline',\n\t\t 'undo': 'dashicons dashicons-undo',\n\t\t 'unorderedlist': 'dashicons dashicons-editor-ul',\n\t\t // 'video': 'dashicons fa-youtube-play'\n\t\t };\n\n\t\t},\n\n\t\tinitTextareaRTEs: function( view ) {\n\t\t\tif ( 1 != view.model.get( 'textarea_rte' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t/*\n\t\t\t * Custom Button for links\n\t\t\t */\n\t\t\tvar that = this;\n\t\t\t// var linkButton = this.linkButton();\n\t\t\tvar linkButton = function( context ) {\n\t\t\t\treturn that.linkButton( context );\n\t\t\t}\n\t\t\tvar mediaButton = function( context ) {\n\t\t\t\treturn that.mediaButton( context );\n\t\t\t}\n\n\t\t\tvar toolbar = [\n\t\t\t\t[ 'paragraphStyle', ['style'] ],\n\t\t\t\t[ 'fontStyle', [ 'bold', 'italic', 'underline','clear' ] ],\n\t\t\t\t[ 'lists', [ 'ul', 'ol' ] ],\n\t\t\t [ 'paragraph', [ 'paragraph' ] ],\n\t\t\t [ 'customGroup', [ 'linkButton', 'unlink' ] ],\n\t\t\t [ 'table', [ 'table' ] ],\n\t\t\t [ 'actions', [ 'undo', 'redo' ] ],\n\t\t\t];\n\n\t\t\tif ( 1 == view.model.get( 'textarea_media' ) && 0 != userSettings.uid ) {\n\t\t\t\ttoolbar.push( [ 'tools', [ 'mediaButton' ] ] );\n\t\t\t}\n\n\t\t\tjQuery( view.el ).find( '.nf-element' ).summernote( {\n\t\t\t\ttoolbar: toolbar,\n\t\t\t\tbuttons: {\n\t\t\t\t\tlinkButton: linkButton,\n\t\t\t\t\tmediaButton: mediaButton\n\t\t\t\t},\n\t\t\t\theight: 150, //set editable area's height\n\t\t\t\tcodemirror: { // codemirror options\n\t\t\t\t theme: 'monokai',\n\t\t\t\t lineNumbers: true\n\t\t\t\t},\n\t\t\t\tprettifyHtml: true,\n\t\t\t\tcallbacks: {\n\t\t\t\t\tonChange: function( e ) {\n\t\t\t\t\t\tview.model.set( 'value', jQuery( this ).summernote( 'code' ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tvar linkMenu = jQuery( view.el ).find( '.link-button' ).next( '.dropdown-menu' ).find( 'button' );\n\t\t\tlinkMenu.replaceWith(function () {\n\t\t\t return jQuery( '
', {\n\t\t\t class: jQuery( linkMenu ).attr( 'class' ),\n\t\t\t html: this.innerHTML\n\t\t\t } );\n\t\t\t} );\n\t\t},\n\n\t\tlinkButton: function( context ) {\n\t\t\tvar that = this;\n\t\t\tvar ui = jQuery.summernote.ui;\n\t\t\tvar linkButton = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-rte-link-button' );\n\t\t\tvar linkDropdown = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-rte-link-dropdown' );\n\t\t\treturn ui.buttonGroup([\n\t\t\t\tui.button({\n\t className: 'dropdown-toggle link-button',\n\t contents: linkButton({}),\n\t tooltip: nfi18n.fieldTextareaRTEInsertLink,\n\t click: function( e ) {\n\t \tthat.clickLinkButton( e, context );\n\t },\n\t data: {\n\t toggle: 'dropdown'\n\t }\n\t }),\n\t\t\t\tui.dropdown([\n\t ui.buttonGroup({\n\t children: [\n\t ui.button({\n\t contents: linkDropdown({}),\n\t tooltip: ''\n\t }),\n\t ]\n\t })\n\t ])\n\t\t\t]).render();\n\t\t},\n\n\t\tmediaButton: function( context ) {\n\t\t\tvar that = this;\n\t\t\tvar ui = jQuery.summernote.ui;\n\t\t\tvar mediaButton = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-rte-media-button' );\n\t\t\treturn ui.button({\n\t className: 'dropdown-toggle',\n\t contents: mediaButton({}),\n\t tooltip: nfi18n.fieldTextareaRTEInsertMedia,\n\t click: function( e ) {\n\t \tthat.openMediaManager( e, context );\n\t }\n\t }).render();\n\t\t},\n\n\t\topenMediaManager: function( e, context ) {\n\t\t\tcontext.invoke( 'editor.saveRange' );\n\t\t\t// If the frame already exists, re-open it.\n\t\t\tif ( this.meta_image_frame ) {\n\t\t\t\tthis.meta_image_frame.open();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Sets up the media library frame\n\t\t\tthis.meta_image_frame = wp.media.frames.meta_image_frame = wp.media({\n\t\t\t\ttitle: nfi18n.fieldTextareaRTESelectAFile,\n\t\t\t\tbutton: { text: 'insert' }\n\t\t\t});\n\n\t\t\tvar that = this;\n\n\t\t\t// Runs when an image is selected.\n\t\t\tthis.meta_image_frame.on('select', function(){\n\n\t\t\t\t// Grabs the attachment selection and creates a JSON representation of the model.\n\t\t\t\tvar media_attachment = that.meta_image_frame.state().get('selection').first().toJSON();\n\t\t\t\tthat.insertMedia( media_attachment, context );\n\t\t\t});\n\n\t\t\t// Opens the media library frame.\n\t\t\tthis.meta_image_frame.open();\n\t\t},\n\n\t\tclickLinkButton: function ( e, context ) {\n\t\t\tvar range = context.invoke( 'editor.createRange' );\n\t\t\tcontext.invoke( 'editor.saveRange' );\n\t\t\tvar text = range.toString()\n\t\t\tthis.currentContext = context;\n\n\t\t\tjQuery( e.target ).closest( '.note-customGroup > .note-btn-group' ).on ('hide.bs.dropdown', function ( e ) {\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tjQuery( e.target ).closest( '.note-customGroup > .note-btn-group' ).on ('shown.bs.dropdown', function ( e ) {\n\t\t\t\tjQuery( e.target ).parent().parent().find( '.link-text' ).val( text );\n\t\t\t\tjQuery( e.target ).parent().parent().find( '.link-url' ).focus();\n\t\t\t});\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tvar textEl = jQuery( e.target ).parent().find( '.link-text' );\n\t\t\tvar urlEl = jQuery( e.target ).parent().find( '.link-url' );\n\t\t\tvar isNewWindowEl = jQuery( e.target ).parent().find( '.link-new-window' );\n\t\t\tthis.currentContext.invoke( 'editor.restoreRange' );\n\t\t\tif ( jQuery( e.target ).hasClass( 'insert-link' ) ) {\n\t\t\t\tvar text = textEl.val();\n\t\t\t\tvar url = urlEl.val();\n\t\t\t\tvar isNewWindow = ( isNewWindowEl.prop( 'checked' ) ) ? true: false;\n\t\t\t\tif ( 0 != text.length && 0 != url.length ) {\n\t\t\t\t\tthis.currentContext.invoke( 'editor.createLink', { text:text, url: url, isNewWindow: isNewWindow } );\n\t\t\t\t}\n\t\t\t}\n\t\t\ttextEl.val( '' );\n\t\t\turlEl.val( '' );\n\t\t\tisNewWindowEl.prop( 'checked', false );\n\t\t\tjQuery( e.target ).closest( 'div.note-btn-group.open' ).removeClass( 'open' );\n\t\t},\n\n\t\tinsertMedia: function( media, context ) {\n\t\t\tcontext.invoke( 'editor.restoreRange' );\n\t\t\tif ( 'image' == media.type ) {\n\t\t\t\tcontext.invoke( 'editor.insertImage', media.url );\n\t\t\t} else {\n\t\t\t\tcontext.invoke( 'editor.createLink', { text: media.filename, url: media.url } );\n\t\t\t}\n\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","define('controllers/fieldStarRating',[], function() {\n var controller = Marionette.Object.extend( {\n\n initialize: function() {\n \tthis.listenTo( nfRadio.channel( 'starrating' ), 'init:model', this.register );\n this.listenTo( nfRadio.channel( 'starrating' ), 'render:view', this.initRating );\n },\n\n register: function( model ) {\n\t\t\tmodel.set( 'renderRatings', this.renderRatings );\n\t\t},\n\n initRating: function( view ){\n jQuery( view.el ).find( '.starrating' ).rating();\n },\n\n renderRatings: function() {\n \tvar html = '';\n \tfor (var i = 0; i <= this.default - 1; i++) {\n \t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-starrating-star' );\n var num = i + 1;\n \t\thtml += template( { id: this.id, classes: this.classes, num: num } );\n \t}\n \treturn html;\n }\n\n });\n\n return controller;\n});\n","define('controllers/fieldTerms',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'terms' ), 'init:model', this.register );\n },\n\n register: function( model ) {\n // nfRadio.channel( 'field-' + this.model.get( 'id' ) ).trigger( 'click:extra', e, this.model );\n this.listenTo( nfRadio.channel( 'field-' + model.get( 'id' ) ), 'click:extra', this.clickExtra );\n this.listenTo( nfRadio.channel( 'field-' + model.get( 'id' ) ), 'keyup:field', this.keyUpExtra );\n },\n \n clickExtra: function( e, model ) {\n var el = jQuery( e.currentTarget );\n var value = el.parent().find( '.extra-value' ).val();\n this.addOption( model, value );\n },\n\n keyUpExtra: function( el, model, keyCode ) {\n if( 13 != keyCode ) return;\n this.addOption( model, el.val() );\n },\n\n addOption: function( model, value ) {\n if( ! value ) return;\n var options = model.get( 'options' );\n var new_option = {\n label: value,\n value: value,\n selected: 0,\n };\n options.push( new_option );\n\n var selected = model.get( 'value' );\n selected.push( value );\n\n // model.set( 'reRender', true );\n model.trigger( 'reRender' );\n }\n \n });\n\n return controller;\n} );\n","/**\n * Before we display our form content, ask if anyone wants to give us a different view.\n * Before we do anything with the data, pass it through any loading filters.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/formContentFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our fieldContent view and load filter arrays.\n\t\t\t */\n\t\t\tthis.viewFilters = [];\n\t\t\tthis.loadFilters = [];\n\n\t\t\t/*\n\t\t\t * Listen for requests to add new formContent filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:loadFilter', this.addLoadFilter, this );\n\n\t\t\t/*\n\t\t\t * Listen for requests to get our formContent filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:viewFilters', this.getViewFilters, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:loadFilters', this.getLoadFilters, this );\n\n\t\t\t/*\n\t\t\t * -- DEPRECATED RADIO REPLIES --\n\t\t\t * \n\t\t\t * The 'fieldContents' channel has been deprecated as of 3.0 (it was present in the RC) in favour of 'formContent'.\n\t\t\t * Listen for requests to add new fieldContent filters.\n\t\t\t * \n\t\t\t * TODO: These radio listeners on the 'fieldContents' channels are here for backwards compatibility and should be removed eventually.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:loadFilter', this.addLoadFilter, this );\n\n\t\t\t/*\n\t\t\t * Listen for requests to get our fieldContent filters.\n\t\t\t * TODO: Remove eventually.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:viewFilters', this.getViewFilters, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:loadFilters', this.getLoadFilters, this );\n\t\t\n\t\t\t/*\n\t\t\t * -- END DEPRECATED --\n\t\t\t */\n\t\t},\n\n\t\taddViewFilter: function( callback, priority ) {\n\t\t\tthis.viewFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetViewFilters: function() {\n\t\t\treturn this.viewFilters;\n\t\t},\n\n\t\taddLoadFilter: function( callback, priority ) {\n\t\t\tthis.loadFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetLoadFilters: function() {\n\t\t\treturn this.loadFilters;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'views/fieldItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\n\t\tinitialize: function() {\n \t\tthis.listenTo( this.model, 'reRender', this.render, this );\n \t\tthis.listenTo( this.model, 'change:addWrapperClass', this.addWrapperClass, this );\n \t\tthis.listenTo( this.model, 'change:removeWrapperClass', this.removeWrapperClass, this );\n\n \t\tthis.template = '#tmpl-nf-field-' + this.model.get( 'wrap_template' );\n\t\t},\n\n\t\ttest: function( model ) {\n\t\t\tconsole.log( 'firing from trigger 1' );\n\t\t},\n\n\t\taddWrapperClass: function() {\n\t\t\tvar cl = this.model.get( 'addWrapperClass' );\n\t\t\tif ( '' != cl ) {\n\t\t\t\tjQuery( this.el ).addClass( cl );\n\t\t\t\tthis.model.set( 'addWrapperClass', '' );\n\t\t\t}\n\t\t},\n\n\t\tremoveWrapperClass: function() {\n\t\t\tvar cl = this.model.get( 'removeWrapperClass' );\n\t\t\tif ( '' != cl ) {\n\t\t\t\tjQuery( this.el ).removeClass( cl );\n\t\t\t\tthis.model.set( 'removeWrapperClass', '' );\n\t\t\t}\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\n\t \t\t/*\n \t\t * If we have an input mask, init that mask.\n \t\t * TODO: Move this to a controller so that the logic isn't in the view.\n \t\t */\n \t\tif ( 'undefined' != typeof this.model.get( 'mask' ) && '' != jQuery.trim( this.model.get( 'mask' ) ) ) {\n \t\t\tif ( 'custom' == this.model.get( 'mask') ) {\n \t\t\t\tvar mask = this.model.get( 'custom_mask' );\n \t\t\t} else {\n \t\t\t\tvar mask = this.model.get( 'mask' );\n \t\t\t}\n\n\n\t\t\t\t/* POLYFILL */ Number.isInteger = Number.isInteger || function(value) { return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value; };\n \t\t\tif ( Number.isInteger( mask ) ) {\n \t\t\t\tmask = mask.toString();\n \t\t\t}\n\n \t\t\tjQuery( this.el ).find( '.nf-element' ).mask( mask );\n \t\t}\n\t\t\tnfRadio.channel( this.model.get( 'type' ) ).trigger( 'render:view', this );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'render:view', this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t\t\t\trenderElement: function(){\n\t\t\t\t\tvar tmpl = _.find( this.element_templates, function( tmpl ) {\n\t\t\t\t\t\tif ( 0 < jQuery( '#tmpl-nf-field-' + tmpl ).length ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-' + tmpl );\n\t\t\t\t\treturn template( this );\n\t\t\t\t},\n\n\t\t\t\trenderLabel: function() {\n\t\t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-field-label' );\n\t\t\t\t\treturn template( this );\n\t\t\t\t},\n\n\t\t\t\trenderLabelClasses: function () {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.customLabelClasses ) {\n\t\t\t\t\t\tclasses = this.customLabelClasses( classes );\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderPlaceholder: function() {\n\t\t\t\t\tvar placeholder = this.placeholder;\n\n\t\t\t\t\tif ( 'undefined' != typeof this.customPlaceholder ) {\n\t\t\t\t\t\tplaceholder = this.customPlaceholder( placeholder );\n\t\t\t\t\t}\n\n\t\t\t\t\tif( '' != jQuery.trim( placeholder ) ) {\n\t\t\t\t\t\treturn 'placeholder=\"' + placeholder + '\"';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\trenderWrapClass: function() {\n\t\t\t\t\tvar wrapClass = 'field-wrap ' + this.type + '-wrap';\n\n\t\t\t\t\t// If we have an old_classname defined, output wrap class for backward compatibility\n\t\t\t\t\tif ( 'undefined' != typeof this.old_classname && 0 < jQuery.trim( this.old_classname ).length ) {\n\t\t\t\t\t\twrapClass += ' ' + this.old_classname + '-wrap';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'undefined' != typeof customWrapClass ) {\n\t\t\t\t\t\twrapClass = customWrapClass( wrapClass );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn wrapClass;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses = classes.replace( 'nf-error', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'undefined' != typeof this.element_class && 0 < jQuery.trim( this.element_class ).length ) {\n\t\t\t\t\t\tclasses += ' ' + this.element_class;\n\t\t\t\t\t}\n\n\t\t\t\t\t/*\n\t\t\t\t\t * If we have a function for adding extra classes, add those.\n\t\t\t\t\t */\n\n\t\t\t\t\tif ( 'undefined' != typeof this.customClasses ) {\n\t\t\t\t\t\tclasses = this.customClasses( classes );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\tmaybeDisabled: function() {\n\t\t\t\t\tif ( 1 == this.disable_input ) {\n\t\t\t\t\t\treturn 'disabled';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tmaybeDisableAutocomplete: function() {\n\t\t\t\t\tif ( 1 == this.disable_browser_autocomplete ) {\n\t\t\t\t\t\treturn 'autocomplete=\"off\"';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tmaybeInputLimit: function() {\n\t\t\t\t\tif ( 'characters' == this.input_limit_type && '' != jQuery.trim( this.input_limit ) ) {\n\t\t\t\t\t\treturn 'maxlength=\"' + this.input_limit + '\"';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tgetHelpText: function() {\n\t\t\t\t\t// this.help_text = jQuery( this.help_text ).html();\n\t\t\t\t\treturn ( 'undefined' != typeof this.help_text ) ? this.help_text.replace(/\"/g, \""\") : '';\n\t\t\t\t},\n\n\t\t\t\tmaybeRenderHelp: function() {\n\t\t\t\t\tvar check_text = '

' + this.help_text + '

';\n\t\t\t\t\tif ( 'undefined' != typeof this.help_text && 0 != jQuery.trim( jQuery( check_text ).text() ).length ) {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\trenderDescText: function() {\n\t\t\t\t\tif ( 'undefined' == typeof this.desc_text ) {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t\tvar check_text = '

' + this.desc_text + '

';\n\t\t\t\t\tif ( 0 != jQuery.trim( jQuery( check_text ).text() ).length ) {\n\t\t\t\t\t\treturn '
' + this.desc_text + '
';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\trenderCurrencyFormatting: function( number ) {\n\t\t\t\t\t/*\n\t\t\t\t\t * Our number will have a . as a decimal point. We want to replace that with our locale decimal, nfi18n.decimal_point.\n\t\t\t\t\t */\n\t\t\t\t\tvar replacedDecimal = number.toString().replace( '.', '||' );\n\t\t\t\t\t/*\n\t\t\t\t\t * Add thousands separator. Our original number var won't have thousands separators.\n\t\t\t\t\t */\n\t\t\t\t\tvar replacedThousands = replacedDecimal.replace( /\\B(?=(\\d{3})+(?!\\d))/g, nfi18n.thousands_sep );\n\t\t\t\t\tvar formattedNumber = replacedThousands.replace( '||', nfi18n.decimal_point );\n\n\t\t\t\t\tvar form = nfRadio.channel( 'app' ).request( 'get:form', that.model.get( 'formID' ) );\n\t\t\t\t\tvar currency_symbol = form.get( 'settings' ).currency_symbol;\n\t\t\t\t\treturn currency_symbol + formattedNumber;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .nf-element': 'fieldChange',\n\t\t\t'keyup .nf-element': 'fieldKeyup',\n\t\t\t'click .nf-element': 'fieldClick',\n\t\t\t'click .extra': 'extraClick',\n\t\t\t'blur .nf-element': 'fieldBlur'\n\t\t},\n\n\t\tfieldChange: function( e ) {\n\t\t\tvar el = jQuery( e.currentTarget );\n\t\t\tvar response = nfRadio.channel( 'nfAdmin' ).request( 'change:field', el, this.model );\n\t\t},\n\n\t\tfieldKeyup: function( e ) {\n\t\t\tvar el = jQuery( e.currentTarget );\n\t\t\tvar keyCode = e.keyCode;\n\t\t\tnfRadio.channel( 'field-' + this.model.get( 'id' ) ).trigger( 'keyup:field', el, this.model, keyCode );\n\t\t\tnfRadio.channel( this.model.get( 'type' ) ).trigger( 'keyup:field', el, this.model, keyCode );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'keyup:field', el, this.model, keyCode );\n\t\t},\n\n\t\tfieldClick: function( e ) {\n\t\t\tvar el = jQuery( e.currentTarget );\n\t\t\tnfRadio.channel( 'field-' + this.model.get( 'id' ) ).trigger( 'click:field', el, this.model );\n\t\t\tnfRadio.channel( this.model.get( 'type' ) ).trigger( 'click:field', el, this.model );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'click:field', el, this.model );\n\t\t},\n\n\t\textraClick: function( e ) {\n\t\t\tnfRadio.channel( 'field-' + this.model.get( 'id' ) ).trigger( 'click:extra', e, this.model );\n\t\t\tnfRadio.channel( this.model.get( 'type' ) ).trigger( 'click:extra', e, this.model );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'click:extra', e, this.model );\n\t\t},\n\n\t\tfieldBlur: function( e ) {\n\t\t\tvar el = jQuery( e.currentTarget );\n\t\t\tnfRadio.channel( 'field-' + this.model.get( 'id' ) ).trigger( 'blur:field', el, this.model );\n\t\t\tnfRadio.channel( this.model.get( 'type' ) ).trigger( 'blur:field', el, this.model );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'blur:field', el, this.model );\n\t\t},\n\n\t\tonAttach: function() {\n\t\t\tnfRadio.channel( this.model.get( 'type' ) ).trigger( 'attach:view', this );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/beforeField',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'nf-section',\n template: '#tmpl-nf-field-before'\n });\n\n return view;\n} );\n","define( 'views/fieldErrorItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'nf-section',\n\t\ttemplate: '#tmpl-nf-field-error',\n\n\t\tonRender: function() {\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\t\t},\n\t});\n\n\treturn view;\n} );\n","define( 'views/fieldErrorCollection',['views/fieldErrorItem'], function( fieldErrorItem ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\ttagName: \"nf-errors\",\n\t\tchildView: fieldErrorItem,\n\n\t\tinitialize: function( options ) {\n\t\t\tthis.fieldModel = options.fieldModel;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( 0 == this.fieldModel.get( 'errors' ).models.length ) {\n this.fieldModel.removeWrapperClass( 'nf-error' );\n this.fieldModel.removeWrapperClass( 'nf-fail' );\n this.fieldModel.addWrapperClass( 'nf-pass' );\n } else {\n this.fieldModel.removeWrapperClass( 'nf-pass' );\n this.fieldModel.addWrapperClass( 'nf-fail' );\n this.fieldModel.addWrapperClass( 'nf-error' );\n }\n\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/inputLimit',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'nf-section',\n template: '#tmpl-nf-field-input-limit',\n\n initialize: function() {\n \tthis.listenTo( nfRadio.channel( 'field-' + this.model.get( 'id' ) ), 'keyup:field', this.updateCount );\n \tthis.count = this.model.get( 'input_limit' );\n \tthis.render();\n },\n\n updateCount: function( el, model ) {\n var value = jQuery( el ).val();\n var regex = /\\s+/gi;\n var words = value.trim().replace(regex, ' ').split(' ');\n var wordCount = words.length;\n var charCount = value.length;\n\n if ( 'characters' == this.model.get( 'input_limit_type' ) ) {\n jQuery( el ).attr( 'maxlength', this.model.get( 'input_limit' ) );\n this.count = this.model.get( 'input_limit' ) - charCount;\n } else {\n this.count = this.model.get( 'input_limit' ) - wordCount;\n var limit = this.model.get( 'input_limit' );\n if( wordCount > limit ){\n jQuery( el ).val( words.slice( 0, limit).join( ' ' ) );\n }\n }\n\n \tthis.render();\n },\n\n templateHelpers: function() {\n \tvar that = this;\n \treturn {\n \t\tcurrentCount: function() {\n \t\t\treturn that.count;\n \t\t}\n \t}\n }\n\n });\n\n return view;\n} );\n","define( 'views/afterField',['views/fieldErrorCollection', 'views/inputLimit'], function( fieldErrorCollection, InputLimitView ) {\n var view = Marionette.ItemView.extend({\n tagName: 'nf-section',\n template: '#tmpl-nf-field-after',\n\n initialize: function() {\n \t\tthis.model.on( 'change:errors', this.changeError, this );\n },\n\n onRender: function() {\n \t/*\n \t * If we have an error, render our error view.\n \t * TODO: Perhaps move to a controller?\n \t */\n \tvar errorEl = jQuery( this.el ).children( '.nf-error-wrap' );\n \t\tthis.errorCollectionView = new fieldErrorCollection( { el: errorEl, collection: this.model.get( 'errors' ), fieldModel: this.model } );\n if ( 0 < this.model.get( 'errors' ).length ) {\n this.errorCollectionView.render(); \n }\n \n \t\t/*\n \t\t * If we have an input limit set, render the view that contains our counter\n \t\t * TODO: Move this to a controller so that the logic isn't in the view.\n \t\t */\n \t\tif ( 'undefined' != typeof this.model.get( 'input_limit' ) && '' != jQuery.trim( this.model.get( 'input_limit' ) ) ){\n \t\t\tvar inputLimitEl = jQuery( this.el ).children( '.nf-input-limit');\n \t\t\tthis.inputLimitView = new InputLimitView( { el: inputLimitEl, model: this.model } );\n \t\t}\n },\n\n changeError: function() {\n\t\t\tthis.errorCollectionView.render();\n\t\t},\n\n });\n\n return view;\n} );\n","define( 'views/fieldLayout',['views/fieldItem', 'views/beforeField', 'views/afterField'], function( fieldItem, beforeField, afterField ) {\n\n var view = Marionette.LayoutView.extend({\n tagName: 'nf-field',\n\n regions: {\n beforeField: '.nf-before-field',\n field: '.nf-field',\n afterField: '.nf-after-field',\n },\n\n initialize: function() {\n this.listenTo( this.model, 'change:visible', this.render, this );\n },\n\n getTemplate: function() {\n if ( this.model.get( 'visible' ) ) {\n return '#tmpl-nf-field-layout';\n } else {\n return '#tmpl-nf-empty';\n }\n },\n\n onRender: function() {\n if ( this.model.get( 'visible' ) ) {\n this.beforeField.show( new beforeField( { model: this.model } ) );\n this.field.show( new fieldItem( { model: this.model } ) );\n this.afterField.show( new afterField( { model: this.model } ) );\n }\n },\n\n templateHelpers: function() {\n return {\n renderContainerClass: function() {\n var containerClass = ' label-' + this.label_pos + ' ';\n // If we have a description position, add that to our container.\n if ( 'undefined' != typeof this.desc_pos ) {\n containerClass += 'desc-' + this.desc_pos + ' ';\n }\n // if we have a container_class field setting, add that to our container.\n if ( 'undefined' != typeof this.container_class && 0 < jQuery.trim( this.container_class ).length ) {\n containerClass += this.container_class + ' ';\n }\n\n return containerClass;\n }\n }\n }\n\n });\n\n return view;\n} );\n\n","/**\n * Return views that might be used in extensions.\n * These are un-instantiated views.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/loadViews',['views/fieldItem', 'views/fieldLayout'], function( fieldItemView, fieldLayoutView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Reply to requests for our field item view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:fieldItem', this.getFieldItem );\n\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:fieldLayout', this.getFieldLayout );\n\t\t},\n\n\t\tgetFieldItem: function( model ) {\n\t\t\treturn fieldItemView;\n\t\t},\n\n\t\tgetFieldLayout: function() {\n\t\t\treturn fieldLayoutView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * If a form has at least one field error, we should disable the submit button and add a form error.\n * If a form had errors, but all the field errors have been removed, we should remove the form error.\n *\n * @since 3.0\n */\ndefine('controllers/formErrors',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Listen for error messages being added to and removed from fields.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:error', this.addError );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'remove:error', this.removeError );\n\n\t\t\t/*\n\t\t\t * Respond to requests to get form errors\n\t\t\t */\n\t\t\tnfRadio.channel( 'form' ).reply( 'get:errors', this.getFormErrors );\n\t\t},\n\n\t\taddError: function( fieldModel, errorID, errorMsg ) {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n\t\t\t/*\n\t\t\t * We store our errors in this object by field ID so that we don't have to loop over all our fields when we're testing for errors.\n\t\t\t * They are stored as an object within an array, using the field ID as the key.\n\t\t\t *\n\t\t\t * If we haven't setup an array item for this field, set it as an object.\n\t\t\t */\n\t\t\tif ( 'undefined' == typeof formModel.get( 'fieldErrors' )[ fieldModel.get( 'id' ) ] ) {\n\t\t\t\tformModel.get( 'fieldErrors' )[ fieldModel.get( 'id' ) ] = {};\n\t\t\t}\n\t\t\t// Add an error to our tracking array\n\t\t\tformModel.get( 'fieldErrors' )[ fieldModel.get( 'id' ) ][ errorID ] = errorMsg;\n\t\t\t/*\n\t\t\t * We have at least one field error, so submmission should be prevented.\n\t\t\t * Add a form error.\n\t\t\t */\n\t\t\tnfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ).request( 'add:error', 'field-errors', formModel.get( 'settings' ).formErrorsCorrectErrors );\n\t\t},\n\n\t\tremoveError: function( fieldModel, errorID ) {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n\t\t\t// Remove this error ID from our tracking array.\n\t\t\tformModel.get( 'fieldErrors' )[ fieldModel.get( 'id' ) ] = _.omit( formModel.get( 'fieldErrors' )[ fieldModel.get( 'id' ) ], errorID );\n\t\t\t/*\n\t\t\t * If we don't have any more error IDs on this field, then we need to remove this field from the array.\n\t\t\t *\n\t\t\t * Then, if the fieldErrors tracking array has a length of 0, we remove our form error, because all field errors have been dealt with.\n\t\t\t */\n\t\t\tif ( 0 == _.size( formModel.get( 'fieldErrors' )[ fieldModel.get( 'id' ) ] ) ) {\n\t\t\t\tdelete formModel.get( 'fieldErrors' )[ fieldModel.get( 'id' ) ];\n\t\t\t}\n\n\t\t\tif ( 0 == _.size( formModel.get( 'fieldErrors' ) ) ) {\n\t\t\t\t// Remove our form error.\n\t\t\t\tnfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ).request( 'remove:error', 'field-errors' );\n\t\t\t}\n\t\t},\n\n\t\tgetFormErrors: function( formID ) {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:form', formID );\n\t\t\tvar errors = false;\n\t\t\t\n\t\t\tif ( formModel ) {\n\t\t\t\t/*\n\t\t\t\t * Check to see if we have any errors on our form model.\n\t\t\t\t */\n\t\t\t\tif ( 0 !== formModel.get( 'errors' ).length ) {\n\t\t\t\t\t_.each( formModel.get( 'errors' ).models, function( error ) {\n\t\t\t\t\t\terrors = errors || {};\n\t\t\t\t\t\terrors[ error.get( 'id' ) ] = error.get( 'msg' );\n\t\t\t\t\t} );\t\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t\n\t\t\t}\n\t\t\treturn errors;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles submission of our form.\n */\ndefine('controllers/submit',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'forms' ), 'init:model', this.registerSubmitHandler );\n\t\t},\n\n\t\t/**\n\t\t * Register the submission handler function.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Backbone.model \tformModel\n\t\t * @return void\n\t\t */\n\t\tregisterSubmitHandler: function( formModel ) {\n\t\t\tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).reply( 'submit', this.submit );\n\t\t},\n\n\t\t/**\n\t\t * Handles the actual submission of our form.\n\t\t * When we submit:\n\t\t *\n\t\t * 1) Send out a message saying that we're about to begin form submission.\n\t\t * 2) Check the form for errors\n\t\t * 3) Submit the data\n\t\t * 4) Send out a message with our response\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Backbone.model \tformModel\n\t\t * @return void\n\t\t */\n\t\tsubmit: function( formModel ) {\n\n\t\t\t/*\n\t\t\t * Send out a radio message saying that we're about to begin submitting.\n\t\t\t * First we send on the generic forms channel, and then on the form-specific channel.\n\t\t\t */\n\t\t\tnfRadio.channel( 'forms' ).trigger( 'before:submit', formModel );\n\t\t\tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'before:submit', formModel );\n\n\t\t\t/*\n\t\t\t * Validate our field models.\n\t\t\t */\n\t\t\tvar validate = nfRadio.channel( 'forms' ).request( 'maybe:validate', formModel );\n\t\t \tif( false !== validate ){\n\n\t\t\t\t/*\n\t\t\t\t * This method is defined in our models/fieldCollection.js file.\n\t\t\t\t */\n\t\t\t\tformModel.get( 'formContentData' ).validateFields();\n\t\t\t}\n\n\t\t\tvar submit = nfRadio.channel( 'form-' + formModel.get( 'id' ) ).request( 'maybe:submit', formModel );\n\t\t\tif ( false == submit ) {\n\t\t\t\tnfRadio.channel( 'forms' ).trigger( 'submit:cancel', formModel );\n\t\t\t\tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'submit:cancel', formModel );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif( false !== validate ){\n\t\t\t\t/*\n\t\t\t\t * Make sure we don't have any form errors before we submit.\n\t\t\t\t * Return false if we do.\n\t\t\t\t */\n\t\t\t\tif ( 0 != _.size( formModel.get( 'fieldErrors' ) ) ) {\n\t\t\t\t\tnfRadio.channel( 'forms' ).trigger( 'submit:failed', formModel );\n\t\t\t\t\tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'submit:failed', formModel );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Send out a radio message saying that we're about to begin submitting.\n\t\t\t * First we send on the generic forms channel, and then on the form-specific channel.\n\t\t\t */\n\t\t\tnfRadio.channel( 'forms' ).trigger( 'after:submitValidation', formModel );\n\t\t\tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'after:submitValidation', formModel );\n\n\t\t\t/*\n\t\t\t * Actually submit our form, and send out a message with our response.\n\t\t\t */\n\n \t\t\tvar formID = formModel.get( 'id' );\n\t\t\tvar fields = {};\n\t\t\t_.each( formModel.get( 'fields' ).models, function( field ) {\n\t\t\t\tvar fieldDataDefaults = { value:field.get( 'value' ), id:field.get( 'id' ) };\n\n\t\t\t\t// Add field data at the field ID for efficient access.\n\t\t\t\tfields[ field.get( 'id' ) ] = nfRadio.channel( field.get( 'type' ) ).request( 'get:submitData', fieldDataDefaults, field ) || fieldDataDefaults;;\n\t\t\t} );\n\t\t\tvar extra = formModel.get( 'extra' );\n\t\t\tvar settings = formModel.get( 'settings' );\n\t\t\tdelete settings.formContentData;\n\t\t\tvar formData = JSON.stringify( { id: formID, fields: fields, settings: settings, extra: extra } );\n\t\t\tvar data = {\n\t\t\t\t'action': 'nf_ajax_submit',\n\t\t\t\t'security': nfFrontEnd.ajaxNonce,\n\t\t\t\t'formData': formData\n\t\t\t}\n\n\t\t\tvar that = this;\n\n\t\t\tjQuery.ajax({\n\t\t\t url: nfFrontEnd.adminAjax,\n\t\t\t type: 'POST',\n\t\t\t data: data,\n\t\t\t cache: false,\n\t\t\t \tsuccess: function( data, textStatus, jqXHR ) {\n\t\t\t \t\ttry {\n\t\t\t\t \t\tvar response = jQuery.parseJSON( data );\n\t\t\t\t nfRadio.channel( 'forms' ).trigger( 'submit:response', response, textStatus, jqXHR, formModel.get( 'id' ) );\n\t\t\t\t \tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'submit:response', response, textStatus, jqXHR );\n\t\t\t \t\t} catch( e ) {\n\t\t\t \t\t\tconsole.log( e );\n\t\t\t \t\t\tconsole.log( 'Parse Error' );\n\t\t\t\t\t\tconsole.log( e );\n\t\t\t \t\t}\n\n\t\t\t },\n\t\t\t error: function( jqXHR, textStatus, errorThrown ) {\n\t\t\t // Handle errors here\n\t\t\t console.log('ERRORS: ' + errorThrown);\n\t\t\t\t\tconsole.log( jqXHR );\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar response = jQuery.parseJSON( jqXHR.responseText );\n\t\t\t\t\t\tnfRadio.channel( 'forms' ).trigger( 'submit:response', response, textStatus, jqXHR, formModel.get( 'id' ) );\n\t\t\t\t\t\tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'submit:response', response, textStatus, jqXHR );\n\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\tconsole.log( 'Parse Error' );\n\t\t\t\t\t}\n\n\t\t\t // STOP LOADING SPINNER\n\t\t\t\t\tnfRadio.channel( 'forms' ).trigger( 'submit:response', 'error', textStatus, jqXHR, errorThrown );\n\t\t\t }\n\t\t\t});\n\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n\n","define( 'views/fieldCollection',['views/fieldLayout'], function( fieldLayout ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\ttagName: 'nf-fields-wrap',\n\t\tchildView: fieldLayout\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Default filters\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/defaultFilters',[ 'views/fieldCollection', 'models/fieldCollection' ], function( FieldCollectionView, FieldCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'form' ), 'before:filterData', this.registerDefaultDataFilter );\n\t\t},\n\n\t\tregisterDefaultDataFilter: function( formModel ) {\n\t\t\t/*\n\t\t\t * Set our default formContent load filter\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:loadFilter', this.defaultFormContentLoad, 10, this );\n\t\t\t/*\n\t\t\t * Set our default formContentView.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:viewFilter', this.defaultFormContentView, 10, this );\n\t\t},\n\n\t\tdefaultFormContentLoad: function( formContentData, formModel, context ) {\n\t\t\tvar fieldCollection = formModel.get( 'fields' );\n\t\t\t/*\n\t\t\t * If we only have one load filter, we can just return the field collection.\n\t\t\t */\n\t\t\tvar formContentLoadFilters = nfRadio.channel( 'formContent' ).request( 'get:loadFilters' );\n\t\t\tvar sortedArray = _.without( formContentLoadFilters, undefined );\n\t\t\tif ( 1 == sortedArray.length || 'undefined' == typeof formContentData || true === formContentData instanceof Backbone.Collection ) return formModel.get( 'fields' );\n\n \tvar fieldModels = _.map( formContentData, function( key ) {\n \t\treturn formModel.get( 'fields' ).findWhere( { key: key } );\n \t}, this );\n\n \tvar currentFieldCollection = new FieldCollection( fieldModels );\n\n \tfieldCollection.on( 'reset', function( collection ) {\n \t\tvar resetFields = [];\n \t\tcurrentFieldCollection.each( function( fieldModel ) {\n \t\t\tif ( 'submit' != fieldModel.get( 'type' ) ) {\n \t\t\t\tresetFields.push( collection.findWhere( { key: fieldModel.get( 'key' ) } ) );\n \t\t\t} else {\n \t\t\t\tresetFields.push( fieldModel );\n \t\t\t}\n \t\t} );\n\n \t\tcurrentFieldCollection.reset( resetFields );\n \t} );\n\n \treturn currentFieldCollection;\n },\n\n defaultFormContentView: function() {\n \treturn FieldCollectionView;\n }\n\n\t});\n\n\treturn controller;\n} );\n","define(\n\t'controllers/loadControllers',[\n\t\t'controllers/formData',\n\t\t'controllers/fieldError',\n\t\t'controllers/changeField',\n\t\t'controllers/changeEmail',\n\t\t'controllers/fieldCheckbox',\n\t\t'controllers/fieldCheckboxList',\n\t\t'controllers/fieldRadio',\n\t\t'controllers/fieldNumber',\n\t\t'controllers/mirrorField',\n\t\t'controllers/confirmField',\n\t\t'controllers/updateFieldModel',\n\t\t'controllers/submitButton',\n\t\t'controllers/submitDebug',\n\t\t'controllers/getFormErrors',\n\t\t'controllers/validateRequired',\n\t\t'controllers/submitError',\n\t\t'controllers/actionRedirect',\n\t\t'controllers/actionSuccess',\n\t\t'controllers/fieldSelect',\n\t\t'controllers/coreSubmitResponse',\n\t\t'controllers/fieldProduct',\n\t\t'controllers/fieldTotal',\n\t\t'controllers/fieldQuantity',\n\t\t'controllers/calculations',\n\t\t'controllers/fieldDate',\n\t\t'controllers/fieldRecaptcha',\n\t\t'controllers/helpText',\n\t\t'controllers/fieldTextareaRTE',\n\t\t'controllers/fieldStarRating',\n\t\t'controllers/fieldTerms',\n\t\t'controllers/formContentFilters',\n\t\t'controllers/loadViews',\n\t\t'controllers/formErrors',\n\t\t'controllers/submit',\n\t\t'controllers/defaultFilters'\n\t],\n\tfunction(\n\t\tFormData,\n\t\tFieldError,\n\t\tChangeField,\n\t\tChangeEmail,\n\t\tFieldCheckbox,\n\t\tFieldCheckboxList,\n\t\tFieldRadio,\n\t\tFieldNumber,\n\t\tMirrorField,\n\t\tConfirmField,\n\t\tUpdateFieldModel,\n\t\tSubmitButton,\n\t\tSubmitDebug,\n\t\tGetFormErrors,\n\t\tValidateRequired,\n\t\tSubmitError,\n\t\tActionRedirect,\n\t\tActionSuccess,\n\t\tFieldSelect,\n\t\tCoreSubmitResponse,\n\t\tFieldProduct,\n\t\tFieldTotal,\n\t\tFieldQuantity,\n\t\tCalculations,\n\t\tFieldDate,\n\t\tFieldRecaptcha,\n\t\tHelpText,\n\t\tFieldTextareaRTE,\n\t\tFieldStarRating,\n\t\tFieldTerms,\n\t\tFormContentFilters,\n\t\tLoadViews,\n\t\tFormErrors,\n\t\tSubmit,\n\t\tDefaultFilters\n\t) {\n\t\tvar controller = Marionette.Object.extend( {\n\t\t\tinitialize: function() {\n\n\t\t\t\t/**\n\t\t\t\t * App Controllers\n\t\t\t\t */\n\t\t\t\tnew LoadViews();\n\t\t\t\tnew FormErrors();\n\t\t\t\tnew Submit();\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Field type controllers\n\t\t\t\t */\n\t\t\t\tnew FieldCheckbox();\n\t\t\t\tnew FieldCheckboxList();\n\t\t\t\tnew FieldRadio();\n\t\t\t\tnew FieldNumber();\n\t\t\t\tnew FieldSelect();\n\t\t\t\tnew FieldProduct();\n\t\t\t\tnew FieldTotal();\n\t\t\t\tnew FieldQuantity();\n\t\t\t\tnew FieldRecaptcha();\n\t\t\t\tnew HelpText();\n\t\t\t\tnew FieldTextareaRTE();\n\t\t\t\tnew FieldStarRating();\n\t\t\t\tnew FieldTerms();\n\t\t\t\tnew FormContentFilters();\n\t\t\t\t/**\n\t\t\t\t * Misc controllers\n\t\t\t\t */\n\t\t\t\tnew FieldError();\n\t\t\t\tnew ChangeField();\n\t\t\t\tnew ChangeEmail();\n\t\t\t\t\n\t\t\t\tnew MirrorField();\n\t\t\t\tnew ConfirmField();\n\t\t\t\tnew UpdateFieldModel();\n\t\t\t\tnew SubmitButton();\n\t\t\t\tnew SubmitDebug();\n\t\t\t\tnew GetFormErrors();\n\t\t\t\tnew ValidateRequired();\n\t\t\t\tnew SubmitError();\n\t\t\t\tnew ActionRedirect();\n\t\t\t\tnew ActionSuccess();\n\t\t\t\t\n\t\t\t\tnew CoreSubmitResponse();\n\t\t\t\tnew Calculations();\n\n\t\t\t\tnew DefaultFilters();\n\n\t\t\t\t/**\n\t\t\t\t * Data controllers\n\t\t\t\t */\n\t\t\t\tnew FieldDate();\n\t\t\t\tnew FormData();\n\t\t\t\t\n\t\t\t}\n\t\t});\n\n\t\treturn controller;\n} );\n\n","define( 'views/beforeForm',[], function( ) {\n\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: \"nf-section\",\n\t\ttemplate: \"#tmpl-nf-before-form\",\n\n\t});\n\n\treturn view;\n} );\n","define( 'views/formErrorItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'nf-section',\n\t\ttemplate: '#tmpl-nf-form-error',\n\n\t\tonRender: function() {\n\t\t\t// this.$el = this.$el.children();\n\t\t\t// this.$el.unwrap();\n\t\t\t// this.setElement( this.$el );\n\t\t},\n\t});\n\n\treturn view;\n} );\n","define( 'views/formErrorCollection',['views/formErrorItem'], function( formErrorItem ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\ttagName: \"nf-errors\",\n\t\tchildView: formErrorItem\n\t});\n\n\treturn view;\n} );\n","define( 'views/honeyPot',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'nf-section',\n template: '#tmpl-nf-form-hp',\n\n events: {\n \t'keyup .nf-field-hp': 'maybeError',\n 'change .nf-field-hp': 'maybeError'\n },\n\n maybeError: function( e ) {\n /*\n * If we have an empty honeyPot field, remove the honeypot form error.\n * If we do not have an empty honeyPot field, add the honeypot form error.\n */\n if ( 0 == jQuery( e.target ).val().length ) {\n nfRadio.channel( 'form-' + this.model.get( 'id' ) ).request( 'remove:error', 'honeyPot' );\n } else {\n var formModel = nfRadio.channel( 'app' ).request( 'get:form', this.model.get( 'id' ) );\n nfRadio.channel( 'form-' + this.model.get( 'id' ) ).request( 'add:error', 'honeyPot', formModel.get( 'settings' ).honeypotHoneypotError );\n }\n }\n });\n\n return view;\n} );\n","define( 'views/afterFormContent',['views/formErrorCollection', 'views/honeyPot'], function( FormErrors, HoneyPot ) {\n\n var view = Marionette.LayoutView.extend({\n tagName: \"nf-section\",\n template: \"#tmpl-nf-after-fields\",\n\n\t\tregions: {\n\t\t\terrors: \".nf-form-errors\",\n hp: \".nf-form-hp\"\n\t\t},\n\n onShow: function() {\n \tthis.errors.show( new FormErrors( { collection: this.model.get( 'errors' ) } ) );\n this.hp.show( new HoneyPot( { model: this.model } ) );\n }\n\n });\n\n return view;\n} );\n","define( 'views/beforeFormContent',[], function( ) {\n\n var view = Marionette.ItemView.extend({\n tagName: \"nf-section\",\n template: \"#tmpl-nf-before-fields\",\n\n templateHelpers: function () {\n return {\n\n renderFieldsMarkedRequired: function() {\n\n var requiredFields = this.fields.filter( { required: 1 } );\n return ( requiredFields.length ) ? this.fieldsMarkedRequired : '';\n },\n };\n },\n\n });\n\n return view;\n} );\n","define( 'views/formLayout',[ 'views/afterFormContent', 'views/beforeFormContent', 'models/fieldCollection' ], function( AfterFormContent, BeforeFormContent, FieldCollection ) {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: \"nf-section\",\n\t\ttemplate: \"#tmpl-nf-form-layout\",\n\n\t\tregions: {\n\t\t\tbeforeFormContent: \".nf-before-form-content\",\n\t\t\tformContent: \".nf-form-content\",\n\t\t\tafterFormContent: \".nf-after-form-content\"\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'form-' + this.model.get( 'id' ) ).reply( 'get:el', this.getEl, this );\n\t\t\t\n\t\t\t/*\n\t\t\t * If we need to hide a form, set the visibility of this form to hidden.\n\t\t\t */\n\t\t\t this.listenTo( this.model, 'hide', this.hide );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.beforeFormContent.show( new BeforeFormContent( { model: this.model } ) );\n\t\t\t\n\t\t\t/*\n\t\t\t * Set our formContentData to our form setting 'formContentData'\n\t\t\t */\n\t\t\tvar formContentData = this.model.get( 'formContentData' );\n\t\t\t\n\t\t\t/*\n\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t */\n\t\t\tvar formContentViewFilters = nfRadio.channel( 'formContent' ).request( 'get:viewFilters' );\n\t\t\t\n\t\t\t/* \n\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t*/\n\t\t\tvar sortedArray = _.without( formContentViewFilters, undefined );\n\t\t\tvar callback = _.first( sortedArray );\n\t\t\tformContentView = callback();\n\t\t\t\n\t\t\tvar options = {\n\t\t\t\tdata: formContentData,\n\t\t\t\tformModel: this.model\n\t\t\t};\n\t\t\t\n\t\t\t/*\n\t\t\t * If we have a collection, pass the returned data as the collection.\n\t\t\t *\n\t\t\t * If we have a model, pass the returned data as the collection.\n\t\t\t */\n\t\t\tif ( false !== formContentData instanceof Backbone.Collection ) {\n\t\t\t\toptions.collection = formContentData;\n\t\t\t} else if ( false !== formContentData instanceof Backbone.Model ) {\n\t\t\t\toptions.model = formContentData;\n\t\t\t}\n\n\t\t\tthis.formContent.show( new formContentView( options ) );\n\t\t\tthis.afterFormContent.show( new AfterFormContent( { model: this.model } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n templateHelpers: function () {\n return {\n\n renderClasses: function() {\n return '';\n }\n\n };\n },\n\n hide: function() {\n \tjQuery( this.el ).hide();\n }\n\n\t});\n\n\treturn view;\n} );\n","define( 'views/afterForm',[], function( ) {\n\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: \"nf-section\",\n\t\ttemplate: \"#tmpl-nf-after-form\",\n\t\t\n\t});\n\n\treturn view;\n} );\n","define( 'views/mainLayout',['views/beforeForm', 'views/formLayout', 'views/afterForm'], function( BeforeForm, FormLayout, AfterForm ) {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttemplate: '#tmpl-nf-layout',\n\n\t\tregions: {\n\t\t\tresponseMsg: '.nf-response-msg',\n\t\t\tbeforeForm: '.nf-before-form',\n\t\t\tformLayout: '.nf-form-layout',\n\t\t\tafterForm: '.nf-after-form'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.$el = jQuery( '#nf-form-' + this.model.id + '-cont' );\n\t\t\tthis.el = '#nf-form-' + this.model.id + '-cont';\n\n\t\t\tthis.render();\n\n\t\t\tthis.beforeForm.show( new BeforeForm( { model: this.model } ) );\n\t\t\tthis.formLayout.show( new FormLayout( { model: this.model, fieldCollection: this.options.fieldCollection } ) );\n\t\t\tthis.afterForm.show( new AfterForm( { model: this.model } ) );\n\n\t\t\t/*\n\t\t\t * If we need to hide a form, set the visibility of this form to hidden.\n\t\t\t */\n\t\t\t this.listenTo( this.model, 'hide', this.hide );\n\t\t},\n\n hide: function() {\n \tjQuery( this.el ).find( '.nf-form-title' ).hide();\n }\n\n\t});\n\n\treturn view;\n} );\n","/*\n * Because our backbone listens to .change() events on elements, changes made using jQuery .val() don't bubble properly.\n * This patch overwrites the default behaviour of jQuery .val() so that IF the item has an nf-element class, we fire a change event.\n */\n( function( jQuery ) {\n\t/*\n\t * Store our original .val() function.\n\t */\n var originalVal = jQuery.fn.val;\n /*\n * Create our own .val() function.\n */\n jQuery.fn.val = function(){\n var prev;\n /* \n * Store a copy of the results of the original .val() call.\n * We use this to make sure that we've actually changed something.\n */\n if( arguments.length > 0 ){\n prev = originalVal.apply( this,[] );\n }\n /*\n * Get the results of the original .val() call. \n */\n var result = originalVal.apply( this, arguments );\n\n /*\n * If we have arguments, we have actually made a change, AND this has the nf-element class, trigger .change().\n */\n if( arguments.length > 0 && prev != originalVal.apply( this, [] ) && jQuery( this ).hasClass( 'nf-element' ) ) {\n\t\t\tjQuery(this).change();\n }\n\n return result;\n };\n} ) ( jQuery );\n\njQuery( document ).ready( function( $ ) {\n\trequire( [ 'models/formCollection', 'models/formModel', 'models/fieldCollection', 'controllers/loadControllers', 'views/mainLayout'], function( formCollection, FormModel, FieldCollection, LoadControllers, mainLayout ) {\n\n\t\tvar NinjaForms = Marionette.Application.extend({\n\t\t\tforms: {},\n\t\t\tinitialize: function( options ) {\n\n\t\t\t\tvar that = this;\n\t\t\t\tMarionette.Renderer.render = function(template, data){\n\t\t\t\t\tvar template = that.template( template );\n\t\t\t\t\treturn template( data );\n\t\t\t\t};\n\n\t\t\t\t// Underscore one-liner for getting URL Parameters\n\t\t\t\tthis.urlParameters = _.object(_.compact(_.map(location.search.slice(1).split('&'), function(item) { if (item) return item.split('='); })));\n\n\t\t\t\tif( 'undefined' != typeof this.urlParameters.nf_resume ) {\n\t\t\t\t\tthis.listenTo(nfRadio.channel('form-' + this.urlParameters.nf_resume), 'loaded', this.restart);\n\t\t\t\t}\n\n\t\t\t\tvar loadControllers = new LoadControllers();\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadControllers' );\n\n\t\t\t\tnfRadio.channel( 'app' ).reply( 'get:template', this.template );\n\t\t\t},\n\t\t\t\n\t\t\tonStart: function() {\n\t\t\t\tvar formCollection = nfRadio.channel( 'app' ).request( 'get:forms' );\n\t\t\t\t_.each( formCollection.models, function( form, index ) {\n\t\t\t\t\tvar layoutView = new mainLayout( { model: form, fieldCollection: form.get( 'fields' ) } );\t\t\t\n\t\t\t\t\tnfRadio.channel( 'form' ).trigger( 'render:view', layoutView );\n\t\t\t\t\tjQuery( document ).trigger( 'nfFormReady', layoutView );\n\t\t\t\t} );\n\t\t\t},\n\n\t\t\trestart: function( formModel ) {\n\t\t\t\tif( 'undefined' != typeof this.urlParameters.nf_resume ){\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\t'action': 'nf_ajax_submit',\n\t\t\t\t\t\t'security': nfFrontEnd.ajaxNonce,\n\t\t\t\t\t\t'nf_resume': this.urlParameters\n\t\t\t\t\t};\n\n\t\t\t\t\tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'disable:submit' );\n\t\t\t\t\tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'processingLabel' );\n\n\t\t\t\t\tthis.listenTo( nfRadio.channel( 'form' ), 'render:view', function() {\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * TODO: This needs to be re-worked for backbone. It's not dynamic enough.\n\t\t\t\t\t\t */\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Hide form fields (but not the submit button).\n\t\t\t\t\t\t */\n\t\t\t\t\t\tjQuery( '#nf-form-' + formModel.get( 'id' ) + '-cont .nf-field-container:not(.submit-container)' ).hide();\n\t\t\t\t\t});\n\n\t\t\t\t\t// TODO: Refactor Duplication\n\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\turl: nfFrontEnd.adminAjax,\n\t\t\t\t\t\ttype: 'POST',\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\tcache: false,\n\t\t\t\t\t\tsuccess: function( data, textStatus, jqXHR ) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t \t\tvar response = jQuery.parseJSON( data );\n\t\t\t\t\t\t nfRadio.channel( 'forms' ).trigger( 'submit:response', response, textStatus, jqXHR, formModel.get( 'id' ) );\n\t\t\t\t\t\t \tnfRadio.channel( 'form-' + formModel.get( 'id' ) ).trigger( 'submit:response', response, textStatus, jqXHR );\n\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\tconsole.log( 'Parse Error' );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t },\n\t\t\t\t\t error: function( jqXHR, textStatus, errorThrown ) {\n\t\t\t\t\t // Handle errors here\n\t\t\t\t\t console.log('ERRORS: ' + textStatus);\n\t\t\t\t\t // STOP LOADING SPINNER\n\t\t\t\t\t\t\tnfRadio.channel( 'forms' ).trigger( 'submit:response', 'error', textStatus, jqXHR, errorThrown );\n\t\t\t\t\t }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\ttemplate: function( template ) {\n\t\t\t\treturn _.template( $( template ).html(), {\n\t\t\t\t\tevaluate: /<#([\\s\\S]+?)#>/g,\n\t\t\t\t\tinterpolate: /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}/g,\n\t\t\t\t\tescape: /\\{\\{([^\\}]+?)\\}\\}(?!\\})/g,\n\t\t\t\t\tvariable: 'data'\n\t\t\t\t} );\n\t\t\t}\n\t\t});\n\t\n\t\tvar ninjaForms = new NinjaForms();\n\t\tninjaForms.start();\t\t\n\t} );\n} );\ndefine(\"main\", function(){});\n\n"]}