{"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/uniqueFieldError.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","invalid","initialize","this","set","options","formModel","get","listenTo","nfRadio","channel","resetModel","bind","changeModel","changeValue","trigger","formLoaded","beforeSubmit","addWrapperClass","cl","removeWrapperClass","setInvalid","fieldModel","comparator","models","on","fieldCollection","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","Number","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","confirmID","confirmFieldErrorMsg","compareValue","confirmValue","updateField","isArray","submitButton","bound","registerHandlers","click","resetLabel","maybeEnable","maybeDisable","processingLabel","size","response","submitDebug","textStatus","jqXHR","formID","debug","debugMessages","message","console","style","log","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","top_of_success_message","offset","top","bottom_of_success_message","outerHeight","bottom_of_screen","scrollTop","height","top_of_screen","the_element_is_visible","animate","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","updateTotal","productQuantity","newTotal","productField","quantity","toFixed","registerQuantity","changeCalc","targetCalcModel","CalcModel","dec","getCalc","CalcCollection","calcs","displayFields","registerCalcs","nfFrontEnd","use_merge_tags","calculations","fieldType","initDisplayField","updateDisplayFields","init","calcCollection","calcModel","setupCalc","eq","eqValues","match","RegExp","updateCalcFields","replaceKey","mexp","eval","isNumeric","tag","reTag","calcTag","reCalcTag","replaceAllKeys","re","calcName","applyLocaleFormatting","number","splitNumber","nfi18n","thousands_sep","formattedNumber","decimal_point","initDatepicker","view","dateFormat","convertDateFormat","dateObject","pikadayResponsive","format","outputFormat","pikadayOptions","yearRange","getYearRange","minDate","getMinDate","maxDate","getMaxDate","firstDay","startOfWeek","setDate","moment","yearRangeStart","yearRangeEnd","Date","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","codemirror","lineNumbers","prettifyHtml","callbacks","onChange","linkMenu","next","replaceWith","class","innerHTML","ui","linkDropdown","buttonGroup","button","className","contents","tooltip","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","toggleAriaInvalid","JSON","stringify","onRender","unwrap","setElement","mask","isInteger","isFinite","Math","floor","currencySymbol","autoNumericOptions","digitGroupSeparator","decimalCharacter","AutoNumeric","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","replacedDecimal","replacedThousands","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","blockingFormErrors","fieldDataDefaults","formData","action","security","ajaxNonce","ajax","adminAjax","cache","success","parseJSON","document","errorThrown","responseText","fieldLayout","FieldCollectionView","registerDefaultDataFilter","defaultFormContentLoad","defaultFormContentView","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","UniqueFieldError","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","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\tinvalid: false\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\tsetInvalid: function( invalid ) {\n\t\t\tthis.set( 'invalid', invalid );\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            this.on( 'reset', function( fieldCollection ){\n                nfRadio.channel( 'fields' ).trigger( 'reset:collection', fieldCollection );\n            }, this );\n\t\t},\n\n\t\tvalidateFields: function() {\n\t\t\t_.each( this.models, function( fieldModel ) {\n\t\t\t\t// When validating all fields, set clean to false to force validation.\n\t\t\t\tfieldModel.set( 'clean', false );\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            this.invoke( function() {\n                this.trigger( 'change:value', this );\n            });\n\t\t},\n\n\t\thideFields: function() {\n\t\t\tthis.invoke( 'set', { visible: false } );\n            this.invoke( function() {\n                this.trigger( 'change:value', this );\n            });\n\t\t}\n\t} );\n\treturn collection;\n} );\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 = Number( calc_value ) + Number( 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\t\n            /*\n             * Default to 0, in case we have no selection.\n             */\n            var calc_value = 0;\n            \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\tif ( 'undefined' !== typeof selected ) {\n                    calc_value = selected.calc;\n\t\t\t\t}\n\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\t//TODO: Add better handling for password confirm fields on the front end.\n\t\t\tif( 'undefined' == typeof targetModel ) return;\n\n\t\t\ttargetModel.set( 'confirm_with', confirmModel.get( 'id' ) );\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\tbound: {},\n\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\tif ( 'undefined' != typeof this.bound[ fieldModel.get( 'id' ) ] ) {\n\t\t\t\treturn false;\n\t\t\t}\n\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\t\n\t\t\tthis.bound[ fieldModel.get( 'id') ] = true;\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 + '<br />';\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' ) || model.get( 'clean' ) ) {\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\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\tvar success_message = jQuery( '#nf-form-' + form_id + '-cont .nf-response-msg' );\n\t\t\t\t\t\n\t\t\t\t\tsuccess_message.html( response.data.actions.success_message ).show();\n\t\t\t\t\t\n\t\t\t\t\t//Let's check if the success message is already fully visible in the viewport without scrolling\n\t\t\t\t\tvar top_of_success_message = success_message.offset().top;\n\t\t\t\t\tvar bottom_of_success_message = success_message.offset().top + success_message.outerHeight();\n\t\t\t\t\tvar bottom_of_screen = jQuery(window).scrollTop() + jQuery(window).height();\n\t\t\t\t\tvar top_of_screen = jQuery(window).scrollTop();\n\n\t\t\t\t\tvar the_element_is_visible = ((bottom_of_screen > bottom_of_success_message) && (top_of_screen < top_of_success_message));\n\n\t\t\t\t\tif(!the_element_is_visible){\n\t\t\t\t\t\t//The element isn't visible, so let's scroll to the success message as in the previous release, but with a short animation\n\t\t\t\t\t\tjQuery('html, body').animate({\n\t\t\t\t\t\t\tscrollTop: ( success_message.offset().top - 50 )\n\t\t\t\t\t\t}, 300 );\n\t\t\t\t\t}\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\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 += 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            _.each( models, function( model ) {\n            \tif( 'undefined' == typeof model.dec ) return;\n                if ( '' === model.dec.trim() ) model.dec = 2;\n                model.dec = parseInt( model.dec );\n            } );\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            // Store the name for debugging later.\n            var calcName = calcModel.get( 'name' );\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                    if( 'undefined' == typeof fieldModel ) return;\n\n                    fieldModel.set( 'clean', false );\n\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\n\t\t\t\t\tif( 'undefined' == typeof targetCalcModel ) return;\n\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            // Scrub unmerged tags (ie deleted/nox-existent fields/calcs, etc).\n            eqValues = eqValues.replace( /{([a-zA-Z0-9]|:|_|-)*}/g, 0 );\n\n            // Scrub line breaks.\n            eqValues = eqValues.replace( /\\r?\\n|\\r/g, '' );\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', Number( mexp.eval( eqValues ) ).toFixed( calcModel.get( 'dec' ) ) );\n\t\t\t} catch( e ) {\n                //console.log( calcName );\n\t\t\t\tconsole.log( e );\n\t\t\t}\n            \n            // If for whatever reason, we got NaN, reset that to 0.\n            if( calcModel.get( 'value' ) === 'NaN' ) calcModel.set( 'value', '0' );\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                    if( 'undefined' == typeof targetCalcModel ) return;\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\n            // Scrub unmerged tags (ie deleted/nox-existent fields/calcs, etc).\n            eqValues = eqValues.replace( /{([a-zA-Z0-9]|:|_|-)*}/g, '0' );\n\n            eqValues = eqValues.replace( /\\r?\\n|\\r/g, '' );\n            try {\n\t\t\t     calcModel.set( 'value', Number( mexp.eval( eqValues ) ).toFixed( calcModel.get( 'dec' ) ) );\n            } catch( e ) {\n                console.log( e );\n            }\n            if( calcModel.get( 'value' ) === 'NaN' ) calcModel.set( 'value', '0' );\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:', '' ).replace( ':2', '' );\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                        if( 'undefined' != typeof( calcValue ) ) {\n                            calcValue = that.applyLocaleFormatting( calcValue );\n                        }\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            eqValues = eqValues.replace( /\\r?\\n|\\r/g, '' );\n            try {\n\t\t\t     calcModel.set( 'value', Number( mexp.eval( eqValues ) ).toFixed( calcModel.get( 'dec' ) ) );\n            } catch( e ) {\n                console.log( e );\n            }\n            if( calcModel.get( 'value' ) === 'NaN' ) calcModel.set( 'value', '0' );\n\t\t},\n        \n        /**\n         * Function to apply Locale Formatting to Calculations\n         * @since Version 3.1\n         * @param Str number\n         * \n         * @return Str\n         */\n        applyLocaleFormatting: function( number ) {\n            \n            // Split our string on the decimal to preserve context.\n            var splitNumber = number.split('.');\n            // If we have more than one element (if we had a decimal point)...\n            if ( splitNumber.length > 1 ) {\n                // Update the thousands and remerge the array.\n                splitNumber[ 0 ] = splitNumber[ 0 ].replace( /\\B(?=(\\d{3})+(?!\\d))/g, nfi18n.thousands_sep );\n                var formattedNumber = splitNumber.join( nfi18n.decimal_point );\n            }\n            // Otherwise (we had no decimal point)...\n            else {\n                // Update the thousands.\n                var formattedNumber = number.replace( /\\B(?=(\\d{3})+(?!\\d))/g, nfi18n.thousands_sep );\n            }\n            return formattedNumber;\n        }\n\t});\n\n\treturn controller;\n} );\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 dateFormat = view.model.get( 'date_format' );\n\n            // For \"default\" date format, convert PHP format to JS compatible format.\n            if( 'default' == dateFormat ){\n                dateFormat = this.convertDateFormat( nfi18n.dateFormat );\n            }\n\n            var el = jQuery( view.el ).find( '.nf-element' )[0];\n            var dateObject = pikadayResponsive( el, {\n                format: dateFormat,\n                outputFormat: dateFormat,\n                classes: jQuery( el ).attr( \"class\" ),\n                pikadayOptions: {\n                    yearRange:  this.getYearRange( view.model ),\n                    minDate: this.getMinDate( view.model ),\n                    maxDate: this.getMaxDate( view.model ),\n                    firstDay: parseInt( nfi18n.startOfWeek )\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        getMinDate: function( fieldModel ) {\n            var minDate = null;\n            var yearRangeStart = fieldModel.get( 'year_range_start' );\n\n            if( yearRangeStart ) {\n                return new Date( yearRangeStart, 0, 1 );\n            }\n\n            return minDate;\n        },\n\n        getMaxDate: function( fieldModel ) {\n            var maxDate = null;\n            var yearRangeEnd   = fieldModel.get( 'year_range_end' );\n\n            if( yearRangeEnd ) {\n                return new Date( yearRangeEnd, 11, 31 );\n            }\n\n            return maxDate;\n        },\n        \n        convertDateFormat: function( dateFormat ) {\n            // http://php.net/manual/en/function.date.php\n            // https://github.com/dbushell/Pikaday/blob/master/README.md#formatting\n            // Note: Be careful not to add overriding replacements. Order is important here.\n\n            /** Day */\n            dateFormat = dateFormat.replace( 'D', 'ddd' ); // @todo Ordering issue?\n            dateFormat = dateFormat.replace( 'd', 'DD' );\n            dateFormat = dateFormat.replace( 'l', 'dddd' );\n            dateFormat = dateFormat.replace( 'j', 'D' );\n            dateFormat = dateFormat.replace( 'N', '' ); // Not Supported\n            dateFormat = dateFormat.replace( 'S', '' ); // Not Supported\n            dateFormat = dateFormat.replace( 'w', 'd' );\n            dateFormat = dateFormat.replace( 'z', '' ); // Not Supported\n\n            /** Week */\n            dateFormat = dateFormat.replace( 'W', 'W' );\n\n            /** Month */\n            dateFormat = dateFormat.replace( 'M', 'MMM' ); // \"M\" before \"F\" or \"m\" to avoid overriding.\n            dateFormat = dateFormat.replace( 'F', 'MMMM' );\n            dateFormat = dateFormat.replace( 'm', 'MM' );\n            dateFormat = dateFormat.replace( 'n', 'M' );\n            dateFormat = dateFormat.replace( 't', '' );  // Not Supported\n\n            // Year\n            dateFormat = dateFormat.replace( 'L', '' ); // Not Supported\n            dateFormat = dateFormat.replace( 'o', 'YYYY' );\n            dateFormat = dateFormat.replace( 'Y', 'YYYY' );\n            dateFormat = dateFormat.replace( 'y', 'YY' );\n\n            // Time - Not supported\n            dateFormat = dateFormat.replace( 'a', '' );\n            dateFormat = dateFormat.replace( 'A', '' );\n            dateFormat = dateFormat.replace( 'B', '' );\n            dateFormat = dateFormat.replace( 'g', '' );\n            dateFormat = dateFormat.replace( 'G', '' );\n            dateFormat = dateFormat.replace( 'h', '' );\n            dateFormat = dateFormat.replace( 'H', '' );\n            dateFormat = dateFormat.replace( 'i', '' );\n            dateFormat = dateFormat.replace( 's', '' );\n            dateFormat = dateFormat.replace( 'u', '' );\n            dateFormat = dateFormat.replace( 'v', '' );\n\n            // Timezone - Not supported\n            dateFormat = dateFormat.replace( 'e', '' );\n            dateFormat = dateFormat.replace( 'I', '' );\n            dateFormat = dateFormat.replace( 'O', '' );\n            dateFormat = dateFormat.replace( 'P', '' );\n            dateFormat = dateFormat.replace( 'T', '' );\n            dateFormat = dateFormat.replace( 'Z', '' );\n\n            // Full Date/Time - Not Supported\n            dateFormat = dateFormat.replace( 'c', '' );\n            dateFormat = dateFormat.replace( 'r', '' );\n            dateFormat = dateFormat.replace( 'u', '' );\n\n            return dateFormat;\n        }\n    });\n\n    return controller;\n});\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( '<div/>', {\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    \t\tthis.listenTo( this.model, 'change:invalid', this.toggleAriaInvalid, 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\ttoggleAriaInvalid: function() {\n\t\t\tvar invalid = this.model.get( 'invalid' );\n\t\t\tjQuery( '[aria-invalid]', this.el ).attr( 'aria-invalid', JSON.stringify( invalid ) );\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\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\t\tif ( 'currency' == mask ) {\n\t\t\t\t\tvar form = nfRadio.channel( 'app' ).request( 'get:form', this.model.get( 'formID' ) );\n\t\t\t\t\t\n\t\t\t\t\tvar thousands_sep = form.get( 'thousands_sep' );\n\t\t\t\t\t/*\n\t\t\t\t\t * TODO: if we have a &nbsp; , replace it with a string with a space.\n\t\t\t\t\t */\n\t\t\t\t\tif ( '&nbsp;' == thousands_sep ) {\n\t\t\t\t\t\tthousands_sep = ' ';\n\t\t\t\t\t}\n\t\t\t\t\tvar currencySymbol = jQuery( '<div/>' ).html( form.get( 'currencySymbol' ) ).text();\n\t\t\t\t\tthousands_sep = jQuery( '<div/>' ).html( thousands_sep ).text();\n\t\t\t\t\tvar decimal_point = jQuery( '<div/>' ).html( form.get( 'decimal_point' ) ).text();\n\t\t\t\t\t\n\t\t\t\t\t/*\n\t\t\t\t\t * TODO: Currently, these options use the plugin-wide defaults for locale.\n\t\t\t\t\t * When per-form locales are implemented, these will need to be revisited.\n\t\t\t\t\t */\n\t\t\t\t\tvar autoNumericOptions = {\n\t\t\t\t\t    digitGroupSeparator        : thousands_sep,\n\t\t\t\t\t    decimalCharacter           : decimal_point,\n\t\t\t\t\t    currencySymbol             : currencySymbol\n\t\t\t\t\t};\n\n\t\t\t\t\t// Initialization\n\t\t\t\t\tnew AutoNumeric( jQuery( this.el ).find( '.nf-element' )[ 0 ], autoNumericOptions );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery( this.el ).find( '.nf-element' ).mask( mask );\n\t\t\t\t} \t\t\t\n\t   \t\t}\n\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, \"&quot;\") : '';\n\t\t\t\t},\n\n\t\t\t\tmaybeRenderHelp: function() {\n\t\t\t\t\tvar check_text = '<p>' + this.help_text + '</p>';\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 '<span class=\"fa fa-info-circle nf-help\" data-text=\"' + this.getHelpText() + '\"></span>';\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 = '<p>' + this.desc_text + '</p>';\n\t\t\t\t\tif ( 0 != jQuery.trim( jQuery( check_text ).text() ).length ) {\n\t\t\t\t\t\treturn '<div class=\"nf-field-description\">' + this.desc_text + '</div>';\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                this.fieldModel.setInvalid( false );\n            } else {\n                this.fieldModel.removeWrapperClass( 'nf-pass' );\n                this.fieldModel.addWrapperClass( 'nf-fail' );\n                this.fieldModel.addWrapperClass( 'nf-error' );\n                this.fieldModel.setInvalid( true );\n            }\n\n\t\t}\n\t});\n\n\treturn view;\n} );\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\n\t\t\t\t// Ignore non-blocking errors.\n\t\t\t\tvar blockingFormErrors = _.filter( formModel.get( 'errors' ).models, function( error ){\n\n\t\t\t\t\t// Ignore email action related errors.\n\t\t\t\t\tif( 'invalid_email' == error.get( 'id' ) || 'email_not_sent' == error.get( 'id' ) ) return false;\n\n\t\t\t\t\treturn true; // Error is blocking.\n\t\t\t\t});\n\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( blockingFormErrors ) ) {\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    \tjQuery( document ).trigger( 'nfFormSubmitResponse', { response: response, id: formModel.get( 'id' ) } );\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                currentFieldCollection.options = { formModel: formModel };\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","/**\n * Controller responsible for removing unique field errors.\n */\n\ndefine('controllers/uniqueFieldError',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Listen to keyup and field changes.\n\t\t\t *\n\t\t\t * If those fields have a unique field error, remove that error.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'change:modelValue', this.removeError );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'keyup:field', this.removeError );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'blur:field', this.removeError );\n\n\t\t},\n\n\t\tremoveError: function( el, model ) {\n\t\t\tmodel = model || el;\n\t\t\t/*\n\t\t\t * Remove any unique field errors.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).request( 'remove:error', model.get( 'id' ), 'unique_field' );\n\t\t},\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\t'controllers/uniqueFieldError'\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\tUniqueFieldError\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\tnew UniqueFieldError();\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"]}