Changeset 1649963
- Timestamp:
- 05/02/2017 09:27:19 PM (9 years ago)
- Location:
- ninja-forms
- Files:
-
- 12 edited
- 1 copied
-
tags/3.1.1 (copied) (copied from ninja-forms/trunk)
-
tags/3.1.1/assets/js/min/builder.js (modified) (1 diff)
-
tags/3.1.1/assets/js/min/builder.js.map (modified) (1 diff)
-
tags/3.1.1/deprecated/ninja-forms.php (modified) (1 diff)
-
tags/3.1.1/includes/Database/FormsController.php (modified) (2 diffs)
-
tags/3.1.1/ninja-forms.php (modified) (2 diffs)
-
tags/3.1.1/readme.txt (modified) (2 diffs)
-
trunk/assets/js/min/builder.js (modified) (1 diff)
-
trunk/assets/js/min/builder.js.map (modified) (1 diff)
-
trunk/deprecated/ninja-forms.php (modified) (1 diff)
-
trunk/includes/Database/FormsController.php (modified) (2 diffs)
-
trunk/ninja-forms.php (modified) (2 diffs)
-
trunk/readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ninja-forms/tags/3.1.1/assets/js/min/builder.js
r1649765 r1649963 1 1 !function(){var e,t,n;!function(i){function r(e,t){return b.call(e,t)}function a(e,t){var n,i,r,a,s,o,l,c,d,h,u,g=t&&t.split("/"),p=y.map,f=p&&p["*"]||{};if(e&&"."===e.charAt(0))if(t){for(e=e.split("/"),s=e.length-1,y.nodeIdCompat&&j.test(e[s])&&(e[s]=e[s].replace(j,"")),e=g.slice(0,g.length-1).concat(e),d=0;d<e.length;d+=1)if(u=e[d],"."===u)e.splice(d,1),d-=1;else if(".."===u){if(1===d&&(".."===e[2]||".."===e[0]))break;d>0&&(e.splice(d-1,2),d-=2)}e=e.join("/")}else 0===e.indexOf("./")&&(e=e.substring(2));if((g||f)&&p){for(n=e.split("/"),d=n.length;d>0;d-=1){if(i=n.slice(0,d).join("/"),g)for(h=g.length;h>0;h-=1)if(r=p[g.slice(0,h).join("/")],r&&(r=r[i])){a=r,o=d;break}if(a)break;!l&&f&&f[i]&&(l=f[i],c=d)}!a&&l&&(a=l,o=c),a&&(n.splice(0,o,a),e=n.join("/"))}return e}function s(e,t){return function(){var n=C.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),g.apply(i,n.concat([e,t]))}}function o(e){return function(t){return a(t,e)}}function l(e){return function(t){m[e]=t}}function c(e){if(r(v,e)){var t=v[e];delete v[e],w[e]=!0,u.apply(i,t)}if(!r(m,e)&&!r(w,e))throw new Error("No "+e);return m[e]}function d(e){var t,n=e?e.indexOf("!"):-1;return n>-1&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function h(e){return function(){return y&&y.config&&y.config[e]||{}}}var u,g,p,f,m={},v={},y={},w={},b=Object.prototype.hasOwnProperty,C=[].slice,j=/\.js$/;p=function(e,t){var n,i=d(e),r=i[0];return e=i[1],r&&(r=a(r,t),n=c(r)),r?e=n&&n.normalize?n.normalize(e,o(t)):a(e,t):(e=a(e,t),i=d(e),r=i[0],e=i[1],r&&(n=c(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},f={require:function(e){return s(e)},exports:function(e){var t=m[e];return"undefined"!=typeof t?t:m[e]={}},module:function(e){return{id:e,uri:"",exports:m[e],config:h(e)}}},u=function(e,t,n,a){var o,d,h,u,g,y,b=[],C=typeof n;if(a=a||e,"undefined"===C||"function"===C){for(t=!t.length&&n.length?["require","exports","module"]:t,g=0;g<t.length;g+=1)if(u=p(t[g],a),d=u.f,"require"===d)b[g]=f.require(e);else if("exports"===d)b[g]=f.exports(e),y=!0;else if("module"===d)o=b[g]=f.module(e);else if(r(m,d)||r(v,d)||r(w,d))b[g]=c(d);else{if(!u.p)throw new Error(e+" missing "+d);u.p.load(u.n,s(a,!0),l(d),{}),b[g]=m[d]}h=n?n.apply(m[e],b):void 0,e&&(o&&o.exports!==i&&o.exports!==m[e]?m[e]=o.exports:h===i&&y||(m[e]=h))}else e&&(m[e]=n)},e=t=g=function(e,t,n,r,a){if("string"==typeof e)return f[e]?f[e](t):c(p(e,t).f);if(!e.splice){if(y=e,y.deps&&g(y.deps,y.callback),!t)return;t.splice?(e=t,t=n,n=null):e=i}return t=t||function(){},"function"==typeof n&&(n=r,r=a),r?u(i,e,t,n):setTimeout(function(){u(i,e,t,n)},4),g},g.config=function(e){return g(e)},e._defined=m,n=function(e,t,n){if("string"!=typeof e)throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),r(m,e)||r(v,e)||(v[e]=[e,t,n])},n.amd={jQuery:!0}}(),n("../lib/almond",function(){}),n("views/app/menuItem",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-app-menu-item",initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.render),this.model.on("change",this.render,this)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},events:{"click a":"clickAppMenu"},clickAppMenu:function(e){i.channel("app").trigger("click:menu",e,this.model)},templateHelpers:function(){return{renderDashicons:function(){return this.dashicons?'<span class="dashicons '+this.dashicons+'"></span>':""},renderClasses:function(){var e=this.classes,t=i.channel("app").request("get:currentDomain");return t.get("id")==this.id&&(e+=" active"),e},renderUrl:function(){if(""!=this.url){var e=i.channel("app").request("get:formModel");return this.url+e.get("id")}return"#"},renderTarget:function(){return""!=this.url?"_blank":"_self"},renderDisabled:function(){return this.disabled?"disabled":""}}}});return e}),n("views/app/menu",["views/app/menuItem"],function(e){var t=Marionette.CollectionView.extend({tagName:"div",childView:e,onShow:function(){jQuery(this.el).find("li:last").unwrap()}});return t}),n("views/app/menuButtons",[],function(){var e=Marionette.ItemView.extend({tagName:"span",template:"#tmpl-nf-app-header-action-button",initialize:function(){this.listenTo(i.channel("app"),"change:clean",this.render,this),this.listenTo(i.channel("app"),"change:loading",this.render,this),this.listenTo(i.channel("app"),"response:updateDB",this.bounceIcon,this)},templateHelpers:function(){var e=this;return{renderPublish:function(){if(e.publishWidth?this.publishWidth='style="width:'+e.publishWidth+'px !important"':this.publishWidth="",i.channel("app").request("get:setting","loading"))var t=i.channel("app").request("get:template","#tmpl-nf-add-header-publish-loading");else var t=i.channel("app").request("get:template","#tmpl-nf-app-header-publish-button");return t(this)},maybeDisabled:function(){return i.channel("app").request("get:setting","clean")?"disabled":""},maybeRenderCancel:function(){if(i.channel("app").request("get:setting","clean"))return"";var e=i.channel("app").request("get:template","#tmpl-nf-app-header-view-changes");return e(this)}}},onShow:function(){jQuery(this.el).find(".publish")},events:{"click .publish":"clickPublish","click .viewChanges":"clickViewChanges"},clickPublish:function(e){i.channel("app").trigger("click:publish",e)},clickViewChanges:function(e){i.channel("app").trigger("click:viewChanges",e)},bounceIcon:function(e){jQuery(this.el).find(".dashicons-backup").effect("bounce",{times:3},600)}});return e}),n("views/app/mobileMenuButton",[],function(){var e=Marionette.ItemView.extend({tagName:"span",template:"#tmpl-nf-mobile-menu-button",initialize:function(){this.listenTo(i.channel("app"),"change:clean",this.render,this)},templateHelpers:function(){return{maybeDisabled:function(){return i.channel("app").request("get:setting","clean")?"disabled":""}}},events:{"click .nf-mobile-menu":"clickMobileMenu"},clickMobileMenu:function(e){var t=i.channel("app").request("get:builderEl");jQuery(t).toggleClass("nf-menu-expand")}});return e}),n("views/app/header",["views/app/menu","views/app/menuButtons","views/app/mobileMenuButton"],function(e,t,n){var r=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-app-header",regions:{menu:".nf-app-menu",buttons:".nf-app-buttons",mobileMenuButton:".nf-mobile-menu-button"},onRender:function(){var r=i.channel("app").request("get:domainCollection");this.menu.show(new e({collection:r})),this.buttons.show(new t),this.mobileMenuButton.show(new n)},events:{"click #nf-logo":"clickLogo"},clickLogo:function(e){}});return r}),n("views/app/subHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-sub-header"});return e}),n("views/app/builderHeader",["views/app/header","views/app/subHeader"],function(e,t){var n=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-header",regions:{app:"#nf-app-header",formTitle:"#nf-app-form-title",appSub:"#nf-app-sub-header"},initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.changeSubHeader)},onShow:function(){this.app.show(new e);var t=i.channel("app").request("get:formModel"),n=t.get("settings"),r=i.channel("views").request("get:formTitle");this.formTitle.show(new r({model:n})),this.changeSubHeader()},changeSubHeader:function(){var e=i.channel("app").request("get:currentDomain"),t=e.get("getSubHeaderView").call(e);this.appSub.show(t)}});return n}),n("views/app/main",[],function(){var e=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-main",className:"nf-main-test",maybeDone:!1,offsetRight:!1,offsetLeft:!1,regions:{gutterLeft:"#nf-main-gutter-left",body:"#nf-main-body",gutterRight:"#nf-main-gutter-right"},initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.render),i.channel("app").reply("get:mainEl",this.getMainEl,this),jQuery(window).on("resize",{context:this},this.resizeBothGutters),this.listenTo(i.channel("drawer"),"before:open",this.setBothGuttersAbsolute),this.listenTo(i.channel("drawer"),"opened",this.setBothGuttersFixed),this.listenTo(i.channel("drawer"),"before:close",this.setBothGuttersAbsolute),this.listenTo(i.channel("drawer"),"closed",this.setBothGuttersFixed),i.channel("app").reply("update:gutters",this.updateGutters,this)},onShow:function(){i.channel("main").trigger("show:main",this)},onRender:function(){var e=i.channel("app").request("get:currentDomain"),t=e.get("getMainContentView").call(e);this.body.show(t);var n=e.get("getGutterLeftView").call(e);this.gutterLeft.show(n);var r=e.get("getGutterRightView").call(e);this.gutterRight.show(r),i.channel("main").trigger("render:main")},getMainEl:function(){return jQuery(this.el).parent()},onAttach:function(){this.initialGutterResize()},onBeforeDestroy:function(){jQuery(window).off("resize",this.resize)},initialGutterResize:function(){this.resizeGutter(this.gutterLeft.el),this.resizeGutter(this.gutterRight.el),this.setBothGuttersFixed(this)},resizeBothGutters:function(e){var t=e?e.data.context:this,n=t.gutterLeft.el,i=t.gutterRight.el;t.resizeGutter(n,t),t.resizeGutter(i,t),t.setBothGuttersAbsolute(t),clearTimeout(t.maybeDone),t.maybeDone=setTimeout(t.setBothGuttersFixed,100,t)},resizeGutter:function(e,t){var n=jQuery(e).offset().top,i=jQuery(window).height(),r=i-n;jQuery(e).height(r)},setBothGuttersFixed:function(e){e=e||this;var t=jQuery(e.gutterLeft.el).offset(),n=t.top,i=t.left;jQuery(e.gutterLeft.el).css({position:"fixed",left:i,top:n});var t=jQuery(e.gutterLeft.el).offset(),r=jQuery(e.gutterRight.el).offset(),a=r.top,s=r.left;jQuery(e.gutterRight.el).css({position:"fixed",left:s,top:a})},setBothGuttersAbsolute:function(e){e=e||this;var t=(jQuery(e.gutterLeft.el).offset(),jQuery(e.gutterRight.el).offset(),jQuery("#nf-main").scrollTop());jQuery(e.gutterLeft.el).css({position:"absolute",left:0,top:t}),jQuery(e.gutterRight.el).css({position:"absolute",top:t,right:0,left:"auto"})},updateGutters:function(){this.resizeBothGutters()}});return e}),n("views/app/mobileMenuItem",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-mobile-menu-item",onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},events:{"click a":"clickAppMenu"},clickAppMenu:function(e){i.channel("app").trigger("click:menu",e,this.model)},templateHelpers:function(){return{renderDashicons:function(){return this.mobileDashicon?'<span class="dashicons '+this.mobileDashicon+'"></span>':""},renderClasses:function(){var e=this.classes,t=i.channel("app").request("get:currentDomain");return t.get("id")==this.id&&(e+=" active"),e},renderUrl:function(){if(""!=this.url){var e=i.channel("app").request("get:formModel");return this.url+e.get("id")}return"#"},renderTarget:function(){return""!=this.url?"_blank":"_self"},renderDisabled:function(){return this.disabled?"disabled":""}}}});return e}),n("views/app/mobileMenu",["views/app/mobileMenuItem"],function(e){var t=Marionette.CompositeView.extend({tagName:"div",template:"#tmpl-nf-mobile-menu",childView:e,initialize:function(){this.listenTo(i.channel("app"),"change:clean",this.render,this)},attachHtml:function(e,t){jQuery(e.el).find(".secondary").append(t.el)},templateHelpers:function(){return{maybeDisabled:function(){return i.channel("app").request("get:setting","clean")?"disabled":""}}},events:{"click .nf-publish":"clickPublish"},clickPublish:function(e){i.channel("app").trigger("click:publish",e);var t=i.channel("app").request("get:builderEl");jQuery(t).toggleClass("nf-menu-expand")}});return t}),n("views/app/drawer/contentEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-empty"});return e}),n("views/app/drawer",["views/app/drawer/contentEmpty"],function(e){var t=Marionette.LayoutView.extend({template:"#tmpl-nf-drawer",regions:{header:"#nf-drawer-header",content:"#nf-drawer-content",footer:"#nf-drawer-footer"},initialize:function(){i.channel("app").reply("get:drawerEl",this.getEl,this),i.channel("drawer").reply("load:drawerContent",this.loadContent,this),i.channel("drawer").reply("empty:drawerContent",this.emptyContent,this)},onShow:function(){i.channel("app").request("is:mobile")||jQuery(this.el).parent().perfectScrollbar()},loadContent:function(e,t){var n=i.channel("app").request("get:drawer",e),r=n.get("getContentView").call(n,t),a=n.get("getHeaderView").call(n,t),s=n.get("getFooterView").call(n,t);this.header.show(a),this.content.show(r),this.footer.show(s)},emptyContent:function(){this.header.empty(),this.content.empty(),this.footer.empty()},getEl:function(){return jQuery(this.el).parent()},events:{"click .nf-toggle-drawer":"clickToggleDrawer"},clickToggleDrawer:function(){i.channel("app").trigger("click:toggleDrawerSize")}});return t}),n("views/app/drawer/mergeTagItem",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tags-item",onBeforeDestroy:function(){this.model.off("change:active",this.render)},initialize:function(){this.model.on("change:active",this.render,this)},events:{"click a":"clickTag"},clickTag:function(e){i.channel("mergeTags").trigger("click:mergeTag",e,this.model)},templateHelpers:function(){return{renderClasses:function(){if(this.active)return"active"}}}});return e}),n("views/app/drawer/mergeTagsSection",["views/app/drawer/mergeTagItem"],function(e){var t=Marionette.CompositeView.extend({tagName:"div",childView:e,template:"#tmpl-nf-merge-tags-section",initialize:function(){this.collection=this.model.get("tags"),this.model.on("change",this.render,this),"fields"==this.model.get("id")},onBeforeDestroy:function(){if(this.model.off("change",this.render),"fields"==this.model.get("id")){var e=i.channel("fields").request("get:collection");e.off("all",this.updateFields,this)}},attachHtml:function(e,t){jQuery(e.el).find(".merge-tags").append(t.el)},updateFields:function(){var e=i.channel("fields").request("get:collection");this.model.set("tags",e)}});return t}),n("models/app/mergeTagModel",[],function(){var e=Backbone.Model.extend({defaults:{active:!1,exclude:!1}});return e}),n("models/app/mergeTagCollection",["models/app/mergeTagModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/app/drawer/mergeTagsContent",["views/app/drawer/mergeTagsSection","models/app/mergeTagCollection"],function(e,t){var n=Marionette.CollectionView.extend({tagName:"div",template:"#tmpl-nf-merge-tags-content",childView:e,initialize:function(){i.channel("mergeTags").reply("get:view",this.getMergeTagsView,this)},reRender:function(e){var n=i.channel("mergeTags").request("get:collection"),r=n.where({default_group:!0}),a=i.channel("app").request("get:currentDomain");if("actions"==a.get("id")){var s=n.where({id:"calcs"});r=r.concat(s)}this.collection=new t(r);var o=this,l=e.get("use_merge_tags");"object"==typeof l&&("undefined"!=typeof l.exclude&&_.each(l.exclude,function(e){o.collection.remove(e)}),"undefined"!=typeof l.include&&_.each(n.models,function(e){-1!=l.include.indexOf(e.get("id"))&&o.collection.add(e)})),this.render()},getMergeTagsView:function(){return this}});return n}),n("views/app/builder",["views/app/builderHeader","views/app/main","views/app/mobileMenu","views/app/drawer","views/app/drawer/mergeTagsContent"],function(e,t,n,r,a){var s=Marionette.LayoutView.extend({template:"#tmpl-nf-builder",el:"#nf-builder",regions:{header:"#nf-header",main:"#nf-main",menuDrawer:"#nf-menu-drawer",drawer:"#nf-drawer",mergeTagsContent:".merge-tags-content"},initialize:function(){i.channel("app").reply("get:builderEl",this.getBuilderEl,this),i.channel("app").reply("get:builderView",this.getBuilderView,this),this.render();var s=i.channel("mergeTags").request("get:collection"),o=s.clone();this.mergeTagsContent.show(new a({collection:o})),this.header.show(new e),this.main.show(new t);var l=i.channel("app").request("get:domainCollection");this.menuDrawer.show(new n({collection:l})),this.drawer.show(new r)},onRender:function(){},getBuilderEl:function(){return this.el},getBuilderView:function(){return this},events:{"click .nf-open-drawer":"openDrawer","click .nf-change-domain":"changeDomain","click .nf-close-drawer":"closeDrawer"},openDrawer:function(e){i.channel("app").trigger("click:openDrawer",e)},closeDrawer:function(){i.channel("app").trigger("click:closeDrawer")},changeDomain:function(e){i.channel("app").trigger("click:menu",e)}});return s}),n("controllers/app/remote",[],function(){return Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting"),"remote",this.addListener)},addListener:function(e,t){var n=e.get("remote").listen;this.listenTo(i.channel("fieldSetting-"+n),"update:setting",this.updateSetting),this.listenTo(i.channel("actionSetting-"+n),"update:setting",this.updateSetting),this.listenTo(i.channel("setting-type-"+e.get("type")),"click:extra",this.clickExtra),e.listenTo(i.channel("setting-remote"),"get:remote",this.getRemote,e),i.channel("setting-remote").trigger("get:remote",t)},clickExtra:function(e,t,n,r){jQuery(e.srcElement).addClass("spin"),i.channel("setting-remote").trigger("get:remote",n)},updateSetting:function(e,t){i.channel("setting-remote").trigger("get:remote",e)},getRemote:function(e){var t=this.get("remote"),n={parentValue:e.get(t.listen),action:t.action,security:t.security?t.security:nfAdmin.ajaxNonce},i=this;jQuery.post(ajaxurl,n,function(t){var t=JSON.parse(t);"textbox"==i.get("type")&&e.set(i.get("name"),t.value),"select"==i.get("type")&&(i.set("options",t.options),i.trigger("rerender"))})}})}),n("controllers/app/drawer",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:openDrawer",this.clickOpenDrawer),this.listenTo(i.channel("app"),"click:closeDrawer",this.closeDrawer),this.listenTo(i.channel("app"),"click:toggleDrawerSize",this.toggleDrawerSize),i.channel("app").reply("open:drawer",this.openDrawer,this),i.channel("app").reply("close:drawer",this.closeDrawer,this),i.channel("drawer").reply("get:closedRightPos",this.getClosedDrawerPos,this),i.channel("drawer").reply("prevent:close",this.preventClose,this),i.channel("drawer").reply("enable:close",this.enableClose,this),i.channel("drawer").reply("get:preventClose",this.maybePreventClose,this),this.objPreventClose={},this.listenTo(i.channel("drawer"),"filter:focused",this.filterFocused)},closeDrawer:function(){var e=i.channel("app").request("get:currentDrawer");if(!e||this.maybePreventClose())return!1;i.channel("drawer-"+e.get("id")).trigger("before:closeDrawer"),i.channel("drawer").trigger("before:closeDrawer"),i.channel("drawer").trigger("before:close"),i.channel("drawer").request("empty:drawerContent");var t=i.channel("app").request("get:builderEl");jQuery(t).addClass("nf-drawer-closed").removeClass("nf-drawer-opened"),jQuery(t).removeClass("disable-main");var n=this.getClosedDrawerPos(),r=i.channel("app").request("get:drawerEl");jQuery(r).css({right:n});var a=this;this.checkCloseDrawerPos=setInterval(function(){n==jQuery(r).css("right")&&(clearInterval(a.checkCloseDrawerPos),i.channel("app").request("update:currentDrawer",!1),i.channel("drawer").trigger("closed"),jQuery(".nf-master-control").css("z-index",98))},150)},clickOpenDrawer:function(e){var t=jQuery(e.target).data("drawerid");this.openDrawer(t)},openDrawer:function(e,t){if(this.maybePreventClose())return!1;if(t=t||{},"undefined"!=typeof t.model){var n=i.channel("app").request("get:currentDomain"),r=n.get("id");i.channel(r).request("clear:editActive"),t.model.set("editActive",!0),this.dataModel=t.model}i.channel("drawer").request("load:drawerContent",e,t),i.channel("drawer").trigger("before:open");var a=i.channel("app").request("get:builderEl");jQuery(a).addClass("nf-drawer-opened").removeClass("nf-drawer-closed");var s=i.channel("app").request("get:drawerEl");jQuery(s).css({right:"0px"});var o=this;this.hasFocus=!1,jQuery(".nf-master-control").css("z-index",0),this.checkOpenDrawerPos=setInterval(function(){"0px"==jQuery(s).css("right")&&(clearInterval(o.checkOpenDrawerPos),o.hasFocus||(o.focusFilter(),o.hasFocus=!0,i.channel("app").request("update:currentDrawer",e),jQuery(s).scrollTop(0),i.channel("drawer").trigger("opened")))},150)},toggleDrawerSize:function(){var e=i.channel("app").request("get:drawerEl");jQuery(e).toggleClass("nf-drawer-expand")},focusFilter:function(){var e=i.channel("drawer").request("get:filterEl");jQuery(e).focus()},getClosedDrawerPos:function(){var e=i.channel("app").request("get:builderEl"),t=jQuery(e).width()+300;return"-"+t+"px"},maybePreventClose:function(){return 0!=Object.keys(this.objPreventClose).length},preventClose:function(e){this.objPreventClose[e]=!0,this.dataModel.set("drawerDisabled",!0)},enableClose:function(e){delete this.objPreventClose[e],this.maybePreventClose()||"undefined"==typeof this.dataModel||this.dataModel.set("drawerDisabled",!1)},filterFocused:function(){clearInterval(this.checkOpenDrawerPos)},getPreventClose:function(){return this.objPreventClose}});return e}),n("views/app/drawer/headerDefault",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-header-default",initialize:function(){this.model&&this.model.on("change:drawerDisabled",this.render,this)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),i.channel("drawer").reply("clear:filter",this.clearFilter,this),i.channel("drawer").reply("blur:filter",this.blurFilter,this),i.channel("drawer").reply("get:filterEl",this.getEl,this)},onBeforeDestroy:function(){this.model&&this.model.off("change:drawerDisabled",this.render)},events:{"keyup .nf-filter":"maybeChangeFilter","input .nf-filter":"changeFilter","focus input":"getFocus"},changeFilter:function(e){var t=i.channel("app").request("get:currentDrawer");i.channel("drawer-"+t.get("id")).trigger("change:filter",e.target.value,e)},maybeChangeFilter:function(e){13==e.keyCode&&(e.addObject=!0,this.changeFilter(e))},clearFilter:function(){var e=jQuery(this.el).find(".nf-filter");""!=jQuery.trim(e.val())&&(e.val(""),e.trigger("input"),e.focus())},blurFilter:function(){jQuery(this.el).find(".nf-filter").blur()},getEl:function(){return jQuery(this.el).find(".nf-filter")},getFocus:function(){i.channel("drawer").trigger("filter:focused")},templateHelpers:function(){return{renderDisabled:function(){return this.drawerDisabled?"disabled":""}}}});return e}),n("views/app/drawer/footerDefault",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-empty"});return e}),n("models/app/drawerModel",["views/app/drawer/headerDefault","views/app/drawer/footerDefault"],function(e,t){var n=Backbone.Model.extend({defaults:{getHeaderView:function(t){return new e(t)},getFooterView:function(e){return new t(e)}}});return n}),n("models/app/drawerCollection",["models/app/drawerModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/fields/drawer/stagedField",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-staged-field",onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},events:{"click .dashicons-dismiss":"removeStagedField"},removeStagedField:function(e){i.channel("drawer-addField").trigger("click:removeStagedField",e,this.model)}});return e}),n("views/fields/drawer/stagingEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-staged-fields-empty",onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)}});return e}),n("views/fields/drawer/stagingCollection",["views/fields/drawer/stagedField","views/fields/drawer/stagingEmpty"],function(e,t){var n=Marionette.CollectionView.extend({tagName:"div",childView:e,emptyView:t,activeClass:"nf-staged-fields-active",initialize:function(){i.channel("app").reply("get:stagedFieldsEl",this.getStagedFieldsEl,this)},onShow:function(){this.$el=jQuery(this.el).parent(),jQuery(this.$el).find("span:first").unwrap(),this.setElement(this.$el);jQuery(this.el).sortable({placeholder:"nf-staged-fields-sortable-placeholder",helper:"clone",tolerance:"pointer",over:function(e,t){i.channel("drawer-addField").trigger("over:stagedFields",e,t)},out:function(e,t){i.channel("drawer-addField").trigger("out:stagedFields",t)},receive:function(e,t){i.channel("drawer-addField").trigger("receive:stagedFields",t)},update:function(e,t){i.channel("fields").request("sort:staging")},start:function(e,t){i.channel("drawer-addField").trigger("start:stagedFields",t)},stop:function(e,t){i.channel("drawer-addField").trigger("stop:stagedFields",t)}}),jQuery(this.el).parent().draggable({opacity:.9,connectToSortable:".nf-field-type-droppable",appendTo:"#nf-main",refreshPositions:!0,grid:[3,3],tolerance:"pointer",helper:function(e){var t=jQuery(e.target).parent().width(),n=jQuery(e.target).parent().height(),i=jQuery(e.target).parent().clone(),r=t/4,a=n/2;return jQuery(this).draggable("option","cursorAt",{top:a,left:r}),jQuery(i).zIndex(1e3),i},start:function(e,t){i.channel("drawer-addField").trigger("startDrag:fieldStaging",this,t)},stop:function(e,t){i.channel("drawer-addField").trigger("stopDrag:fieldStaging",this,t)}})},getStagedFieldsEl:function(){return jQuery(this.el)},onAddChild:function(){jQuery(this.el).addClass(this.activeClass)},onRemoveChild:function(){this.hasStagedFields()||jQuery(this.el).removeClass(this.activeClass)},hasStagedFields:function(){return 0!=this.collection.length}});return n}),n("models/fields/stagingModel",[],function(){var e=Backbone.Model.extend({});return e}),n("models/fields/stagingCollection",["models/fields/stagingModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order"});return t}),n("views/fields/drawer/typeSection",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-field-type-section",initialize:function(){_.bindAll(this,"render"),i.channel("fields").reply("get:typeSection",this.getTypeSection,this)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),this.dragging=!1;var e=this;i.channel("app").request("is:mobile")||(jQuery(this.el).find("div.nf-field-type-draggable").draggable({opacity:.9,tolerance:"pointer",connectToSortable:".nf-field-type-droppable",refreshPositions:!0,grid:[5,5],appendTo:"#nf-builder",helper:function(e){var t=jQuery(e.target).parent().width(),n=jQuery(e.target).parent().height(),i=jQuery(e.target).parent().clone(),r=t/4,a=n/2;return jQuery(this).draggable("option","cursorAt",{top:a,left:r}),jQuery(i).zIndex(1e3),i},start:function(t,n){e.dragging=!0,i.channel("drawer-addField").trigger("startDrag:type",this,n)},stop:function(t,n){e.dragging=!1,i.channel("drawer-addField").trigger("stopDrag:type",this,n)},drag:function(e,t){i.channel("drawer-addField").trigger("drag:type",this,t,e)}}).disableSelection(),jQuery(this.el).find(".nf-item").focus(function(){jQuery(this).addClass("active")}).blur(function(){jQuery(this).removeClass("active")}))},events:{"click .nf-item":"clickFieldType","keydown .nf-item":"maybeClickFieldType","mousedown .nf-item":"mousedownFieldType"},clickFieldType:function(e){this.dragging||i.channel("drawer").trigger("click:fieldType",e)},mousedownFieldType:function(e){jQuery(e.target).addClass("clicked"),setTimeout(function(){jQuery(e.target).removeClass("clicked")},1500)},maybeClickFieldType:function(e){13==e.keyCode&&(this.clickFieldType(e),i.channel("drawer").request("clear:filter"))},templateHelpers:function(){return{renderFieldTypes:function(){var e="",t=this;return _.each(this.fieldTypes,function(n){var r=i.channel("fields").request("get:type",n),a=r.get("nicename"),s=r.get("icon"),o=i.channel("app").request("get:template","#tmpl-nf-drawer-field-type-button");e+=o({id:n,nicename:a,icon:s,type:r,savedField:t.savedField})}),e},savedField:function(){return this.type.get("savedField")?"nf-saved":""}}},getTypeSection:function(){return this.el}});return e}),n("views/fields/drawer/typeSectionCollection",["views/fields/drawer/typeSection"],function(e){var t=Marionette.CollectionView.extend({tagName:"div",childView:e,onShow:function(){jQuery(this.el).find(".nf-settings").unwrap(),i.channel("fields").request("clear:editActive")}});return t}),n("views/fields/drawer/addField",["views/fields/drawer/stagingCollection","models/fields/stagingCollection","views/fields/drawer/typeSectionCollection"],function(e,t,n){var r=Marionette.LayoutView.extend({template:"#tmpl-nf-drawer-content-add-field",regions:{staging:"#nf-drawer-staging .nf-reservoir",primary:"#nf-drawer-primary",secondary:"#nf-drawer-secondary"},initialize:function(){this.listenTo(i.channel("drawer"),"filter:fieldTypes",this.filterFieldTypes),this.listenTo(i.channel("drawer"),"clear:filter",this.removeFieldTypeFilter),this.savedCollection=i.channel("fields").request("get:savedFields"),this.primaryCollection=this.savedCollection,this.fieldTypeSectionCollection=i.channel("fields").request("get:typeSections"),this.secondaryCollection=this.fieldTypeSectionCollection},onShow:function(){var t=i.channel("fields").request("get:staging");this.staging.show(new e({collection:t})),this.primary.show(new n({collection:this.primaryCollection})),this.secondary.show(new n({collection:this.secondaryCollection}))},getEl:function(){return jQuery(this.el).parent()},filterFieldTypes:function(e){this.primary.reset(),this.secondary.reset(),this.filteredSectionCollection=e,this.primary.show(new n({collection:this.filteredSectionCollection}))},removeFieldTypeFilter:function(){this.primary.show(new n({collection:this.savedCollection})),this.secondary.show(new n({collection:this.fieldTypeSectionCollection}))}});return r}),n("views/app/drawer/itemSettingCollection",[],function(){var e=Marionette.CollectionView.extend({tagName:"div",initialize:function(e){this.childViewOptions={dataModel:e.dataModel}},getChildView:function(e){return i.channel("app").request("get:settingChildView",e)}});return e}),n("views/app/drawer/itemSettingGroup",["views/app/drawer/itemSettingCollection"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-edit-field-setting-group",regions:{settings:".nf-field-settings"},initialize:function(e){this.model.on("change",this.render,this),this.dataModel=e.dataModel},onBeforeDestroy:function(){this.model.off("change",this.render)},onRender:function(){this.model.get("display")?this.settings.show(new e({collection:this.model.get("settings"),dataModel:this.dataModel})):this.settings.empty(),i.channel("drawer").trigger("render:settingGroup",this)},events:{"click .toggle":"clickToggleGroup"},clickToggleGroup:function(e){i.channel("drawer").trigger("click:toggleSettingGroup",e,this.model)},templateHelpers:function(){return{renderLabel:function(){if(""!=this.label){var e=i.channel("app").request("get:template","#tmpl-nf-drawer-content-edit-setting-group-label");return e(this)}return""},renderArrowDir:function(){return this.display?"down":"right"}}}});return t}),n("views/app/drawer/itemSettingGroupCollection",["views/app/drawer/itemSettingGroup"],function(e){var t=Marionette.CollectionView.extend({tagName:"div",childView:e,initialize:function(e){this.childViewOptions={dataModel:e.dataModel}}});return t}),n("views/app/drawer/editSettings",["views/app/drawer/itemSettingGroupCollection"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-edit-settings",regions:{settingTitle:".nf-setting-title",settingGroups:".nf-setting-groups"},initialize:function(e){this.dataModel=e.model,this.groupCollection=e.groupCollection},onRender:function(){var t=i.channel("app").request("get:currentDomain"),n=t.get("getSettingsTitleView").call(t,{model:this.model});this.settingTitle.show(n),this.settingGroups.show(new e({collection:this.groupCollection,dataModel:this.dataModel}))},templateHelpers:function(){return{maybeRenderTitle:function(){if("undefined"!=typeof this.type){var e=i.channel("app").request("get:template","#tmpl-nf-drawer-content-edit-settings-title");return e(this)}return""},renderTypeNicename:function(){ 2 2 var e=i.channel("app").request("get:currentDomain"),t=e.get("id"),n=i.channel(t).request("get:type",this.type);return n.get("nicename")}}}});return t}),n("views/app/drawer/headerEditSettings",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-header-edit-settings",initialize:function(){this.model&&this.model.on("change:drawerDisabled",this.render,this)},onBeforeDestroy:function(){this.model&&this.model.off("change:drawerDisabled",this.render)},templateHelpers:function(){return{renderDisabled:function(){return this.drawerDisabled?"disabled":""}}}});return e}),n("views/actions/drawer/typeButton",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-action-type-button",onRender:function(){if(this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),jQuery(this.el).disableSelection(),"installed"==this.model.get("section")){var e=this;jQuery(this.el).draggable({opacity:.9,tolerance:"intersect",scroll:!1,helper:"clone",start:function(t,n){e.dragging=!0,i.channel("drawer-addAction").trigger("startDrag:type",this,n)},stop:function(t,n){e.dragging=!1,i.channel("drawer-addAction").trigger("stopDrag:type",this,n)}})}},events:{"click .nf-item":"clickAddAction"},clickAddAction:function(e){this.dragging||("installed"==this.model.get("section")?i.channel("actions").trigger("click:addAction",this.model):window.open(this.model.get("link"),"_blank"))},templateHelpers:function(){return{renderClasses:function(){var e="nf-item";return""!=jQuery.trim(this.image)&&(e+=" nf-has-img"),"installed"==this.section&&(e+=" nf-action-type"),e},renderStyle:function(){return""!=jQuery.trim(this.image)?'style="background-image: url('+this.image+');"':""}}}});return e}),n("views/actions/drawer/typeCollection",["views/actions/drawer/typeButton"],function(e){var t=Marionette.CompositeView.extend({template:"#tmpl-nf-drawer-action-type-section",childView:e,templateHelpers:function(){var e=this;return{renderNicename:function(){return e.collection.nicename},renderClasses:function(){return e.collection.slug}}},attachHtml:function(e,t){jQuery(e.el).find(".action-types").append(t.el)}});return t}),n("views/actions/drawer/addAction",["views/actions/drawer/typeCollection"],function(e){var t=Marionette.LayoutView.extend({template:"#tmpl-nf-drawer-content-add-action",regions:{primary:"#nf-drawer-primary",secondary:"#nf-drawer-secondary"},initialize:function(){this.listenTo(i.channel("drawer"),"filter:actionTypes",this.filteractionTypes),this.listenTo(i.channel("drawer"),"clear:filter",this.removeactionTypeFilter),this.installedActions=i.channel("actions").request("get:installedActions"),this.primaryCollection=this.installedActions,this.availableActions=i.channel("actions").request("get:availableActions"),this.secondaryCollection=this.availableActions},onShow:function(){this.primary.show(new e({collection:this.primaryCollection})),this.secondary.show(new e({collection:this.secondaryCollection}))},getEl:function(){return jQuery(this.el).parent()},filteractionTypes:function(t,n){this.primary.reset(),this.secondary.reset(),this.primary.show(new e({collection:t})),this.secondary.show(new e({collection:n}))},removeactionTypeFilter:function(){this.primary.show(new e({collection:this.installedActions})),this.secondary.show(new e({collection:this.availableActions}))}});return t}),n("views/app/drawer/contentViewChangesItem",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-view-changes-item",initialize:function(){this.model.on("change:disabled",this.render,this)},onBeforeDestroy:function(){this.model.off("change:disabled",this.render)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},events:{"click .undoSingle":"undoSingle"},undoSingle:function(e){i.channel("drawer").trigger("click:undoSingle",this.model)}});return e}),n("views/app/drawer/contentViewChanges",["views/app/drawer/contentViewChangesItem"],function(e){var t=Marionette.CollectionView.extend({tagName:"table",className:"nf-changes",childView:e});return t}),n("views/app/drawer/headerViewChanges",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-header-view-changes",events:{"click .undoChanges":"clickUndoChanges"},clickUndoChanges:function(e){i.channel("drawer").trigger("click:undoChanges")}});return e}),n("views/app/drawer/settingError",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-edit-setting-error"});return e}),n("views/app/drawer/itemSetting",["views/app/drawer/mergeTagsContent","views/app/drawer/settingError"],function(e,t){var n=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-edit-setting-wrap",regions:{error:".nf-setting-error"},initialize:function(e){this.dataModel=e.dataModel;var t="undefined"!=typeof i.channel("setting-type-"+this.model.get("type")).request("renderOnChange")&&i.channel("setting-type-"+this.model.get("type")).request("renderOnChange");t&&this.dataModel.on("change:"+this.model.get("name"),this.render,this),this.model.on("change:error",this.renderError,this);var n=this.model.get("deps");if(n)for(var r in n)n.hasOwnProperty(r)&&this.dataModel.on("change:"+r,this.render,this);var a=this.model.get("remote");if(a){if("undefined"!=typeof a.refresh||a.refresh){var s=this.model.get("label");this.model.set("label",s+' <a class="extra"><span class="dashicons dashicons-update"></span></a>')}i.channel("setting").trigger("remote",this.model,this.dataModel,this),this.model.on("rerender",this.render,this)}this.listenTo(i.channel("drawer"),"opened",this.drawerOpened),this.listenTo(i.channel("drawer"),"closed",this.drawerClosed)},onBeforeDestroy:function(){this.dataModel.off("change:"+this.model.get("name"),this.render),this.model.off("change:error",this.renderError);var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render);if(this.model.get("remote")&&this.model.off("rerender",this.render,this),i.channel("setting-"+this.model.get("name")).trigger("destroy:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("destroy:setting",this.model,this.dataModel,this),"textbox"==this.model.get("type")){var n=this.model.get("name"),r=this.dataModel.get(n);this.dataModel.set(n,_.unescape(r),{silent:!0})}},onBeforeRender:function(){if("textbox"==this.model.get("type")){var e=this.model.get("name"),t=this.dataModel.get(e);this.dataModel.set(e,_.escape(t),{silent:!0})}i.channel("app").trigger("before:renderSetting",this.model,this.dataModel),i.channel("setting-type-"+this.model.get("type")).trigger("before:renderSetting",this.model,this.dataModel,this),i.channel("setting-"+this.model.get("name")).trigger("before:renderSetting",this.model,this.dataModel,this)},onRender:function(){this.mergeTagsContentView=!1;i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("render:setting",this.model,this.dataModel,this),jQuery(this.el).find(".nf-help").each(function(){var e=jQuery(this).next(".nf-help-text");jQuery(this).jBox("Tooltip",{content:e,maxWidth:200,theme:"TooltipBorder",trigger:"click",closeOnClick:!0})}),this.model.get("use_merge_tags")&&i.channel("mergeTags").request("init",this);var e=this.model.get("mask");if("undefined"!=typeof e){var t=jQuery(this.$el).find("input");switch(e.type){case"numeric":t.autoNumeric({aSep:thousandsSeparator,aDec:decimalPoint});break;case"currency":var n=i.channel("settings").request("get:setting","currency"),r=nfAdmin.currencySymbols[n]||"";t.autoNumeric({aSign:jQuery("<div />").html(r).text(),aSep:thousandsSeparator,aDec:decimalPoint});break;case"custom":e.format&&t.mask(e.format);break;default:console.log('Notice: Mask type of "'+e.type+'" is not supported.')}}this.renderError()},onShow:function(){i.channel("setting-"+this.model.get("name")).trigger("show:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("show:setting",this.model,this.dataModel,this)},onAttach:function(){i.channel("setting-"+this.model.get("name")).trigger("attach:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("attach:setting",this.model,this.dataModel,this)},renderError:function(){this.model.get("error")?(jQuery(this.el).find(".nf-setting").addClass("nf-error"),this.error.show(new t({model:this.model}))):(jQuery(this.el).find(".nf-setting").removeClass("nf-error"),this.error.empty())},templateHelpers:function(){var e=this;return{renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!=this.deps[t])return'style="display:none;"';return""},renderSetting:function(){"undefined"!=typeof e.dataModel.get(this.name)?this.value=e.dataModel.get(this.name):"undefined"==typeof this.value&&(this.value="");var t=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return t(this)},renderLabelClasses:function(){var e="";return this.use_merge_tags&&(e+=" has-merge-tags"),"rte"==this.type&&(e+=" rte"),e},renderClasses:function(){var e="nf-setting ";return e+="undefined"!=typeof this.width?"nf-"+this.width:" nf-one-half",this.error&&(e+=" nf-error"),e},renderTooltip:function(){return this.help?'<a class="nf-help" href="#" tabindex="-1"><span class="dashicons dashicons-admin-comments"></span></a><div class="nf-help-text">'+this.help+"</div>":""},renderMergeTags:function(){return this.use_merge_tags&&!this.hide_merge_tags?'<span class="dashicons dashicons-list-view merge-tags"></span>':""},renderPlaceholder:function(){return this.placeholder?'placeholder="'+this.placeholder+'"':""}}},events:{"change .setting":"changeSetting","keyup .setting":"keyUpSetting","click .setting":"clickSetting","click .extra":"clickExtra"},changeSetting:function(e){i.channel("app").trigger("change:setting",e,this.model,this.dataModel)},keyUpSetting:function(e){i.channel("app").trigger("keyup:setting",e,this.model,this.dataModel),i.channel("setting-"+this.model.get("name")).trigger("keyup:setting",e,this.model,this.dataModel)},clickSetting:function(e){i.channel("app").trigger("click:setting",e,this.model,this.dataModel),i.channel("setting-type-"+this.model.get("type")).trigger("click:setting",e,this.model,this.dataModel,this)},clickExtra:function(e){i.channel("setting-type-"+this.model.get("type")).trigger("click:extra",e,this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("name")).trigger("click:extra",e,this.model,this.dataModel,this),i.channel("setting-name-"+this.model.get("name")).trigger("click:extra",e,this.model,this.dataModel,this)},drawerOpened:function(){i.channel("setting-type-"+this.model.get("type")).trigger("drawer:opened",this.model,this.dataModel,this)},drawerClosed:function(){i.channel("setting-type-"+this.model.get("type")).trigger("drawer:closed",this.model,this.dataModel,this)}});return n}),n("views/app/drawer/contentNewForm",["views/app/drawer/itemSetting"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-new-form",regions:{formName:".new-form-name",formSubmit:".new-form-submit"},onRender:function(){var t=i.channel("settings").request("get:settingModel","title"),n=i.channel("settings").request("get:settingModel","add_submit"),r=i.channel("settings").request("get:settings");this.formName.show(new e({model:t,dataModel:r}));var a=i.channel("fields").request("get:collection"),s=a.findWhere({type:"submit"});"undefined"==typeof s?this.formSubmit.show(new e({model:n,dataModel:r})):r.set("add_submit",0)},events:{"click .publish":"clickPublish"},clickPublish:function(e){i.channel("app").trigger("click:confirmPublish",e)}});return t}),n("views/app/drawer/headerNewForm",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-header-new-form"});return e}),n("controllers/app/drawerConfig",["models/app/drawerCollection","views/fields/drawer/addField","views/app/drawer/editSettings","views/app/drawer/headerEditSettings","views/actions/drawer/addAction","views/app/drawer/contentViewChanges","views/app/drawer/headerViewChanges","views/app/drawer/contentNewForm","views/app/drawer/headerNewForm"],function(e,t,n,r,a,s,o,l,c,d){var h=Marionette.Object.extend({initialize:function(){this.collection=new e([{id:"addField",getContentView:function(e){return new t(e)}},{id:"addAction",getContentView:function(e){return new a(e)}},{id:"editSettings",getHeaderView:function(e){if("undefined"!=typeof e.typeModel)var t=i.channel(e.typeModel.get("id")).request("get:drawerHeaderView")||r;else var t=r;return new t(e)},getContentView:function(e){return new n(e)}},{id:"viewChanges",getHeaderView:function(e){return new o(e)},getContentView:function(e){return new s(e)}},{id:"newForm",getHeaderView:function(e){return new c(e)},getContentView:function(e){return new l(e)}}]),i.channel("app").reply("get:drawerCollection",this.getDrawerCollection,this),i.channel("app").reply("get:drawer",this.getDrawer,this)},getDrawerCollection:function(){return this.collection},getDrawer:function(e){return this.collection.get(e)}});return h}),n("views/app/drawer/defaultSettingsTitle",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-edit-settings-title-default",templateHelpers:function(){return{renderTypeNicename:function(){var e=i.channel("app").request("get:currentDomain"),t=e.get("id"),n=i.channel(t).request("get:type",this.type);return"undefined"!=typeof n?n.get("nicename"):""}}}});return e}),n("views/app/empty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-empty"});return e}),n("models/app/domainModel",["views/app/drawer/defaultSettingsTitle","views/app/empty"],function(e,t){var n=Backbone.Model.extend({defaults:{dashicons:"",classes:"",active:!1,url:"",hotkeys:!1,disabled:!1,getSettingsTitleView:function(t){return new e(t)},getDefaultSettingsTitleView:function(t){return new e(t)},getGutterLeftView:function(e){return new t},getGutterRightView:function(e){return new t}}});return n}),n("models/app/domainCollection",["models/app/domainModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/fields/subHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-sub-header-fields"});return e}),n("views/fields/mainContentFieldCollection",[],function(){var e=Marionette.CollectionView.extend({tagName:"div",reorderOnSort:!0,getChildView:function(){return i.channel("views").request("get:fieldItem")},getEmptyView:function(){return i.channel("views").request("get:mainContentEmpty")},initialize:function(){i.channel("fields").reply("get:sortableEl",this.getSortableEl,this),i.channel("fields").reply("init:sortable",this.initSortable,this),i.channel("fields").reply("destroy:sortable",this.destroySortable,this)},onRender:function(){if(this.collection.models.length>0){jQuery(this.el).addClass("nf-field-type-droppable").addClass("nf-fields-sortable");this.initSortable()}i.channel("app").trigger("render:fieldsSortable",this)},getSortableEl:function(){return this.el},initSortable:function(){if(i.channel("app").request("is:mobile"));else;jQuery(this.el).sortable({helper:"clone",cancel:".nf-item-controls",placeholder:"nf-fields-sortable-placeholder",opacity:.95,grid:[5,5],appendTo:"#nf-main",scrollSensitivity:10,receive:function(e,t){t.item.dropping||i.channel("app").request("receive:fieldsSortable",t)},over:function(e,t){t.item.dropping||i.channel("app").request("over:fieldsSortable",t)},out:function(e,t){t.item.dropping||i.channel("app").request("out:fieldsSortable",t)},start:function(e,t){t.item.dropping||i.channel("app").request("start:fieldsSortable",t)},update:function(e,t){t.item.dropping||i.channel("app").request("update:fieldsSortable",t,this)},stop:function(e,t){t.item.dropping||i.channel("app").request("stop:fieldsSortable",t)}})},destroySortable:function(){jQuery(this.el).sortable("destroy")},onAddChild:function(e){i.channel("fields").request("get:adding")&&(e.$el.hide().show("clip"),i.channel("fields").request("set:adding",!1))}});return e}),n("views/fields/drawer/addSavedField",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-add-saved-field",initialize:function(){this.model.on("change:addSavedLoading",this.renderAddButton,this)},onRender:function(){this.renderAddButton()},renderAddButton:function(){if(this.model.get("addSavedLoading"))var e=i.channel("app").request("get:template","#tmpl-nf-add-saved-field-loading");else var e=i.channel("app").request("get:template","#tmpl-nf-add-saved-field-button");jQuery(this.el).find(".add-button").html(e(this))},onBeforeDestroy:function(){this.model.off("change:addSavedLoading",this.render)},events:{"click .nf-button":"clickAddSavedField"},clickAddSavedField:function(e){i.channel("drawer").trigger("click:addSavedField",e,this.model)}});return e}),n("views/fields/drawer/settingsTitle",["views/fields/drawer/addSavedField"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-edit-settings-title-fields",initialize:function(){this.model.on("change:saved",this.render,this),this.model.on("change:label",this.renderjBoxContent,this)},regions:{addSaved:".nf-add-saved-field"},onBeforeDestroy:function(){this.model.off("change:saved",this.render),this.addSavedjBox.destroy(),this.model.unset("jBox",{silent:!0})},onRender:function(){this.renderjBoxContent();var e=this;this.addSavedjBox=new jBox("Tooltip",{trigger:"click",title:"Add to Saved Fields",position:{x:"left",y:"center"},outside:"x",closeOnClick:"body",onCreated:function(){this.setContent(jQuery(e.el).find(".nf-add-saved-field"))}}),this.addSavedjBox.attach(jQuery(this.el).find(".dashicons")),this.model.set("jBox",this.addSavedjBox,{silent:!0})},renderjBoxContent:function(){this.addSaved&&this.addSaved.show(new e({model:this.model}))},templateHelpers:function(){return{renderTypeNicename:function(){var e=i.channel("app").request("get:currentDomain"),t=e.get("id"),n=i.channel(t).request("get:type",this.type),r=n.get("nicename");if(this.saved){var a=i.channel(t).request("get:type",n.get("type"));r+=" - "+a.get("nicename")}return r},renderSavedStar:function(){if(this.saved)var e="filled";else var e="empty";return'<span class="dashicons dashicons-star-'+e+'"></span>'}}}});return t}),n("views/actions/mainHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-header-actions",initialize:function(){var e=i.channel("actions").request("get:collection");this.listenTo(e,"add",this.render),this.listenTo(e,"remove",this.render)},onRender:function(){var e=i.channel("actions").request("get:collection");0==e.models.length?jQuery(this.el).hide():jQuery(this.el).show()}});return e}),n("views/actions/subHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-sub-header-actions"});return e}),n("views/app/itemControls",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-item-controls",initialize:function(){},onRender:function(){this.currentDomain=i.channel("app").request("get:currentDomain")},events:{"mouseover .nf-item-control":"mouseoverItemControl","click .nf-edit-settings":"clickEdit","singletap .nf-edit-settings":"singleTapEdit","click .nf-delete":"clickDelete","click .nf-duplicate":"clickDuplicateField"},clickEdit:function(e){i.channel("app").request("is:mobile")||i.channel("app").trigger("click:edit",e,this.model)},singleTapEdit:function(e){i.channel("app").trigger("click:edit",e,this.model)},clickDelete:function(e){i.channel("app").trigger("click:delete",e,this.model)},clickDuplicateField:function(e){i.channel("app").trigger("click:duplicate",e,this.model)},mouseoverItemControl:function(e){i.channel("app").trigger("mouseover:itemControl",e,this.model)}});return e}),n("views/actions/actionItem",["views/app/itemControls"],function(e){var t=Marionette.LayoutView.extend({tagName:"tr",template:"#tmpl-nf-action-item",regions:{itemControls:".nf-item-controls"},initialize:function(){this.template=i.channel("actions").request("get:actionItemTemplate")||this.template,this.model.on("change:label",this.render,this),this.model.on("change:editActive",this.render,this),this.model.on("change:active",this.maybeDeactivate,this)},onBeforeDestroy:function(){this.model.off("change:label",this.render),this.model.off("change:editActive",this.render),this.model.off("change:active",this.maybeDeactivate)},onRender:function(){this.model.get("editActive")?jQuery(this.el).addClass("active"):jQuery(this.el).removeClass("active"),this.maybeDeactivate(),this.itemControls.show(new e({model:this.model}))},maybeDeactivate:function(){0==this.model.get("active")?jQuery(this.el).addClass("deactivated"):jQuery(this.el).removeClass("deactivated")},events:{"change input":"changeToggle",click:"maybeClickEdit"},maybeClickEdit:function(e){"TR"==jQuery(e.target).parent().prop("tagName")&&i.channel("app").trigger("click:edit",e,this.model)},changeToggle:function(e){var t=jQuery(e.target).data("setting"),n=i.channel("actions").request("get:settingModel",t);console.log(n),console.log(this.model),i.channel("app").request("change:setting",e,n,this.model),i.channel("app").request("update:db")},templateHelpers:function(){return{renderToggle:function(e){this.settingName=e||"active";var t=this.label;this.label="",this.value=this[this.settingName],this.name=this.id+"-"+this.settingName;var n=i.channel("app").request("get:template","#tmpl-nf-edit-setting-toggle");return n=n(this),this.label=t,n},renderTypeNicename:function(){var e=i.channel("actions").request("get:type",this.type);if("undefined"!=typeof e)return e.get("nicename")},renderTooltip:function(){return this.help?'<a class="nf-help" href="#" tabindex="-1"><span class="dashicons dashicons-admin-comments"></span></a><div class="nf-help-text">'+this.help+"</div>":""},renderMergeTags:function(){return this.use_merge_tags?'<span class="dashicons dashicons-list-view merge-tags"></span>':""}}}});return t}),n("views/actions/mainContentEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-content-actions-empty",onBeforeDestroy:function(){jQuery(this.el).parent().parent().removeClass("nf-actions-empty")},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},onShow:function(){jQuery(this.el).parent().parent().addClass("nf-actions-empty")}});return e}),n("views/actions/mainContent",["views/actions/actionItem","views/actions/mainContentEmpty"],function(e,t){var n=Marionette.CompositeView.extend({template:"#tmpl-nf-action-table",childView:e,emptyView:t,initialize:function(){this.template=i.channel("actions").request("get:mainContentTemplate")||this.template},onRender:function(){jQuery(this.el).droppable({accept:".nf-action-type-draggable",activeClass:"nf-droppable-active",hoverClass:"nf-droppable-hover",drop:function(e,t){i.channel("app").request("drop:actionType",e,t)}})},attachHtml:function(e,t){"undefined"!=typeof i.channel("actions").request("get:type",t.model.get("type"))&&jQuery(e.el).find("tbody").append(t.el)}});return n}),n("views/advanced/mainHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-header-settings"});return e}),n("views/advanced/subHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-sub-header-settings"});return e}),n("views/advanced/settingItem",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-form-setting-type",onBeforeDestroy:function(){this.model.off("change:editActive",this.updateActiveClass)},initialize:function(){this.model.on("change:editActive",this.updateActiveClass,this)},events:{click:"clickEdit"},clickEdit:function(e){i.channel("settings").trigger("click:edit",e,this.model)},templateHelpers:function(){return{renderClasses:function(){var e="nf-setting-wrap "+this.id;return this.editActive&&(e+=" active"),e}}},updateActiveClass:function(){this.model.get("editActive")?jQuery(this.el).find(".nf-setting-wrap").addClass("active"):jQuery(this.el).find(".nf-setting-wrap").removeClass("active")}});return e}),n("views/advanced/mainContent",["views/advanced/settingItem"],function(e){var t=Marionette.CollectionView.extend({childView:e});return t}),n("models/fields/fieldModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Field",objectDomain:"fields",editActive:!1,order:999},initialize:function(){if("undefined"!=typeof this.get("type")){this.on("change",this.changeSetting,this);var e=i.channel("fields").request("get:type",this.get("type")),t=e.get("parentType");_.each(e.get("settingDefaults"),function(e,t){"undefined"==typeof this.get(t)&&this.set(t,e,{silent:!0})},this),"saved"==e.get("section")&&this.set("type",e.get("type")),i.channel("fields").trigger("init:fieldModel",this),i.channel("fields-"+t).trigger("init:fieldModel",this),i.channel("fields-"+this.get("type")).trigger("init:fieldModel",this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)}},changeSetting:function(e,t){i.channel("fieldSetting-"+_.keys(e.changedAttributes())[0]).trigger("update:setting",this,t.settingModel),i.channel("fields").trigger("update:setting",this,t.settingModel),i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("models/fields/fieldCollection",["models/fields/fieldModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:function(e){return parseInt(e.get("order"))},tmpNum:1,initialize:function(){this.on("add",this.addField,this),this.on("remove",this.removeField,this),this.listenTo(this,"add:field",this.addNewField),this.listenTo(this,"append:field",this.appendNewField),this.listenTo(this,"remove:field",this.removeFieldResponse),this.newIDs=[]},addField:function(e){this.newIDs.push(e.get("id"))},removeField:function(e){this.removedIDs=this.removedIDs||{},this.removedIDs[e.get("id")]=e.get("id")},addNewField:function(e){this.add(e)},appendNewField:function(e){if(0==this.length)var t=0;else var t=this.at(this.length-1).get("order")+1;e.set("order",t,{silent:!0}),this.add(e)},removeFieldResponse:function(e){this.remove(e)},fieldExists:function(e){return-1!=this.indexOf(e)}});return t}),n("controllers/app/domainConfig",["models/app/domainCollection","views/fields/subHeader","views/fields/mainContentFieldCollection","views/fields/drawer/settingsTitle","views/actions/mainHeader","views/actions/subHeader","views/actions/mainContent","views/advanced/mainHeader","views/advanced/subHeader","views/advanced/mainContent","views/app/empty","models/fields/fieldCollection"],function(e,t,n,r,a,s,o,l,c,d,h,u){var g=Marionette.Object.extend({initialize:function(){i.channel("formContent").request("add:viewFilter",this.defaultFormContentView,10,this),i.channel("formContent").request("add:loadFilter",this.defaultFormContentLoad,10,this),i.channel("formContentGutters").request("add:leftFilter",this.defaultFormContentGutterView,10,this),i.channel("formContentGutters").request("add:rightFilter",this.defaultFormContentGutterView,10,this),this.collection=new e([{id:"fields",nicename:nfi18n.domainFormFields,hotkeys:{Esc:"close:drawer","Ctrl+Shift+n":"add:newField","Ctrl+Shift+a":"changeDomain:actions","Ctrl+Shift+s":"changeDomain:settings","Alt+Ctrl+t":"open:mergeTags",up:"up:mergeTags",down:"down:mergeTags","Shift+return":"return:mergeTags"},mobileDashicon:"dashicons-menu",getSubHeaderView:function(){return new t},getMainContentView:function(e){var t=i.channel("settings").request("get:setting","formContentData");t||(t=i.channel("settings").request("get:setting","fieldContentsData"));var n=i.channel("formContent").request("get:loadFilters"),r=_.without(n,void 0),a=_.first(r);t=a(t,i.channel("app").request("get:formModel"),!0);var s=i.channel("formContent").request("get:viewFilters"),r=_.without(s,void 0),a=_.first(r);return formContentView=a(),i.channel("settings").request("update:setting","formContentData",t,!0),new formContentView({collection:t})},getSettingsTitleView:function(e){return"fields"==e.model.get("objectDomain")?new r(e):this.get("getDefaultSettingsTitleView").call(this,e)},getGutterLeftView:function(e){var t=i.channel("formContentGutters").request("get:leftFilters"),n=_.without(t,void 0),r=_.first(n);return gutterView=r(),new gutterView},getGutterRightView:function(){var e=i.channel("formContentGutters").request("get:rightFilters"),t=_.without(e,void 0),n=_.first(t);return gutterView=n(),new gutterView}},{id:"actions",nicename:nfi18n.domainActions,hotkeys:{Esc:"close:drawer","Ctrl+Shift+n":"add:newAction","Ctrl+Shift+f":"changeDomain:fields","Ctrl+Shift+s":"changeDomain:settings","Alt+Ctrl+t":"open:mergeTags",up:"up:mergeTags",down:"down:mergeTags","Shift+return":"return:mergeTags"},mobileDashicon:"dashicons-external",getSubHeaderView:function(){return new s},getMainContentView:function(){var e=i.channel("actions").request("get:collection");return new o({collection:e})}},{id:"settings",nicename:nfi18n.domainAdvanced,hotkeys:{Esc:"close:drawer","Ctrl+Shift+f":"changeDomain:fields","Ctrl+Shift+a":"changeDomain:actions","Alt+Ctrl+t":"open:mergeTags",up:"up:mergeTags",down:"down:mergeTags","Shift+return":"return:mergeTags"},mobileDashicon:"dashicons-admin-generic",getSubHeaderView:function(){return new c},getMainContentView:function(){var e=i.channel("settings").request("get:typeCollection");return new d({collection:e})}},{id:"preview",nicename:"Preview Form",classes:"preview",dashicons:"dashicons-visibility",mobileDashicon:"dashicons-visibility",url:nfAdmin.previewurl}]),i.channel("app").trigger("init:domainCollection",this.collection),i.channel("app").reply("get:domainCollection",this.getDomainCollection,this),i.channel("app").reply("get:domainModel",this.getDomainModel,this)},getDomainCollection:function(){return this.collection},getDomainModel:function(e){return this.collection.get(e)},defaultFormContentView:function(e){return n},defaultFormContentLoad:function(e){var t=i.channel("fields").request("get:collection"),n=i.channel("formContent").request("get:loadFilters"),r=_.without(n,void 0);if(1==r.length||"undefined"==typeof e||!0==e instanceof Backbone.Collection)return t;var a=_.map(e,function(e){return t.findWhere({key:e})},this);return new u(a)},defaultFormContentGutterView:function(e){return h}});return g}),n("models/app/appModel",[],function(){var e=Backbone.Model.extend({defaults:{loading:!1},initialize:function(){this.on("change:clean",this.changeStatus,this)},changeStatus:function(){i.channel("app").trigger("change:clean",this.get("clean"))}});return e}),n("controllers/app/data",["models/app/appModel"],function(e){var t=Marionette.Object.extend({initialize:function(){var t=i.channel("app").request("get:domainCollection");this.model=new e({currentDrawer:!1,currentDomain:t.get("fields"),clean:!0});var n=1==nfAdmin.mobile;this.model.set("mobile",n),i.channel("app").reply("is:mobile",this.isMobile,this),i.channel("app").reply("get:data",this.getData,this),i.channel("app").reply("get:setting",this.getSetting,this),i.channel("app").reply("get:currentDomain",this.getCurrentDomain,this),i.channel("app").reply("get:currentDrawer",this.getCurrentDrawer,this),i.channel("drawer").reply("get:current",this.getCurrentDrawer,this),i.channel("app").reply("update:currentDomain",this.updateCurrentDomain,this),i.channel("app").reply("update:currentDrawer",this.updateCurrentDrawer,this),i.channel("app").reply("update:setting",this.updateSetting,this)},updateCurrentDomain:function(e){this.updateSetting("currentDomain",e)},updateSetting:function(e,t){return this.model.set(e,t),!0},getSetting:function(e){return this.model.get(e)},getData:function(){return this.model},getCurrentDomain:function(){return this.model.get("currentDomain")},updateCurrentDrawer:function(e){ 3 return this.updateSetting("currentDrawer",e),!0},getCurrentDrawer:function(){var e=this.model.get("currentDrawer");return i.channel("app").request("get:drawer",e)},isMobile:function(){return this.model.get("mobile")}});return t}),n("controllers/app/drawerToggleSettingGroup",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"click:toggleSettingGroup",this.toggleSettingGroup)},toggleSettingGroup:function(e,t){if(t.get("display")){var n=!1;_.each(t.get("settings").models,function(e){e.get("error")&&(n=!0)}),n||t.set("display",!1)}else t.set("display",!0)}});return e}),n("controllers/app/updateDB",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"closed",this.updateDB),i.channel("app").reply("update:db",this.updateDB,this),i.channel("formContent").request("add:saveFilter",this.defaultSaveFilter,10,this)},updateDB:function(e){if(i.channel("app").request("get:setting","clean"))return!1;if(e=e||"preview","preview"==e)var t="nf_preview_update";else if("publish"==e)var t="nf_save_form";var n=i.channel("app").request("get:formModel");_.each(n.get("fields").models,function(e,t){e.unset("jBox",{silent:!0})});var r=i.channel("settings").request("get:setting","formContentData");r||(r=i.channel("settings").request("get:setting","fieldContentsData"));var a=i.channel("formContent").request("get:saveFilters"),s=_.without(a,void 0),o=_.first(s);if(r=o(r),"publish"==e&&n.get("show_publish_options")){i.channel("app").request("open:drawer","newForm");var l=i.channel("app").request("get:builderEl");return jQuery(l).addClass("disable-main"),!1}var c=i.channel("app").request("get:formModel"),d=JSON.parse(JSON.stringify(c));d.settings.formContentData=r;var h=c.get("fields").removedIDs;_.each(d.fields,function(e){var t=e.id;delete e.id,delete e.parent_id;var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i],delete e[i]);for(var r in n)null===n[r]&&delete n[r];e.settings=n,e.id=t}),d.deleted_fields=h;var h=c.get("actions").removedIDs;_.each(d.actions,function(e){var t=e.id;delete e.id,delete e.parent_id;var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i],delete e[i]);e.settings=n,e.id=t}),d.deleted_actions=h,d=JSON.stringify(d),i.channel("app").trigger("before:updateDB",d),"publish"==e&&(i.channel("app").request("update:setting","loading",!0),i.channel("app").trigger("change:loading"),i.channel("app").request("is:mobile")&&i.channel("notices").request("add","publishing","Your Changes Are Being Published",{autoClose:!1})),jQuery.post(ajaxurl,{action:t,form:d,security:nfAdmin.ajaxNonce},function(t){try{t=JSON.parse(t),t.action=e,i.channel("app").trigger("response:updateDB",t),!i.channel("app").request("is:mobile")&&"preview"==e}catch(e){console.log("Something went wrong!"),console.log(e)}})},defaultSaveFilter:function(e){return e.pluck("key")}});return e}),n("models/app/formModel",[],function(){var e=Backbone.Model.extend({initialize:function(){jQuery.isNumeric(this.get("id"))?this.set("show_publish_options",!1,{silent:!0}):this.set("show_publish_options",!0,{silent:!0})}});return e}),n("controllers/app/formData",["models/app/formModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.model=new e({id:preloadedFormData.id}),this.model.set("fields",i.channel("fields").request("get:collection")),this.model.set("actions",i.channel("actions").request("get:collection")),this.model.set("settings",i.channel("settings").request("get:settings")),i.channel("app").reply("get:formModel",this.getFormModel,this)},getFormModel:function(){return this.model}});return t}),n("controllers/app/previewLink",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:sendChanges",this.disablePreview,this),this.listenTo(i.channel("app"),"response:sendChanges",this.enablePreview,this),this.listenTo(i.channel("app"),"change:clean",this.changePreviewNicename,this)},disablePreview:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("preview");t.set("disabled",!0)},changePreviewNicename:function(e){var t=i.channel("app").request("get:domainCollection"),n=t.get("preview");if(e)var r="Preview Form";else var r="Preview Changes";n.set("nicename",r)},enablePreview:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("preview");t.set("disabled",!1)}});return e}),n("controllers/app/menuButtons",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:publish",this.publish),this.listenTo(i.channel("app"),"click:viewChanges",this.viewChanges)},publish:function(){i.channel("app").request("update:db","publish")},viewChanges:function(){var e=i.channel("changes").request("get:collection");i.channel("app").request("open:drawer","viewChanges",{collection:e})}});return e}),n("models/app/changeModel",[],function(){var e=Backbone.Model.extend({defaults:{disabled:!1}});return e}),n("models/app/changeCollection",["models/app/changeModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:function(e){var t=parseInt(e.cid.replace("c",""));return-t}});return t}),n("controllers/app/trackChanges",["models/app/changeCollection","models/app/changeModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.collection=new e,i.channel("changes").reply("register:change",this.registerChange,this),i.channel("changes").reply("get:collection",this.getCollection,this),this.listenTo(i.channel("app"),"change:clean",this.maybeResetCollection)},registerChange:function(e,n,i,r,a){var a="undefined"!=typeof a?a:{};"undefined"==typeof r.dashicon&&(r.dashicon="admin-generic");var s=new t({action:e,model:n,changes:i,label:r,data:a});return this.collection.add(s),s},getCollection:function(){return this.collection},maybeResetCollection:function(e){e&&this.collection.reset()}});return n}),n("controllers/app/undoChanges",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"click:undoChanges",this.undoChanges,this),this.listenTo(i.channel("drawer"),"click:undoSingle",this.undoSingle,this)},undoChanges:function(){var e=i.channel("changes").request("get:collection");e.sort();var t=this;_.each(e.models,function(e){t.undoSingle(e,!0)}),e.reset(),i.channel("app").request("update:db"),i.channel("app").request("update:setting","clean",!0),i.channel("app").request("close:drawer")},undoSingle:function(e,t){i.channel("changes").request("undo:"+e.get("action"),e,t)}});return e}),n("controllers/app/publishResponse",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"response:updateDB",this.publishResponse)},publishResponse:function(e){return"publish"===e.action&&("undefined"!=typeof e.data.new_ids&&("undefined"!=typeof e.data.new_ids.fields&&_.each(e.data.new_ids.fields,function(e,t){var n=i.channel("fields").request("get:field",t);n&&n.set("id",e)}),"undefined"!=typeof e.data.new_ids.actions&&_.each(e.data.new_ids.actions,function(e,t){var n=i.channel("actions").request("get:action",t);n&&n.set("id",e)}),"undefined"!=typeof e.data.new_ids.forms&&_.each(e.data.new_ids.forms,function(e,t){var n=i.channel("app").request("get:formModel");n.set("id",e),history.replaceState("","","admin.php?page=ninja-forms&form_id="+e)})),i.channel("app").request("update:setting","loading",!1),i.channel("app").trigger("change:loading"),i.channel("app").request("is:mobile")&&i.channel("notices").request("close","publishing"),i.channel("notices").request("add","published","Changes Published"),i.channel("app").trigger("app:published",e),void i.channel("app").request("update:setting","clean",!0))}});return e}),n("controllers/app/changeDomain",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:menu",this.changeAppDomain),i.channel("app").reply("change:currentDomain",this.changeAppDomain,this),i.channel("app").reply("prevent:changeDomain",this.preventChange,this),i.channel("app").reply("enable:changeDomain",this.enableChange,this),this.objPreventChange={}},changeAppDomain:function(e,t){if(this.maybePreventChange())return!1;if("undefined"==typeof t)var n=jQuery(e.target).data("domain"),t=i.channel("app").request("get:domainModel",n);if(i.channel("app").request("get:currentDrawer")&&i.channel("app").request("close:drawer"),0==t.get("url").length){var r=i.channel("app").request("get:mainEl");i.channel("app").request("update:currentDomain",t),jQuery(r).scrollTop(0),i.channel("app").trigger("change:currentDomain",t)}},maybePreventChange:function(){return 0!=Object.keys(this.objPreventChange).length},preventChange:function(e){this.objPreventChange[e]=!0},enableChange:function(e){delete this.objPreventChange[e]}});return e}),n("controllers/app/pushstate",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.changePushState)},changePushState:function(){var e=i.channel("app").request("get:currentDomain");history.pushState(null,null,window.location.href+"&domain="+e.get("id"));var t=/domain=\\d+/,n=window.location.toString(),r=n.replace(t,"");console.log(r)}});return e}),n("controllers/app/hotkeys",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("main"),"render:main",this.changeHotkeys),this.listenTo(i.channel("drawer"),"opened",this.changeHotkeys),this.listenTo(i.channel("drawer"),"render:settingGroup",this.changeHotkeys),this.listenTo(i.channel("hotkeys"),"add:newField",this.addNewField),this.listenTo(i.channel("hotkeys"),"add:newAction",this.addNewAction),this.listenTo(i.channel("hotkeys"),"changeDomain:fields",this.changeDomainFields),this.listenTo(i.channel("hotkeys"),"changeDomain:actions",this.changeDomainActions),this.listenTo(i.channel("hotkeys"),"changeDomain:settings",this.changeDomainSettings),this.listenTo(i.channel("hotkeys"),"close:drawer",this.closeDrawer)},changeHotkeys:function(){var e=i.channel("app").request("get:currentDomain");jQuery(document).off(".nfDomainHotkeys"),jQuery("input").off(".nfDomainHotkeys"),e.get("hotkeys")&&jQuery.each(e.get("hotkeys"),function(e,t){jQuery(document).on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)}),jQuery("input").on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)}),jQuery("textarea").on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)})})},addNewField:function(){"addField"!=i.channel("app").request("get:currentDrawer")?i.channel("app").request("open:drawer","addField"):i.channel("app").request("close:drawer")},addNewAction:function(){"addAction"!=i.channel("app").request("get:currentDrawer")?i.channel("app").request("open:drawer","addAction"):i.channel("app").request("close:drawer")},changeDomainFields:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("fields");i.channel("app").request("change:currentDomain",{},t)},changeDomainActions:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("actions");i.channel("app").request("change:currentDomain",{},t)},changeDomainSettings:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("settings");i.channel("app").request("change:currentDomain",{},t)},closeDrawer:function(){i.channel("app").request("close:drawer")}});return e}),n("controllers/app/cleanState",[],function(){var e=Marionette.Object.extend({initialize:function(){this.ignoreAttributes=["editActive"],this.listenTo(i.channel("app"),"update:setting",this.setAppClean)},setAppClean:function(e){for(var t in e.changedAttributes())var n=t,r=e.changedAttributes()[t];i.channel("undo-"+e.get("type")).request("ignore:attributes",this.ignoreAttributes)||this.ignoreAttributes;return-1==this.ignoreAttributes.indexOf(t)&&void i.channel("app").request("update:setting","clean",!1)}});return e}),n("controllers/app/coreUndo",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("changes").reply("undo:changeSetting",this.undoChangeSetting,this),i.channel("changes").reply("undo:addObject",this.undoAddObject,this),i.channel("changes").reply("undo:removeObject",this.undoRemoveObject,this),i.channel("changes").reply("undo:duplicateObject",this.undoDuplicateObject,this),i.channel("changes").reply("undo:sortFields",this.undoSortFields,this),i.channel("changes").reply("undo:addListOption",this.undoAddListOption,this),i.channel("changes").reply("undo:removeListOption",this.undoRemoveListOption,this),i.channel("changes").reply("undo:sortListOptions",this.undoSortListOptions,this)},undoChangeSetting:function(e,t){var n=e.get("model"),i=e.get("changes"),r=i.attr,a=i.before;n.set(r,a),this.maybeRemoveChange(e,t)},undoAddObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if("undefined"!=typeof r.newIDs&&delete r.newIDs[n.get("id")],!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&a.remove(t)})}r.remove(n),this.maybeRemoveChange(e,t)},undoDuplicateObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&a.remove(t)})}r.remove(n),this.maybeRemoveChange(e,t)},undoRemoveObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(i.channel(n.get("objectDomain")).request("add",n),delete r.removedIDs[n.get("id")],!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&t.set("disabled",!1)})}r.trigger("reset",r),this.maybeRemoveChange(e,t)},undoSortFields:function(e,t){var n=e.get("data"),r=n.fields,a=i.channel("fields").request("get:collection");_.each(r,function(e){var t=e.before,n=e.model;n.set("order",t)}),a.sort(),this.maybeRemoveChange(e,t)},undoAddListOption:function(e,t){var n=e.get("model");if(!t){var r=i.channel("changes").request("get:collection"),a=r.where({model:n});_.each(a,function(t){t!==e&&r.remove(t)})}n.collection.remove(n),this.maybeRemoveChange(e,t)},undoRemoveListOption:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(r.add(n),!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&t.set("disabled",!1)})}this.maybeRemoveChange(e,t)},undoSortListOptions:function(e,t){var n=e.get("data"),i=n.collection,r=n.objModels;_.each(r,function(e){var t=e.before,n=e.model;n.set("order",t)}),i.sort(),this.maybeRemoveChange(e,t)},maybeRemoveChange:function(e,t){var t="undefined"!=typeof t&&t;if(!t){i.channel("app").request("update:db");var n=i.channel("changes").request("get:collection");n.remove(e),0==n.length&&(i.channel("app").request("update:setting","clean",!0),i.channel("app").request("close:drawer"))}}});return e}),n("controllers/app/cloneModelDeep",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("clone:modelDeep",this.cloneModelDeep,this)},cloneModelDeep:function(e){var t={};_.each(e.attributes,function(e,n){if(e instanceof Backbone.Collection){var r=i.channel("app").request("clone:collectionDeep",e);t[n]=r}else e instanceof Backbone.Model&&(t[n]=this.cloneModelDeep(e))},this);var n=e.clone();return _.each(t,function(e,t){n.set(t,e)}),n}});return e}),n("controllers/app/getSettingChildView",["views/app/drawer/itemSetting"],function(e){var t=Marionette.Object.extend({initialize:function(){i.channel("app").reply("get:settingChildView",this.getSettingChildView,this)},getSettingChildView:function(t){var n=t.get("type"),r=i.channel(n).request("get:settingChildView",t)||e;return r}});return t}),n("controllers/app/changeSettingDefault",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("change:setting",this.changeSetting,this),this.listenTo(i.channel("app"),"change:setting",this.changeSetting,this)},changeSetting:function(e,t,n,r){var a=t.get("name"),s=n.get(a),r=r||null;r||(r=i.channel(t.get("type")).request("before:updateSetting",e,n,a,t)),"undefined"==typeof r&&(r=jQuery(e.target).val()),n.set(a,r,{settingModel:t}),i.channel("setting-"+a).trigger("after:updateSetting",n,t);var o=r,l={attr:a,before:s,after:o},c=i.channel("app").request("get:currentDomain"),d=(c.get("id"),{object:n.get("objectType"),label:n.get("label"),change:"Changed "+t.get("label")+" from "+s+" to "+o});i.channel("changes").request("register:change","changeSetting",n,l,d)}});return e}),n("views/app/drawer/typeSettingFieldset",["views/app/drawer/itemSetting"],function(e){var t=Marionette.CompositeView.extend({template:"#tmpl-nf-edit-setting-wrap",childView:e,initialize:function(e){this.collection=this.model.get("settings"),this.childViewOptions={dataModel:e.dataModel},this.dataModel=e.dataModel;var t=this.model.get("deps");if(t)for(var n in t)t.hasOwnProperty(n)&&this.dataModel.on("change:"+n,this.render,this);this.model.on("rerender",this.render,this)},onBeforeDestroy:function(){var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render)},onBeforeRender:function(){i.channel("app").trigger("before:renderSetting",this.model,this.dataModel),i.channel("setting-type-"+this.model.get("type")).trigger("before:renderSetting",this.model,this.dataModel,this),i.channel("setting-"+this.model.get("name")).trigger("before:renderSetting",this.model,this.dataModel,this)},onRender:function(){i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("render:setting",this.model,this.dataModel,this)},templateHelpers:function(){var e=this;return{renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!==this.deps[t])return'style="display:none;"';return""},renderSetting:function(){var e=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return e(this)},renderClasses:function(){var e="";return e+="undefined"!=typeof this.width?this.width:" one-half",this.error&&(e+=" nf-error"),e},renderError:function(){return this.error?this.error:""}}},attachHtml:function(e,t){jQuery(e.el).find(".nf-field-sub-settings").append(t.el)}});return t}),n("models/app/settingModel",[],function(){var e=Backbone.Model.extend({defaults:{settings:!1,hide_merge_tags:!1,error:!1},initialize:function(){i.channel("app").trigger("init:settingModel",this),i.channel(this.get("type")).trigger("init:settingModel",this),i.channel("setting-name-"+this.get("name")).trigger("init:settingModel",this),this.on("change:error",this.maybePreventUI,this),"undefined"!=typeof this.collection&&this.get("use_merge_tags")&&"undefined"!=typeof this.collection.options.objectType&&this.listenTo(i.channel("app"),"update:fieldKey",this.updateKey)},updateKey:function(e){i.channel("app").trigger("fire:updateFieldKey",e,this)},maybePreventUI:function(){this.get("error")?(i.channel("drawer").request("prevent:close","setting-"+this.get("name")+"-error"),i.channel("app").request("prevent:changeDomain","setting-"+this.get("name")+"-error")):(i.channel("drawer").request("enable:close","setting-"+this.get("name")+"-error"),i.channel("app").request("enable:changeDomain","setting-"+this.get("name")+"-error"))}});return e}),n("models/app/settingCollection",["models/app/settingModel"],function(e){var t=Backbone.Collection.extend({model:e,initialize:function(e,t){this.options=t||{}}});return t}),n("controllers/app/fieldset",["views/app/drawer/typeSettingFieldset","models/app/settingCollection"],function(e,t){var n=Marionette.Object.extend({initialize:function(){i.channel("fieldset").reply("get:settingChildView",this.getSettingChildView,this),this.listenTo(i.channel("fieldset"),"init:settingModel",this.createSettingsCollection)},getSettingChildView:function(t){return e},createSettingsCollection:function(e){e.set("settings",new t(e.get("settings")))}});return n}),n("controllers/app/toggleSetting",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-toggle").reply("renderOnChange",function(){return!1}),i.channel("toggle").reply("before:updateSetting",this.updateSetting,this)},updateSetting:function(e,t,n,i){if(jQuery(e.target).attr("checked"))var r=1;else var r=0;return r}});return e}),n("controllers/app/itemControls",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:edit",this.clickEdit),this.listenTo(i.channel("app"),"click:delete",this.clickDelete),this.listenTo(i.channel("app"),"click:duplicate",this.clickDuplicate)},clickEdit:function(e,t){var n=i.channel("app").request("get:currentDomain"),r=n.get("id"),a=i.channel(r).request("get:type",t.get("type"));i.channel("app").request("open:drawer","editSettings",{model:t,groupCollection:a.get("settingGroups")})},clickDelete:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r={object:t.get("objectType"),label:t.get("label"),change:"Removed",dashicon:"dismiss"},a={collection:t.collection},s=i.channel("changes").request("get:collection"),o=s.where({model:t});_.each(o,function(e){var i=e.get("data");"undefined"!=typeof i.fields&&_.each(i.fields,function(e,r){e.model==t&&(i.fields[r].model=n)}),e.set("data",i),e.set("model",n),e.set("disabled",!0)}),i.channel("changes").request("register:change","removeObject",n,null,r,a);var l=i.channel("app").request("get:currentDomain"),c=l.get("id");i.channel(c).request("delete",t)},clickDuplicate:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r=i.channel("app").request("get:currentDomain"),a=r.get("id");n.set("label",n.get("label")+" Copy");var s=i.channel(a).request("get:tmpID");n.set("id",s),i.channel(a).request("add",n,!1,!1,"duplicate");var o={object:t.get("objectType"),label:t.get("label"),change:"Duplicated",dashicon:"admin-page"},l={collection:i.channel(a).request("get:collection")};i.channel("changes").request("register:change","duplicateObject",n,null,o,l),t.trigger("change:label",t),i.channel("app").request("update:db")}});return e}),n("controllers/app/mergeTags",["models/app/mergeTagCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.tagSectionCollection=new e;var t=this;_.each(mergeTags,function(n){if(n.tags)var i=new e(n.tags);else var i="";t.tagSectionCollection.add({id:n.id,label:n.label,tags:i,default_group:n.default_group})});var n=this.tagSectionCollection.get("fields").get("tags"),r=i.channel("fields").request("get:collection");_.each(r.models,function(e){"submit"!==e.get("type")&&n.add({id:e.get("id"),label:e.get("label"),tag:t.getFieldKeyFormat(e.get("key"))})});var a=new e,s=i.channel("app").request("get:formModel"),o=s.get("settings").get("calculations");_.each(o.models,function(e){a.add({label:e.get("name"),tag:"{calc:"+e.get("name")+"}"})}),this.tagSectionCollection.get("calcs").set("tags",a),this.currentElement={},this.settingModel={},this.open=!1,this.listenTo(i.channel("mergeTags"),"click:mergeTag",this.clickMergeTag),this.listenTo(i.channel("fields"),"add:field",this.addFieldTags),this.listenTo(i.channel("fields"),"delete:field",this.deleteFieldTags),this.listenTo(i.channel("option-repeater-calculations"),"update:option",this.updateCalcTags),this.listenTo(i.channel("option-repeater-calculations"),"remove:option",this.updateCalcTags),i.channel("mergeTags").reply("update:currentElement",this.updateCurrentElement,this),i.channel("mergeTags").reply("update:currentSetting",this.updateCurrentSetting,this),i.channel("mergeTags").reply("get:collection",this.getCollection,this),i.channel("mergeTags").reply("get:mergeTag",this.getSectionModel,this),this.listenTo(i.channel("fieldSetting-key"),"update:setting",this.updateKey),this.listenTo(i.channel("app"),"replace:fieldKey",this.replaceFieldKey),i.channel("app").reply("get:fieldKeyFormat",this.getFieldKeyFormat,this)},initMergeTags:function(e){var t=i.channel("mergeTags").request("get:view"),n=this;this.jBoxes={};var n=this;jQuery(e.el).find(".merge-tags").each(function(){if("undefined"==typeof jQuery(this).data("jBox-id")){var i=jQuery(this).jBox("Tooltip",{title:"Insert Merge Tag",trigger:"click",position:{x:"center",y:"bottom"},closeOnClick:"body",closeOnEsc:!0,theme:"TooltipBorder",maxHeight:200,onOpen:function(){t.reRender(e.model),this.setContent(jQuery(".merge-tags-content"));var i=jQuery(this.target).prev(".setting");0==i.length&&(i=jQuery(e.el).find(".setting")),n.updateCurrentSetting(e.model),n.updateCurrentElement(i)},onClose:function(){}});jQuery(this).data("jBox-id",i.id)}})},clickMergeTag:function(e,t){if("undefined"!=typeof this.settingModel.get("settingModel")&&"calculations"==this.settingModel.get("settingModel").get("name")){console.log(t);var n=jQuery(this.currentElement).val(),i=jQuery(this.currentElement).caret(),r=i+t.get("tag").length,a="undefined"!=typeof t.get("calcTag")?t.get("calcTag"):t.get("tag");n=n.substr(0,i)+a+n.substr(i),jQuery(this.currentElement).val(n).caret(r).trigger("change")}else if("rte"==this.settingModel.get("type"))jQuery(this.currentElement).summernote("insertText",t.get("tag"));else{var n=jQuery(this.currentElement).val(),i=jQuery(this.currentElement).caret(),r=i+t.get("tag").length;n=n.substr(0,i)+t.get("tag")+n.substr(i),jQuery(this.currentElement).val(n).caret(r).trigger("change")}},addFieldTags:function(e){"submit"!==e.get("type")&&this.tagSectionCollection.get("fields").get("tags").add({id:e.get("id"),label:e.get("label"),tag:this.getFieldKeyFormat(e.get("key")),calcTag:this.getFieldKeyFormatCalc(e.get("key"))})},deleteFieldTags:function(e){var t=e.get("id"),n=this.tagSectionCollection.get("fields").get("tags").get(t);this.tagSectionCollection.get("fields").get("tags").remove(n)},updateCalcTags:function(t){var n=new e,r=i.channel("app").request("get:formModel"),a=r.get("settings").get("calculations");_.each(a.models,function(e){n.add({label:e.get("name"),tag:"{calc:"+e.get("name")+"}"})}),this.tagSectionCollection.get("calcs").set("tags",n)},openMergeTags:function(e){"TEXTAREA"!=jQuery(e.target)[0].tagName&&"INPUT"!=jQuery(e.target)[0].tagName||jQuery(e.target).parent().find(".merge-tags").click()},returnMergeTags:function(e){if(this.open){e.preventDefault();var t=this.fields.where({active:!0})[0];t&&this.clickMergeTag(e,t)}},upMergeTags:function(e){this.open&&(e.preventDefault(),this.changeActiveTag("up"))},downMergeTags:function(e){this.open&&(e.preventDefault(),this.changeActiveTag("down"))},changeActiveTag:function(e){if("down"==e)var t=1;else var t=-1;if(0<this.fields.where({active:!0}).length){var n=this.fields.where({active:!0})[0],i=this.fields.indexOf(n);n.set("active",!1);var r=this.fields.models[i+t];r&&r.set("active",!0)}else 0<this.fields.where({active:!0})?console.log("system"):0<this.userInfo.where({active:!0})?console.log("userinfo"):0<this.fields.models.length?this.fields.models[0].set("active",!0):this.system.models[0].set("active",!0)},updateCurrentElement:function(e){this.currentElement=e},updateCurrentSetting:function(e){this.settingModel=e},getCollection:function(){return this.tagSectionCollection},getSectionModel:function(e){return this.tagSectionCollection.get(e)},updateOpen:function(e){this.open=e,_.each(this.tagSectionCollection.get("fields").models,function(e){e.set("active",!1)})},updateKey:function(e){var t=e.get("key"),n=this.tagSectionCollection.get("fields").get("tags").get(e.get("id"));"undefined"!=typeof n&&n.set("tag",this.getFieldKeyFormat(t))},getFieldKeyFormat:function(e){return"{field:"+e+"}"},getFieldKeyFormatCalc:function(e){return"{field:"+e+":calc}"},replaceFieldKey:function(e,t,n){var i=this.getFieldKeyFormat(t._previousAttributes.key),r=this.getFieldKeyFormat(t.get("key")),a=n.get("name"),s=e.get(a);if("calculations"==a&&"undefined"!=typeof e.get("calculations")){var o=e.get("calculations");return o.each(function(e){var t=i.slice(0,i.length-1)+":calc}",n=r.slice(0,r.length-1)+":calc}";if(s=e.get("eq"),"string"==typeof s){var a=new RegExp(t,"g"),o=s.replace(a,n);a=new RegExp(i,"g"),o=o.replace(a,r),e.set("eq",o)}}),!1}if("string"==typeof s){var l=new RegExp(i,"g");newVal=s.replace(l,r),e.set(a,newVal)}}});return t}),n("models/app/mergeTagLookupCollection",["models/app/mergeTagModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/app/drawer/mergeTag",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tag-box-tag",events:{click:"insertTag"},insertTag:function(){i.channel("mergeTags").request("insert:tag",this.model.get("tag"))}});return e}),n("views/app/drawer/mergeTagList",["views/app/drawer/mergeTag"],function(e){var t=Marionette.CollectionView.extend({tagName:"ul",childView:e,initialize:function(){i.channel("merge-tags").reply("update:taglist",this.sectionFilter,this),i.channel("merge-tags").reply("filtersearch",this.searchFilter,this)},filter:function(e,t,n){return"fields"==e.get("section")},sectionFilter:function(e){this.filter=function(t,n,i){return e==t.get("section")},this.render(),i.channel("merge-tags").trigger("after:filtersearch")},searchFilter:function(e){this.filter=function(t,n,i){var r=t.get("label").toLowerCase().indexOf(e.toLowerCase().replace(":",""))>=0,a=t.get("tag").toLowerCase().indexOf(e.toLowerCase())>=0;return r||a},this.render(),i.channel("merge-tags").trigger("after:filtersearch")}});return t}),n("views/app/drawer/mergeTagGroup",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tag-box-section",events:{click:"onClick"},initialize:function(){this.listenTo(i.channel("merge-tags"),"after:filtersearch",this.removeActive)},onClick:function(){this.updateTags(),this.setActive()},updateTags:function(){i.channel("merge-tags").request("update:taglist",this.model.get("id"))},setActive:function(){this.$el.addClass("active"),this.$el.siblings().removeClass("active")},removeActive:function(){this.$el.removeClass("active")}});return e}),n("views/app/drawer/mergeTagGroupList",["views/app/drawer/mergeTagGroup"],function(e){var t=Marionette.CollectionView.extend({tagName:"ul",childView:e,initialize:function(){this.listenTo(i.channel("merge-tags"),"open",this.render,this)},filter:function(e,t,n){return 0<e.get("tags").length}});return t}),n("views/app/drawer/mergeTagFilter",[],function(){var e=Marionette.ItemView.extend({template:"#tmpl-nf-merge-tag-box-filter",events:{"keyup input":"updateFilter"},updateFilter:function(e){if(13==e.keyCode){var t=jQuery("#merge-tags-box .merge-tag-list ul li span").first().data("tag");return i.channel("mergeTags").request("insert:tag",t),jQuery("#merge-tags-box").css("display","none"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}var n=this.$el.find("input").val();i.channel("merge-tags").request("filtersearch",n)}});return e}),n("views/app/drawer/mergeTagBox",[],function(){var e=Marionette.LayoutView.extend({el:"#merge-tags-box",template:"#tmpl-nf-merge-tag-box",regions:{filter:".merge-tag-filter",sections:".merge-tag-sections",tags:".merge-tag-list"}});return e}),n("controllers/app/mergeTagBox",["models/app/mergeTagModel","models/app/mergeTagLookupCollection","views/app/drawer/mergeTag","views/app/drawer/mergeTagList","views/app/drawer/mergeTagGroup","views/app/drawer/mergeTagGroupList","views/app/drawer/mergeTagFilter","views/app/drawer/mergeTagBox"],function(e,t,n,r,a,s,o,l){var c=Marionette.Object.extend({caret:0,old:"",initialize:function(){this.listenTo(i.channel(" app"),"after:appStart",this.afterAppStart),this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting),this.listenTo(i.channel("drawer"),"before:close",this.beforeDrawerClose),this.listenTo(i.channel("drawer"),"opened",function(){jQuery(".merge-tags").on("click",this.mergeTagsButtonClick)});var e=this;i.channel("mergeTags").reply("set:caret",function(t){e.caret=t}),i.channel("mergeTags").reply("get:caret",function(){4 return e.caret});var e=this;i.channel("mergeTags").reply("set:old",function(t){e.old=t}),i.channel("mergeTags").reply("get:old",function(){return e.old}),i.channel("mergeTags").reply("insert:tag",this.insertTag.bind(this)),this.listenTo(i.channel("option-repeater"),"add:option",function(t){var n="#"+t.cid+" .has-merge-tags input.setting";jQuery(n).on("focus",function(t){e.focusCallback(t,n,"option-repeater")}),jQuery(n).on("keyup",function(t){e.keyupCallback(t,n,"option-repeater")}),jQuery(n).siblings(".merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("setting-calculations-option"),"render:setting",this.renderSetting),this.listenTo(i.channel("setting-calculations-option"),"render:setting",function(e,t,n){n.$el.find(".merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("summernote"),"focus",function(t,n){e.focusCallback(!1,n,"rte")}),this.listenTo(i.channel("summernote"),"keydown",function(e,t){jQuery(t).closest(".nf-setting").find(".setting").summernote("saveRange")}),this.listenTo(i.channel("summernote"),"keyup",function(t,n){e.keyupCallback(t,n,"rte")}),jQuery(document).on("keyup",function(e){27==e.keyCode&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").blur(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))})},afterAppStart:function(){var e=i.channel("mergeTags").request("get:collection"),n=[];e.each(function(e){e.get("tags").each(function(t){n.push({label:t.get("label"),tag:t.get("tag"),section:e.get("id")})})});var a=new l;a.render();var c=new t(n),d=new r({collection:c}),h=new s({collection:e});a.getRegion("tags").show(d),a.getRegion("sections").show(h),a.getRegion("filter").show(new o);var u=this;this.listenTo(i.channel("mergeTags"),"open",function(){u.afterAppStart()})},beforeRenderSetting:function(e,t){if("undefined"!=typeof e.get("use_merge_tags")&&e.get("use_merge_tags")){var n=e.get("name");this.listenTo(i.channel("setting-"+n),"render:setting",this.renderSetting)}},renderSetting:function(e,t,n){n.$el.find(".merge-tags").on("click",this.mergeTagsButtonClick),0==jQuery("#merge-tags-box").length&&this.afterAppStart(),jQuery("#nf-drawer").on("scroll",function(){if(0!=jQuery(".merge-tag-focus").length){var e=jQuery(".merge-tag-focus").closest(".nf-setting").find(".note-editor");if(0!=e.length)var t=e.offset().top-jQuery(window).scrollTop(),n=e.outerHeight();else var t=jQuery(".merge-tag-focus").offset().top-jQuery(window).scrollTop(),n=jQuery(".merge-tag-focus").outerHeight();jQuery("#merge-tags-box").css("top",t+n);var i=jQuery("#merge-tags-box").outerHeight();jQuery("#nf-drawer").css("padding-bottom",i+"px");var r=jQuery(".merge-tag-focus").closest(".nf-list-options-tbody");if(0!=r.length){var a=r.offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",a)}else{var s=jQuery(".merge-tag-focus").closest(".nf-settings").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",s),jQuery("#merge-tags-box").css("width",jQuery(".merge-tag-focus").closest(".nf-settings").width())}}}),jQuery(n.el).find(".setting").on("focus",this.focusCallback),jQuery(n.el).find(".setting").on("keyup",this.keyupCallback)},beforeDrawerClose:function(){jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),i.channel("mergeTags").trigger("open")},insertTag:function(e){var t=jQuery(".merge-tag-focus");if(0!=t.closest(".nf-setting").first().find(".note-editable").length&&(t=t.closest(".nf-setting").first().find(".note-editable")),1<t.length&&(t=t.first()),t.hasClass("note-editable"))var n=t.closest(".nf-setting").find(".setting").summernote("code");else var n=t.val();for(var r=i.channel("mergeTags").request("get:old"),a=e,s=i.channel("mergeTags").request("get:caret"),o=/{([a-z0-9]|:|_|})*/g;match=o.exec(n);)if(r==match[0]){var l=n.slice(0,match.index)+a+n.slice(o.lastIndex);if(t.hasClass("note-editable")){t.closest(".nf-setting").find(".setting").summernote("code",l);var c=t,d=null;_.each(c[0].childNodes,function(e,t){if(!d&&(e.nodeValue||e.innerHTML)){if(e.nodeValue)var n=e.nodeValue.indexOf(a)+r.length;else if(e.innerHTML)var n=e.innerHTML.indexOf(a)+r.length;s==n&&(d=c[0].childNodes[t])}}),d||(d=c[0].childNodes[0]);var h=s-r.length+a.length,u=document.createRange(),g=window.getSelection();if(0!=d.childNodes.length)try{u.setStart(d.childNodes[0],h)}catch(e){console.log("error")}else try{u.setStart(d,h)}catch(e){console.log("error")}u.collapse(!0),g.removeAllRanges(),g.addRange(u)}else t.val(l),t.change(),t.caret(s-r.length+a.length)}jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),t.removeClass("merge-tag-focus"),t.closest(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")},mergeTagsButtonClick:function(e){var t=jQuery(this);if(t.siblings().hasClass("merge-tag-focus"))return i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay");var n=t.siblings(".setting").first();if(0!==t.closest(".nf-setting, .nf-table-row").find(".note-tools").length)t.closest(".nf-setting").find(".setting").summernote("insertText","{");else{var r=n.val()||"";n.val(r+"{").change(),i.channel("mergeTags").request("set:caret",r.length+1)}t.parent().hasClass("note-tools"),i.channel("mergeTags").request("set:old","{"),n.addClass("merge-tag-focus");var a=t.attr("autocomplete");t.attr("autocomplete","off"),t.data("autocomplete",a);var s=t.closest(".nf-setting, .nf-table-row");0!=s.find(".note-editor").length?s.find(".note-editor").addClass("merge-tag-focus-overlay"):s.addClass("merge-tag-focus-overlay"),jQuery("#merge-tags-box").css("display","block"),i.channel("drawer").request("prevent:close"),jQuery(".merge-tag-focus-overlay").on("click",function(e){jQuery(e.target).hasClass("note-editor")&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))}),setTimeout(function(){jQuery("#merge-tags-box").find(".merge-tag-filter").find("input").focus()},500)},focusCallback:function(e,t,n){var n=n||"setting",i="undefined"==typeof t?jQuery(this):jQuery(t);if(jQuery(".merge-tag-focus").each(function(e,t){this!=t&&t.removeClass("merge-tag-focus")}),"rte"==n)var r=i.closest(".nf-setting").find(".note-editor").offset().top-jQuery(window).scrollTop(),a=i.closest(".nf-setting").find(".note-editor").outerHeight();else var r=i.offset().top-jQuery(window).scrollTop(),a=i.outerHeight();jQuery("#merge-tags-box").css("top",r+a);var s=i.closest(".nf-list-options-tbody");if(0!=s.length){var o=s.offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",o)}else if("rte"==n){var l=i.closest(".nf-setting").find(".note-editor").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",l),jQuery("#merge-tags-box").css("width",i.closest(".nf-setting").find(".note-editor").width())}else{var l=jQuery(this).closest(".nf-settings").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",l),jQuery("#merge-tags-box").css("width",i.closest(".nf-settings").width())}var c=jQuery(this).data("id")},keyupCallback:function(e,t,n){var n=n||"setting";if(13==e.keyCode){var r=jQuery("#merge-tags-box .merge-tag-list ul li span").first().data("tag");return i.channel("mergeTags").request("insert:tag",r),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}if("undefined"!=typeof t)var a=jQuery(t);else var a=jQuery(this);var s=jQuery(this).data("id");if(!s||"eq"==s){if("rte"==n){var o=a.summernote("createRange");if(o)var l=o.so;else var l=0;a.closest(".nf-setting").find(".setting").summernote("saveRange")}else var l=a.caret();if(i.channel("mergeTags").request("set:caret",l),"rte"==n)var c=a.summernote("code").match(new RegExp(/{([a-z0-9]|:|_|})*/g));else var c=a.val().match(new RegExp(/{([a-z0-9]|:|_|})*/g));if(c=_.filter(c,function(e){return-1==e.indexOf("}")}),0!==c.length){i.channel("mergeTags").request("set:old",c[0]),jQuery("#merge-tags-box").css("display","block"),i.channel("drawer").request("prevent:close"),a.addClass("merge-tag-focus");var d=jQuery("#merge-tags-box").outerHeight();jQuery("#nf-drawer").css("padding-bottom",d+"px");var h=a.attr("autocomplete");a.attr("autocomplete","off"),a.data("autocomplete",h);var u=a.closest(".nf-setting, .nf-table-row");0!=u.find(".note-editor").length?u.find(".note-editor").addClass("merge-tag-focus-overlay"):u.addClass("merge-tag-focus-overlay"),u.on("click",function(e){var t=jQuery(e.target).attr("class")||[];-1!==t.indexOf("merge-tag-focus-overlay")&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))});var g=c[0].replace("{","");i.channel("merge-tags").request("filtersearch",g)}else jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}}});return c}),n("controllers/app/itemSettingFill",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t){"fields"==e.get("fill")}});return e}),n("controllers/app/confirmPublish",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:confirmPublish",this.confirmPublish)},confirmPublish:function(){var e=i.channel("app").request("get:formModel");1==e.get("settings").get("add_submit")&&i.channel("fields").request("add",{type:"submit",label:"Submit",order:9999}),e.set("show_publish_options",!1),i.channel("app").request("update:db","publish")}});return e}),n("controllers/app/rte",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-rte").reply("renderOnChange",function(){return!1}),this.listenTo(i.channel("rte"),"init:settingModel",this.initSettingModel),this.listenTo(i.channel("setting-type-rte"),"render:setting",this.renderSetting),this.listenTo(i.channel("setting-type-rte"),"destroy:setting",this.destroySetting),this.listenTo(i.channel("setting-type-rte"),"click:extra",this.clickExtra),this.meta_image_frame,jQuery.summernote.options.icons={align:"dashicons dashicons-editor-alignleft",alignCenter:"dashicons dashicons-editor-aligncenter",alignJustify:"dashicons dashicons-editor-justify",alignLeft:"dashicons dashicons-editor-alignleft",alignRight:"dashicons dashicons-editor-alignright",indent:"dashicons dashicons-editor-indent",outdent:"dashicons dashicons-editor-outdent",bold:"dashicons dashicons-editor-bold",caret:"dashicons dashicons-arrow-down",close:"dashicons dashicons-dismiss",code:"dashicons dashicons-editor-code",eraser:"dashicons dashicons-editor-removeformatting",italic:"dashicons dashicons-editor-italic",link:"dashicons dashicons-admin-links",unlink:"dashicons dashicons-editor-unlink",magic:"dashicons dashicons-editor-paragraph",minus:"dashicons dashicons-minus",orderedlist:"dashicons dashicons-editor-ol",redo:"dashicons dashicons-redo",square:"dashicons fa-square",table:"dashicons dashicons-editor-table",underline:"dashicons dashicons-editor-underline",undo:"dashicons dashicons-undo",unorderedlist:"dashicons dashicons-editor-ul"},this.currentContext={}},initSettingModel:function(e){e.set("hide_merge_tags",!0)},initRTE:function(e,t,n){var r=this,a=function(e){return r.linkButton(e)},s=function(e){return r.mediaButton(e)},o=this.mergeTags(),l=[["paragraphStyle",["style"]],["fontStyle",["bold","italic","underline","clear"]],["lists",["ul","ol"]],["paragraph",["paragraph"]],["customGroup",["linkButton","unlink"]],["table",["table"]],["actions",["undo","redo"]],["tools",["mediaButton","mergeTags","codeview"]]];jQuery(n.el).find("div.setting").summernote({toolbar:l,buttons:{linkButton:a,mergeTags:o,mediaButton:s},height:150,codemirror:{theme:"monokai",lineNumbers:!0,callbacks:{onBlur:function(n){var i=n.getValue();r.updateDataModel(e,t,i)}}},prettifyHtml:!0,callbacks:{onBlur:function(n,a){var s=jQuery(this).summernote("code");r.updateDataModel(e,t,s),i.channel("summernote").trigger("blur",e,t,s)},onFocus:function(e,t){i.channel("summernote").trigger("focus",e,this,t)},onKeydown:function(e,t){i.channel("summernote").trigger("keydown",e,this,t)},onKeyup:function(e,t){i.channel("summernote").trigger("keyup",e,this,t)}}})},updateDataModel:function(e,t,n){var r=e.get("name"),a=t.get(r),s=n,o={attr:r,before:a,after:s},l={object:t.get("objectType"),label:t.get("label"),change:"Changed "+e.get("label")+" from "+a+" to "+s};i.channel("changes").request("register:change","changeSetting",t,o,l),t.set(e.get("name"),s)},renderSetting:function(e,t,n){this.initRTE(e,t,n);var i=jQuery(n.el).find(".link-button").next(".dropdown-menu").find("button");i.replaceWith(function(){return jQuery("<div/>",{class:jQuery(i).attr("class"),html:this.innerHTML})})},destroySetting:function(e,t,n){this.removeRTE(e,t,n)},removeRTE:function(e,t,n){jQuery(n.el).find("div.setting").summernote("destroy")},drawerOpened:function(e,t,n){this.initRTE(e,t,n)},linkButton:function(e){var t=this,n=jQuery.summernote.ui,r=i.channel("app").request("get:template","#tmpl-nf-rte-link-button"),a=i.channel("app").request("get:template","#tmpl-nf-rte-link-dropdown");return n.buttonGroup([n.button({className:"dropdown-toggle link-button",contents:r({}),tooltip:"Insert Link",click:function(n){t.clickLinkButton(n,e)},data:{toggle:"dropdown"}}),n.dropdown([n.buttonGroup({children:[n.button({contents:a({}),tooltip:""})]})])]).render()},mergeTags:function(e){var t=jQuery.summernote.ui,n=i.channel("app").request("get:template","#tmpl-nf-rte-merge-tags-button");return t.button({className:"dropdown-toggle merge-tags",contents:n({}),tooltip:"Merge Tags"}).render()},mediaButton:function(e){var t=this,n=jQuery.summernote.ui,r=i.channel("app").request("get:template","#tmpl-nf-rte-media-button");return n.button({className:"dropdown-toggle",contents:r({}),tooltip:"Insert Media",click:function(n){t.openMediaManager(n,e)}}).render()},openMediaManager:function(e,t){if(t.invoke("editor.createRange"),t.invoke("editor.saveRange"),this.currentContext=t,this.meta_image_frame)return void this.meta_image_frame.open();this.meta_image_frame=wp.media.frames.meta_image_frame=wp.media({title:"Select a file",button:{text:"insert"}});var n=this;this.meta_image_frame.on("select",function(){var e=n.meta_image_frame.state().get("selection").first().toJSON();n.insertMedia(e,t)}),this.meta_image_frame.open()},clickLinkButton:function(e,t){var n=t.invoke("editor.createRange");t.invoke("editor.saveRange");var i=n.toString();this.currentContext=t,jQuery(e.target).closest(".note-customGroup > .note-btn-group").on("hide.bs.dropdown",function(e){return!1}),jQuery(e.target).closest(".note-customGroup > .note-btn-group").on("shown.bs.dropdown",function(e){jQuery(e.target).parent().parent().find(".link-text").val(i),jQuery(e.target).parent().parent().find(".link-url").focus()})},clickExtra:function(e,t,n,i){var r=jQuery(e.target).parent().find(".link-text"),a=jQuery(e.target).parent().find(".link-url"),s=jQuery(e.target).parent().find(".link-new-window");if(this.currentContext.invoke("editor.restoreRange"),jQuery(e.target).hasClass("insert-link")){var o=r.val(),l=a.val(),c=!!s.prop("checked");0!=o.length&&0!=l.length&&this.currentContext.invoke("editor.createLink",{text:o,url:l,isNewWindow:c})}r.val(""),a.val(""),s.prop("checked",!1),jQuery(e.target).closest("div.note-btn-group.open").removeClass("open")},insertMedia:function(e,t){this.currentContext.invoke("editor.restoreRange"),"image"==e.type?this.currentContext.invoke("editor.insertImage",e.url):this.currentContext.invoke("editor.createLink",{text:e.filename,url:e.url})}});return e}),n("controllers/app/settingFieldSelect",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("field-select"),"init:settingModel",this.trackKeyChanges),this.listenTo(i.channel("setting-type-field-select"),"before:renderSetting",this.beforeRender),this.listenTo(i.channel("field-select"),"init:settingModel",function(){this.listenTo(i.channel("app"),"change:setting",this.maybeSwitchToFieldsDomain)}),this.listenTo(i.channel("app"),"change:currentDomain",this.autoOpenDrawer),this.listenTo(i.channel("drawer"),"opened",this.filterDrawerContents),this.listenTo(i.channel("drawer"),"closed",this.SwitchToFieldsDomain)},trackKeyChanges:function(e){e.listenTo(i.channel("app"),"update:fieldKey",e.updateKey),this.listenTo(i.channel("app"),"replace:fieldKey",this.updateFieldMap)},updateFieldMap:function(e,t,n){var i=t._previousAttributes.key,r=t.get("key");"field-select"==n.get("type")&&e.get(n.get("name"))==i&&e.set(n.get("name"),r)},beforeRender:function(e,t){var n=i.channel("fields").request("get:collection"),r=e.get("field_types"),a=[{label:"--",value:0}];_.each(n.models,function(n){if(t.cid!=n.cid&&("undefined"==typeof r||0==r.length||_.contains(r,n.get("type")))){var i=e.get("field_filter");if(i&&"undefined"!=typeof i[n.get("type")]){var s=!1;if(_.each(i[n.get("type")],function(e,t){console.log(e+":"+n.get(t)),e!=n.get(t)&&(s=!0)}),s)return}var o=n.get("key");switch(e.get("field_value_format")){case"key":o=n.get("key");break;case"merge_tag":default:o="{field:"+n.get("key")+"}"}a.push({label:n.get("label"),value:o})}}),"undefined"!=typeof r&&0!=r.length&&_.each(r,function(e){var t=i.channel("fields").request("get:type",e);a.push({label:"-- Add "+t.get("nicename")+" Field",value:"addField:"+e})}),e.set("options",a)},maybeSwitchToFieldsDomain:function(e,t,n){if("field-select"==t.get("type")){var r=t.get("name"),a=n.get(r);if(a){var s=a.split(":");"addField"==s[0]&&(this.openDrawer="addField",this.filterDrawer=s[1],n.set(r,""),this.switchDomain=!0,i.channel("app").request("close:drawer"))}}},SwitchToFieldsDomain:function(){if(this.switchDomain){var e=i.channel("app").request("get:domainModel","fields");i.channel("app").request("change:currentDomain",null,e),this.switchDomain=null}},autoOpenDrawer:function(){this.openDrawer&&(i.channel("app").request("open:drawer",this.openDrawer),this.openDrawer=null)},filterDrawerContents:function(){this.filterDrawer&&(i.channel("drawer-addField").trigger("change:filter",this.filterDrawer),this.filterDrawer=null)}});return e}),n("controllers/app/settingFieldList",["views/app/drawer/typeSettingFieldset","models/app/settingCollection"],function(e,t){return Marionette.Object.extend({fieldListSettings:[],initialize:function(){this.listenTo(i.channel("field-list"),"init:settingModel",this.registerFieldListSettings),this.listenTo(i.channel("fields"),"update:setting",this.updateFieldListSettingKeys),i.channel("field-list").reply("get:settingChildView",this.getSettingChildView,this)},registerFieldListSettings:function(e){this.fieldListSettings.push(e.get("name"))},updateFieldListSettingKeys:function(e){if("undefined"!=typeof e.changed.key){var t=e._previousAttributes.key,n=e.changed.key,i=this;_.each(Backbone.Radio.channel("actions").request("get:collection").models,function(e){_.each(e.attributes,function(r,a){var s="";_.each(i.fieldListSettings,function(i){if(a==i+"-"+t&&s!=t){var r=e.get(i+"-"+t);e.set(i+"-"+n,r),e.set(i+"-"+t,0),s=t}})})})}},getSettingChildView:function(n){var r=_.filter(i.channel("fields").request("get:collection").models,function(e){return _.contains(n.get("field_types"),e.get("type"))}),a=_.map(r,function(e){return{name:n.get("name")+"-"+e.get("key"),type:"toggle",label:e.get("label"),width:"full"}});return n.set("settings",new t(a)),e}})}),n("controllers/app/settingHTML",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-html"),"before:renderSetting",this.init)},init:function(e,t){"undefined"!=e.get("mirror")&&t.on("change:"+e.get("mirror"),this.update,e)},update:function(e,t){e.set(this.get("name"),t)}});return e}),n("controllers/app/settingColor",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-color").reply("renderOnChange",this.setRenderFalse),this.listenTo(i.channel("setting-type-color"),"destroy:setting",this.closeColorPickers),this.listenTo(i.channel("setting-type-color"),"render:setting",this.initColorPicker)},initColorPicker:function(e,t,n){var r=(e.get("name"),jQuery(n.el).find("input"));jQuery(r).wpColorPicker({change:function(n,r){i.channel("app").request("change:setting",n,e,t,r.color.toString())}})},setRenderFalse:function(){return!1},closeColorPickers:function(e,t,n){jQuery(n.el).find(".wp-color-picker").wpColorPicker("close")}});return e}),n("controllers/app/changeMenu",[],function(){var e=Marionette.Object.extend({editFormText:"",initialize:function(){this.editFormText=nfAdmin.editFormText||"Edit Form",this.listenTo(i.channel("app"),"after:appStart",this.changeMenu),this.listenTo(i.channel("app"),"response:updateDB",this.formPublish)},changeMenu:function(){var e=i.channel("app").request("get:formModel");this.isNewForm(e.id)?this.highlightAddNew():this.appendEditForm()},isNewForm:function(e){return isNaN(e)},highlightAddNew:function(){jQuery(".wp-submenu li").removeClass("current"),jQuery('a[href="admin.php?page=ninja-forms&form_id=new"]').parent().addClass("current")},appendEditForm:function(){var e='<li class="current"><a href="#">'+this.editFormText+"</a></li>";0==jQuery('li a:contains("'+this.editFormText+'")').length&&(jQuery(".wp-submenu li").removeClass("current"),jQuery('a[href="admin.php?page=ninja-forms&form_id=new"]').parent().after(e))},formPublish:function(e){return"publish"===e.action&&void this.changeMenu()}});return e}),n("controllers/app/mobile",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:menu",this.closeMobileMenu)},closeMobileMenu:function(){var e=i.channel("app").request("get:builderEl");jQuery(e).removeClass("nf-menu-expand")}});return e}),n("controllers/app/notices",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("notices").reply("add",this.addNotice,this),i.channel("notices").reply("close",this.closeNotice,this),this.notices={}},addNotice:function(e,t,n){var r={content:t,color:"green",zIndex:12e3,constructOnInit:!0,stack:!0,animation:{open:"flip",close:"flip"}},a={position:{x:"center",y:"top"},animation:{open:"slide:top",close:"slide:left"},autoClose:2e3,offset:{x:0,y:55}},s={attributes:{x:"left",y:"bottom"},autoClose:4e3};if(i.channel("app").request("is:mobile"))var o=a;else var o=s;o=jQuery.extend(o,r);var n=jQuery.extend(o,n);this.notices[e]=new jBox("Notice",n)},closeNotice:function(e){"undefined"!=typeof this.notices[e]&&this.notices[e].close()},openNotice:function(e){"undefined"!=typeof this.notices[e]&&this.notices[e].open()}});return e}),n("controllers/app/unloadCheck",[],function(){var e=Marionette.Object.extend({initialize:function(){jQuery(window).bind("beforeunload",this.maybePrompt)},maybePrompt:function(e){if(!i.channel("app").request("get:setting","clean"))return"You have unsaved changes."}});return e}),n("controllers/app/formContentFilters",[],function(){var e=Marionette.Object.extend({initialize:function(){this.viewFilters=[],this.saveFilters=[],this.loadFilters=[],i.channel("formContent").reply("add:viewFilter",this.addViewFilter,this),i.channel("formContent").reply("add:saveFilter",this.addSaveFilter,this),i.channel("formContent").reply("add:loadFilter",this.addLoadFilter,this),i.channel("formContent").reply("get:viewFilters",this.getViewFilters,this),i.channel("formContent").reply("get:saveFilters",this.getSaveFilters,this),i.channel("formContent").reply("get:loadFilters",this.getLoadFilters,this),i.channel("fieldContents").reply("add:viewFilter",this.addViewFilter,this),i.channel("fieldContents").reply("add:saveFilter",this.addSaveFilter,this),i.channel("fieldContents").reply("add:loadFilter",this.addLoadFilter,this),i.channel("fieldContents").reply("get:viewFilters",this.getViewFilters,this),i.channel("fieldContents").reply("get:saveFilters",this.getSaveFilters,this),i.channel("fieldContents").reply("get:loadFilters",this.getLoadFilters,this)},addViewFilter:function(e,t){this.viewFilters[t]=e},getViewFilters:function(){return this.viewFilters},addSaveFilter:function(e,t){this.saveFilters[t]=e},getSaveFilters:function(){return this.saveFilters},addLoadFilter:function(e,t){this.loadFilters[t]=e},getLoadFilters:function(){return this.loadFilters}});return e}),n("controllers/app/formContentGutterFilters",[],function(){var e=Marionette.Object.extend({initialize:function(){this.leftFilters=[],this.rightFilters=[],i.channel("formContentGutters").reply("add:leftFilter",this.addLeftFilter,this),i.channel("formContentGutters").reply("add:rightFilter",this.addRightFilter,this),i.channel("formContentGutters").reply("get:leftFilters",this.getLeftFilters,this),i.channel("formContentGutters").reply("get:rightFilters",this.getRightFilters,this)},addLeftFilter:function(e,t){this.leftFilters[t]=e},addRightFilter:function(e,t){this.rightFilters[t]=e},getLeftFilters:function(){return this.leftFilters},getRightFilters:function(){return this.rightFilters}});return e}),n("controllers/app/cloneCollectionDeep",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("clone:collectionDeep",this.cloneCollectionDeep,this)},cloneCollectionDeep:function(e){var t=[];return _.each(e.models,function(e){var n=i.channel("app").request("clone:modelDeep",e);t.push(n)}),new e.constructor(t,e.options)}});return e}),n("controllers/app/trackKeyDown",[],function(){var e=Marionette.Object.extend({keys:[],initialize:function(){var e=this;jQuery(document).on("keydown",function(t){e.keyDown(t,e)}),jQuery(document).on("keyup",function(t){e.keyUp(t,e)}),i.channel("app").reply("get:keydown",this.getKeyDown,this)},keyDown:function(e,t){t.keys[e.keyCode]=e.keyCode},keyUp:function(e,t){-1!=t.keys.indexOf(e.keyCode)&&delete t.keys[e.keyCode]},getKeyDown:function(){return this.keys}});return e}),n("controllers/app/perfectScroll",[],function(){var e=Marionette.Object.extend({movedPos:!1,initialize:function(){this.listenTo(i.channel("main"),"show:main",this.initPerfectScroll),this.listenTo(i.channel("drawer"),"opened",this.moveRail),this.listenTo(i.channel("drawer"),"before:closeDrawer",this.resetRail)},initPerfectScroll:function(e){i.channel("app").request("is:mobile")||jQuery(e.el).parent().perfectScrollbar({suppressScrollX:!0}),jQuery("head").append('<style id="ps-scrollbar-css" type="text/css"></style>')},moveRail:function(){var e=i.channel("app").request("get:drawerEl"),t=jQuery(e).outerWidth();jQuery("#ps-scrollbar-css").text(".ps-scrollbar-moved { right: "+t+"px !important; } "),jQuery("#nf-main .ps-scrollbar-y-rail").addClass("ps-scrollbar-moved ")},resetRail:function(){jQuery(".ps-scrollbar-y-rail").removeClass("ps-scrollbar-moved ")}});return e}),n("models/app/settingGroupModel",["models/app/settingCollection"],function(e){var t=Backbone.Model.extend({defaults:{display:!1},initialize:function(t){0==this.get("settings")instanceof Backbone.Collection&&this.set("settings",new e(this.get("settings")))}});return t}),n("models/app/settingGroupCollection",["models/app/settingGroupModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/app/getNewSettingGroupCollection",["models/app/settingGroupCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){i.channel("app").reply("get:settingGroupCollectionDefinition",this.getNewSettingGroupCollection,this)},getNewSettingGroupCollection:function(){return e}});return t}),n("controllers/app/settingMedia",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-media"),"click:extra",this.clickExtra)},clickExtra:function(e,t,n,i){var r=jQuery(e.target).parent().find(".setting");if(jQuery(e.target).hasClass("open-media-manager")){if(this.meta_image_frame)return void this.meta_image_frame.open();this.meta_image_frame=wp.media.frames.meta_image_frame=wp.media({title:"Select a file",button:{text:"insert"}});var a=this;this.meta_image_frame.on("select",function(){var e=a.meta_image_frame.state().get("selection").first().toJSON();r.val(e.url).change()}),this.meta_image_frame.open()}}});return e}),n("models/app/typeModel",["models/app/settingGroupCollection"],function(e){var t=Backbone.Model.extend({initialize:function(){!1==this.get("settingGroups")instanceof Backbone.Collection&&this.set("settingGroups",new e(this.get("settingGroups"))),i.channel("fields").trigger("init:typeModel",this)}});return t}),n("models/app/typeCollection",["models/app/typeModel"],function(e){var t=Backbone.Collection.extend({model:e,type:!1,initialize:function(e,t){_.each(t,function(e,t){this[t]=e},this)}});return t}),n("models/fields/typeSectionModel",[],function(){var e=Backbone.Model.extend({defaults:{classes:""}});return e}),n("models/fields/typeSectionCollection",["models/fields/typeSectionModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/fields/types",["models/app/typeCollection","models/fields/typeSectionCollection"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.sections=new t(fieldTypeSections),this.listenTo(i.channel("fields"),"init:typeModel",this.registerSection),this.collection=new e(fieldTypeData,{type:"fields"}),i.channel("fields").reply("get:type",this.getFieldType,this),i.channel("fields").reply("get:typeCollection",this.getTypeCollection,this),i.channel("fields").reply("get:typeSections",this.getTypeSections,this),i.channel("fields").reply("get:savedFields",this.getSavedFields,this),this.listenTo(i.channel("drawer"),"click:fieldType",this.addField)},registerSection:function(e){"fields"==e.collection.type&&e.get("section")&&this.sections.get(e.get("section")).get("fieldTypes").push(e.get("id"))},getFieldType:function(e){return this.collection.get(e)},getTypeCollection:function(e){return this.collection},addField:function(e){var t=jQuery(e.target).data("id");if(e.shiftKey)return void i.channel("fields").request("add:stagedField",t);var n=i.channel("fields").request("add",{type:t,label:i.channel("fields").request("get:type",t).get("nicename")}),r={object:"Field",label:n.get("label"),change:"Added",dashicon:"plus-alt"},a={collection:i.channel("fields").request("get:collection")};i.channel("changes").request("register:change","addObject",n,null,r,a),i.channel("fields").request("redraw:collection")},getTypeSections:function(){return this.sections},getSavedFields:function(){this.sections.get("saved")}});return n}),n("controllers/fields/fieldTypeDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:type",this.startDrag),this.listenTo(i.channel("drawer-addField"),"stopDrag:type",this.stopDrag),i.channel("drawer-addField").reply("get:typeHelperClone",this.getCurrentDraggableHelperClone,this)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"), 5 this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important"),this.draggableHelperClone=jQuery(t.helper).clone()},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")},getCurrentDraggableHelperClone:function(){return this.draggableHelperClone}});return e}),n("controllers/fields/stagingDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:fieldStaging",this.startDrag),this.listenTo(i.channel("drawer-addField"),"stopDrag:fieldStaging",this.stopDrag)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important");var n=i.channel("fields").request("get:staging"),r=i.channel("app").request("get:template","#tmpl-nf-staged-fields-drag");jQuery(t.helper).html(r({num:n.models.length})),jQuery(t.helper).prop("id","nf-staged-fields-drag"),jQuery(t.item).css("opacity","0.7")},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")}});return e}),n("controllers/fields/staging",["models/fields/stagingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e,i.channel("fields").reply("add:stagedField",this.addStagedField,this),i.channel("fields").reply("remove:stagedField",this.removeStagedField,this),i.channel("fields").reply("get:staging",this.getStagingCollection,this),i.channel("fields").reply("sort:staging",this.sortStagedFields,this),i.channel("fields").reply("clear:staging",this.clearStagedFields,this),this.listenTo(i.channel("drawer-addField"),"click:removeStagedField",this.removeStagedField),this.listenTo(i.channel("drawer-addField"),"before:closeDrawer",this.beforeCloseDrawer)},getStagingCollection:function(){return this.collection},addStagedField:function(e,t){var t=t||!1,n=i.channel("fields").request("get:type",e),r="nf-staged-field-"+jQuery.now(),a={id:r,slug:n.get("type"),nicename:n.get("nicename"),icon:n.get("icon")},s=this.collection.add(a);return t||i.channel("fields").trigger("add:stagedField",s),r},removeStagedField:function(e,t){this.collection.remove(t),i.channel("fields").trigger("remove:stagedField",t)},beforeCloseDrawer:function(){if(0!=this.collection.models.length){var e=i.channel("fields").request("get:collection");_.each(this.collection.models,function(t){var n=i.channel("fields").request("get:tmpID"),r={id:n,label:t.get("nicename"),type:t.get("slug")},a=i.channel("fields").request("add",r,!1),s={object:"Field",label:a.get("label"),change:"Added",dashicon:"plus-alt"},o={collection:e};i.channel("changes").request("register:change","addObject",a,null,s,o)}),e.trigger("reset",e),this.collection.reset()}i.channel("fields").request("sort:fields",null,null,!1)},sortStagedFields:function(){var e=i.channel("app").request("get:stagedFieldsEl"),t=jQuery(e).sortable("toArray");_.each(this.collection.models,function(e){var n=e.get("id"),i=t.indexOf(n);e.set("order",i)}),this.collection.sort()},clearStagedFields:function(){this.collection.reset()}});return t}),n("controllers/fields/stagingSortable",["models/fields/stagingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"receive:stagedFields",this.receiveStagedFields),this.listenTo(i.channel("drawer-addField"),"over:stagedFields",this.overStagedFields),this.listenTo(i.channel("drawer-addField"),"out:stagedFields",this.outStagedFields),this.listenTo(i.channel("drawer-addField"),"start:stagedFields",this.startStagedFields),this.listenTo(i.channel("drawer-addField"),"stop:stagedFields",this.stopStagedFields)},receiveStagedFields:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.item).data("id"),n=i.channel("fields").request("add:stagedField",t);jQuery(e.helper).prop("id",n),i.channel("fields").request("sort:staging"),jQuery(e.helper).remove(),i.channel("drawer-addField").trigger("drop:fieldType",t)}},addActiveClass:function(){var e=i.channel("app").request("get:stagedFieldsEl");jQuery(e).addClass("nf-droppable-active")},removeActiveClass:function(){var e=i.channel("app").request("get:stagedFieldsEl");jQuery(e).removeClass("nf-droppable-active")},overStagedFields:function(e,t){if(jQuery(t.item).hasClass("nf-field-type-draggable")){var n=jQuery(t.item).data("id"),r=i.channel("fields").request("get:type",n),a=r.get("nicename");this.currentHelper=t.helper,jQuery(t.helper).html(a+'<span class="dashicons dashicons-dismiss"></span>'),jQuery(t.helper).removeClass("nf-field-type-button").addClass("nf-item-dock").css({opacity:"0.8",width:"",height:""});var s=i.channel("app").request("get:stagedFieldsEl");jQuery(s).hasClass("ui-sortable")&&jQuery(s).addClass("nf-droppable-hover")}},outStagedFields:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=i.channel("drawer-addField").request("get:typeHelperClone");jQuery(this.currentHelper).html(jQuery(t).html()),jQuery(this.currentHelper).removeClass("nf-item-dock").addClass("nf-field-type-button");var n=i.channel("app").request("get:stagedFieldsEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}},startStagedFields:function(e){jQuery(e.item).show(),jQuery(e.item).css({display:"inline",opacity:"0.7"}),jQuery(e.helper).css("opacity","0.5")},stopStagedFields:function(e){jQuery(e.item).css("opacity",""),jQuery(e.helper).remove()}});return t}),n("controllers/fields/filterTypes",["models/fields/typeSectionCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"change:filter",this.filterFieldTypes)},filterFieldTypes:function(t,n){if(""!=jQuery.trim(t)){var r=[];_.each(this.filterCollection(t),function(e){r.push(e.get("id"))});var a=new e([{id:"filtered",nicename:"Filtered Fields",fieldTypes:r}]);i.channel("drawer").trigger("filter:fieldTypes",a),"undefined"!=typeof n&&n.addObject&&0<r.length&&(i.channel("fields").request("add:stagedField",r[0]),i.channel("drawer").request("clear:filter"))}else i.channel("drawer").trigger("clear:filter")},filterCollection:function(e){e=e.toLowerCase();var t=i.channel("fields").request("get:typeCollection"),n=t.filter(function(t){var n=!1;return t.get("type").toLowerCase().indexOf(e)!=-1?n=!0:t.get("nicename").toLowerCase().indexOf(e)!=-1&&(n=!0),t.get("tags")&&0==e.indexOf("#")&&_.each(t.get("tags"),function(t){e.replace("#","").length>1&&t.toLowerCase().indexOf(e.replace("#",""))!=-1&&(n=!0)}),t.get("alias")&&_.each(t.get("alias"),function(t){t.toLowerCase().indexOf(e)!=-1&&(n=!0)}),n});return n}});return t}),n("controllers/fields/sortable",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:type",this.addActiveClass),this.listenTo(i.channel("drawer-addField"),"stopDrag:type",this.removeActiveClass),this.listenTo(i.channel("drawer-addField"),"startDrag:fieldStaging",this.addActiveClass),this.listenTo(i.channel("drawer-addField"),"stopDrag:fieldStaging",this.removeActiveClass),i.channel("app").reply("receive:fieldsSortable",this.receiveFieldsSortable,this),i.channel("app").reply("over:fieldsSortable",this.overfieldsSortable,this),i.channel("app").reply("out:fieldsSortable",this.outFieldsSortable,this),i.channel("app").reply("stop:fieldsSortable",this.stopFieldsSortable,this),i.channel("app").reply("start:fieldsSortable",this.startFieldsSortable,this),i.channel("app").reply("update:fieldsSortable",this.updateFieldsSortable,this)},addActiveClass:function(){var e=i.channel("fields").request("get:sortableEl");jQuery(e).addClass("nf-droppable-active")},removeActiveClass:function(){var e=i.channel("fields").request("get:sortableEl");jQuery(e).removeClass("nf-droppable-active")},receiveFieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.item).data("id"),n=this.addField(t,!1);jQuery(e.helper).prop("id",n),i.channel("fields").request("sort:fields"),jQuery(e.helper).remove(),i.channel("fields").trigger("drop:fieldType",t,n)}else if(jQuery(e.item).hasClass("nf-stage")){var r=this;i.channel("fields").request("sort:staging");var a=i.channel("fields").request("get:staging"),s=i.channel("fields").request("get:sortableEl");if(jQuery(s).hasClass("ui-sortable"))var o=jQuery(s).sortable("toArray");else var o=["nf-staged-fields-drag"];var l=o.indexOf("nf-staged-fields-drag");_.each(a.models,function(e,t){var n=r.addField(e.get("slug"));o.splice(l+t,0,n)});var l=o.indexOf("nf-staged-fields-drag");o.splice(l,1),i.channel("fields").request("sort:fields",o),i.channel("fields").request("clear:staging"),jQuery(e.helper).remove()}},addField:function(e,t){t=t||!1;var n=i.channel("fields").request("get:type",e),r=i.channel("fields").request("get:tmpID"),a=i.channel("fields").request("add",{id:r,label:n.get("nicename"),type:e},t),s={object:"Field",label:a.get("label"),change:"Added",dashicon:"plus-alt"},o={collection:i.channel("fields").request("get:collection")};return i.channel("changes").request("register:change","addObject",a,null,s,o),r},overfieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.helper).data("id"),n=i.channel("fields").request("get:type",t),r=n.get("nicename"),a=i.channel("fields").request("get:sortableEl"),s=jQuery(a).width();this.currentHelper=e.helper,jQuery(e.helper).html(r),jQuery(e.helper).removeClass("nf-field-type-button").addClass("nf-field-wrap").css({width:s,height:"50px"}),jQuery(a).hasClass("ui-sortable")&&jQuery(a).addClass("nf-droppable-hover")}else if(jQuery(e.item).hasClass("nf-stage")){var a=i.channel("fields").request("get:sortableEl");jQuery(a).hasClass("ui-sortable")&&jQuery(a).addClass("nf-droppable-hover")}},outFieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=i.channel("drawer-addField").request("get:typeHelperClone");jQuery(this.currentHelper).html(jQuery(t).html()),jQuery(this.currentHelper).removeClass("nf-field-wrap").addClass("nf-field-type-button").css({width:"",height:""});var n=i.channel("fields").request("get:sortableEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}else if(jQuery(e.item).hasClass("nf-stage")){var n=i.channel("fields").request("get:sortableEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}},stopFieldsSortable:function(e){jQuery(e.item).css("opacity",""),jQuery(e.helper).remove(),i.channel("fields").trigger("sortable:stop",e)},startFieldsSortable:function(e){jQuery(e.item).hasClass("nf-field-type-draggable")||jQuery(e.item).hasClass("nf-stage")||jQuery(e.item).css("opacity","0.5").show(),i.channel("fields").trigger("sortable:start",e)},updateFieldsSortable:function(e,t){if(i.channel("fields").request("sort:fields"),!jQuery(e.item).hasClass("nf-field-type-draggable")&&!jQuery(e.item).hasClass("nf-stage")){var n=i.channel("fields").request("get:collection"),r=jQuery(e.item).prop("id").replace("field-",""),a=n.get(r),s={fields:[]};_.each(n.models,function(e){var t=e._previousAttributes.order,n=e.get("order");s.fields.push({model:e,attr:"order",before:t,after:n})});var o={object:"Field",label:a.get("label"),change:"Re-ordered from "+a._previousAttributes.order+" to "+a.get("order"),dashicon:"sort"};i.channel("changes").request("register:change","sortFields",a,null,o,s)}}});return e}),n("controllers/fields/data",["models/fields/fieldCollection","models/fields/fieldModel"],function(e,t){var n=Marionette.Object.extend({adding:!1,removing:!1,initialize:function(){this.collection=new e(preloadedFormData.fields),this.collection.removedIDs={},i.channel("fields").reply("get:collection",this.getFieldCollection,this),i.channel("fields").reply("get:field",this.getField,this),i.channel("fields").reply("redraw:collection",this.redrawFieldCollection,this),i.channel("fields").reply("get:tmpID",this.getTmpFieldID,this),i.channel("fields").reply("add",this.addField,this),i.channel("fields").reply("delete",this.deleteField,this),i.channel("fields").reply("sort:fields",this.sortFields,this),i.channel("fields").reply("get:adding",this.getAdding,this),i.channel("fields").reply("set:adding",this.setAdding,this),i.channel("fields").reply("get:removing",this.getRemoving,this),i.channel("fields").reply("set:removing",this.setRemoving,this)},getFieldCollection:function(){return this.collection},redrawFieldCollection:function(){this.collection.trigger("reset",this.collection)},getField:function(e){return this.collection.findWhere({key:e})?this.collection.findWhere({key:e}):this.collection.get(e)},addField:function(e,n,r,a){if(i.channel("fields").request("set:adding",!0),n=n||!1,a=a||"",r="undefined"==typeof r||r,!1==e instanceof Backbone.Model){"undefined"==typeof e.id&&(e.id=this.getTmpFieldID());var s=new t(e)}else var s=e;if(jQuery.isNumeric(s.get("type"))){var o=i.channel("fields").request("get:type",s.get("type"));s.set("type",o.get("parentType"))}var l=this.collection.add(s,{silent:n});return i.channel("app").request("update:setting","clean",!1),i.channel("fields").trigger("add:field",s),r&&i.channel("fields").trigger("render:newField",l,a),i.channel("fields").trigger("after:addField",s),s},updateFieldSetting:function(e,t,n){var i=this.collection.get(e);i.set(t,n)},sortFields:function(e,t,n){null==n&&(n=!0);var r=i.channel("fields").request("get:sortableEl");if(jQuery(r).hasClass("ui-sortable")){var e=e||jQuery(r).sortable("toArray");_.each(this.collection.models,function(t){var n=(t.get("order"),t.get("id"));if(jQuery.isNumeric(n))var i="field-"+n;else var i=n;var r=e.indexOf(i)+1;t.set("order",r)}),this.collection.sort(),n&&(i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db"))}},deleteField:function(e){i.channel("fields").trigger("delete:field",e),this.removing=!0,this.collection.remove(e),i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db")},getTmpFieldID:function(){var e=this.collection.tmpNum;return this.collection.tmpNum++,"tmp-"+e},getAdding:function(){return this.adding},setAdding:function(e){this.adding=e},getRemoving:function(){return this.removing},setRemoving:function(e){this.removing=e}});return n}),n("models/app/optionRepeaterModel",[],function(){var e=Backbone.Model.extend({defaults:{errors:{}},initialize:function(){this.on("change:errors",this.changeErrors,this)},changeErrors:function(e){if(0==_.size(e.get("errors"))){var t=!1;_.each(e.collection.models,function(e){0!=_.size(e.get("errors"))&&(t=!0)}),t||e.collection.settingModel.set("error",!1)}else e.collection.settingModel.set("error",!0)}});return e}),n("models/app/optionRepeaterCollection",["models/app/optionRepeaterModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order",initialize:function(e,t){this.on("sort",this.changeCollection,this),this.on("add",this.addOption,this),this.settingModel=t.settingModel},changeCollection:function(){i.channel("option-repeater").trigger("sort:options",this),i.channel("option-repeater-"+this.settingModel.get("name")).trigger("sort:options",this)},addOption:function(e,t){e.set("settingModel",this.settingModel)}});return t}),n("views/app/drawer/optionRepeaterError",[],function(){var e=Marionette.ItemView.extend({tagName:"div",className:"nf-error",template:"#tmpl-nf-edit-setting-option-repeater-error",templateHelpers:function(){var e=this;return{renderErrors:function(){return"undefined"!=typeof e.errors?e.errors[Object.keys(errors)[0]]:""}}}});return e}),n("views/app/drawer/optionRepeaterOption",["views/app/drawer/optionRepeaterError"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",className:"nf-table-row",template:"#tmpl-nf-edit-setting-option-repeater-default-row",id:function(){return this.model.cid},regions:{error:".nf-option-error"},initialize:function(e){this.settingModel=e.settingModel,this.dataModel=e.dataModel,this.collection=e.collection,this.columns=e.columns,this.parentView=e.parentView,this.model.on("change:errors",this.renderErrors,this),"undefined"!=typeof this.settingModel.get("tmpl_row")&&(this.template="#"+this.settingModel.get("tmpl_row")),this.hasErrors=!1},onBeforeDestroy:function(){this.model.off("change",this.render),this.model.off("change:errors",this.renderErrors)},onBeforeRender:function(){if(this.model.get("label")){var e=this.model.get("label");this.model.set("label",_.escape(e),{silent:!0})}},onRender:function(){if(i.channel("mergeTags").request("init",this),i.channel("setting-"+this.settingModel.get("name")+"-option").trigger("render:setting",this.model,this.dataModel,this),this.model.get("label")){var e=this.model.get("label");this.model.set("label",_.unescape(e),{silent:!0})}},onShow:function(){this.model.get("new")&&(jQuery(this.el).find("input:first").focus(),this.model.set("new",!1))},events:{"change .setting":"changeOption","click .nf-delete":"deleteOption",keyup:"keyupOption"},changeOption:function(e){i.channel("option-repeater").trigger("change:option",e,this.model,this.dataModel,this.settingModel,this)},deleteOption:function(e){i.channel("option-repeater").trigger("click:deleteOption",this.model,this.collection,this.dataModel,this)},keyupOption:function(e){this.maybeAddOption(e),i.channel("option-repeater").trigger("keyup:option",e,this.model,this.dataModel,this.settingModel,this),i.channel("option-repeater-"+this.settingModel.get("name")).trigger("keyup:option",e,this.model,this.dataModel,this.settingModel,this)},maybeAddOption:function(e){13==e.keyCode&&(i.channel("option-repeater").trigger("click:addOption",this.collection,this.dataModel,this),jQuery(this.parentView.children.findByIndex(this.parentView.children.length-1).el).find('[data-id="label"]').focus())},renderErrors:function(){0==Object.keys(this.model.get("errors"))?this.hasErrors&&(this.error.empty(),jQuery(this.el).removeClass("nf-error")):(this.hasErrors=!0,this.error.show(new e({model:this.model})),jQuery(this.el).addClass("nf-error"))},templateHelpers:function(){var e=this;return{getColumns:function(){return e.columns},renderFieldSelect:function(e,t){var n=i.channel("fields").request("get:collection"),r='<label class="nf-select"><select class="setting" data-id="'+e+'">';return n.each(function(e){var n=t==e.get("key")?" selected":"";r+='<option value="'+e.get("key")+'"'+n+">"+e.get("label")+"</option>"}),r+="</select><div></div></label>"},renderOptions:function(t,n){if("undefined"!=typeof e.options.columns[t]){var i="";return _.each(e.options.columns[t].options,function(e){var t=n==e.value?" selected":"";i+='<option value="'+e.value+'"'+t+">"+e.label+"</option>"}),i}}}}});return t}),n("views/app/drawer/optionRepeaterEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"tr",template:"#tmpl-nf-edit-setting-option-repeater-empty"});return e}),n("views/app/drawer/optionRepeaterComposite",["views/app/drawer/optionRepeaterOption","views/app/drawer/optionRepeaterEmpty","models/app/optionRepeaterCollection"],function(e,t,n){var r=Marionette.CompositeView.extend({template:"#tmpl-nf-edit-setting-option-repeater-wrap",childView:e,emptyView:t,reorderOnSort:!1,initialize:function(e){var t=e.dataModel.get(this.model.get("name"));0==t instanceof Backbone.Collection&&(t=new n([],{settingModel:this.model}),t.add(e.dataModel.get(this.model.get("name"))),e.dataModel.set(this.model.get("name"),t,{silent:!0})),this.collection=t,this.dataModel=e.dataModel,this.childViewOptions={parentView:this,settingModel:this.model,collection:this.collection,dataModel:e.dataModel,columns:this.model.get("columns")};var i=this.model.get("deps");if(i)for(var r in i)i.hasOwnProperty(r)&&this.dataModel.on("change:"+r,this.render,this)},onBeforeDestroy:function(){var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render)},onRender:function(){var e=this;jQuery(this.el).find(".nf-list-options-tbody").sortable({handle:".handle",helper:"clone",placeholder:"nf-list-options-sortable-placeholder",forcePlaceholderSize:!0,opacity:.95,tolerance:"pointer",start:function(e,t){i.channel("option-repeater").request("start:optionSortable",t)},stop:function(e,t){i.channel("option-repeater").request("stop:optionSortable",t)},update:function(t,n){i.channel("option-repeater").request("update:optionSortable",n,this,e)}}),i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this)},onAttach:function(){var e=jQuery(this.el).find(".nf-open-import-tooltip"),t=jQuery(e).jBox("Tooltip",{title:"<h3>Please enter your options below:</h3>",content:jQuery(this.el).find(".nf-import-options"),trigger:"click",closeOnClick:"body",closeButton:"box",offset:{x:20,y:0},addClass:"import-options",onOpen:function(){var e=this;setTimeout(function(){jQuery(e.content).find("textarea").focus()},200)}});jQuery(this.el).find(".nf-import").on("click",{view:this,jBox:t},this.clickImport),i.channel("setting-"+this.model.get("name")).trigger("attach:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("attach:setting",this.model,this.dataModel,this)},templateHelpers:function(){var e=this;return{renderHeaders:function(){var e="<div> </div>";return _.each(this.columns,function(t){e+="<div>"+t.header+"</div>"}),e+="<div> </div>"},renderSetting:function(){var e=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return e(this)},renderClasses:function(){var e="";return e+="undefined"!=typeof this.width?this.width:" one-half",this.error&&(e+=" nf-error"),e},renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!==this.deps[t])return'style="display:none;"';return""},renderError:function(){return this.error?this.error:""},renderFieldsetClasses:function(){return e.model.get("name")},currencySymbol:function(){return i.channel("settings").request("get:setting","currency")||nfi18n.currency_symbol}}},attachHtml:function(e,t){jQuery(e.el).find(".nf-list-options-tbody").append(t.el),i.channel("mergeTags").request("init",this)},events:{"click .nf-add-new":"clickAddOption","click .extra":"clickExtra"},clickAddOption:function(e){i.channel("option-repeater").trigger("click:addOption",this.collection,this.dataModel),jQuery(this.children.findByIndex(this.children.length-1).el).find('[data-id="label"]').focus()},clickExtra:function(e){i.channel("option-repeater").trigger("click:extra",e,this.collection,this.dataModel),i.channel("option-repeater-"+this.model.get("name")).trigger("click:extra",e,this.model,this.collection,this.dataModel)},clickImport:function(e){var t=jQuery(e.data.jBox.content).find("textarea"),n=t.val().trimLeft().trimRight();if(0==n.length)return e.data.jBox.close(),!1;var r=n.split(/\n/);_.isArray(r)&&_.each(r,function(t){var n=t.split(","),r=n[0],a=n[1]||jQuery.slugify(r,{separator:"-"}),s=n[2]||"";r=r.trimLeft().trimRight(),a=a.trimLeft().trimRight(),s=s.trimLeft().trimRight();var o=e.data.view.collection.add({label:n[0],value:a,calc:s}),r={object:"field",label:n[0],change:"Option Added",dashicon:"plus-alt"};i.channel("changes").request("register:change","addListOption",o,null,r),i.channel("option-repeater-"+e.data.view.model.get("name")).trigger("add:option",o),i.channel("option-repeater").trigger("add:option",o),i.channel("app").trigger("update:setting",o)},this),t.val(""),e.data.jBox.close()}});return r}),n("controllers/app/optionRepeater",["models/app/optionRepeaterModel","models/app/optionRepeaterCollection","views/app/drawer/optionRepeaterComposite"],function(e,t,n){var r=Marionette.Object.extend({initialize:function(){i.channel("option-repeater").reply("get:settingChildView",this.getSettingChildView,this),this.listenTo(i.channel("option-repeater"),"change:option",this.changeOption),this.listenTo(i.channel("option-repeater"),"click:addOption",this.addOption),this.listenTo(i.channel("option-repeater"),"click:deleteOption",this.deleteOption),i.channel("option-repeater").reply("update:optionSortable",this.updateOptionSortable,this),i.channel("option-repeater").reply("stop:optionSortable",this.stopOptionSortable,this),i.channel("option-repeater").reply("start:optionSortable",this.startOptionSortable,this),this.listenTo(i.channel("option-repeater"),"init:dataModel",this.convertSettings)},changeOption:function(e,t,n,r,a){var s=jQuery(e.target).data("id");if("selected"==s)if(jQuery(e.target).attr("checked"))var o=1;else var o=0;else var o=jQuery(e.target).val();var l=t.get(s);t.set(s,o),this.triggerDataModel(t,n);var c=o,d={attr:s,before:l,after:c},h={object:n.get("objectType"),label:n.get("label"),change:"Option "+t.get("label")+" "+s+" changed from "+l+" to "+c};i.channel("changes").request("register:change","changeSetting",t,d,h),i.channel("option-repeater").trigger("update:option",t,n,r,a),i.channel("option-repeater-option-"+s).trigger("update:option",e,t,n,r,a),i.channel("option-repeater-"+r.get("name")).trigger("update:option",t,n,r,a)},addOption:function(t,n){var r={order:t.length,new:!0,options:{}};_.each(t.settingModel.get("columns"),function(e,t){r[t]=e.default,"undefined"!=typeof e.options&&(r.options[t]=e.options)});var a=new e(r);t.add(a);var s={object:n.get("objectType"),label:n.get("label"),change:"Option Added",dashicon:"plus-alt"};i.channel("changes").request("register:change","addListOption",a,null,s),i.channel("option-repeater-"+t.settingModel.get("name")).trigger("add:option",a),i.channel("option-repeater").trigger("add:option",a),this.triggerDataModel(a,n)},deleteOption:function(e,t,n){var r=i.channel("app").request("clone:modelDeep",e),a={object:n.get("objectType"),label:n.get("label"),change:"Option "+r.get("label")+" Removed",dashicon:"dismiss"},s={collection:t};i.channel("changes").request("register:change","removeListOption",r,null,a,s);var o=i.channel("changes").request("get:collection"),l=o.where({model:e});_.each(l,function(e){"object"==typeof e.get("data")&&_.each(e.get("data"),function(e){e.model==e&&(e.model=r)}),e.set("model",r),e.set("disabled",!0)}),t.remove(e),i.channel("option-repeater").trigger("remove:option",e),i.channel("option-repeater-"+t.settingModel.get("name")).trigger("remove:option",e),this.triggerDataModel(e,n)},triggerDataModel:function(e,t){i.channel("app").trigger("update:setting",e)},getSettingChildView:function(e){return n},updateOptionSortable:function(e,t,n){var r=jQuery(t).sortable("toArray"),a=n.collection.get({cid:jQuery(e.item).prop("id")}),s={collection:n.collection,objModels:[]};_.each(r,function(e,t){var i=n.collection.get({cid:e}),r=i.get("order");i.set("order",t);var a=t;s.objModels.push({model:i,attr:"order",before:r,after:a})}),n.collection.sort({silent:!0});var o={object:n.dataModel.get("objectType"),label:n.dataModel.get("label"),change:"Option "+a.get("label")+" re-ordered from "+a._previousAttributes.order+" to "+a.get("order"),dashicon:"sort"};i.channel("changes").request("register:change","sortListOptions",a,null,o,s),this.triggerDataModel(a,n.dataModel),i.channel("option-repeater").trigger("sort:option",a,n),i.channel("option-repeater-"+n.model.get("name")).trigger("sort:option",a,n)},stopOptionSortable:function(e){jQuery(e.item).css("opacity","")},startOptionSortable:function(e){jQuery(e.placeholder).find("div").remove(),jQuery(e.item).css("opacity","0.5").show()},convertSettings:function(e,n){var i=e.get(n.get("name"));0==i instanceof Backbone.Collection&&(i=new t([],{settingModel:n}),i.add(e.get(n.get("name"))),e.set(n.get("name"),i,{silent:!0}))}});return r}),n("controllers/fields/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("fields").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("fields").request("get:collection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/fields/fieldSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(fieldSettings,{objectType:"fields"}),i.channel("fields").reply("get:settingModel",this.getSettingModel,this),i.channel("fields").reply("get:settingCollection",this.getSettingCollection,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})},getSettingCollection:function(){return this.collection}});return t}),n("controllers/fields/fieldCreditCard",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"after:addField",this.dropCreditCardField)},dropCreditCardField:function(e){if("creditcard"==e.get("type")){var t=e.get("order");i.channel("fields").request("delete",e),_.each(["creditcardfullname","creditcardnumber","creditcardcvc","creditcardexpiration","creditcardzip"],function(e){var n=i.channel("fields").request("get:type",e),r={id:i.channel("fields").request("get:tmpID"),type:e,label:n.get("nicename"),order:t};i.channel("fields").request("add",r)})}},stageCreditCardField:function(e){"creditcard"==e.get("slug")&&(i.channel("fields").request("remove:stagedField","",e),_.each(["creditcardfullname","creditcardnumber","creditcardcvc","creditcardexpiration","creditcardzip"],function(e){i.channel("fields").request("add:stagedField",e)}))}});return e}),n("controllers/fields/fieldList",["models/app/optionRepeaterCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("option-repeater-option-label"),"update:option",this.updateOptionLabel),this.listenTo(i.channel("option-repeater-option-value"),"update:option",this.updateOptionValue),this.listenTo(i.channel("fields-list"),"init:fieldModel",this.convertOptions)},updateOptionLabel:function(e,t,n,i,r){"list"==_.findWhere(fieldTypeData,{id:n.get("type")}).parentType&&(t.get("manual_value")||(value=jQuery.slugify(t.get("label"),{separator:"-"}),t.set("value",value),t.trigger("change",t),jQuery(r.el).find('[data-id="value"]').focus().select()))},updateOptionValue:function(e,t,n,i,r){var a=_.findWhere(fieldTypeData,{id:n.get("type")});"undefined"!=typeof a&&"list"==a.parentType&&(t.set("manual_value",!0),jQuery(r.el).find('[data-id="calc"]').focus().select())},convertOptions:function(t){var n=t.get("options"),r=i.channel("fields").request("get:settingModel","options");0==n instanceof Backbone.Collection&&(n=new e([],{settingModel:r}),n.add(t.get("options")),t.set("options",n,{silent:!0}))}});return t}),n("controllers/fields/fieldPassword",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"after:addField",this.addField)},addField:function(e){if("password"==e.get("type")){var t=e.get("order"),n=this.insertField("passwordconfirm",t+1);n.set("confirm_field",e.get("key"))}},insertField:function(e,t){var n=i.channel("fields").request("get:type",e),r={id:i.channel("fields").request("get:tmpID"),type:e,label:n.get("nicename"),order:t};return i.channel("fields").request("add",r)}});return e}),n("controllers/fields/fieldQuantity",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t,n){if("product_assignment"==e.get("name")){var i=this.getProductFields(e);e.set("options",i)}},getProductFields:function(e){var t=[e.get("select_product")],n=i.channel("fields").request("get:collection");return _.each(n.models,function(e){"product"==e.get("type")&&t.push({label:e.get("label"),value:e.get("id")})}),t}});return e}),n("controllers/fields/fieldShipping",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-shipping_options"),"render:setting",this.addMask),this.listenTo(i.channel("setting-shipping_options-option"),"render:setting",this.addMask)},addMask:function(e,t,n){ 6 jQuery(n.el).find('[data-id="value"]').each(function(){jQuery(this).autoNumeric({aSign:"$",aSep:thousandsSeparator,aDec:decimalPoint})})}});return e}),n("controllers/fields/key",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"add:field",this.newFieldKey),this.listenTo(i.channel("fieldSetting-label"),"update:setting",this.updateLabel),this.listenTo(i.channel("fieldSetting-key"),"update:setting",this.updateKey),this.listenTo(i.channel("setting-key"),"keyup:setting",this.keyUp)},newFieldKey:function(e){var t=new Date,n=t.valueOf(),i=this.slugify(e.get("type")+"_"+n);e.set("key",i,{silent:!0}),"undefined"==e.get("manual_key")&&e.set("manual_key",!1,{silent:!0})},updateLabel:function(e){if(!e.get("manual_key")&&0!=jQuery.trim(e.get("label")).length){delete e.changed.label;var t=new Date,n=t.valueOf(),i=this.slugify(e.get("label")+"_"+n);e.set("key",i)}},updateKey:function(e){var t=e.get("key");this.settingModel=i.channel("fields").request("get:settingModel","key"),this.setError(t,e)},keyUp:function(e,t,n){n.set("manual_key",!0),this.settingModel=t;var i=jQuery(e.target).val();this.setError(i,n)},setError:function(e,t){var n=!1;""==jQuery.trim(e)?n="Field keys can't be empty. Please enter a key.":e!=e.toLowerCase()?n="Field keys must be lowercase.":e!=e.replace(" ","_")?n='Field keys must cannot use spaces. Separate with "_" instead.':"_"==e.slice(-1)?n='Field keys cannot end with a "_"':e!=this.slugify(e)?n="Invalid Format.":e!=this.keyExists(e,t)&&(n="Field keys must be unique. Please enter another key."),n?this.settingModel.set("error",n):(i.channel("app").trigger("update:fieldKey",t),this.settingModel.set("error",!1))},keyExists:function(e,t){var n=this.slugify(e);0!=n.length&&(e=n);var r=i.channel("fields").request("get:collection"),a=1,s=e;return _.each(r.models,function(n){t!=n&&s==n.get("key")&&(s=e+"_"+a,a++)}),e=s},slugify:function(e){return jQuery.slugify(e,{separator:"_"})}});return e}),n("controllers/fields/notices",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"add:stagedField",this.addStagedField)},addStagedField:function(e){i.channel("notices").request("add","addStagedField",e.get("nicename")+" added to staging")}});return e}),n("controllers/fields/mobile",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"sortable:start",this.startWiggle),this.listenTo(i.channel("fields"),"sortable:stop",this.stopWiggle)},initWiggle:function(e){i.channel("app").request("is:mobile")&&jQuery(e.el).find(".nf-field-wrap").on("taphold",function(){jQuery(this).ClassyWiggle("start",{degrees:[".65","1",".65","0","-.65","-1","-.65","0"],delay:50})})},startWiggle:function(e){i.channel("app").request("is:mobile")&&(jQuery(e.item).removeClass("ui-sortable-helper").ClassyWiggle("stop"),jQuery(e.helper).css("opacity","0.75").ClassyWiggle("start",{degrees:[".5","1",".5","0","-.5","-1","-.5","0"]}))},stopWiggle:function(e){i.channel("app").request("is:mobile")&&(jQuery(e.helper).ClassyWiggle("stop"),jQuery(e.item).removeClass("ui-sortable-helper drag-selected"))}});return e}),n("controllers/fields/savedFields",[],function(){var e=Marionette.Object.extend({ignoreAttributes:["editActive","order","saved","jBox"],initialize:function(){this.listenTo(i.channel("fields"),"update:setting",this.updateField),this.listenTo(i.channel("drawer"),"click:addSavedField",this.clickAddSavedField,this)},updateField:function(e){if(e.get("saved")){var t=!1,n=_.keys(e.changedAttributes()),i=this;_.each(n,function(e){-1==i.ignoreAttributes.indexOf(e)&&(t=!0)}),t&&e.set("saved",!1)}},clickAddSavedField:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r=n.attributes;r.saved=!0,delete r.jBox,delete r.editActive,delete r.created_at,delete r.order,delete r.id,delete r.formID,delete r.parent_id;var a=i.channel("fields").request("get:type",r.type),s=_.clone(a.attributes),o=jQuery(e.target).parent().parent().find("input").val();console.log(o),s.nicename=o,r.label=o,r.nicename=o,t.set("addSavedLoading",!0);var l=JSON.stringify(r);jQuery.post(ajaxurl,{action:"nf_create_saved_field",field:l,security:nfAdmin.ajaxNonce},function(e){e=JSON.parse(e),s.id=e.data.id,s.nicename=o,s.settingDefaults=r;var n=i.channel("fields").request("get:typeCollection"),a=(n.add(s),i.channel("fields").request("get:typeSections"));a.get("saved").get("fieldTypes").push(s.id),t.set("addSavedLoading",!1),t.unset("addSavedLoading",{silent:!0}),t.get("jBox").close(),i.channel("notices").request("add","addSaved","Saved Field Added")})}});return e}),n("controllers/fields/fieldDatepicker",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-datepicker"),"render:setting",this.addDatepicker)},addDatepicker:function(e,t,n){pikadayResponsive(jQuery(n.el).find(".setting")[0])}});return e}),n("controllers/fields/fieldDisplayCalc",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-calc_var"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t,n){},getProductFields:function(e){var t=[e.get("select_product")],n=i.channel("fields").request("get:collection");return _.each(n.models,function(e){"product"==e.get("type")&&t.push({label:e.get("label"),value:e.get("id")})}),t}});return e}),n("controllers/actions/types",["models/app/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.installedActions=new e(_.filter(actionTypeData,function(e){return"installed"==e.section}),{slug:"installed",nicename:nfi18n.installed}),this.availableActions=new e(_.filter(actionTypeData,function(e){return"available"==e.section}),{slug:"available",nicename:nfi18n.available}),i.channel("actions").reply("get:type",this.getType,this),i.channel("actions").reply("get:installedActions",this.getInstalledActions,this),i.channel("actions").reply("get:availableActions",this.getAvailableActions,this)},getType:function(e){var t=this.installedActions.get(e);return t||(t=this.availableActions.get(e)),t},getInstalledActions:function(){return this.installedActions},getAvailableActions:function(){return this.availableActions},addStagedField:function(e){var t=jQuery(e.target).data("id");i.channel("fields").request("add:stagedField",t)},getTypeSections:function(){return this.fieldTypeSections}});return t}),n("models/actions/actionModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Action",objectDomain:"actions",editActive:!1},initialize:function(){this.on("change",this.changeSetting,this);var e=i.channel("actions").request("get:type",this.get("type"));if("undefined"!=typeof e){var t=this;_.each(e.get("settingDefaults"),function(e,n){t.get(n)||t.set(n,e,{silent:!0})}),i.channel("actions").trigger("init:actionModel",this),i.channel("actions-"+this.get("type")).trigger("init:actionModel",this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)}},changeSetting:function(e,t){i.channel("actionSetting-"+_.keys(this.changedAttributes())[0]).trigger("update:setting",this,t.settingModel),i.channel("actions").trigger("update:setting",this,t.settingModel),i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("models/actions/actionCollection",["models/actions/actionModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order",tmpNum:1,initialize:function(){this.on("add",this.addAction,this),this.on("remove",this.removeAction,this),this.newIDs=[]},addAction:function(e){this.newIDs.push(e.get("id"))},removeAction:function(e){this.removedIDs[e.get("id")]=e.get("id")}});return t}),n("controllers/actions/data",["models/actions/actionCollection","models/actions/actionModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){if(this.collection=new e(preloadedFormData.actions),this.collection.tmpNum=1,0!=this.collection.models.length){var t=this;_.each(this.collection.models,function(e){jQuery.isNumeric(e.get("id"))||t.collection.tmpNum++})}this.collection.removedIDs={},i.channel("actions").reply("get:collection",this.getCollection,this),i.channel("actions").reply("get:action",this.getAction,this),i.channel("actions").reply("get:tmpID",this.getTmpID,this),i.channel("actions").reply("add",this.addAction,this),i.channel("actions").reply("delete",this.deleteAction,this)},getCollection:function(){return this.collection},getAction:function(e){return this.collection.get(e)},addAction:function(e,n){if(n=n||!1,!1==e instanceof Backbone.Model)var r=new t(e);else var r=e;return this.collection.add(r,{silent:n}),i.channel("app").request("update:setting","clean",!1),r},deleteAction:function(e){this.collection.remove(e),i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db")},getTmpID:function(){var e=this.collection.tmpNum;return this.collection.tmpNum++,"tmp-"+e}});return n}),n("controllers/actions/actionSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(actionSettings,{objectType:"actions"}),i.channel("actions").reply("get:settingModel",this.getSettingModel,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})}});return t}),n("controllers/actions/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("actions").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("actions").request("get:collection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/actions/addActionTypes",["models/actions/actionCollection","models/actions/actionModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("actions"),"click:addAction",this.addAction),i.channel("actions").reply("add:actionType",this.addAction,this)},addAction:function(e){var t={id:i.channel("actions").request("get:tmpID"),type:e.get("id"),label:e.get("settingDefaults").label||e.get("nicename")},n=i.channel("actions").request("add",t),r={object:"Action",label:n.get("label"),change:"Added",dashicon:"plus-alt"},t={collection:i.channel("actions").request("get:collection")};i.channel("changes").request("register:change","addObject",n,null,r,t),i.channel("app").trigger("click:edit",{},n)}});return n}),n("controllers/actions/typeDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addAction"),"startDrag:type",this.startDrag),this.listenTo(i.channel("drawer-addAction"),"stopDrag:type",this.stopDrag),i.channel("drawer-addAction").reply("get:typeHelperClone",this.getCurrentDraggableHelperClone,this)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important"),this.draggableHelperClone=jQuery(t.helper).clone()},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")},getCurrentDraggableHelperClone:function(){return this.draggableHelperClone}});return e}),n("controllers/actions/droppable",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("drop:actionType",this.dropActionType,this)},dropActionType:function(e,t){var n=jQuery(t.helper).data("type"),r=i.channel("actions").request("get:type",n);i.channel("actions").request("add:actionType",r)}});return e}),n("models/actions/typeModel",[],function(){var e=Backbone.Model.extend({});return e}),n("models/actions/typeCollection",["models/actions/typeModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/actions/filterTypes",["models/actions/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addAction"),"change:filter",this.filterActionTypes)},filterActionTypes:function(t,n){if(""!=jQuery.trim(t)){var r=[],a=i.channel("actions").request("get:installedActions");_.each(this.filterCollection(t,a),function(e){r.push(e)});var s=[],o=i.channel("actions").request("get:availableActions");_.each(this.filterCollection(t,o),function(e){s.push(e)});var l=new e(r);l.slug="installed",l.nicename="Installed";var c=new e(s);c.slug="available",c.nicename="Available",i.channel("drawer").trigger("filter:actionTypes",l,c),n.addObject&&0<l.length&&(i.channel("actions").request("add:actionType",l.models[0]),i.channel("drawer").request("clear:filter"))}else i.channel("drawer").trigger("clear:filter")},filterCollection:function(e,t){e=e.toLowerCase();var n=t.filter(function(t){var n=!1;return t.get("id").toLowerCase().indexOf(e)!=-1?n=!0:t.get("nicename").toLowerCase().indexOf(e)!=-1&&(n=!0),t.get("tags")&&0==e.indexOf("#")&&_.each(t.get("tags"),function(t){e.replace("#","").length>1&&t.toLowerCase().indexOf(e.replace("#",""))!=-1&&(n=!0)}),t.get("alias")&&_.each(t.get("alias"),function(t){t.toLowerCase().indexOf(e)!=-1&&(n=!0)}),n});return n}});return t}),n("controllers/actions/newsletterList",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-newsletter_list"),"show:setting",this.defaultFields),this.listenTo(i.channel("setting-type-newsletter_list"),"click:extra",this.clickListUpdate),this.listenTo(i.channel("actionSetting-newsletter_list"),"update:setting",this.maybeRenderFields),this.listenTo(i.channel("actionSetting-newsletter_list"),"update:setting",this.maybeRenderGroups),this.listenTo(i.channel("setting-name-newsletter_list_fields"),"init:settingModel",this.registerFieldsListener),this.listenTo(i.channel("setting-name-newsletter_list_groups"),"init:settingModel",this.registerGroupsListener)},defaultFields:function(e,t){this.maybeRenderFields(t,e),this.maybeRenderGroups(t,e)},registerFieldsListener:function(e){e.listenTo(i.channel("newsletter_list_fields"),"update:fieldMapping",this.updateFieldMapping,e)},registerGroupsListener:function(e){e.listenTo(i.channel("newsletter_list_groups"),"update:interestGroups",this.updateInterestGroups,e)},clickListUpdate:function(e,t,n,i){var r={action:"nf_"+n.attributes.type+"_get_lists",security:nfAdmin.ajaxNonce},a=this;jQuery(e.srcElement).addClass("spin"),jQuery.post(ajaxurl,r,function(e){var e=JSON.parse(e);a.updateLists(t,e.lists,i,n),n.set("newsletter_list",e.lists[0].value,{settingModel:t})}).always(function(){jQuery(e.srcElement).removeClass("spin")})},updateLists:function(e,t,n,i){e.set("options",t),n.render()},maybeRenderFields:function(e,t){if("undefined"!=typeof t){var n=e.get("newsletter_list"),r=t.get("options");_.each(r,function(e){n==e.value&&i.channel("newsletter_list_fields").trigger("update:fieldMapping",e.fields)}),e.set("newsletter_list_fields",0)}},maybeRenderGroups:function(e,t){if("undefined"!=typeof t){var n=e.get("newsletter_list"),r=t.get("options");_.each(r,function(e){n==e.value&&i.channel("newsletter_list_groups").trigger("update:interestGroups",e.groups)}),e.set("newsletter_list_fields",0)}},updateFieldMapping:function(e){var t=this.get("settings");t.reset(),_.each(e,function(e){t.add({name:e.value,type:"textbox",label:e.label,width:"full",use_merge_tags:{exclude:["user","post","system","querystrings"]}})}),this.set("settings",t)},updateInterestGroups:function(e){var t=this.get("settings");t.reset(),_.each(e,function(e){t.add({name:e.value,type:"toggle",label:e.label,width:"full"})}),this.set("settings",t)}});return e}),n("controllers/advanced/types",["models/app/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(formSettingTypeData),i.channel("settings").reply("get:type",this.getType,this),i.channel("settings").reply("get:typeCollection",this.getCollection,this)},getType:function(e){return this.collection.get(e)},getCollection:function(){return this.collection}});return t}),n("models/advanced/settingsModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Form Setting",editActive:!1},initialize:function(){this.bind("change",this.changeSetting,this);var e=i.channel("settings").request("get:collection");_.each(e.models,function(e){"undefined"==typeof this.get(e.get("name"))&&this.set(e.get("name"),e.get("value"),{silent:!0}),i.channel(e.get("type")).trigger("init:dataModel",this,e)},this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)},changeSetting:function(e,t){i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("controllers/advanced/data",["models/advanced/settingsModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.model=new e(preloadedFormData.settings),i.channel("settings").reply("get:settings",this.getSettings,this),i.channel("settings").reply("get:setting",this.getSetting,this),i.channel("settings").reply("update:setting",this.updateSetting,this)},getSettings:function(){return this.model},updateSetting:function(e,t,n){n=n||!1,this.model.set(e,t,{silent:n})},getSetting:function(e){return this.model.get(e)}});return t}),n("controllers/advanced/formSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(formSettings,{objectType:"settings"}),i.channel("settings").reply("get:settingModel",this.getSettingModel,this),i.channel("settings").reply("get:collection",this.getSettingCollection,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})},getSettingCollection:function(){return this.collection}});return t}),n("controllers/advanced/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("settings").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("settings").request("get:typeCollection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/advanced/clickEdit",["models/advanced/settingsModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("settings"),"click:edit",this.clickEdit)},clickEdit:function(e,t){var n=i.channel("settings").request("get:settings");i.channel("app").request("open:drawer","editSettings",{model:n,groupCollection:t.get("settingGroups"),typeModel:t});var r=i.channel("drawer").request("get:preventClose");r||t.set("editActive",!0)}});return t}),n("controllers/advanced/calculations",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("option-repeater-calculations"),"keyup:option",this.keyUp),this.listenTo(i.channel("option-repeater-calculations"),"update:option",this.updateCalc),this.listenTo(i.channel("option-repeater-calculations"),"sort:option",this.sortCalc)},keyUp:function(e,t){var n=jQuery(e.target).val(),i=jQuery(e.target).data("id");"name"==i?(this.checkName(n,t),this.checkEQ(t.get("eq"),t)):"eq"==i?this.checkEQ(n,t):"dec"==i&&this.checkDec(n,t)},updateCalc:function(e){this.checkName(e.get("name"),e,!1),this.checkEQ(e.get("eq"),e),this.checkDec(e.get("dec"),e)},sortCalc:function(e,t){this.checkAllCalcs(t.collection)},checkName:function(e,t,n){n=n||!0;var i=t.get("errors"),r=t.collection.where({name:jQuery.trim(e)});e==t.get("name")&&(r=[]),0!=r.length?i.nameExists="Calculation names must be unique. Please enter another name.":(t.set("name",e,{silent:n}),delete i.nameExists),t.set("errors",i),t.trigger("change:errors",t)},checkEQ:function(e,t){var n=t.get("errors"),i=!1,r=!1,a=e.match(new RegExp(/{calc:(.*?)}/g));if(a){var s=t.collection;a=a.map(function(e){var a=e.replace("}","").replace("{calc:",""),o=s.findWhere({name:a});a==t.get("name")?(n.selfRef="A calculation can't reference itself!",i=!0):o&&o.get("order")>t.get("order")&&(r=!0,n.futureCalc="Can't reference a future calculation!")})}i||delete n.selfRef,r||delete n.futureCalc,t.set("errors",n),t.trigger("change:errors",t)},checkDec:function(e,t){var n=t.get("errors"),i=!1,r=Math.abs(parseInt(e.trim()));""!==e.trim()&&r.toString()!==e.trim()&&(i=!0,n.nonIntDec="Decimals must be a non-negative integer!"),i||delete n.nonIntDec,t.set("errors",n),t.trigger("change:errors",t)},checkAllCalcs:function(e){var t=this;e.models.map(function(e){t.checkName(e.get("name"),e),t.checkEQ(e.get("eq"),e),t.checkDec(e.get("dec"),e)})}});return e}),n("controllers/loadControllers",["controllers/app/remote","controllers/app/drawer","controllers/app/drawerConfig","controllers/app/domainConfig","controllers/app/data","controllers/app/drawerToggleSettingGroup","controllers/app/updateDB","controllers/app/formData","controllers/app/previewLink","controllers/app/menuButtons","controllers/app/trackChanges","controllers/app/undoChanges","controllers/app/publishResponse","controllers/app/changeDomain","controllers/app/pushstate","controllers/app/hotkeys","controllers/app/cleanState","controllers/app/coreUndo","controllers/app/cloneModelDeep","controllers/app/getSettingChildView","controllers/app/changeSettingDefault","controllers/app/fieldset","controllers/app/toggleSetting","controllers/app/itemControls","controllers/app/mergeTags","controllers/app/mergeTagBox","controllers/app/itemSettingFill","controllers/app/confirmPublish","controllers/app/rte","controllers/app/settingFieldSelect","controllers/app/settingFieldList","controllers/app/settingHTML","controllers/app/settingColor","controllers/app/changeMenu","controllers/app/mobile","controllers/app/notices","controllers/app/unloadCheck","controllers/app/formContentFilters","controllers/app/formContentGutterFilters","controllers/app/cloneCollectionDeep","controllers/app/trackKeyDown","controllers/app/perfectScroll","controllers/app/getNewSettingGroupCollection","controllers/app/settingMedia","controllers/fields/types","controllers/fields/fieldTypeDrag","controllers/fields/stagingDrag","controllers/fields/staging","controllers/fields/stagingSortable","controllers/fields/filterTypes","controllers/fields/sortable","controllers/fields/data","controllers/app/optionRepeater","controllers/fields/editActive","controllers/fields/fieldSettings","controllers/fields/fieldCreditCard","controllers/fields/fieldList","controllers/fields/fieldPassword","controllers/fields/fieldQuantity","controllers/fields/fieldShipping","controllers/fields/key","controllers/fields/notices","controllers/fields/mobile","controllers/fields/savedFields","controllers/fields/fieldDatepicker","controllers/fields/fieldDisplayCalc","controllers/actions/types","controllers/actions/data","controllers/actions/actionSettings","controllers/actions/editActive","controllers/actions/addActionTypes","controllers/actions/typeDrag","controllers/actions/droppable","controllers/actions/filterTypes","controllers/actions/newsletterList","controllers/advanced/types","controllers/advanced/data","controllers/advanced/formSettings","controllers/advanced/editActive","controllers/advanced/clickEdit","controllers/advanced/calculations"],function(e,t,n,i,r,a,s,o,l,c,d,h,u,g,p,f,m,v,y,w,b,C,j,k,M,T,S,F,Q,q,x,D,_,O,A,E,V,z,R,B,N,L,I,P,H,G,$,K,W,U,J,X,Y,Z,ee,te,ne,ie,re,ae,se,oe,le,ce,de,he,ue,ge,pe,fe,me,ve,ye,we,be,Ce,je,ke,Me,Te,Se){var Fe=Marionette.Object.extend({initialize:function(){new z,new R,new f,new e,new t,new n,new i,new a,new l,new c,new d,new h,new u,new g,new m,new v,new y,new k,new F,new Q,new q,new x,new D,new _,new P,new O,new A,new E,new V,new s,new B,new N,new L,new I,new C,new Y,new H,new G,new $,new K,new W,new U,new J,new b,new j,new w,new Z,new ee,new te,new ne,new ie,new re,new ae,new se,new oe,new le,new ce,new de,new he,new be,new ue,new ge,new pe,new fe,new me,new ve,new ye,new we,new Ce,new ke,new Se,new je,new Me,new Te,new r,new X,new o,new M,new T,new S}});return Fe}),n("views/fields/fieldItem",["views/app/itemControls"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-main-content-field",doingShortcut:!1,regions:{itemControls:".nf-item-controls"},initialize:function(){this.model.on("change:editActive",this.render,this),this.model.on("change:label",this.render,this),this.model.on("change:required",this.render,this),this.model.on("change:id",this.render,this)},onBeforeDestroy:function(){this.model.off("change:editActive",this.render),this.model.off("change:label",this.render),this.model.off("change:required",this.render),this.model.off("change:id",this.render)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),this.itemControls.show(new e({model:this.model})),jQuery(this.el).disableSelection(),i.channel("app").request("is:mobile")&&jQuery(this.el).on("taphold",function(e,t){jQuery(e.target).hasClass("nf-edit-settings")||(jQuery(this).addClass("ui-sortable-helper drag-selected"),jQuery(this).ClassyWiggle("start",{degrees:[".65","1",".65","0","-.65","-1","-.65","0"],delay:50}))})},templateHelpers:function(){return{renderClasses:function(){var e="nf-field-wrap";return this.editActive&&(e+=" active"),e},renderRequired:function(){return 1==this.required?'<span class="required">*</span>':""},getFieldID:function(){return jQuery.isNumeric(this.id)?"field-"+this.id:this.id},renderIcon:function(){var e=i.channel("fields").request("get:type",this.type);return'<span class="fa fa-'+e.get("icon")+'"></span>'}}},events:{"mouseover .nf-item-control":"mouseoverItemControl",mousedown:"maybeShortcut",click:"maybeClickEdit",singletap:"maybeTapEdit",swipeleft:"swipeLeft",swiperight:"swipeRight",tapend:"tapend"},maybeClickEdit:function(e){return this.doingShortcut?(this.doingShortcut=!1,!1):void((jQuery(e.target).parent().hasClass("nf-fields-sortable")||jQuery(e.target).parent().hasClass("nf-field-wrap")||jQuery(e.target).hasClass("nf-field-wrap"))&&!i.channel("app").request("is:mobile")&&(jQuery(":focus").blur(),i.channel("app").trigger("click:edit",e,this.model)))},maybeShortcut:function(e){var t=i.channel("app").request("get:keydown");return-1==t.indexOf(16)||(-1!=t.indexOf(68)?(i.channel("app").trigger("click:delete",e,this.model),this.doingShortcut=!0,!1):-1!=t.indexOf(67)?(this.doingShortcut=!0,i.channel("app").trigger("click:duplicate",e,this.model),!1):void 0)},maybeTapEdit:function(e){jQuery(e.target).parent().hasClass("nf-fields-sortable")&&i.channel("app").trigger("click:edit",e,this.model)},swipeLeft:function(e,t){jQuery(t.startEvnt.target).closest("div").find(".nf-item-duplicate").show(),jQuery(t.startEvnt.target).closest("div").find(".nf-item-delete").show()},swipeRight:function(e,t){jQuery(t.startEvnt.target).closest("div").find(".nf-item-duplicate").hide(),jQuery(t.startEvnt.target).closest("div").find(".nf-item-delete").hide()},tapend:function(e,t){jQuery(this.el).ClassyWiggle("stop"),jQuery(this.el).removeClass("ui-sortable-helper drag-selected")},remove:function(){i.channel("fields").request("get:removing")?this.$el.hide("clip",function(){jQuery(this).remove()}):this.$el.remove(),i.channel("fields").request("set:removing",!1)},mouseoverItemControl:function(e){jQuery(this.el).find(".nf-item-control").css("display","")}});return t}),n("views/fields/mainContentEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-content-fields-empty",onBeforeDestroy:function(){jQuery(this.el).parent().removeClass("nf-fields-empty-droppable").droppable("destroy")},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},onShow:function(){jQuery(this.el).parent().hasClass("ui-sortable")&&jQuery(this.el).parent().sortable("destroy"),jQuery(this.el).parent().addClass("nf-fields-empty-droppable"),jQuery(this.el).parent().droppable({accept:function(e){if(jQuery(e).hasClass("nf-stage")||jQuery(e).hasClass("nf-field-type-button"))return!0},activeClass:"nf-droppable-active",hoverClass:"nf-droppable-hover",tolerance:"pointer",over:function(e,t){t.item=t.draggable,i.channel("app").request("over:fieldsSortable",t)},out:function(e,t){t.item=t.draggable,i.channel("app").request("out:fieldsSortable",t)},drop:function(e,t){t.item=t.draggable,i.channel("app").request("receive:fieldsSortable",t);var n=i.channel("fields").request("get:collection");n.trigger("reset",n)}})}});return e}),n("views/app/formTitle",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-header-form-title",initialize:function(){this.model.on("change:title",this.render,this)},templateHelpers:function(){return{renderTitle:function(){var e=i.channel("app").request("get:formModel");return _.escape(e.get("settings").get("title"))}}}});return e}),n("views/loadViews",["views/fields/fieldItem","views/fields/mainContentEmpty","views/app/formTitle"],function(e,t,n){var r=Marionette.Object.extend({initialize:function(){i.channel("views").reply("get:fieldItem",this.getFieldItem),i.channel("views").reply("get:mainContentEmpty",this.getMainContentEmpty),i.channel("views").reply("get:formTitle",this.getFormTitle)},getFieldItem:function(t){return e},getMainContentEmpty:function(){return t},getFormTitle:function(){return n}});return r});var i=Backbone.Radio;jQuery(document).ready(function(e){t(["views/app/builder","controllers/loadControllers","views/loadViews"],function(t,n,r){var a=Marionette.Application.extend({initialize:function(e){var t=this;Marionette.Renderer.render=function(e,n){var e=t.template(e);return e(n)},i.channel("app").trigger("before:loadControllers",this);new n;i.channel("app").trigger("after:loadControllers",this),i.channel("app").trigger("before:loadViews",this);new r;i.channel("app").trigger("after:loadViews",this),i.channel("app").reply("get:template",this.template)},onStart:function(){new t;i.channel("app").trigger("after:appStart",this),0==nfAdmin.formID&&i.channel("app").request("open:drawer","addField")},template:function(t){return _.template(e(t).html(),{evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^\}]+?)\}\}(?!\})/g,variable:"data"})}}),s=new a;s.start()})}),n("main",function(){})}();3 return this.updateSetting("currentDrawer",e),!0},getCurrentDrawer:function(){var e=this.model.get("currentDrawer");return i.channel("app").request("get:drawer",e)},isMobile:function(){return this.model.get("mobile")}});return t}),n("controllers/app/drawerToggleSettingGroup",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"click:toggleSettingGroup",this.toggleSettingGroup)},toggleSettingGroup:function(e,t){if(t.get("display")){var n=!1;_.each(t.get("settings").models,function(e){e.get("error")&&(n=!0)}),n||t.set("display",!1)}else t.set("display",!0)}});return e}),n("controllers/app/updateDB",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"closed",this.updateDB),i.channel("app").reply("update:db",this.updateDB,this),i.channel("formContent").request("add:saveFilter",this.defaultSaveFilter,10,this)},updateDB:function(e){if(i.channel("app").request("get:setting","clean"))return!1;if(e=e||"preview","preview"==e)var t="nf_preview_update";else if("publish"==e)var t="nf_save_form";var n=i.channel("app").request("get:formModel");_.each(n.get("fields").models,function(e,t){e.unset("jBox",{silent:!0})});var r=i.channel("settings").request("get:setting","formContentData");r||(r=i.channel("settings").request("get:setting","fieldContentsData"));var a=i.channel("formContent").request("get:saveFilters"),s=_.without(a,void 0),o=_.first(s);if(r=o(r),"publish"==e&&n.get("show_publish_options")){i.channel("app").request("open:drawer","newForm");var l=i.channel("app").request("get:builderEl");return jQuery(l).addClass("disable-main"),!1}var c=i.channel("app").request("get:formModel"),d=JSON.parse(JSON.stringify(c));d.settings.formContentData=r;var h=c.get("fields").removedIDs;_.each(d.fields,function(e){var t=e.id;delete e.id,delete e.parent_id;var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i],delete e[i]);for(var r in n)null===n[r]&&delete n[r];e.settings=n,e.id=t}),d.deleted_fields=h;var h=c.get("actions").removedIDs;_.each(d.actions,function(e){var t=e.id;delete e.id,delete e.parent_id;var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i],delete e[i]);e.settings=n,e.id=t}),d.deleted_actions=h,d=JSON.stringify(d),i.channel("app").trigger("before:updateDB",d),"publish"==e&&(i.channel("app").request("update:setting","loading",!0),i.channel("app").trigger("change:loading"),i.channel("app").request("is:mobile")&&i.channel("notices").request("add","publishing","Your Changes Are Being Published",{autoClose:!1})),jQuery.post(ajaxurl,{action:t,form:d,security:nfAdmin.ajaxNonce},function(t){try{t=JSON.parse(t),t.action=e,i.channel("app").trigger("response:updateDB",t),!i.channel("app").request("is:mobile")&&"preview"==e}catch(e){console.log("Something went wrong!"),console.log(e)}})},defaultSaveFilter:function(e){return e.pluck("key")}});return e}),n("models/app/formModel",[],function(){var e=Backbone.Model.extend({initialize:function(){jQuery.isNumeric(this.get("id"))?this.set("show_publish_options",!1,{silent:!0}):this.set("show_publish_options",!0,{silent:!0})}});return e}),n("controllers/app/formData",["models/app/formModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.model=new e({id:preloadedFormData.id}),this.model.set("fields",i.channel("fields").request("get:collection")),this.model.set("actions",i.channel("actions").request("get:collection")),this.model.set("settings",i.channel("settings").request("get:settings")),i.channel("app").reply("get:formModel",this.getFormModel,this)},getFormModel:function(){return this.model}});return t}),n("controllers/app/previewLink",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:sendChanges",this.disablePreview,this),this.listenTo(i.channel("app"),"response:sendChanges",this.enablePreview,this),this.listenTo(i.channel("app"),"change:clean",this.changePreviewNicename,this)},disablePreview:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("preview");t.set("disabled",!0)},changePreviewNicename:function(e){var t=i.channel("app").request("get:domainCollection"),n=t.get("preview");if(e)var r="Preview Form";else var r="Preview Changes";n.set("nicename",r)},enablePreview:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("preview");t.set("disabled",!1)}});return e}),n("controllers/app/menuButtons",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:publish",this.publish),this.listenTo(i.channel("app"),"click:viewChanges",this.viewChanges)},publish:function(){i.channel("app").request("update:db","publish")},viewChanges:function(){var e=i.channel("changes").request("get:collection");i.channel("app").request("open:drawer","viewChanges",{collection:e})}});return e}),n("models/app/changeModel",[],function(){var e=Backbone.Model.extend({defaults:{disabled:!1}});return e}),n("models/app/changeCollection",["models/app/changeModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:function(e){var t=parseInt(e.cid.replace("c",""));return-t}});return t}),n("controllers/app/trackChanges",["models/app/changeCollection","models/app/changeModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.collection=new e,i.channel("changes").reply("register:change",this.registerChange,this),i.channel("changes").reply("get:collection",this.getCollection,this),this.listenTo(i.channel("app"),"change:clean",this.maybeResetCollection)},registerChange:function(e,n,i,r,a){var a="undefined"!=typeof a?a:{};"undefined"==typeof r.dashicon&&(r.dashicon="admin-generic");var s=new t({action:e,model:n,changes:i,label:r,data:a});return this.collection.add(s),s},getCollection:function(){return this.collection},maybeResetCollection:function(e){e&&this.collection.reset()}});return n}),n("controllers/app/undoChanges",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"click:undoChanges",this.undoChanges,this),this.listenTo(i.channel("drawer"),"click:undoSingle",this.undoSingle,this)},undoChanges:function(){var e=i.channel("changes").request("get:collection");e.sort();var t=this;_.each(e.models,function(e){t.undoSingle(e,!0)}),e.reset(),i.channel("app").request("update:db"),i.channel("app").request("update:setting","clean",!0),i.channel("app").request("close:drawer")},undoSingle:function(e,t){i.channel("changes").request("undo:"+e.get("action"),e,t)}});return e}),n("controllers/app/publishResponse",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"response:updateDB",this.publishResponse)},publishResponse:function(e){return"publish"===e.action&&("undefined"!=typeof e.data.new_ids&&("undefined"!=typeof e.data.new_ids.fields&&_.each(e.data.new_ids.fields,function(e,t){var n=i.channel("fields").request("get:field",t);n&&n.set("id",e)}),"undefined"!=typeof e.data.new_ids.actions&&_.each(e.data.new_ids.actions,function(e,t){var n=i.channel("actions").request("get:action",t);n&&n.set("id",e)}),"undefined"!=typeof e.data.new_ids.forms&&_.each(e.data.new_ids.forms,function(e,t){var n=i.channel("app").request("get:formModel");n.set("id",e),history.replaceState("","","admin.php?page=ninja-forms&form_id="+e)})),i.channel("app").request("update:setting","loading",!1),i.channel("app").trigger("change:loading"),i.channel("app").request("is:mobile")&&i.channel("notices").request("close","publishing"),i.channel("notices").request("add","published","Changes Published"),i.channel("app").trigger("app:published",e),void i.channel("app").request("update:setting","clean",!0))}});return e}),n("controllers/app/changeDomain",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:menu",this.changeAppDomain),i.channel("app").reply("change:currentDomain",this.changeAppDomain,this),i.channel("app").reply("prevent:changeDomain",this.preventChange,this),i.channel("app").reply("enable:changeDomain",this.enableChange,this),this.objPreventChange={}},changeAppDomain:function(e,t){if(this.maybePreventChange())return!1;if("undefined"==typeof t)var n=jQuery(e.target).data("domain"),t=i.channel("app").request("get:domainModel",n);if(i.channel("app").request("get:currentDrawer")&&i.channel("app").request("close:drawer"),0==t.get("url").length){var r=i.channel("app").request("get:mainEl");i.channel("app").request("update:currentDomain",t),jQuery(r).scrollTop(0),i.channel("app").trigger("change:currentDomain",t)}},maybePreventChange:function(){return 0!=Object.keys(this.objPreventChange).length},preventChange:function(e){this.objPreventChange[e]=!0},enableChange:function(e){delete this.objPreventChange[e]}});return e}),n("controllers/app/pushstate",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.changePushState)},changePushState:function(){var e=i.channel("app").request("get:currentDomain");history.pushState(null,null,window.location.href+"&domain="+e.get("id"));var t=/domain=\\d+/,n=window.location.toString(),r=n.replace(t,"");console.log(r)}});return e}),n("controllers/app/hotkeys",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("main"),"render:main",this.changeHotkeys),this.listenTo(i.channel("drawer"),"opened",this.changeHotkeys),this.listenTo(i.channel("drawer"),"render:settingGroup",this.changeHotkeys),this.listenTo(i.channel("hotkeys"),"add:newField",this.addNewField),this.listenTo(i.channel("hotkeys"),"add:newAction",this.addNewAction),this.listenTo(i.channel("hotkeys"),"changeDomain:fields",this.changeDomainFields),this.listenTo(i.channel("hotkeys"),"changeDomain:actions",this.changeDomainActions),this.listenTo(i.channel("hotkeys"),"changeDomain:settings",this.changeDomainSettings),this.listenTo(i.channel("hotkeys"),"close:drawer",this.closeDrawer)},changeHotkeys:function(){var e=i.channel("app").request("get:currentDomain");jQuery(document).off(".nfDomainHotkeys"),jQuery("input").off(".nfDomainHotkeys"),e.get("hotkeys")&&jQuery.each(e.get("hotkeys"),function(e,t){jQuery(document).on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)}),jQuery("input").on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)}),jQuery("textarea").on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)})})},addNewField:function(){"addField"!=i.channel("app").request("get:currentDrawer")?i.channel("app").request("open:drawer","addField"):i.channel("app").request("close:drawer")},addNewAction:function(){"addAction"!=i.channel("app").request("get:currentDrawer")?i.channel("app").request("open:drawer","addAction"):i.channel("app").request("close:drawer")},changeDomainFields:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("fields");i.channel("app").request("change:currentDomain",{},t)},changeDomainActions:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("actions");i.channel("app").request("change:currentDomain",{},t)},changeDomainSettings:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("settings");i.channel("app").request("change:currentDomain",{},t)},closeDrawer:function(){i.channel("app").request("close:drawer")}});return e}),n("controllers/app/cleanState",[],function(){var e=Marionette.Object.extend({initialize:function(){this.ignoreAttributes=["editActive"],this.listenTo(i.channel("app"),"update:setting",this.setAppClean)},setAppClean:function(e){for(var t in e.changedAttributes())var n=t,r=e.changedAttributes()[t];i.channel("undo-"+e.get("type")).request("ignore:attributes",this.ignoreAttributes)||this.ignoreAttributes;return-1==this.ignoreAttributes.indexOf(t)&&void i.channel("app").request("update:setting","clean",!1)}});return e}),n("controllers/app/coreUndo",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("changes").reply("undo:changeSetting",this.undoChangeSetting,this),i.channel("changes").reply("undo:addObject",this.undoAddObject,this),i.channel("changes").reply("undo:removeObject",this.undoRemoveObject,this),i.channel("changes").reply("undo:duplicateObject",this.undoDuplicateObject,this),i.channel("changes").reply("undo:sortFields",this.undoSortFields,this),i.channel("changes").reply("undo:addListOption",this.undoAddListOption,this),i.channel("changes").reply("undo:removeListOption",this.undoRemoveListOption,this),i.channel("changes").reply("undo:sortListOptions",this.undoSortListOptions,this)},undoChangeSetting:function(e,t){var n=e.get("model"),i=e.get("changes"),r=i.attr,a=i.before;n.set(r,a),this.maybeRemoveChange(e,t)},undoAddObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if("undefined"!=typeof r.newIDs&&delete r.newIDs[n.get("id")],!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&a.remove(t)})}r.remove(n),this.maybeRemoveChange(e,t)},undoDuplicateObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&a.remove(t)})}r.remove(n),this.maybeRemoveChange(e,t)},undoRemoveObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(i.channel(n.get("objectDomain")).request("add",n),delete r.removedIDs[n.get("id")],!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&t.set("disabled",!1)})}r.trigger("reset",r),this.maybeRemoveChange(e,t)},undoSortFields:function(e,t){var n=e.get("data"),r=n.fields,a=i.channel("fields").request("get:collection");_.each(r,function(e){var t=e.before,n=e.model;n.set("order",t)}),a.sort(),this.maybeRemoveChange(e,t)},undoAddListOption:function(e,t){var n=e.get("model");if(!t){var r=i.channel("changes").request("get:collection"),a=r.where({model:n});_.each(a,function(t){t!==e&&r.remove(t)})}n.collection.remove(n),this.maybeRemoveChange(e,t)},undoRemoveListOption:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(r.add(n),!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&t.set("disabled",!1)})}this.maybeRemoveChange(e,t)},undoSortListOptions:function(e,t){var n=e.get("data"),i=n.collection,r=n.objModels;_.each(r,function(e){var t=e.before,n=e.model;n.set("order",t)}),i.sort(),this.maybeRemoveChange(e,t)},maybeRemoveChange:function(e,t){var t="undefined"!=typeof t&&t;if(!t){i.channel("app").request("update:db");var n=i.channel("changes").request("get:collection");n.remove(e),0==n.length&&(i.channel("app").request("update:setting","clean",!0),i.channel("app").request("close:drawer"))}}});return e}),n("controllers/app/cloneModelDeep",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("clone:modelDeep",this.cloneModelDeep,this)},cloneModelDeep:function(e){var t={};_.each(e.attributes,function(e,n){if(e instanceof Backbone.Collection){var r=i.channel("app").request("clone:collectionDeep",e);t[n]=r}else e instanceof Backbone.Model&&(t[n]=this.cloneModelDeep(e))},this);var n=e.clone();return _.each(t,function(e,t){n.set(t,e)}),n}});return e}),n("controllers/app/getSettingChildView",["views/app/drawer/itemSetting"],function(e){var t=Marionette.Object.extend({initialize:function(){i.channel("app").reply("get:settingChildView",this.getSettingChildView,this)},getSettingChildView:function(t){var n=t.get("type"),r=i.channel(n).request("get:settingChildView",t)||e;return r}});return t}),n("controllers/app/changeSettingDefault",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("change:setting",this.changeSetting,this),this.listenTo(i.channel("app"),"change:setting",this.changeSetting,this)},changeSetting:function(e,t,n,r){var a=t.get("name"),s=n.get(a),r=r||null;r||(r=i.channel(t.get("type")).request("before:updateSetting",e,n,a,t)),"undefined"==typeof r&&(r=jQuery(e.target).val()),n.set(a,r,{settingModel:t}),i.channel("setting-"+a).trigger("after:updateSetting",n,t);var o=r,l={attr:a,before:s,after:o},c=i.channel("app").request("get:currentDomain"),d=(c.get("id"),{object:n.get("objectType"),label:n.get("label"),change:"Changed "+t.get("label")+" from "+s+" to "+o});i.channel("changes").request("register:change","changeSetting",n,l,d)}});return e}),n("views/app/drawer/typeSettingFieldset",["views/app/drawer/itemSetting"],function(e){var t=Marionette.CompositeView.extend({template:"#tmpl-nf-edit-setting-wrap",childView:e,initialize:function(e){this.collection=this.model.get("settings"),this.childViewOptions={dataModel:e.dataModel},this.dataModel=e.dataModel;var t=this.model.get("deps");if(t)for(var n in t)t.hasOwnProperty(n)&&this.dataModel.on("change:"+n,this.render,this);this.model.on("rerender",this.render,this)},onBeforeDestroy:function(){var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render)},onBeforeRender:function(){i.channel("app").trigger("before:renderSetting",this.model,this.dataModel),i.channel("setting-type-"+this.model.get("type")).trigger("before:renderSetting",this.model,this.dataModel,this),i.channel("setting-"+this.model.get("name")).trigger("before:renderSetting",this.model,this.dataModel,this)},onRender:function(){i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("render:setting",this.model,this.dataModel,this)},templateHelpers:function(){var e=this;return{renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!==this.deps[t])return'style="display:none;"';return""},renderSetting:function(){var e=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return e(this)},renderClasses:function(){var e="";return e+="undefined"!=typeof this.width?this.width:" one-half",this.error&&(e+=" nf-error"),e},renderError:function(){return this.error?this.error:""}}},attachHtml:function(e,t){jQuery(e.el).find(".nf-field-sub-settings").append(t.el)}});return t}),n("models/app/settingModel",[],function(){var e=Backbone.Model.extend({defaults:{settings:!1,hide_merge_tags:!1,error:!1},initialize:function(){i.channel("app").trigger("init:settingModel",this),i.channel(this.get("type")).trigger("init:settingModel",this),i.channel("setting-name-"+this.get("name")).trigger("init:settingModel",this),this.on("change:error",this.maybePreventUI,this),"undefined"!=typeof this.collection&&this.get("use_merge_tags")&&"undefined"!=typeof this.collection.options.objectType&&this.listenTo(i.channel("app"),"update:fieldKey",this.updateKey)},updateKey:function(e){i.channel("app").trigger("fire:updateFieldKey",e,this)},maybePreventUI:function(){this.get("error")?(i.channel("drawer").request("prevent:close","setting-"+this.get("name")+"-error"),i.channel("app").request("prevent:changeDomain","setting-"+this.get("name")+"-error")):(i.channel("drawer").request("enable:close","setting-"+this.get("name")+"-error"),i.channel("app").request("enable:changeDomain","setting-"+this.get("name")+"-error"))}});return e}),n("models/app/settingCollection",["models/app/settingModel"],function(e){var t=Backbone.Collection.extend({model:e,initialize:function(e,t){this.options=t||{}}});return t}),n("controllers/app/fieldset",["views/app/drawer/typeSettingFieldset","models/app/settingCollection"],function(e,t){var n=Marionette.Object.extend({initialize:function(){i.channel("fieldset").reply("get:settingChildView",this.getSettingChildView,this),this.listenTo(i.channel("fieldset"),"init:settingModel",this.createSettingsCollection)},getSettingChildView:function(t){return e},createSettingsCollection:function(e){e.set("settings",new t(e.get("settings")))}});return n}),n("controllers/app/toggleSetting",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-toggle").reply("renderOnChange",function(){return!1}),i.channel("toggle").reply("before:updateSetting",this.updateSetting,this)},updateSetting:function(e,t,n,i){if(jQuery(e.target).attr("checked"))var r=1;else var r=0;return r}});return e}),n("controllers/app/itemControls",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:edit",this.clickEdit),this.listenTo(i.channel("app"),"click:delete",this.clickDelete),this.listenTo(i.channel("app"),"click:duplicate",this.clickDuplicate)},clickEdit:function(e,t){var n=i.channel("app").request("get:currentDomain"),r=n.get("id"),a=i.channel(r).request("get:type",t.get("type"));i.channel("app").request("open:drawer","editSettings",{model:t,groupCollection:a.get("settingGroups")})},clickDelete:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r={object:t.get("objectType"),label:t.get("label"),change:"Removed",dashicon:"dismiss"},a={collection:t.collection},s=i.channel("changes").request("get:collection"),o=s.where({model:t});_.each(o,function(e){var i=e.get("data");"undefined"!=typeof i.fields&&_.each(i.fields,function(e,r){e.model==t&&(i.fields[r].model=n)}),e.set("data",i),e.set("model",n),e.set("disabled",!0)}),i.channel("changes").request("register:change","removeObject",n,null,r,a);var l=i.channel("app").request("get:currentDomain"),c=l.get("id");i.channel(c).request("delete",t)},clickDuplicate:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r=i.channel("app").request("get:currentDomain"),a=r.get("id");n.set("label",n.get("label")+" Copy");var s=i.channel(a).request("get:tmpID");n.set("id",s),i.channel(a).request("add",n,!1,!1,"duplicate");var o={object:t.get("objectType"),label:t.get("label"),change:"Duplicated",dashicon:"admin-page"},l={collection:i.channel(a).request("get:collection")};i.channel("changes").request("register:change","duplicateObject",n,null,o,l),t.trigger("change:label",t),i.channel("app").request("update:db")}});return e}),n("controllers/app/mergeTags",["models/app/mergeTagCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.tagSectionCollection=new e;var t=this;_.each(mergeTags,function(n){if(n.tags)var i=new e(n.tags);else var i="";t.tagSectionCollection.add({id:n.id,label:n.label,tags:i,default_group:n.default_group})});var n=this.tagSectionCollection.get("fields").get("tags"),r=i.channel("fields").request("get:collection");_.each(r.models,function(e){"submit"!==e.get("type")&&n.add({id:e.get("id"),label:e.get("label"),tag:t.getFieldKeyFormat(e.get("key"))})});var a=new e,s=i.channel("app").request("get:formModel"),o=s.get("settings").get("calculations");_.each(o.models,function(e){a.add({label:e.get("name"),tag:"{calc:"+e.get("name")+"}"})}),this.tagSectionCollection.get("calcs").set("tags",a),this.currentElement={},this.settingModel={},this.open=!1,this.listenTo(i.channel("mergeTags"),"click:mergeTag",this.clickMergeTag),this.listenTo(i.channel("fields"),"add:field",this.addFieldTags),this.listenTo(i.channel("fields"),"delete:field",this.deleteFieldTags),this.listenTo(i.channel("option-repeater-calculations"),"update:option",this.updateCalcTags),this.listenTo(i.channel("option-repeater-calculations"),"remove:option",this.updateCalcTags),i.channel("mergeTags").reply("update:currentElement",this.updateCurrentElement,this),i.channel("mergeTags").reply("update:currentSetting",this.updateCurrentSetting,this),i.channel("mergeTags").reply("get:collection",this.getCollection,this),i.channel("mergeTags").reply("get:mergeTag",this.getSectionModel,this),this.listenTo(i.channel("fieldSetting-key"),"update:setting",this.updateKey),this.listenTo(i.channel("app"),"replace:fieldKey",this.replaceFieldKey),i.channel("app").reply("get:fieldKeyFormat",this.getFieldKeyFormat,this)},initMergeTags:function(e){var t=i.channel("mergeTags").request("get:view"),n=this;this.jBoxes={};var n=this;jQuery(e.el).find(".merge-tags").each(function(){if("undefined"==typeof jQuery(this).data("jBox-id")){var i=jQuery(this).jBox("Tooltip",{title:"Insert Merge Tag",trigger:"click",position:{x:"center",y:"bottom"},closeOnClick:"body",closeOnEsc:!0,theme:"TooltipBorder",maxHeight:200,onOpen:function(){t.reRender(e.model),this.setContent(jQuery(".merge-tags-content"));var i=jQuery(this.target).prev(".setting");0==i.length&&(i=jQuery(e.el).find(".setting")),n.updateCurrentSetting(e.model),n.updateCurrentElement(i)},onClose:function(){}});jQuery(this).data("jBox-id",i.id)}})},clickMergeTag:function(e,t){if("undefined"!=typeof this.settingModel.get("settingModel")&&"calculations"==this.settingModel.get("settingModel").get("name")){console.log(t);var n=jQuery(this.currentElement).val(),i=jQuery(this.currentElement).caret(),r=i+t.get("tag").length,a="undefined"!=typeof t.get("calcTag")?t.get("calcTag"):t.get("tag");n=n.substr(0,i)+a+n.substr(i),jQuery(this.currentElement).val(n).caret(r).trigger("change")}else if("rte"==this.settingModel.get("type"))jQuery(this.currentElement).summernote("insertText",t.get("tag"));else{var n=jQuery(this.currentElement).val(),i=jQuery(this.currentElement).caret(),r=i+t.get("tag").length;n=n.substr(0,i)+t.get("tag")+n.substr(i),jQuery(this.currentElement).val(n).caret(r).trigger("change")}},addFieldTags:function(e){"submit"!==e.get("type")&&this.tagSectionCollection.get("fields").get("tags").add({id:e.get("id"),label:e.get("label"),tag:this.getFieldKeyFormat(e.get("key")),calcTag:this.getFieldKeyFormatCalc(e.get("key"))})},deleteFieldTags:function(e){var t=e.get("id"),n=this.tagSectionCollection.get("fields").get("tags").get(t);this.tagSectionCollection.get("fields").get("tags").remove(n)},updateCalcTags:function(t){var n=new e,r=i.channel("app").request("get:formModel"),a=r.get("settings").get("calculations");_.each(a.models,function(e){n.add({label:e.get("name"),tag:"{calc:"+e.get("name")+"}"})}),this.tagSectionCollection.get("calcs").set("tags",n)},openMergeTags:function(e){"TEXTAREA"!=jQuery(e.target)[0].tagName&&"INPUT"!=jQuery(e.target)[0].tagName||jQuery(e.target).parent().find(".merge-tags").click()},returnMergeTags:function(e){if(this.open){e.preventDefault();var t=this.fields.where({active:!0})[0];t&&this.clickMergeTag(e,t)}},upMergeTags:function(e){this.open&&(e.preventDefault(),this.changeActiveTag("up"))},downMergeTags:function(e){this.open&&(e.preventDefault(),this.changeActiveTag("down"))},changeActiveTag:function(e){if("down"==e)var t=1;else var t=-1;if(0<this.fields.where({active:!0}).length){var n=this.fields.where({active:!0})[0],i=this.fields.indexOf(n);n.set("active",!1);var r=this.fields.models[i+t];r&&r.set("active",!0)}else 0<this.fields.where({active:!0})?console.log("system"):0<this.userInfo.where({active:!0})?console.log("userinfo"):0<this.fields.models.length?this.fields.models[0].set("active",!0):this.system.models[0].set("active",!0)},updateCurrentElement:function(e){this.currentElement=e},updateCurrentSetting:function(e){this.settingModel=e},getCollection:function(){return this.tagSectionCollection},getSectionModel:function(e){return this.tagSectionCollection.get(e)},updateOpen:function(e){this.open=e,_.each(this.tagSectionCollection.get("fields").models,function(e){e.set("active",!1)})},updateKey:function(e){var t=e.get("key"),n=this.tagSectionCollection.get("fields").get("tags").get(e.get("id"));"undefined"!=typeof n&&n.set("tag",this.getFieldKeyFormat(t))},getFieldKeyFormat:function(e){return"{field:"+e+"}"},getFieldKeyFormatCalc:function(e){return"{field:"+e+":calc}"},replaceFieldKey:function(e,t,n){var i=this.getFieldKeyFormat(t._previousAttributes.key),r=this.getFieldKeyFormat(t.get("key")),a=n.get("name"),s=e.get(a);if("calculations"==a&&"undefined"!=typeof e.get("calculations")){var o=e.get("calculations");return o.each(function(e){var t=i.slice(0,i.length-1)+":calc}",n=r.slice(0,r.length-1)+":calc}";if(s=e.get("eq"),"string"==typeof s){var a=new RegExp(t,"g"),o=s.replace(a,n);a=new RegExp(i,"g"),o=o.replace(a,r),e.set("eq",o)}}),!1}if("string"==typeof s){var l=new RegExp(i,"g");newVal=s.replace(l,r),e.set(a,newVal)}}});return t}),n("models/app/mergeTagLookupCollection",["models/app/mergeTagModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/app/drawer/mergeTag",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tag-box-tag",events:{click:"insertTag"},insertTag:function(){i.channel("mergeTags").request("insert:tag",this.model.get("tag"))}});return e}),n("views/app/drawer/mergeTagList",["views/app/drawer/mergeTag"],function(e){var t=Marionette.CollectionView.extend({tagName:"ul",childView:e,initialize:function(){i.channel("merge-tags").reply("update:taglist",this.sectionFilter,this),i.channel("merge-tags").reply("filtersearch",this.searchFilter,this)},filter:function(e,t,n){return"fields"==e.get("section")},sectionFilter:function(e){this.filter=function(t,n,i){return e==t.get("section")},this.render(),i.channel("merge-tags").trigger("after:filtersearch")},searchFilter:function(e){this.filter=function(t,n,i){var r=t.get("label").toLowerCase().indexOf(e.toLowerCase().replace(":",""))>=0,a=t.get("tag").toLowerCase().indexOf(e.toLowerCase())>=0;return r||a},this.render(),i.channel("merge-tags").trigger("after:filtersearch")}});return t}),n("views/app/drawer/mergeTagGroup",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tag-box-section",events:{click:"onClick"},initialize:function(){this.listenTo(i.channel("merge-tags"),"after:filtersearch",this.removeActive)},onClick:function(){this.updateTags(),this.setActive()},updateTags:function(){i.channel("merge-tags").request("update:taglist",this.model.get("id"))},setActive:function(){this.$el.addClass("active"),this.$el.siblings().removeClass("active")},removeActive:function(){this.$el.removeClass("active")}});return e}),n("views/app/drawer/mergeTagGroupList",["views/app/drawer/mergeTagGroup"],function(e){var t=Marionette.CollectionView.extend({tagName:"ul",childView:e,initialize:function(){this.listenTo(i.channel("merge-tags"),"open",this.render,this)},filter:function(e,t,n){return 0<e.get("tags").length}});return t}),n("views/app/drawer/mergeTagFilter",[],function(){var e=Marionette.ItemView.extend({template:"#tmpl-nf-merge-tag-box-filter",events:{"keyup input":"updateFilter"},updateFilter:function(e){if(13==e.keyCode){var t=jQuery("#merge-tags-box .merge-tag-list ul li span").first().data("tag");return i.channel("mergeTags").request("insert:tag",t),jQuery("#merge-tags-box").css("display","none"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}var n=this.$el.find("input").val();i.channel("merge-tags").request("filtersearch",n)}});return e}),n("views/app/drawer/mergeTagBox",[],function(){var e=Marionette.LayoutView.extend({el:"#merge-tags-box",template:"#tmpl-nf-merge-tag-box",regions:{filter:".merge-tag-filter",sections:".merge-tag-sections",tags:".merge-tag-list"}});return e}),n("controllers/app/mergeTagBox",["models/app/mergeTagModel","models/app/mergeTagLookupCollection","views/app/drawer/mergeTag","views/app/drawer/mergeTagList","views/app/drawer/mergeTagGroup","views/app/drawer/mergeTagGroupList","views/app/drawer/mergeTagFilter","views/app/drawer/mergeTagBox"],function(e,t,n,r,a,s,o,l){var c=Marionette.Object.extend({caret:0,old:"",initialize:function(){this.listenTo(i.channel("drawer"),"render:settingGroup",function(){jQuery(".merge-tags").off("click"),jQuery(".merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("app"),"after:appStart",this.afterAppStart),this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting),this.listenTo(i.channel("drawer"),"before:close",this.beforeDrawerClose);var e=this;i.channel("mergeTags").reply("set:caret",function(t){e.caret=t; 4 }),i.channel("mergeTags").reply("get:caret",function(){return e.caret});var e=this;i.channel("mergeTags").reply("set:old",function(t){e.old=t}),i.channel("mergeTags").reply("get:old",function(){return e.old}),i.channel("mergeTags").reply("insert:tag",this.insertTag.bind(this)),this.listenTo(i.channel("option-repeater"),"add:option",function(t){var n="#"+t.cid+" .has-merge-tags input.setting";jQuery(n).on("focus",function(t){e.focusCallback(t,n,"option-repeater")}),jQuery(n).on("keyup",function(t){e.keyupCallback(t,n,"option-repeater")}),jQuery(n).siblings(".nf-list-options .merge-tags").off("click"),jQuery(n).siblings(".nf-list-options .merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("drawer"),"opened",function(){jQuery(".nf-list-options .merge-tags").off("click"),jQuery(".nf-list-options .merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("setting-calculations-option"),"render:setting",this.renderSetting),this.listenTo(i.channel("drawer"),"opened",function(){jQuery(".nf-list-options.calculations .merge-tags").off("click"),jQuery(".nf-list-options.calculations .merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("summernote"),"focus",function(t,n){e.focusCallback(!1,n,"rte")}),this.listenTo(i.channel("summernote"),"keydown",function(e,t){jQuery(t).closest(".nf-setting").find(".setting").summernote("saveRange")}),this.listenTo(i.channel("summernote"),"keyup",function(t,n){e.keyupCallback(t,n,"rte")}),this.listenTo(i.channel("drawer"),"opened",function(){jQuery(".note-editor .merge-tags").off("click"),jQuery(".note-editor .merge-tags").on("click",this.mergeTagsButtonClick)}),jQuery(document).on("keyup",function(e){27==e.keyCode&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").blur(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))})},afterAppStart:function(){var e=i.channel("mergeTags").request("get:collection"),n=[];e.each(function(e){e.get("tags").each(function(t){n.push({label:t.get("label"),tag:t.get("tag"),section:e.get("id")})})});var a=new l;a.render();var c=new t(n),d=new r({collection:c}),h=new s({collection:e});a.getRegion("tags").show(d),a.getRegion("sections").show(h),a.getRegion("filter").show(new o);var u=this;this.listenTo(i.channel("mergeTags"),"open",function(){u.afterAppStart()})},beforeRenderSetting:function(e,t){if("undefined"!=typeof e.get("use_merge_tags")&&e.get("use_merge_tags")){var n=e.get("name");this.listenTo(i.channel("setting-"+n),"render:setting",this.renderSetting)}},renderSetting:function(e,t,n){n.$el.find(".merge-tags").off("click"),n.$el.find(".merge-tags").on("click",this.mergeTagsButtonClick),0==jQuery("#merge-tags-box").length&&this.afterAppStart(),jQuery("#nf-drawer").on("scroll",function(){if(0!=jQuery(".merge-tag-focus").length){var e=jQuery(".merge-tag-focus").closest(".nf-setting").find(".note-editor");if(0!=e.length)var t=e.offset().top-jQuery(window).scrollTop(),n=e.outerHeight();else var t=jQuery(".merge-tag-focus").offset().top-jQuery(window).scrollTop(),n=jQuery(".merge-tag-focus").outerHeight();jQuery("#merge-tags-box").css("top",t+n);var i=jQuery("#merge-tags-box").outerHeight();jQuery("#nf-drawer").css("padding-bottom",i+"px");var r=jQuery(".merge-tag-focus").closest(".nf-list-options-tbody");if(0!=r.length){var a=r.offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",a)}else{var s=jQuery(".merge-tag-focus").closest(".nf-settings").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",s),jQuery("#merge-tags-box").css("width",jQuery(".merge-tag-focus").closest(".nf-settings").width())}}}),jQuery(n.el).find(".setting").on("focus",this.focusCallback),jQuery(n.el).find(".setting").on("keyup",this.keyupCallback)},beforeDrawerClose:function(){jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),i.channel("mergeTags").trigger("open")},insertTag:function(e){var t=jQuery(".merge-tag-focus");if(0!=t.closest(".nf-setting").first().find(".note-editable").length&&(t=t.closest(".nf-setting").first().find(".note-editable")),1<t.length&&(t=t.first()),t.hasClass("note-editable"))var n=t.closest(".nf-setting").find(".setting").summernote("code");else var n=t.val();for(var r=i.channel("mergeTags").request("get:old"),a=e,s=i.channel("mergeTags").request("get:caret"),o=/{([a-z0-9]|:|_||-})*/g;match=o.exec(n);)if(r==match[0]){var l=n.slice(0,match.index)+a+n.slice(o.lastIndex);if(t.hasClass("note-editable")){t.closest(".nf-setting").find(".setting").summernote("code",l);var c=t,d=null;_.each(c[0].childNodes,function(e,t){if(!d&&(e.nodeValue||e.innerHTML)){if(e.nodeValue)var n=e.nodeValue.indexOf(a)+r.length;else if(e.innerHTML)var n=e.innerHTML.indexOf(a)+r.length;s==n&&(d=c[0].childNodes[t])}}),d||(d=c[0].childNodes[0]);var h=s-r.length+a.length,u=document.createRange(),g=window.getSelection();if(0!=d.childNodes.length)try{u.setStart(d.childNodes[0],h)}catch(e){console.log("error")}else try{u.setStart(d,h)}catch(e){console.log("error")}u.collapse(!0),g.removeAllRanges(),g.addRange(u)}else t.val(l),t.change(),t.caret(s-r.length+a.length)}jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),t.removeClass("merge-tag-focus"),t.closest(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")},mergeTagsButtonClick:function(e){var t=jQuery(this);if(t.siblings().hasClass("merge-tag-focus"))return i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay");if(0!==t.closest(".nf-setting, .nf-table-row").find(".note-tools").length){var n=t.closest(".note-editor").siblings(".setting").first();t.closest(".nf-setting").find(".setting").summernote("insertText","{")}else{var n=t.siblings(".setting").first(),r=n.val()||"";n.val(r+"{").change(),i.channel("mergeTags").request("set:caret",r.length+1)}t.parent().hasClass("note-tools"),i.channel("mergeTags").request("set:old","{"),n.addClass("merge-tag-focus");var a=t.attr("autocomplete");t.attr("autocomplete","off"),t.data("autocomplete",a);var s=t.closest(".nf-setting, .nf-table-row");0!=s.find(".note-editor").length?s.find(".note-editor").addClass("merge-tag-focus-overlay"):s.addClass("merge-tag-focus-overlay"),jQuery("#merge-tags-box").css("display","block"),i.channel("drawer").request("prevent:close"),jQuery(".merge-tag-focus-overlay").off("click"),jQuery(".merge-tag-focus-overlay").on("click",function(e){jQuery(e.target).hasClass("note-editor")&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))}),setTimeout(function(){jQuery("#merge-tags-box").find(".merge-tag-filter").find("input").focus()},500)},focusCallback:function(e,t,n){var n=n||"setting",i="undefined"==typeof t?jQuery(this):jQuery(t);if(jQuery(".merge-tag-focus").each(function(e,t){this!=t&&t.removeClass("merge-tag-focus")}),"rte"==n)var r=i.closest(".nf-setting").find(".note-editor").offset().top-jQuery(window).scrollTop(),a=i.closest(".nf-setting").find(".note-editor").outerHeight();else var r=i.offset().top-jQuery(window).scrollTop(),a=i.outerHeight();jQuery("#merge-tags-box").css("top",r+a);var s=i.closest(".nf-list-options-tbody");if(0!=s.length){var o=s.offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",o)}else if("rte"==n){var l=i.closest(".nf-setting").find(".note-editor").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",l),jQuery("#merge-tags-box").css("width",i.closest(".nf-setting").find(".note-editor").width())}else{var l=jQuery(this).closest(".nf-settings").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",l),jQuery("#merge-tags-box").css("width",i.closest(".nf-settings").width())}var c=jQuery(this).data("id")},keyupCallback:function(e,t,n){var n=n||"setting";if(13==e.keyCode){var r=jQuery("#merge-tags-box .merge-tag-list ul li span").first().data("tag");return i.channel("mergeTags").request("insert:tag",r),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}if("undefined"!=typeof t)var a=jQuery(t);else var a=jQuery(this);var s=jQuery(this).data("id");if(!s||"eq"==s){if("rte"==n){var o=a.summernote("createRange");if(o)var l=o.so;else var l=0;a.closest(".nf-setting").find(".setting").summernote("saveRange")}else var l=a.caret();if(i.channel("mergeTags").request("set:caret",l),"rte"==n)var c=a.summernote("code").match(new RegExp(/{([a-z0-9]|:|_|-|})*/g));else var c=a.val().match(new RegExp(/{([a-z0-9]|:|_|-|})*/g));if(c=_.filter(c,function(e){return-1==e.indexOf("}")}),0!==c.length){i.channel("mergeTags").request("set:old",c[0]),jQuery("#merge-tags-box").css("display","block"),i.channel("drawer").request("prevent:close"),a.addClass("merge-tag-focus");var d=jQuery("#merge-tags-box").outerHeight();jQuery("#nf-drawer").css("padding-bottom",d+"px");var h=a.attr("autocomplete");a.attr("autocomplete","off"),a.data("autocomplete",h);var u=a.closest(".nf-setting, .nf-table-row");0!=u.find(".note-editor").length?u.find(".note-editor").addClass("merge-tag-focus-overlay"):u.addClass("merge-tag-focus-overlay"),u.off("click"),u.on("click",function(e){var t=jQuery(e.target).attr("class")||[];-1!==t.indexOf("merge-tag-focus-overlay")&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))});var g=c[0].replace("{","");i.channel("merge-tags").request("filtersearch",g)}else jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}}});return c}),n("controllers/app/itemSettingFill",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t){"fields"==e.get("fill")}});return e}),n("controllers/app/confirmPublish",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:confirmPublish",this.confirmPublish)},confirmPublish:function(){var e=i.channel("app").request("get:formModel");1==e.get("settings").get("add_submit")&&i.channel("fields").request("add",{type:"submit",label:"Submit",order:9999}),e.set("show_publish_options",!1),i.channel("app").request("update:db","publish")}});return e}),n("controllers/app/rte",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-rte").reply("renderOnChange",function(){return!1}),this.listenTo(i.channel("rte"),"init:settingModel",this.initSettingModel),this.listenTo(i.channel("setting-type-rte"),"render:setting",this.renderSetting),this.listenTo(i.channel("setting-type-rte"),"destroy:setting",this.destroySetting),this.listenTo(i.channel("setting-type-rte"),"click:extra",this.clickExtra),this.meta_image_frame,jQuery.summernote.options.icons={align:"dashicons dashicons-editor-alignleft",alignCenter:"dashicons dashicons-editor-aligncenter",alignJustify:"dashicons dashicons-editor-justify",alignLeft:"dashicons dashicons-editor-alignleft",alignRight:"dashicons dashicons-editor-alignright",indent:"dashicons dashicons-editor-indent",outdent:"dashicons dashicons-editor-outdent",bold:"dashicons dashicons-editor-bold",caret:"dashicons dashicons-arrow-down",close:"dashicons dashicons-dismiss",code:"dashicons dashicons-editor-code",eraser:"dashicons dashicons-editor-removeformatting",italic:"dashicons dashicons-editor-italic",link:"dashicons dashicons-admin-links",unlink:"dashicons dashicons-editor-unlink",magic:"dashicons dashicons-editor-paragraph",minus:"dashicons dashicons-minus",orderedlist:"dashicons dashicons-editor-ol",redo:"dashicons dashicons-redo",square:"dashicons fa-square",table:"dashicons dashicons-editor-table",underline:"dashicons dashicons-editor-underline",undo:"dashicons dashicons-undo",unorderedlist:"dashicons dashicons-editor-ul"},this.currentContext={}},initSettingModel:function(e){e.set("hide_merge_tags",!0)},initRTE:function(e,t,n){var r=this,a=function(e){return r.linkButton(e)},s=function(e){return r.mediaButton(e)},o=this.mergeTags(),l=[["paragraphStyle",["style"]],["fontStyle",["bold","italic","underline","clear"]],["lists",["ul","ol"]],["paragraph",["paragraph"]],["customGroup",["linkButton","unlink"]],["table",["table"]],["actions",["undo","redo"]],["tools",["mediaButton","mergeTags","codeview"]]];jQuery(n.el).find("div.setting").summernote({toolbar:l,buttons:{linkButton:a,mergeTags:o,mediaButton:s},height:150,codemirror:{theme:"monokai",lineNumbers:!0,callbacks:{onBlur:function(n){var i=n.getValue();r.updateDataModel(e,t,i)}}},prettifyHtml:!0,callbacks:{onBlur:function(n,a){var s=jQuery(this).summernote("code");r.updateDataModel(e,t,s),i.channel("summernote").trigger("blur",e,t,s)},onFocus:function(e,t){i.channel("summernote").trigger("focus",e,this,t)},onKeydown:function(e,t){i.channel("summernote").trigger("keydown",e,this,t)},onKeyup:function(e,t){i.channel("summernote").trigger("keyup",e,this,t)}}})},updateDataModel:function(e,t,n){var r=e.get("name"),a=t.get(r),s=n,o={attr:r,before:a,after:s},l={object:t.get("objectType"),label:t.get("label"),change:"Changed "+e.get("label")+" from "+a+" to "+s};i.channel("changes").request("register:change","changeSetting",t,o,l),t.set(e.get("name"),s)},renderSetting:function(e,t,n){this.initRTE(e,t,n);var i=jQuery(n.el).find(".link-button").next(".dropdown-menu").find("button");i.replaceWith(function(){return jQuery("<div/>",{class:jQuery(i).attr("class"),html:this.innerHTML})})},destroySetting:function(e,t,n){this.removeRTE(e,t,n)},removeRTE:function(e,t,n){jQuery(n.el).find("div.setting").summernote("destroy")},drawerOpened:function(e,t,n){this.initRTE(e,t,n)},linkButton:function(e){var t=this,n=jQuery.summernote.ui,r=i.channel("app").request("get:template","#tmpl-nf-rte-link-button"),a=i.channel("app").request("get:template","#tmpl-nf-rte-link-dropdown");return n.buttonGroup([n.button({className:"dropdown-toggle link-button",contents:r({}),tooltip:"Insert Link",click:function(n){t.clickLinkButton(n,e)},data:{toggle:"dropdown"}}),n.dropdown([n.buttonGroup({children:[n.button({contents:a({}),tooltip:""})]})])]).render()},mergeTags:function(e){var t=jQuery.summernote.ui,n=i.channel("app").request("get:template","#tmpl-nf-rte-merge-tags-button");return t.button({className:"dropdown-toggle merge-tags",contents:n({}),tooltip:"Merge Tags"}).render()},mediaButton:function(e){var t=this,n=jQuery.summernote.ui,r=i.channel("app").request("get:template","#tmpl-nf-rte-media-button");return n.button({className:"dropdown-toggle",contents:r({}),tooltip:"Insert Media",click:function(n){t.openMediaManager(n,e)}}).render()},openMediaManager:function(e,t){if(t.invoke("editor.createRange"),t.invoke("editor.saveRange"),this.currentContext=t,this.meta_image_frame)return void this.meta_image_frame.open();this.meta_image_frame=wp.media.frames.meta_image_frame=wp.media({title:"Select a file",button:{text:"insert"}});var n=this;this.meta_image_frame.on("select",function(){var e=n.meta_image_frame.state().get("selection").first().toJSON();n.insertMedia(e,t)}),this.meta_image_frame.open()},clickLinkButton:function(e,t){var n=t.invoke("editor.createRange");t.invoke("editor.saveRange");var i=n.toString();this.currentContext=t,jQuery(e.target).closest(".note-customGroup > .note-btn-group").on("hide.bs.dropdown",function(e){return!1}),jQuery(e.target).closest(".note-customGroup > .note-btn-group").on("shown.bs.dropdown",function(e){jQuery(e.target).parent().parent().find(".link-text").val(i),jQuery(e.target).parent().parent().find(".link-url").focus()})},clickExtra:function(e,t,n,i){var r=jQuery(e.target).parent().find(".link-text"),a=jQuery(e.target).parent().find(".link-url"),s=jQuery(e.target).parent().find(".link-new-window");if(this.currentContext.invoke("editor.restoreRange"),jQuery(e.target).hasClass("insert-link")){var o=r.val(),l=a.val(),c=!!s.prop("checked");0!=o.length&&0!=l.length&&this.currentContext.invoke("editor.createLink",{text:o,url:l,isNewWindow:c})}r.val(""),a.val(""),s.prop("checked",!1),jQuery(e.target).closest("div.note-btn-group.open").removeClass("open")},insertMedia:function(e,t){this.currentContext.invoke("editor.restoreRange"),"image"==e.type?this.currentContext.invoke("editor.insertImage",e.url):this.currentContext.invoke("editor.createLink",{text:e.filename,url:e.url})}});return e}),n("controllers/app/settingFieldSelect",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("field-select"),"init:settingModel",this.trackKeyChanges),this.listenTo(i.channel("setting-type-field-select"),"before:renderSetting",this.beforeRender),this.listenTo(i.channel("field-select"),"init:settingModel",function(){this.listenTo(i.channel("app"),"change:setting",this.maybeSwitchToFieldsDomain)}),this.listenTo(i.channel("app"),"change:currentDomain",this.autoOpenDrawer),this.listenTo(i.channel("drawer"),"opened",this.filterDrawerContents),this.listenTo(i.channel("drawer"),"closed",this.SwitchToFieldsDomain)},trackKeyChanges:function(e){e.listenTo(i.channel("app"),"update:fieldKey",e.updateKey),this.listenTo(i.channel("app"),"replace:fieldKey",this.updateFieldMap)},updateFieldMap:function(e,t,n){var i=t._previousAttributes.key,r=t.get("key");"field-select"==n.get("type")&&e.get(n.get("name"))==i&&e.set(n.get("name"),r)},beforeRender:function(e,t){var n=i.channel("fields").request("get:collection"),r=e.get("field_types"),a=[{label:"--",value:0}];_.each(n.models,function(n){if(t.cid!=n.cid&&("undefined"==typeof r||0==r.length||_.contains(r,n.get("type")))){var i=e.get("field_filter");if(i&&"undefined"!=typeof i[n.get("type")]){var s=!1;if(_.each(i[n.get("type")],function(e,t){console.log(e+":"+n.get(t)),e!=n.get(t)&&(s=!0)}),s)return}var o=n.get("key");switch(e.get("field_value_format")){case"key":o=n.get("key");break;case"merge_tag":default:o="{field:"+n.get("key")+"}"}a.push({label:n.get("label"),value:o})}}),"undefined"!=typeof r&&0!=r.length&&_.each(r,function(e){var t=i.channel("fields").request("get:type",e);a.push({label:"-- Add "+t.get("nicename")+" Field",value:"addField:"+e})}),e.set("options",a)},maybeSwitchToFieldsDomain:function(e,t,n){if("field-select"==t.get("type")){var r=t.get("name"),a=n.get(r);if(a){var s=a.split(":");"addField"==s[0]&&(this.openDrawer="addField",this.filterDrawer=s[1],n.set(r,""),this.switchDomain=!0,i.channel("app").request("close:drawer"))}}},SwitchToFieldsDomain:function(){if(this.switchDomain){var e=i.channel("app").request("get:domainModel","fields");i.channel("app").request("change:currentDomain",null,e),this.switchDomain=null}},autoOpenDrawer:function(){this.openDrawer&&(i.channel("app").request("open:drawer",this.openDrawer),this.openDrawer=null)},filterDrawerContents:function(){this.filterDrawer&&(i.channel("drawer-addField").trigger("change:filter",this.filterDrawer),this.filterDrawer=null)}});return e}),n("controllers/app/settingFieldList",["views/app/drawer/typeSettingFieldset","models/app/settingCollection"],function(e,t){return Marionette.Object.extend({fieldListSettings:[],initialize:function(){this.listenTo(i.channel("field-list"),"init:settingModel",this.registerFieldListSettings),this.listenTo(i.channel("fields"),"update:setting",this.updateFieldListSettingKeys),i.channel("field-list").reply("get:settingChildView",this.getSettingChildView,this)},registerFieldListSettings:function(e){this.fieldListSettings.push(e.get("name"))},updateFieldListSettingKeys:function(e){if("undefined"!=typeof e.changed.key){var t=e._previousAttributes.key,n=e.changed.key,i=this;_.each(Backbone.Radio.channel("actions").request("get:collection").models,function(e){_.each(e.attributes,function(r,a){var s="";_.each(i.fieldListSettings,function(i){if(a==i+"-"+t&&s!=t){var r=e.get(i+"-"+t);e.set(i+"-"+n,r),e.set(i+"-"+t,0),s=t}})})})}},getSettingChildView:function(n){var r=_.filter(i.channel("fields").request("get:collection").models,function(e){return _.contains(n.get("field_types"),e.get("type"))}),a=_.map(r,function(e){return{name:n.get("name")+"-"+e.get("key"),type:"toggle",label:e.get("label"),width:"full"}});return n.set("settings",new t(a)),e}})}),n("controllers/app/settingHTML",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-html"),"before:renderSetting",this.init)},init:function(e,t){"undefined"!=e.get("mirror")&&t.on("change:"+e.get("mirror"),this.update,e)},update:function(e,t){e.set(this.get("name"),t)}});return e}),n("controllers/app/settingColor",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-color").reply("renderOnChange",this.setRenderFalse),this.listenTo(i.channel("setting-type-color"),"destroy:setting",this.closeColorPickers),this.listenTo(i.channel("setting-type-color"),"render:setting",this.initColorPicker)},initColorPicker:function(e,t,n){var r=(e.get("name"),jQuery(n.el).find("input"));jQuery(r).wpColorPicker({change:function(n,r){i.channel("app").request("change:setting",n,e,t,r.color.toString())}})},setRenderFalse:function(){return!1},closeColorPickers:function(e,t,n){jQuery(n.el).find(".wp-color-picker").wpColorPicker("close")}});return e}),n("controllers/app/changeMenu",[],function(){var e=Marionette.Object.extend({editFormText:"",initialize:function(){this.editFormText=nfAdmin.editFormText||"Edit Form",this.listenTo(i.channel("app"),"after:appStart",this.changeMenu),this.listenTo(i.channel("app"),"response:updateDB",this.formPublish)},changeMenu:function(){var e=i.channel("app").request("get:formModel");this.isNewForm(e.id)?this.highlightAddNew():this.appendEditForm()},isNewForm:function(e){return isNaN(e)},highlightAddNew:function(){jQuery(".wp-submenu li").removeClass("current"),jQuery('a[href="admin.php?page=ninja-forms&form_id=new"]').parent().addClass("current")},appendEditForm:function(){var e='<li class="current"><a href="#">'+this.editFormText+"</a></li>";0==jQuery('li a:contains("'+this.editFormText+'")').length&&(jQuery(".wp-submenu li").removeClass("current"),jQuery('a[href="admin.php?page=ninja-forms&form_id=new"]').parent().after(e))},formPublish:function(e){return"publish"===e.action&&void this.changeMenu()}});return e}),n("controllers/app/mobile",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:menu",this.closeMobileMenu)},closeMobileMenu:function(){var e=i.channel("app").request("get:builderEl");jQuery(e).removeClass("nf-menu-expand")}});return e}),n("controllers/app/notices",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("notices").reply("add",this.addNotice,this),i.channel("notices").reply("close",this.closeNotice,this),this.notices={}},addNotice:function(e,t,n){var r={content:t,color:"green",zIndex:12e3,constructOnInit:!0,stack:!0,animation:{open:"flip",close:"flip"}},a={position:{x:"center",y:"top"},animation:{open:"slide:top",close:"slide:left"},autoClose:2e3,offset:{x:0,y:55}},s={attributes:{x:"left",y:"bottom"},autoClose:4e3};if(i.channel("app").request("is:mobile"))var o=a;else var o=s;o=jQuery.extend(o,r);var n=jQuery.extend(o,n);this.notices[e]=new jBox("Notice",n)},closeNotice:function(e){"undefined"!=typeof this.notices[e]&&this.notices[e].close()},openNotice:function(e){"undefined"!=typeof this.notices[e]&&this.notices[e].open()}});return e}),n("controllers/app/unloadCheck",[],function(){var e=Marionette.Object.extend({initialize:function(){jQuery(window).bind("beforeunload",this.maybePrompt)},maybePrompt:function(e){if(!i.channel("app").request("get:setting","clean"))return"You have unsaved changes."}});return e}),n("controllers/app/formContentFilters",[],function(){var e=Marionette.Object.extend({initialize:function(){this.viewFilters=[],this.saveFilters=[],this.loadFilters=[],i.channel("formContent").reply("add:viewFilter",this.addViewFilter,this),i.channel("formContent").reply("add:saveFilter",this.addSaveFilter,this),i.channel("formContent").reply("add:loadFilter",this.addLoadFilter,this),i.channel("formContent").reply("get:viewFilters",this.getViewFilters,this),i.channel("formContent").reply("get:saveFilters",this.getSaveFilters,this),i.channel("formContent").reply("get:loadFilters",this.getLoadFilters,this),i.channel("fieldContents").reply("add:viewFilter",this.addViewFilter,this),i.channel("fieldContents").reply("add:saveFilter",this.addSaveFilter,this),i.channel("fieldContents").reply("add:loadFilter",this.addLoadFilter,this),i.channel("fieldContents").reply("get:viewFilters",this.getViewFilters,this),i.channel("fieldContents").reply("get:saveFilters",this.getSaveFilters,this),i.channel("fieldContents").reply("get:loadFilters",this.getLoadFilters,this)},addViewFilter:function(e,t){this.viewFilters[t]=e},getViewFilters:function(){return this.viewFilters},addSaveFilter:function(e,t){this.saveFilters[t]=e},getSaveFilters:function(){return this.saveFilters},addLoadFilter:function(e,t){this.loadFilters[t]=e},getLoadFilters:function(){return this.loadFilters}});return e}),n("controllers/app/formContentGutterFilters",[],function(){var e=Marionette.Object.extend({initialize:function(){this.leftFilters=[],this.rightFilters=[],i.channel("formContentGutters").reply("add:leftFilter",this.addLeftFilter,this),i.channel("formContentGutters").reply("add:rightFilter",this.addRightFilter,this),i.channel("formContentGutters").reply("get:leftFilters",this.getLeftFilters,this),i.channel("formContentGutters").reply("get:rightFilters",this.getRightFilters,this)},addLeftFilter:function(e,t){this.leftFilters[t]=e},addRightFilter:function(e,t){this.rightFilters[t]=e},getLeftFilters:function(){return this.leftFilters},getRightFilters:function(){return this.rightFilters}});return e}),n("controllers/app/cloneCollectionDeep",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("clone:collectionDeep",this.cloneCollectionDeep,this)},cloneCollectionDeep:function(e){var t=[];return _.each(e.models,function(e){var n=i.channel("app").request("clone:modelDeep",e);t.push(n)}),new e.constructor(t,e.options)}});return e}),n("controllers/app/trackKeyDown",[],function(){var e=Marionette.Object.extend({keys:[],initialize:function(){var e=this;jQuery(document).on("keydown",function(t){e.keyDown(t,e)}),jQuery(document).on("keyup",function(t){e.keyUp(t,e)}),i.channel("app").reply("get:keydown",this.getKeyDown,this)},keyDown:function(e,t){t.keys[e.keyCode]=e.keyCode},keyUp:function(e,t){-1!=t.keys.indexOf(e.keyCode)&&delete t.keys[e.keyCode]},getKeyDown:function(){return this.keys}});return e}),n("controllers/app/perfectScroll",[],function(){var e=Marionette.Object.extend({movedPos:!1,initialize:function(){this.listenTo(i.channel("main"),"show:main",this.initPerfectScroll),this.listenTo(i.channel("drawer"),"opened",this.moveRail),this.listenTo(i.channel("drawer"),"before:closeDrawer",this.resetRail)},initPerfectScroll:function(e){i.channel("app").request("is:mobile")||jQuery(e.el).parent().perfectScrollbar({suppressScrollX:!0}),jQuery("head").append('<style id="ps-scrollbar-css" type="text/css"></style>')},moveRail:function(){var e=i.channel("app").request("get:drawerEl"),t=jQuery(e).outerWidth();jQuery("#ps-scrollbar-css").text(".ps-scrollbar-moved { right: "+t+"px !important; } "),jQuery("#nf-main .ps-scrollbar-y-rail").addClass("ps-scrollbar-moved ")},resetRail:function(){jQuery(".ps-scrollbar-y-rail").removeClass("ps-scrollbar-moved ")}});return e}),n("models/app/settingGroupModel",["models/app/settingCollection"],function(e){var t=Backbone.Model.extend({defaults:{display:!1},initialize:function(t){0==this.get("settings")instanceof Backbone.Collection&&this.set("settings",new e(this.get("settings")))}});return t}),n("models/app/settingGroupCollection",["models/app/settingGroupModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/app/getNewSettingGroupCollection",["models/app/settingGroupCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){i.channel("app").reply("get:settingGroupCollectionDefinition",this.getNewSettingGroupCollection,this)},getNewSettingGroupCollection:function(){return e}});return t}),n("controllers/app/settingMedia",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-media"),"click:extra",this.clickExtra)},clickExtra:function(e,t,n,i){var r=jQuery(e.target).parent().find(".setting");if(jQuery(e.target).hasClass("open-media-manager")){if(this.meta_image_frame)return void this.meta_image_frame.open();this.meta_image_frame=wp.media.frames.meta_image_frame=wp.media({title:"Select a file",button:{text:"insert"}});var a=this;this.meta_image_frame.on("select",function(){var e=a.meta_image_frame.state().get("selection").first().toJSON();r.val(e.url).change()}),this.meta_image_frame.open()}}});return e}),n("models/app/typeModel",["models/app/settingGroupCollection"],function(e){var t=Backbone.Model.extend({initialize:function(){!1==this.get("settingGroups")instanceof Backbone.Collection&&this.set("settingGroups",new e(this.get("settingGroups"))),i.channel("fields").trigger("init:typeModel",this)}});return t}),n("models/app/typeCollection",["models/app/typeModel"],function(e){var t=Backbone.Collection.extend({model:e,type:!1,initialize:function(e,t){_.each(t,function(e,t){this[t]=e},this)}});return t}),n("models/fields/typeSectionModel",[],function(){var e=Backbone.Model.extend({defaults:{classes:""}});return e}),n("models/fields/typeSectionCollection",["models/fields/typeSectionModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/fields/types",["models/app/typeCollection","models/fields/typeSectionCollection"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.sections=new t(fieldTypeSections),this.listenTo(i.channel("fields"),"init:typeModel",this.registerSection),this.collection=new e(fieldTypeData,{type:"fields"}),i.channel("fields").reply("get:type",this.getFieldType,this),i.channel("fields").reply("get:typeCollection",this.getTypeCollection,this),i.channel("fields").reply("get:typeSections",this.getTypeSections,this),i.channel("fields").reply("get:savedFields",this.getSavedFields,this),this.listenTo(i.channel("drawer"),"click:fieldType",this.addField)},registerSection:function(e){"fields"==e.collection.type&&e.get("section")&&this.sections.get(e.get("section")).get("fieldTypes").push(e.get("id"))},getFieldType:function(e){return this.collection.get(e)},getTypeCollection:function(e){return this.collection},addField:function(e){var t=jQuery(e.target).data("id");if(e.shiftKey)return void i.channel("fields").request("add:stagedField",t);var n=i.channel("fields").request("add",{type:t,label:i.channel("fields").request("get:type",t).get("nicename")}),r={object:"Field",label:n.get("label"),change:"Added",dashicon:"plus-alt"},a={ 5 collection:i.channel("fields").request("get:collection")};i.channel("changes").request("register:change","addObject",n,null,r,a),i.channel("fields").request("redraw:collection")},getTypeSections:function(){return this.sections},getSavedFields:function(){this.sections.get("saved")}});return n}),n("controllers/fields/fieldTypeDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:type",this.startDrag),this.listenTo(i.channel("drawer-addField"),"stopDrag:type",this.stopDrag),i.channel("drawer-addField").reply("get:typeHelperClone",this.getCurrentDraggableHelperClone,this)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important"),this.draggableHelperClone=jQuery(t.helper).clone()},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")},getCurrentDraggableHelperClone:function(){return this.draggableHelperClone}});return e}),n("controllers/fields/stagingDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:fieldStaging",this.startDrag),this.listenTo(i.channel("drawer-addField"),"stopDrag:fieldStaging",this.stopDrag)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important");var n=i.channel("fields").request("get:staging"),r=i.channel("app").request("get:template","#tmpl-nf-staged-fields-drag");jQuery(t.helper).html(r({num:n.models.length})),jQuery(t.helper).prop("id","nf-staged-fields-drag"),jQuery(t.item).css("opacity","0.7")},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")}});return e}),n("controllers/fields/staging",["models/fields/stagingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e,i.channel("fields").reply("add:stagedField",this.addStagedField,this),i.channel("fields").reply("remove:stagedField",this.removeStagedField,this),i.channel("fields").reply("get:staging",this.getStagingCollection,this),i.channel("fields").reply("sort:staging",this.sortStagedFields,this),i.channel("fields").reply("clear:staging",this.clearStagedFields,this),this.listenTo(i.channel("drawer-addField"),"click:removeStagedField",this.removeStagedField),this.listenTo(i.channel("drawer-addField"),"before:closeDrawer",this.beforeCloseDrawer)},getStagingCollection:function(){return this.collection},addStagedField:function(e,t){var t=t||!1,n=i.channel("fields").request("get:type",e),r="nf-staged-field-"+jQuery.now(),a={id:r,slug:n.get("type"),nicename:n.get("nicename"),icon:n.get("icon")},s=this.collection.add(a);return t||i.channel("fields").trigger("add:stagedField",s),r},removeStagedField:function(e,t){this.collection.remove(t),i.channel("fields").trigger("remove:stagedField",t)},beforeCloseDrawer:function(){if(0!=this.collection.models.length){var e=i.channel("fields").request("get:collection");_.each(this.collection.models,function(t){var n=i.channel("fields").request("get:tmpID"),r={id:n,label:t.get("nicename"),type:t.get("slug")},a=i.channel("fields").request("add",r,!1),s={object:"Field",label:a.get("label"),change:"Added",dashicon:"plus-alt"},o={collection:e};i.channel("changes").request("register:change","addObject",a,null,s,o)}),e.trigger("reset",e),this.collection.reset()}i.channel("fields").request("sort:fields",null,null,!1)},sortStagedFields:function(){var e=i.channel("app").request("get:stagedFieldsEl"),t=jQuery(e).sortable("toArray");_.each(this.collection.models,function(e){var n=e.get("id"),i=t.indexOf(n);e.set("order",i)}),this.collection.sort()},clearStagedFields:function(){this.collection.reset()}});return t}),n("controllers/fields/stagingSortable",["models/fields/stagingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"receive:stagedFields",this.receiveStagedFields),this.listenTo(i.channel("drawer-addField"),"over:stagedFields",this.overStagedFields),this.listenTo(i.channel("drawer-addField"),"out:stagedFields",this.outStagedFields),this.listenTo(i.channel("drawer-addField"),"start:stagedFields",this.startStagedFields),this.listenTo(i.channel("drawer-addField"),"stop:stagedFields",this.stopStagedFields)},receiveStagedFields:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.item).data("id"),n=i.channel("fields").request("add:stagedField",t);jQuery(e.helper).prop("id",n),i.channel("fields").request("sort:staging"),jQuery(e.helper).remove(),i.channel("drawer-addField").trigger("drop:fieldType",t)}},addActiveClass:function(){var e=i.channel("app").request("get:stagedFieldsEl");jQuery(e).addClass("nf-droppable-active")},removeActiveClass:function(){var e=i.channel("app").request("get:stagedFieldsEl");jQuery(e).removeClass("nf-droppable-active")},overStagedFields:function(e,t){if(jQuery(t.item).hasClass("nf-field-type-draggable")){var n=jQuery(t.item).data("id"),r=i.channel("fields").request("get:type",n),a=r.get("nicename");this.currentHelper=t.helper,jQuery(t.helper).html(a+'<span class="dashicons dashicons-dismiss"></span>'),jQuery(t.helper).removeClass("nf-field-type-button").addClass("nf-item-dock").css({opacity:"0.8",width:"",height:""});var s=i.channel("app").request("get:stagedFieldsEl");jQuery(s).hasClass("ui-sortable")&&jQuery(s).addClass("nf-droppable-hover")}},outStagedFields:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=i.channel("drawer-addField").request("get:typeHelperClone");jQuery(this.currentHelper).html(jQuery(t).html()),jQuery(this.currentHelper).removeClass("nf-item-dock").addClass("nf-field-type-button");var n=i.channel("app").request("get:stagedFieldsEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}},startStagedFields:function(e){jQuery(e.item).show(),jQuery(e.item).css({display:"inline",opacity:"0.7"}),jQuery(e.helper).css("opacity","0.5")},stopStagedFields:function(e){jQuery(e.item).css("opacity",""),jQuery(e.helper).remove()}});return t}),n("controllers/fields/filterTypes",["models/fields/typeSectionCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"change:filter",this.filterFieldTypes)},filterFieldTypes:function(t,n){if(""!=jQuery.trim(t)){var r=[];_.each(this.filterCollection(t),function(e){r.push(e.get("id"))});var a=new e([{id:"filtered",nicename:"Filtered Fields",fieldTypes:r}]);i.channel("drawer").trigger("filter:fieldTypes",a),"undefined"!=typeof n&&n.addObject&&0<r.length&&(i.channel("fields").request("add:stagedField",r[0]),i.channel("drawer").request("clear:filter"))}else i.channel("drawer").trigger("clear:filter")},filterCollection:function(e){e=e.toLowerCase();var t=i.channel("fields").request("get:typeCollection"),n=t.filter(function(t){var n=!1;return t.get("type").toLowerCase().indexOf(e)!=-1?n=!0:t.get("nicename").toLowerCase().indexOf(e)!=-1&&(n=!0),t.get("tags")&&0==e.indexOf("#")&&_.each(t.get("tags"),function(t){e.replace("#","").length>1&&t.toLowerCase().indexOf(e.replace("#",""))!=-1&&(n=!0)}),t.get("alias")&&_.each(t.get("alias"),function(t){t.toLowerCase().indexOf(e)!=-1&&(n=!0)}),n});return n}});return t}),n("controllers/fields/sortable",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:type",this.addActiveClass),this.listenTo(i.channel("drawer-addField"),"stopDrag:type",this.removeActiveClass),this.listenTo(i.channel("drawer-addField"),"startDrag:fieldStaging",this.addActiveClass),this.listenTo(i.channel("drawer-addField"),"stopDrag:fieldStaging",this.removeActiveClass),i.channel("app").reply("receive:fieldsSortable",this.receiveFieldsSortable,this),i.channel("app").reply("over:fieldsSortable",this.overfieldsSortable,this),i.channel("app").reply("out:fieldsSortable",this.outFieldsSortable,this),i.channel("app").reply("stop:fieldsSortable",this.stopFieldsSortable,this),i.channel("app").reply("start:fieldsSortable",this.startFieldsSortable,this),i.channel("app").reply("update:fieldsSortable",this.updateFieldsSortable,this)},addActiveClass:function(){var e=i.channel("fields").request("get:sortableEl");jQuery(e).addClass("nf-droppable-active")},removeActiveClass:function(){var e=i.channel("fields").request("get:sortableEl");jQuery(e).removeClass("nf-droppable-active")},receiveFieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.item).data("id"),n=this.addField(t,!1);jQuery(e.helper).prop("id",n),i.channel("fields").request("sort:fields"),jQuery(e.helper).remove(),i.channel("fields").trigger("drop:fieldType",t,n)}else if(jQuery(e.item).hasClass("nf-stage")){var r=this;i.channel("fields").request("sort:staging");var a=i.channel("fields").request("get:staging"),s=i.channel("fields").request("get:sortableEl");if(jQuery(s).hasClass("ui-sortable"))var o=jQuery(s).sortable("toArray");else var o=["nf-staged-fields-drag"];var l=o.indexOf("nf-staged-fields-drag");_.each(a.models,function(e,t){var n=r.addField(e.get("slug"));o.splice(l+t,0,n)});var l=o.indexOf("nf-staged-fields-drag");o.splice(l,1),i.channel("fields").request("sort:fields",o),i.channel("fields").request("clear:staging"),jQuery(e.helper).remove()}},addField:function(e,t){t=t||!1;var n=i.channel("fields").request("get:type",e),r=i.channel("fields").request("get:tmpID"),a=i.channel("fields").request("add",{id:r,label:n.get("nicename"),type:e},t),s={object:"Field",label:a.get("label"),change:"Added",dashicon:"plus-alt"},o={collection:i.channel("fields").request("get:collection")};return i.channel("changes").request("register:change","addObject",a,null,s,o),r},overfieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.helper).data("id"),n=i.channel("fields").request("get:type",t),r=n.get("nicename"),a=i.channel("fields").request("get:sortableEl"),s=jQuery(a).width();this.currentHelper=e.helper,jQuery(e.helper).html(r),jQuery(e.helper).removeClass("nf-field-type-button").addClass("nf-field-wrap").css({width:s,height:"50px"}),jQuery(a).hasClass("ui-sortable")&&jQuery(a).addClass("nf-droppable-hover")}else if(jQuery(e.item).hasClass("nf-stage")){var a=i.channel("fields").request("get:sortableEl");jQuery(a).hasClass("ui-sortable")&&jQuery(a).addClass("nf-droppable-hover")}},outFieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=i.channel("drawer-addField").request("get:typeHelperClone");jQuery(this.currentHelper).html(jQuery(t).html()),jQuery(this.currentHelper).removeClass("nf-field-wrap").addClass("nf-field-type-button").css({width:"",height:""});var n=i.channel("fields").request("get:sortableEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}else if(jQuery(e.item).hasClass("nf-stage")){var n=i.channel("fields").request("get:sortableEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}},stopFieldsSortable:function(e){jQuery(e.item).css("opacity",""),jQuery(e.helper).remove(),i.channel("fields").trigger("sortable:stop",e)},startFieldsSortable:function(e){jQuery(e.item).hasClass("nf-field-type-draggable")||jQuery(e.item).hasClass("nf-stage")||jQuery(e.item).css("opacity","0.5").show(),i.channel("fields").trigger("sortable:start",e)},updateFieldsSortable:function(e,t){if(i.channel("fields").request("sort:fields"),!jQuery(e.item).hasClass("nf-field-type-draggable")&&!jQuery(e.item).hasClass("nf-stage")){var n=i.channel("fields").request("get:collection"),r=jQuery(e.item).prop("id").replace("field-",""),a=n.get(r),s={fields:[]};_.each(n.models,function(e){var t=e._previousAttributes.order,n=e.get("order");s.fields.push({model:e,attr:"order",before:t,after:n})});var o={object:"Field",label:a.get("label"),change:"Re-ordered from "+a._previousAttributes.order+" to "+a.get("order"),dashicon:"sort"};i.channel("changes").request("register:change","sortFields",a,null,o,s)}}});return e}),n("controllers/fields/data",["models/fields/fieldCollection","models/fields/fieldModel"],function(e,t){var n=Marionette.Object.extend({adding:!1,removing:!1,initialize:function(){this.collection=new e(preloadedFormData.fields),this.collection.removedIDs={},i.channel("fields").reply("get:collection",this.getFieldCollection,this),i.channel("fields").reply("get:field",this.getField,this),i.channel("fields").reply("redraw:collection",this.redrawFieldCollection,this),i.channel("fields").reply("get:tmpID",this.getTmpFieldID,this),i.channel("fields").reply("add",this.addField,this),i.channel("fields").reply("delete",this.deleteField,this),i.channel("fields").reply("sort:fields",this.sortFields,this),i.channel("fields").reply("get:adding",this.getAdding,this),i.channel("fields").reply("set:adding",this.setAdding,this),i.channel("fields").reply("get:removing",this.getRemoving,this),i.channel("fields").reply("set:removing",this.setRemoving,this)},getFieldCollection:function(){return this.collection},redrawFieldCollection:function(){this.collection.trigger("reset",this.collection)},getField:function(e){return this.collection.findWhere({key:e})?this.collection.findWhere({key:e}):this.collection.get(e)},addField:function(e,n,r,a){if(i.channel("fields").request("set:adding",!0),n=n||!1,a=a||"",r="undefined"==typeof r||r,!1==e instanceof Backbone.Model){"undefined"==typeof e.id&&(e.id=this.getTmpFieldID());var s=new t(e)}else var s=e;if(jQuery.isNumeric(s.get("type"))){var o=i.channel("fields").request("get:type",s.get("type"));s.set("type",o.get("parentType"))}var l=this.collection.add(s,{silent:n});return i.channel("app").request("update:setting","clean",!1),i.channel("fields").trigger("add:field",s),r&&i.channel("fields").trigger("render:newField",l,a),i.channel("fields").trigger("after:addField",s),s},updateFieldSetting:function(e,t,n){var i=this.collection.get(e);i.set(t,n)},sortFields:function(e,t,n){null==n&&(n=!0);var r=i.channel("fields").request("get:sortableEl");if(jQuery(r).hasClass("ui-sortable")){var e=e||jQuery(r).sortable("toArray");_.each(this.collection.models,function(t){var n=(t.get("order"),t.get("id"));if(jQuery.isNumeric(n))var i="field-"+n;else var i=n;var r=e.indexOf(i)+1;t.set("order",r)}),this.collection.sort(),n&&(i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db"))}},deleteField:function(e){i.channel("fields").trigger("delete:field",e),this.removing=!0,this.collection.remove(e),i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db")},getTmpFieldID:function(){var e=this.collection.tmpNum;return this.collection.tmpNum++,"tmp-"+e},getAdding:function(){return this.adding},setAdding:function(e){this.adding=e},getRemoving:function(){return this.removing},setRemoving:function(e){this.removing=e}});return n}),n("models/app/optionRepeaterModel",[],function(){var e=Backbone.Model.extend({defaults:{errors:{}},initialize:function(){this.on("change:errors",this.changeErrors,this)},changeErrors:function(e){if(0==_.size(e.get("errors"))){var t=!1;_.each(e.collection.models,function(e){0!=_.size(e.get("errors"))&&(t=!0)}),t||e.collection.settingModel.set("error",!1)}else e.collection.settingModel.set("error",!0)}});return e}),n("models/app/optionRepeaterCollection",["models/app/optionRepeaterModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order",initialize:function(e,t){this.on("sort",this.changeCollection,this),this.on("add",this.addOption,this),this.settingModel=t.settingModel},changeCollection:function(){i.channel("option-repeater").trigger("sort:options",this),i.channel("option-repeater-"+this.settingModel.get("name")).trigger("sort:options",this)},addOption:function(e,t){e.set("settingModel",this.settingModel)}});return t}),n("views/app/drawer/optionRepeaterError",[],function(){var e=Marionette.ItemView.extend({tagName:"div",className:"nf-error",template:"#tmpl-nf-edit-setting-option-repeater-error",templateHelpers:function(){var e=this;return{renderErrors:function(){return"undefined"!=typeof e.errors?e.errors[Object.keys(errors)[0]]:""}}}});return e}),n("views/app/drawer/optionRepeaterOption",["views/app/drawer/optionRepeaterError"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",className:"nf-table-row",template:"#tmpl-nf-edit-setting-option-repeater-default-row",id:function(){return this.model.cid},regions:{error:".nf-option-error"},initialize:function(e){this.settingModel=e.settingModel,this.dataModel=e.dataModel,this.collection=e.collection,this.columns=e.columns,this.parentView=e.parentView,this.model.on("change:errors",this.renderErrors,this),"undefined"!=typeof this.settingModel.get("tmpl_row")&&(this.template="#"+this.settingModel.get("tmpl_row")),this.hasErrors=!1},onBeforeDestroy:function(){this.model.off("change",this.render),this.model.off("change:errors",this.renderErrors)},onBeforeRender:function(){if(this.model.get("label")){var e=this.model.get("label");this.model.set("label",_.escape(e),{silent:!0})}},onRender:function(){if(i.channel("mergeTags").request("init",this),i.channel("setting-"+this.settingModel.get("name")+"-option").trigger("render:setting",this.model,this.dataModel,this),this.model.get("label")){var e=this.model.get("label");this.model.set("label",_.unescape(e),{silent:!0})}},onShow:function(){this.model.get("new")&&(jQuery(this.el).find("input:first").focus(),this.model.set("new",!1))},events:{"change .setting":"changeOption","click .nf-delete":"deleteOption",keyup:"keyupOption"},changeOption:function(e){i.channel("option-repeater").trigger("change:option",e,this.model,this.dataModel,this.settingModel,this)},deleteOption:function(e){i.channel("option-repeater").trigger("click:deleteOption",this.model,this.collection,this.dataModel,this)},keyupOption:function(e){this.maybeAddOption(e),i.channel("option-repeater").trigger("keyup:option",e,this.model,this.dataModel,this.settingModel,this),i.channel("option-repeater-"+this.settingModel.get("name")).trigger("keyup:option",e,this.model,this.dataModel,this.settingModel,this)},maybeAddOption:function(e){13==e.keyCode&&(i.channel("option-repeater").trigger("click:addOption",this.collection,this.dataModel,this),jQuery(this.parentView.children.findByIndex(this.parentView.children.length-1).el).find('[data-id="label"]').focus())},renderErrors:function(){0==Object.keys(this.model.get("errors"))?this.hasErrors&&(this.error.empty(),jQuery(this.el).removeClass("nf-error")):(this.hasErrors=!0,this.error.show(new e({model:this.model})),jQuery(this.el).addClass("nf-error"))},templateHelpers:function(){var e=this;return{getColumns:function(){return e.columns},renderFieldSelect:function(e,t){var n=i.channel("fields").request("get:collection"),r='<label class="nf-select"><select class="setting" data-id="'+e+'">';return n.each(function(e){var n=t==e.get("key")?" selected":"";r+='<option value="'+e.get("key")+'"'+n+">"+e.get("label")+"</option>"}),r+="</select><div></div></label>"},renderOptions:function(t,n){if("undefined"!=typeof e.options.columns[t]){var i="";return _.each(e.options.columns[t].options,function(e){var t=n==e.value?" selected":"";i+='<option value="'+e.value+'"'+t+">"+e.label+"</option>"}),i}}}}});return t}),n("views/app/drawer/optionRepeaterEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"tr",template:"#tmpl-nf-edit-setting-option-repeater-empty"});return e}),n("views/app/drawer/optionRepeaterComposite",["views/app/drawer/optionRepeaterOption","views/app/drawer/optionRepeaterEmpty","models/app/optionRepeaterCollection"],function(e,t,n){var r=Marionette.CompositeView.extend({template:"#tmpl-nf-edit-setting-option-repeater-wrap",childView:e,emptyView:t,reorderOnSort:!1,initialize:function(e){var t=e.dataModel.get(this.model.get("name"));0==t instanceof Backbone.Collection&&(t=new n([],{settingModel:this.model}),t.add(e.dataModel.get(this.model.get("name"))),e.dataModel.set(this.model.get("name"),t,{silent:!0})),this.collection=t,this.dataModel=e.dataModel,this.childViewOptions={parentView:this,settingModel:this.model,collection:this.collection,dataModel:e.dataModel,columns:this.model.get("columns")};var i=this.model.get("deps");if(i)for(var r in i)i.hasOwnProperty(r)&&this.dataModel.on("change:"+r,this.render,this)},onBeforeDestroy:function(){var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render)},onRender:function(){var e=this;jQuery(this.el).find(".nf-list-options-tbody").sortable({handle:".handle",helper:"clone",placeholder:"nf-list-options-sortable-placeholder",forcePlaceholderSize:!0,opacity:.95,tolerance:"pointer",start:function(e,t){i.channel("option-repeater").request("start:optionSortable",t)},stop:function(e,t){i.channel("option-repeater").request("stop:optionSortable",t)},update:function(t,n){i.channel("option-repeater").request("update:optionSortable",n,this,e)}}),i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this)},onAttach:function(){var e=jQuery(this.el).find(".nf-open-import-tooltip"),t=jQuery(e).jBox("Tooltip",{title:"<h3>Please enter your options below:</h3>",content:jQuery(this.el).find(".nf-import-options"),trigger:"click",closeOnClick:"body",closeButton:"box",offset:{x:20,y:0},addClass:"import-options",onOpen:function(){var e=this;setTimeout(function(){jQuery(e.content).find("textarea").focus()},200)}});jQuery(this.el).find(".nf-import").on("click",{view:this,jBox:t},this.clickImport),i.channel("setting-"+this.model.get("name")).trigger("attach:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("attach:setting",this.model,this.dataModel,this)},templateHelpers:function(){var e=this;return{renderHeaders:function(){var e="<div> </div>";return _.each(this.columns,function(t){e+="<div>"+t.header+"</div>"}),e+="<div> </div>"},renderSetting:function(){var e=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return e(this)},renderClasses:function(){var e="";return e+="undefined"!=typeof this.width?this.width:" one-half",this.error&&(e+=" nf-error"),e},renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!==this.deps[t])return'style="display:none;"';return""},renderError:function(){return this.error?this.error:""},renderFieldsetClasses:function(){return e.model.get("name")},currencySymbol:function(){return i.channel("settings").request("get:setting","currency")||nfi18n.currency_symbol}}},attachHtml:function(e,t){jQuery(e.el).find(".nf-list-options-tbody").append(t.el),i.channel("mergeTags").request("init",this)},events:{"click .nf-add-new":"clickAddOption","click .extra":"clickExtra"},clickAddOption:function(e){i.channel("option-repeater").trigger("click:addOption",this.collection,this.dataModel),jQuery(this.children.findByIndex(this.children.length-1).el).find('[data-id="label"]').focus()},clickExtra:function(e){i.channel("option-repeater").trigger("click:extra",e,this.collection,this.dataModel),i.channel("option-repeater-"+this.model.get("name")).trigger("click:extra",e,this.model,this.collection,this.dataModel)},clickImport:function(e){var t=jQuery(e.data.jBox.content).find("textarea"),n=t.val().trimLeft().trimRight();if(0==n.length)return e.data.jBox.close(),!1;var r=n.split(/\n/);_.isArray(r)&&_.each(r,function(t){var n=t.split(","),r=n[0],a=n[1]||jQuery.slugify(r,{separator:"-"}),s=n[2]||"";r=r.trimLeft().trimRight(),a=a.trimLeft().trimRight(),s=s.trimLeft().trimRight();var o=e.data.view.collection.add({label:n[0],value:a,calc:s}),r={object:"field",label:n[0],change:"Option Added",dashicon:"plus-alt"};i.channel("changes").request("register:change","addListOption",o,null,r),i.channel("option-repeater-"+e.data.view.model.get("name")).trigger("add:option",o),i.channel("option-repeater").trigger("add:option",o),i.channel("app").trigger("update:setting",o)},this),t.val(""),e.data.jBox.close()}});return r}),n("controllers/app/optionRepeater",["models/app/optionRepeaterModel","models/app/optionRepeaterCollection","views/app/drawer/optionRepeaterComposite"],function(e,t,n){var r=Marionette.Object.extend({initialize:function(){i.channel("option-repeater").reply("get:settingChildView",this.getSettingChildView,this),this.listenTo(i.channel("option-repeater"),"change:option",this.changeOption),this.listenTo(i.channel("option-repeater"),"click:addOption",this.addOption),this.listenTo(i.channel("option-repeater"),"click:deleteOption",this.deleteOption),i.channel("option-repeater").reply("update:optionSortable",this.updateOptionSortable,this),i.channel("option-repeater").reply("stop:optionSortable",this.stopOptionSortable,this),i.channel("option-repeater").reply("start:optionSortable",this.startOptionSortable,this),this.listenTo(i.channel("option-repeater"),"init:dataModel",this.convertSettings)},changeOption:function(e,t,n,r,a){var s=jQuery(e.target).data("id");if("selected"==s)if(jQuery(e.target).attr("checked"))var o=1;else var o=0;else var o=jQuery(e.target).val();var l=t.get(s);t.set(s,o),this.triggerDataModel(t,n);var c=o,d={attr:s,before:l,after:c},h={object:n.get("objectType"),label:n.get("label"),change:"Option "+t.get("label")+" "+s+" changed from "+l+" to "+c};i.channel("changes").request("register:change","changeSetting",t,d,h),i.channel("option-repeater").trigger("update:option",t,n,r,a),i.channel("option-repeater-option-"+s).trigger("update:option",e,t,n,r,a),i.channel("option-repeater-"+r.get("name")).trigger("update:option",t,n,r,a)},addOption:function(t,n){var r={order:t.length,new:!0,options:{}};_.each(t.settingModel.get("columns"),function(e,t){r[t]=e.default,"undefined"!=typeof e.options&&(r.options[t]=e.options)});var a=new e(r);t.add(a);var s={object:n.get("objectType"),label:n.get("label"),change:"Option Added",dashicon:"plus-alt"};i.channel("changes").request("register:change","addListOption",a,null,s),i.channel("option-repeater-"+t.settingModel.get("name")).trigger("add:option",a),i.channel("option-repeater").trigger("add:option",a),this.triggerDataModel(a,n)},deleteOption:function(e,t,n){var r=i.channel("app").request("clone:modelDeep",e),a={object:n.get("objectType"),label:n.get("label"),change:"Option "+r.get("label")+" Removed",dashicon:"dismiss"},s={collection:t};i.channel("changes").request("register:change","removeListOption",r,null,a,s);var o=i.channel("changes").request("get:collection"),l=o.where({model:e});_.each(l,function(e){"object"==typeof e.get("data")&&_.each(e.get("data"),function(e){e.model==e&&(e.model=r)}),e.set("model",r),e.set("disabled",!0)}),t.remove(e),i.channel("option-repeater").trigger("remove:option",e),i.channel("option-repeater-"+t.settingModel.get("name")).trigger("remove:option",e),this.triggerDataModel(e,n)},triggerDataModel:function(e,t){i.channel("app").trigger("update:setting",e)},getSettingChildView:function(e){return n},updateOptionSortable:function(e,t,n){var r=jQuery(t).sortable("toArray"),a=n.collection.get({cid:jQuery(e.item).prop("id")}),s={collection:n.collection,objModels:[]};_.each(r,function(e,t){var i=n.collection.get({cid:e}),r=i.get("order");i.set("order",t);var a=t;s.objModels.push({model:i,attr:"order",before:r,after:a})}),n.collection.sort({silent:!0});var o={object:n.dataModel.get("objectType"),label:n.dataModel.get("label"),change:"Option "+a.get("label")+" re-ordered from "+a._previousAttributes.order+" to "+a.get("order"),dashicon:"sort"};i.channel("changes").request("register:change","sortListOptions",a,null,o,s),this.triggerDataModel(a,n.dataModel),i.channel("option-repeater").trigger("sort:option",a,n),i.channel("option-repeater-"+n.model.get("name")).trigger("sort:option",a,n)},stopOptionSortable:function(e){jQuery(e.item).css("opacity","")},startOptionSortable:function(e){jQuery(e.placeholder).find("div").remove(),jQuery(e.item).css("opacity","0.5").show()},convertSettings:function(e,n){var i=e.get(n.get("name"));0==i instanceof Backbone.Collection&&(i=new t([],{settingModel:n}),i.add(e.get(n.get("name"))),e.set(n.get("name"),i,{silent:!0}))}});return r}),n("controllers/fields/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("fields").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("fields").request("get:collection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/fields/fieldSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(fieldSettings,{objectType:"fields"}),i.channel("fields").reply("get:settingModel",this.getSettingModel,this),i.channel("fields").reply("get:settingCollection",this.getSettingCollection,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})},getSettingCollection:function(){return this.collection}});return t}),n("controllers/fields/fieldCreditCard",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"after:addField",this.dropCreditCardField)},dropCreditCardField:function(e){if("creditcard"==e.get("type")){var t=e.get("order");i.channel("fields").request("delete",e),_.each(["creditcardfullname","creditcardnumber","creditcardcvc","creditcardexpiration","creditcardzip"],function(e){var n=i.channel("fields").request("get:type",e),r={id:i.channel("fields").request("get:tmpID"),type:e,label:n.get("nicename"),order:t};i.channel("fields").request("add",r)})}},stageCreditCardField:function(e){"creditcard"==e.get("slug")&&(i.channel("fields").request("remove:stagedField","",e),_.each(["creditcardfullname","creditcardnumber","creditcardcvc","creditcardexpiration","creditcardzip"],function(e){i.channel("fields").request("add:stagedField",e)}))}});return e}),n("controllers/fields/fieldList",["models/app/optionRepeaterCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("option-repeater-option-label"),"update:option",this.updateOptionLabel),this.listenTo(i.channel("option-repeater-option-value"),"update:option",this.updateOptionValue),this.listenTo(i.channel("fields-list"),"init:fieldModel",this.convertOptions)},updateOptionLabel:function(e,t,n,i,r){"list"==_.findWhere(fieldTypeData,{id:n.get("type")}).parentType&&(t.get("manual_value")||(value=jQuery.slugify(t.get("label"),{separator:"-"}),t.set("value",value),t.trigger("change",t),jQuery(r.el).find('[data-id="value"]').focus().select()))},updateOptionValue:function(e,t,n,i,r){var a=_.findWhere(fieldTypeData,{id:n.get("type")});"undefined"!=typeof a&&"list"==a.parentType&&(t.set("manual_value",!0),jQuery(r.el).find('[data-id="calc"]').focus().select())},convertOptions:function(t){var n=t.get("options"),r=i.channel("fields").request("get:settingModel","options");0==n instanceof Backbone.Collection&&(n=new e([],{settingModel:r}),n.add(t.get("options")),t.set("options",n,{silent:!0}))}});return t}),n("controllers/fields/fieldPassword",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"after:addField",this.addField)},addField:function(e){if("password"==e.get("type")){var t=e.get("order"),n=this.insertField("passwordconfirm",t+1);n.set("confirm_field",e.get("key"))}},insertField:function(e,t){var n=i.channel("fields").request("get:type",e),r={id:i.channel("fields").request("get:tmpID"),type:e,label:n.get("nicename"),order:t};return i.channel("fields").request("add",r)}});return e}),n("controllers/fields/fieldQuantity",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting); 6 },beforeRenderSetting:function(e,t,n){if("product_assignment"==e.get("name")){var i=this.getProductFields(e);e.set("options",i)}},getProductFields:function(e){var t=[e.get("select_product")],n=i.channel("fields").request("get:collection");return _.each(n.models,function(e){"product"==e.get("type")&&t.push({label:e.get("label"),value:e.get("id")})}),t}});return e}),n("controllers/fields/fieldShipping",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-shipping_options"),"render:setting",this.addMask),this.listenTo(i.channel("setting-shipping_options-option"),"render:setting",this.addMask)},addMask:function(e,t,n){jQuery(n.el).find('[data-id="value"]').each(function(){jQuery(this).autoNumeric({aSign:"$",aSep:thousandsSeparator,aDec:decimalPoint})})}});return e}),n("controllers/fields/key",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"add:field",this.newFieldKey),this.listenTo(i.channel("fieldSetting-label"),"update:setting",this.updateLabel),this.listenTo(i.channel("fieldSetting-key"),"update:setting",this.updateKey),this.listenTo(i.channel("setting-key"),"keyup:setting",this.keyUp)},newFieldKey:function(e){var t=new Date,n=t.valueOf(),i=this.slugify(e.get("type")+"_"+n);e.set("key",i,{silent:!0}),"undefined"==e.get("manual_key")&&e.set("manual_key",!1,{silent:!0})},updateLabel:function(e){if(!e.get("manual_key")&&0!=jQuery.trim(e.get("label")).length){delete e.changed.label;var t=new Date,n=t.valueOf(),i=this.slugify(e.get("label")+"_"+n);e.set("key",i)}},updateKey:function(e){var t=e.get("key");this.settingModel=i.channel("fields").request("get:settingModel","key"),this.setError(t,e)},keyUp:function(e,t,n){n.set("manual_key",!0),this.settingModel=t;var i=jQuery(e.target).val();this.setError(i,n)},setError:function(e,t){var n=!1;""==jQuery.trim(e)?n="Field keys can't be empty. Please enter a key.":e!=e.toLowerCase()?n="Field keys must be lowercase.":e!=e.replace(" ","_")?n='Field keys must cannot use spaces. Separate with "_" instead.':"_"==e.slice(-1)?n='Field keys cannot end with a "_"':e!=this.slugify(e)?n="Invalid Format.":e!=this.keyExists(e,t)&&(n="Field keys must be unique. Please enter another key."),n?this.settingModel.set("error",n):(i.channel("app").trigger("update:fieldKey",t),this.settingModel.set("error",!1))},keyExists:function(e,t){var n=this.slugify(e);0!=n.length&&(e=n);var r=i.channel("fields").request("get:collection"),a=1,s=e;return _.each(r.models,function(n){t!=n&&s==n.get("key")&&(s=e+"_"+a,a++)}),e=s},slugify:function(e){return jQuery.slugify(e,{separator:"_"})}});return e}),n("controllers/fields/notices",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"add:stagedField",this.addStagedField)},addStagedField:function(e){i.channel("notices").request("add","addStagedField",e.get("nicename")+" added to staging")}});return e}),n("controllers/fields/mobile",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"sortable:start",this.startWiggle),this.listenTo(i.channel("fields"),"sortable:stop",this.stopWiggle)},initWiggle:function(e){i.channel("app").request("is:mobile")&&jQuery(e.el).find(".nf-field-wrap").on("taphold",function(){jQuery(this).ClassyWiggle("start",{degrees:[".65","1",".65","0","-.65","-1","-.65","0"],delay:50})})},startWiggle:function(e){i.channel("app").request("is:mobile")&&(jQuery(e.item).removeClass("ui-sortable-helper").ClassyWiggle("stop"),jQuery(e.helper).css("opacity","0.75").ClassyWiggle("start",{degrees:[".5","1",".5","0","-.5","-1","-.5","0"]}))},stopWiggle:function(e){i.channel("app").request("is:mobile")&&(jQuery(e.helper).ClassyWiggle("stop"),jQuery(e.item).removeClass("ui-sortable-helper drag-selected"))}});return e}),n("controllers/fields/savedFields",[],function(){var e=Marionette.Object.extend({ignoreAttributes:["editActive","order","saved","jBox"],initialize:function(){this.listenTo(i.channel("fields"),"update:setting",this.updateField),this.listenTo(i.channel("drawer"),"click:addSavedField",this.clickAddSavedField,this)},updateField:function(e){if(e.get("saved")){var t=!1,n=_.keys(e.changedAttributes()),i=this;_.each(n,function(e){-1==i.ignoreAttributes.indexOf(e)&&(t=!0)}),t&&e.set("saved",!1)}},clickAddSavedField:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r=n.attributes;r.saved=!0,delete r.jBox,delete r.editActive,delete r.created_at,delete r.order,delete r.id,delete r.formID,delete r.parent_id;var a=i.channel("fields").request("get:type",r.type),s=_.clone(a.attributes),o=jQuery(e.target).parent().parent().find("input").val();console.log(o),s.nicename=o,r.label=o,r.nicename=o,t.set("addSavedLoading",!0);var l=JSON.stringify(r);jQuery.post(ajaxurl,{action:"nf_create_saved_field",field:l,security:nfAdmin.ajaxNonce},function(e){e=JSON.parse(e),s.id=e.data.id,s.nicename=o,s.settingDefaults=r;var n=i.channel("fields").request("get:typeCollection"),a=(n.add(s),i.channel("fields").request("get:typeSections"));a.get("saved").get("fieldTypes").push(s.id),t.set("addSavedLoading",!1),t.unset("addSavedLoading",{silent:!0}),t.get("jBox").close(),i.channel("notices").request("add","addSaved","Saved Field Added")})}});return e}),n("controllers/fields/fieldDatepicker",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-datepicker"),"render:setting",this.addDatepicker)},addDatepicker:function(e,t,n){pikadayResponsive(jQuery(n.el).find(".setting")[0])}});return e}),n("controllers/fields/fieldDisplayCalc",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-calc_var"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t,n){},getProductFields:function(e){var t=[e.get("select_product")],n=i.channel("fields").request("get:collection");return _.each(n.models,function(e){"product"==e.get("type")&&t.push({label:e.get("label"),value:e.get("id")})}),t}});return e}),n("controllers/actions/types",["models/app/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.installedActions=new e(_.filter(actionTypeData,function(e){return"installed"==e.section}),{slug:"installed",nicename:nfi18n.installed}),this.availableActions=new e(_.filter(actionTypeData,function(e){return"available"==e.section}),{slug:"available",nicename:nfi18n.available}),i.channel("actions").reply("get:type",this.getType,this),i.channel("actions").reply("get:installedActions",this.getInstalledActions,this),i.channel("actions").reply("get:availableActions",this.getAvailableActions,this)},getType:function(e){var t=this.installedActions.get(e);return t||(t=this.availableActions.get(e)),t},getInstalledActions:function(){return this.installedActions},getAvailableActions:function(){return this.availableActions},addStagedField:function(e){var t=jQuery(e.target).data("id");i.channel("fields").request("add:stagedField",t)},getTypeSections:function(){return this.fieldTypeSections}});return t}),n("models/actions/actionModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Action",objectDomain:"actions",editActive:!1},initialize:function(){this.on("change",this.changeSetting,this);var e=i.channel("actions").request("get:type",this.get("type"));if("undefined"!=typeof e){var t=this;_.each(e.get("settingDefaults"),function(e,n){t.get(n)||t.set(n,e,{silent:!0})}),i.channel("actions").trigger("init:actionModel",this),i.channel("actions-"+this.get("type")).trigger("init:actionModel",this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)}},changeSetting:function(e,t){i.channel("actionSetting-"+_.keys(this.changedAttributes())[0]).trigger("update:setting",this,t.settingModel),i.channel("actions").trigger("update:setting",this,t.settingModel),i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("models/actions/actionCollection",["models/actions/actionModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order",tmpNum:1,initialize:function(){this.on("add",this.addAction,this),this.on("remove",this.removeAction,this),this.newIDs=[]},addAction:function(e){this.newIDs.push(e.get("id"))},removeAction:function(e){this.removedIDs[e.get("id")]=e.get("id")}});return t}),n("controllers/actions/data",["models/actions/actionCollection","models/actions/actionModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){if(this.collection=new e(preloadedFormData.actions),this.collection.tmpNum=1,0!=this.collection.models.length){var t=this;_.each(this.collection.models,function(e){jQuery.isNumeric(e.get("id"))||t.collection.tmpNum++})}this.collection.removedIDs={},i.channel("actions").reply("get:collection",this.getCollection,this),i.channel("actions").reply("get:action",this.getAction,this),i.channel("actions").reply("get:tmpID",this.getTmpID,this),i.channel("actions").reply("add",this.addAction,this),i.channel("actions").reply("delete",this.deleteAction,this)},getCollection:function(){return this.collection},getAction:function(e){return this.collection.get(e)},addAction:function(e,n){if(n=n||!1,!1==e instanceof Backbone.Model)var r=new t(e);else var r=e;return this.collection.add(r,{silent:n}),i.channel("app").request("update:setting","clean",!1),r},deleteAction:function(e){this.collection.remove(e),i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db")},getTmpID:function(){var e=this.collection.tmpNum;return this.collection.tmpNum++,"tmp-"+e}});return n}),n("controllers/actions/actionSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(actionSettings,{objectType:"actions"}),i.channel("actions").reply("get:settingModel",this.getSettingModel,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})}});return t}),n("controllers/actions/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("actions").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("actions").request("get:collection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/actions/addActionTypes",["models/actions/actionCollection","models/actions/actionModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("actions"),"click:addAction",this.addAction),i.channel("actions").reply("add:actionType",this.addAction,this)},addAction:function(e){var t={id:i.channel("actions").request("get:tmpID"),type:e.get("id"),label:e.get("settingDefaults").label||e.get("nicename")},n=i.channel("actions").request("add",t),r={object:"Action",label:n.get("label"),change:"Added",dashicon:"plus-alt"},t={collection:i.channel("actions").request("get:collection")};i.channel("changes").request("register:change","addObject",n,null,r,t),i.channel("app").trigger("click:edit",{},n)}});return n}),n("controllers/actions/typeDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addAction"),"startDrag:type",this.startDrag),this.listenTo(i.channel("drawer-addAction"),"stopDrag:type",this.stopDrag),i.channel("drawer-addAction").reply("get:typeHelperClone",this.getCurrentDraggableHelperClone,this)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important"),this.draggableHelperClone=jQuery(t.helper).clone()},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")},getCurrentDraggableHelperClone:function(){return this.draggableHelperClone}});return e}),n("controllers/actions/droppable",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("drop:actionType",this.dropActionType,this)},dropActionType:function(e,t){var n=jQuery(t.helper).data("type"),r=i.channel("actions").request("get:type",n);i.channel("actions").request("add:actionType",r)}});return e}),n("models/actions/typeModel",[],function(){var e=Backbone.Model.extend({});return e}),n("models/actions/typeCollection",["models/actions/typeModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/actions/filterTypes",["models/actions/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addAction"),"change:filter",this.filterActionTypes)},filterActionTypes:function(t,n){if(""!=jQuery.trim(t)){var r=[],a=i.channel("actions").request("get:installedActions");_.each(this.filterCollection(t,a),function(e){r.push(e)});var s=[],o=i.channel("actions").request("get:availableActions");_.each(this.filterCollection(t,o),function(e){s.push(e)});var l=new e(r);l.slug="installed",l.nicename="Installed";var c=new e(s);c.slug="available",c.nicename="Available",i.channel("drawer").trigger("filter:actionTypes",l,c),n.addObject&&0<l.length&&(i.channel("actions").request("add:actionType",l.models[0]),i.channel("drawer").request("clear:filter"))}else i.channel("drawer").trigger("clear:filter")},filterCollection:function(e,t){e=e.toLowerCase();var n=t.filter(function(t){var n=!1;return t.get("id").toLowerCase().indexOf(e)!=-1?n=!0:t.get("nicename").toLowerCase().indexOf(e)!=-1&&(n=!0),t.get("tags")&&0==e.indexOf("#")&&_.each(t.get("tags"),function(t){e.replace("#","").length>1&&t.toLowerCase().indexOf(e.replace("#",""))!=-1&&(n=!0)}),t.get("alias")&&_.each(t.get("alias"),function(t){t.toLowerCase().indexOf(e)!=-1&&(n=!0)}),n});return n}});return t}),n("controllers/actions/newsletterList",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-newsletter_list"),"show:setting",this.defaultFields),this.listenTo(i.channel("setting-type-newsletter_list"),"click:extra",this.clickListUpdate),this.listenTo(i.channel("actionSetting-newsletter_list"),"update:setting",this.maybeRenderFields),this.listenTo(i.channel("actionSetting-newsletter_list"),"update:setting",this.maybeRenderGroups),this.listenTo(i.channel("setting-name-newsletter_list_fields"),"init:settingModel",this.registerFieldsListener),this.listenTo(i.channel("setting-name-newsletter_list_groups"),"init:settingModel",this.registerGroupsListener)},defaultFields:function(e,t){this.maybeRenderFields(t,e),this.maybeRenderGroups(t,e)},registerFieldsListener:function(e){e.listenTo(i.channel("newsletter_list_fields"),"update:fieldMapping",this.updateFieldMapping,e)},registerGroupsListener:function(e){e.listenTo(i.channel("newsletter_list_groups"),"update:interestGroups",this.updateInterestGroups,e)},clickListUpdate:function(e,t,n,i){var r={action:"nf_"+n.attributes.type+"_get_lists",security:nfAdmin.ajaxNonce},a=this;jQuery(e.srcElement).addClass("spin"),jQuery.post(ajaxurl,r,function(e){var e=JSON.parse(e);a.updateLists(t,e.lists,i,n),n.set("newsletter_list",e.lists[0].value,{settingModel:t})}).always(function(){jQuery(e.srcElement).removeClass("spin")})},updateLists:function(e,t,n,i){e.set("options",t),n.render()},maybeRenderFields:function(e,t){if("undefined"!=typeof t){var n=e.get("newsletter_list"),r=t.get("options");_.each(r,function(e){n==e.value&&i.channel("newsletter_list_fields").trigger("update:fieldMapping",e.fields)}),e.set("newsletter_list_fields",0)}},maybeRenderGroups:function(e,t){if("undefined"!=typeof t){var n=e.get("newsletter_list"),r=t.get("options");_.each(r,function(e){n==e.value&&i.channel("newsletter_list_groups").trigger("update:interestGroups",e.groups)}),e.set("newsletter_list_fields",0)}},updateFieldMapping:function(e){var t=this.get("settings");t.reset(),_.each(e,function(e){t.add({name:e.value,type:"textbox",label:e.label,width:"full",use_merge_tags:{exclude:["user","post","system","querystrings"]}})}),this.set("settings",t)},updateInterestGroups:function(e){var t=this.get("settings");t.reset(),_.each(e,function(e){t.add({name:e.value,type:"toggle",label:e.label,width:"full"})}),this.set("settings",t)}});return e}),n("controllers/advanced/types",["models/app/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(formSettingTypeData),i.channel("settings").reply("get:type",this.getType,this),i.channel("settings").reply("get:typeCollection",this.getCollection,this)},getType:function(e){return this.collection.get(e)},getCollection:function(){return this.collection}});return t}),n("models/advanced/settingsModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Form Setting",editActive:!1},initialize:function(){this.bind("change",this.changeSetting,this);var e=i.channel("settings").request("get:collection");_.each(e.models,function(e){"undefined"==typeof this.get(e.get("name"))&&this.set(e.get("name"),e.get("value"),{silent:!0}),i.channel(e.get("type")).trigger("init:dataModel",this,e)},this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)},changeSetting:function(e,t){i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("controllers/advanced/data",["models/advanced/settingsModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.model=new e(preloadedFormData.settings),i.channel("settings").reply("get:settings",this.getSettings,this),i.channel("settings").reply("get:setting",this.getSetting,this),i.channel("settings").reply("update:setting",this.updateSetting,this)},getSettings:function(){return this.model},updateSetting:function(e,t,n){n=n||!1,this.model.set(e,t,{silent:n})},getSetting:function(e){return this.model.get(e)}});return t}),n("controllers/advanced/formSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(formSettings,{objectType:"settings"}),i.channel("settings").reply("get:settingModel",this.getSettingModel,this),i.channel("settings").reply("get:collection",this.getSettingCollection,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})},getSettingCollection:function(){return this.collection}});return t}),n("controllers/advanced/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("settings").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("settings").request("get:typeCollection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/advanced/clickEdit",["models/advanced/settingsModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("settings"),"click:edit",this.clickEdit)},clickEdit:function(e,t){var n=i.channel("settings").request("get:settings");i.channel("app").request("open:drawer","editSettings",{model:n,groupCollection:t.get("settingGroups"),typeModel:t});var r=i.channel("drawer").request("get:preventClose");r||t.set("editActive",!0)}});return t}),n("controllers/advanced/calculations",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("option-repeater-calculations"),"keyup:option",this.keyUp),this.listenTo(i.channel("option-repeater-calculations"),"update:option",this.updateCalc),this.listenTo(i.channel("option-repeater-calculations"),"sort:option",this.sortCalc)},keyUp:function(e,t){var n=jQuery(e.target).val(),i=jQuery(e.target).data("id");"name"==i?(this.checkName(n,t),this.checkEQ(t.get("eq"),t)):"eq"==i?this.checkEQ(n,t):"dec"==i&&this.checkDec(n,t)},updateCalc:function(e){this.checkName(e.get("name"),e,!1),this.checkEQ(e.get("eq"),e),this.checkDec(e.get("dec"),e)},sortCalc:function(e,t){this.checkAllCalcs(t.collection)},checkName:function(e,t,n){n=n||!0;var i=t.get("errors"),r=t.collection.where({name:jQuery.trim(e)});e==t.get("name")&&(r=[]),0!=r.length?i.nameExists="Calculation names must be unique. Please enter another name.":(t.set("name",e,{silent:n}),delete i.nameExists),t.set("errors",i),t.trigger("change:errors",t)},checkEQ:function(e,t){var n=t.get("errors"),i=!1,r=!1,a=e.match(new RegExp(/{calc:(.*?)}/g));if(a){var s=t.collection;a=a.map(function(e){var a=e.replace("}","").replace("{calc:",""),o=s.findWhere({name:a});a==t.get("name")?(n.selfRef="A calculation can't reference itself!",i=!0):o&&o.get("order")>t.get("order")&&(r=!0,n.futureCalc="Can't reference a future calculation!")})}i||delete n.selfRef,r||delete n.futureCalc,t.set("errors",n),t.trigger("change:errors",t)},checkDec:function(e,t){if("undefined"==typeof e)return!1;var n=t.get("errors"),i=!1,r=Math.abs(parseInt(e.trim()));""!==e.trim()&&r.toString()!==e.trim()&&(i=!0,n.nonIntDec="Decimals must be a non-negative integer!"),i||delete n.nonIntDec,t.set("errors",n),t.trigger("change:errors",t)},checkAllCalcs:function(e){var t=this;e.models.map(function(e){t.checkName(e.get("name"),e),t.checkEQ(e.get("eq"),e),t.checkDec(e.get("dec"),e)})}});return e}),n("controllers/loadControllers",["controllers/app/remote","controllers/app/drawer","controllers/app/drawerConfig","controllers/app/domainConfig","controllers/app/data","controllers/app/drawerToggleSettingGroup","controllers/app/updateDB","controllers/app/formData","controllers/app/previewLink","controllers/app/menuButtons","controllers/app/trackChanges","controllers/app/undoChanges","controllers/app/publishResponse","controllers/app/changeDomain","controllers/app/pushstate","controllers/app/hotkeys","controllers/app/cleanState","controllers/app/coreUndo","controllers/app/cloneModelDeep","controllers/app/getSettingChildView","controllers/app/changeSettingDefault","controllers/app/fieldset","controllers/app/toggleSetting","controllers/app/itemControls","controllers/app/mergeTags","controllers/app/mergeTagBox","controllers/app/itemSettingFill","controllers/app/confirmPublish","controllers/app/rte","controllers/app/settingFieldSelect","controllers/app/settingFieldList","controllers/app/settingHTML","controllers/app/settingColor","controllers/app/changeMenu","controllers/app/mobile","controllers/app/notices","controllers/app/unloadCheck","controllers/app/formContentFilters","controllers/app/formContentGutterFilters","controllers/app/cloneCollectionDeep","controllers/app/trackKeyDown","controllers/app/perfectScroll","controllers/app/getNewSettingGroupCollection","controllers/app/settingMedia","controllers/fields/types","controllers/fields/fieldTypeDrag","controllers/fields/stagingDrag","controllers/fields/staging","controllers/fields/stagingSortable","controllers/fields/filterTypes","controllers/fields/sortable","controllers/fields/data","controllers/app/optionRepeater","controllers/fields/editActive","controllers/fields/fieldSettings","controllers/fields/fieldCreditCard","controllers/fields/fieldList","controllers/fields/fieldPassword","controllers/fields/fieldQuantity","controllers/fields/fieldShipping","controllers/fields/key","controllers/fields/notices","controllers/fields/mobile","controllers/fields/savedFields","controllers/fields/fieldDatepicker","controllers/fields/fieldDisplayCalc","controllers/actions/types","controllers/actions/data","controllers/actions/actionSettings","controllers/actions/editActive","controllers/actions/addActionTypes","controllers/actions/typeDrag","controllers/actions/droppable","controllers/actions/filterTypes","controllers/actions/newsletterList","controllers/advanced/types","controllers/advanced/data","controllers/advanced/formSettings","controllers/advanced/editActive","controllers/advanced/clickEdit","controllers/advanced/calculations"],function(e,t,n,i,r,a,s,o,l,c,d,h,u,g,p,f,m,v,y,w,b,C,j,k,M,T,S,F,Q,q,x,D,_,O,A,E,V,z,R,B,N,L,I,P,H,G,$,K,W,U,J,X,Y,Z,ee,te,ne,ie,re,ae,se,oe,le,ce,de,he,ue,ge,pe,fe,me,ve,ye,we,be,Ce,je,ke,Me,Te,Se){var Fe=Marionette.Object.extend({initialize:function(){new z,new R,new f,new e,new t,new n,new i,new a,new l,new c,new d,new h,new u,new g,new m,new v,new y,new k,new F,new Q,new q,new x,new D,new _,new P,new O,new A,new E,new V,new s,new B,new N,new L,new I,new C,new Y,new H,new G,new $,new K,new W,new U,new J,new b,new j,new w,new Z,new ee,new te,new ne,new ie,new re,new ae,new se,new oe,new le,new ce,new de,new he,new be,new ue,new ge,new pe,new fe,new me,new ve,new ye,new we,new Ce,new ke,new Se,new je,new Me,new Te,new r,new X,new o,new M,new T,new S}});return Fe}),n("views/fields/fieldItem",["views/app/itemControls"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-main-content-field",doingShortcut:!1,regions:{itemControls:".nf-item-controls"},initialize:function(){this.model.on("change:editActive",this.render,this),this.model.on("change:label",this.render,this),this.model.on("change:required",this.render,this),this.model.on("change:id",this.render,this)},onBeforeDestroy:function(){this.model.off("change:editActive",this.render),this.model.off("change:label",this.render),this.model.off("change:required",this.render),this.model.off("change:id",this.render)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),this.itemControls.show(new e({model:this.model})),jQuery(this.el).disableSelection(),i.channel("app").request("is:mobile")&&jQuery(this.el).on("taphold",function(e,t){jQuery(e.target).hasClass("nf-edit-settings")||(jQuery(this).addClass("ui-sortable-helper drag-selected"),jQuery(this).ClassyWiggle("start",{degrees:[".65","1",".65","0","-.65","-1","-.65","0"],delay:50}))})},templateHelpers:function(){return{renderClasses:function(){var e="nf-field-wrap";return this.editActive&&(e+=" active"),e},renderRequired:function(){return 1==this.required?'<span class="required">*</span>':""},getFieldID:function(){return jQuery.isNumeric(this.id)?"field-"+this.id:this.id},renderIcon:function(){var e=i.channel("fields").request("get:type",this.type);return'<span class="fa fa-'+e.get("icon")+'"></span>'}}},events:{"mouseover .nf-item-control":"mouseoverItemControl",mousedown:"maybeShortcut",click:"maybeClickEdit",singletap:"maybeTapEdit",swipeleft:"swipeLeft",swiperight:"swipeRight",tapend:"tapend"},maybeClickEdit:function(e){return this.doingShortcut?(this.doingShortcut=!1,!1):void((jQuery(e.target).parent().hasClass("nf-fields-sortable")||jQuery(e.target).parent().hasClass("nf-field-wrap")||jQuery(e.target).hasClass("nf-field-wrap"))&&!i.channel("app").request("is:mobile")&&(jQuery(":focus").blur(),i.channel("app").trigger("click:edit",e,this.model)))},maybeShortcut:function(e){var t=i.channel("app").request("get:keydown");return-1==t.indexOf(16)||(-1!=t.indexOf(68)?(i.channel("app").trigger("click:delete",e,this.model),this.doingShortcut=!0,!1):-1!=t.indexOf(67)?(this.doingShortcut=!0,i.channel("app").trigger("click:duplicate",e,this.model),!1):void 0)},maybeTapEdit:function(e){jQuery(e.target).parent().hasClass("nf-fields-sortable")&&i.channel("app").trigger("click:edit",e,this.model)},swipeLeft:function(e,t){jQuery(t.startEvnt.target).closest("div").find(".nf-item-duplicate").show(),jQuery(t.startEvnt.target).closest("div").find(".nf-item-delete").show()},swipeRight:function(e,t){jQuery(t.startEvnt.target).closest("div").find(".nf-item-duplicate").hide(),jQuery(t.startEvnt.target).closest("div").find(".nf-item-delete").hide()},tapend:function(e,t){jQuery(this.el).ClassyWiggle("stop"),jQuery(this.el).removeClass("ui-sortable-helper drag-selected")},remove:function(){i.channel("fields").request("get:removing")?this.$el.hide("clip",function(){jQuery(this).remove()}):this.$el.remove(),i.channel("fields").request("set:removing",!1)},mouseoverItemControl:function(e){jQuery(this.el).find(".nf-item-control").css("display","")}});return t}),n("views/fields/mainContentEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-content-fields-empty",onBeforeDestroy:function(){jQuery(this.el).parent().removeClass("nf-fields-empty-droppable").droppable("destroy")},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},onShow:function(){jQuery(this.el).parent().hasClass("ui-sortable")&&jQuery(this.el).parent().sortable("destroy"),jQuery(this.el).parent().addClass("nf-fields-empty-droppable"),jQuery(this.el).parent().droppable({accept:function(e){if(jQuery(e).hasClass("nf-stage")||jQuery(e).hasClass("nf-field-type-button"))return!0},activeClass:"nf-droppable-active",hoverClass:"nf-droppable-hover",tolerance:"pointer",over:function(e,t){t.item=t.draggable,i.channel("app").request("over:fieldsSortable",t)},out:function(e,t){t.item=t.draggable,i.channel("app").request("out:fieldsSortable",t)},drop:function(e,t){t.item=t.draggable,i.channel("app").request("receive:fieldsSortable",t);var n=i.channel("fields").request("get:collection");n.trigger("reset",n)}})}});return e}),n("views/app/formTitle",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-header-form-title",initialize:function(){this.model.on("change:title",this.render,this)},templateHelpers:function(){return{renderTitle:function(){var e=i.channel("app").request("get:formModel");return _.escape(e.get("settings").get("title"))}}}});return e}),n("views/loadViews",["views/fields/fieldItem","views/fields/mainContentEmpty","views/app/formTitle"],function(e,t,n){var r=Marionette.Object.extend({initialize:function(){i.channel("views").reply("get:fieldItem",this.getFieldItem),i.channel("views").reply("get:mainContentEmpty",this.getMainContentEmpty),i.channel("views").reply("get:formTitle",this.getFormTitle)},getFieldItem:function(t){return e},getMainContentEmpty:function(){return t},getFormTitle:function(){return n}});return r});var i=Backbone.Radio;jQuery(document).ready(function(e){t(["views/app/builder","controllers/loadControllers","views/loadViews"],function(t,n,r){var a=Marionette.Application.extend({initialize:function(e){var t=this;Marionette.Renderer.render=function(e,n){var e=t.template(e);return e(n)},i.channel("app").trigger("before:loadControllers",this);new n;i.channel("app").trigger("after:loadControllers",this),i.channel("app").trigger("before:loadViews",this);new r;i.channel("app").trigger("after:loadViews",this),i.channel("app").reply("get:template",this.template)},onStart:function(){new t;i.channel("app").trigger("after:appStart",this),0==nfAdmin.formID&&i.channel("app").request("open:drawer","addField")},template:function(t){return _.template(e(t).html(),{evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^\}]+?)\}\}(?!\})/g,variable:"data"})}}),s=new a;s.start()})}),n("main",function(){})}(); 7 7 //# sourceMappingURL=almond.build.js.map 8 8 //# sourceMappingURL=builder.js.map -
ninja-forms/tags/3.1.1/assets/js/min/builder.js.map
r1649765 r1649963 1 {"version":3,"sources":["../../../config-wrap-start-default.js","../lib/almond.js","views/app/menuItem.js","views/app/menu.js","views/app/menuButtons.js","views/app/mobileMenuButton.js","views/app/header.js","views/app/subHeader.js","views/app/builderHeader.js","views/app/main.js","views/app/mobileMenuItem.js","views/app/mobileMenu.js","views/app/drawer/contentEmpty.js","views/app/drawer.js","views/app/drawer/mergeTagItem.js","views/app/drawer/mergeTagsSection.js","models/app/mergeTagModel.js","models/app/mergeTagCollection.js","views/app/drawer/mergeTagsContent.js","views/app/builder.js","controllers/app/remote.js","controllers/app/drawer.js","views/app/drawer/headerDefault.js","views/app/drawer/footerDefault.js","models/app/drawerModel.js","models/app/drawerCollection.js","views/fields/drawer/stagedField.js","views/fields/drawer/stagingEmpty.js","views/fields/drawer/stagingCollection.js","models/fields/stagingModel.js","models/fields/stagingCollection.js","views/fields/drawer/typeSection.js","views/fields/drawer/typeSectionCollection.js","views/fields/drawer/addField.js","views/app/drawer/itemSettingCollection.js","views/app/drawer/itemSettingGroup.js","views/app/drawer/itemSettingGroupCollection.js","views/app/drawer/editSettings.js","views/app/drawer/headerEditSettings.js","views/actions/drawer/typeButton.js","views/actions/drawer/typeCollection.js","views/actions/drawer/addAction.js","views/app/drawer/contentViewChangesItem.js","views/app/drawer/contentViewChanges.js","views/app/drawer/headerViewChanges.js","views/app/drawer/settingError.js","views/app/drawer/itemSetting.js","views/app/drawer/contentNewForm.js","views/app/drawer/headerNewForm.js","controllers/app/drawerConfig.js","views/app/drawer/defaultSettingsTitle.js","views/app/empty.js","models/app/domainModel.js","models/app/domainCollection.js","views/fields/subHeader.js","views/fields/mainContentFieldCollection.js","views/fields/drawer/addSavedField.js","views/fields/drawer/settingsTitle.js","views/actions/mainHeader.js","views/actions/subHeader.js","views/app/itemControls.js","views/actions/actionItem.js","views/actions/mainContentEmpty.js","views/actions/mainContent.js","views/advanced/mainHeader.js","views/advanced/subHeader.js","views/advanced/settingItem.js","views/advanced/mainContent.js","models/fields/fieldModel.js","models/fields/fieldCollection.js","controllers/app/domainConfig.js","models/app/appModel.js","controllers/app/data.js","controllers/app/drawerToggleSettingGroup.js","controllers/app/updateDB.js","models/app/formModel.js","controllers/app/formData.js","controllers/app/previewLink.js","controllers/app/menuButtons.js","models/app/changeModel.js","models/app/changeCollection.js","controllers/app/trackChanges.js","controllers/app/undoChanges.js","controllers/app/publishResponse.js","controllers/app/changeDomain.js","controllers/app/pushstate.js","controllers/app/hotkeys.js","controllers/app/cleanState.js","controllers/app/coreUndo.js","controllers/app/cloneModelDeep.js","controllers/app/getSettingChildView.js","controllers/app/changeSettingDefault.js","views/app/drawer/typeSettingFieldset.js","models/app/settingModel.js","models/app/settingCollection.js","controllers/app/fieldset.js","controllers/app/toggleSetting.js","controllers/app/itemControls.js","controllers/app/mergeTags.js","models/app/mergeTagLookupCollection.js","views/app/drawer/mergeTag.js","views/app/drawer/mergeTagList.js","views/app/drawer/mergeTagGroup.js","views/app/drawer/mergeTagGroupList.js","views/app/drawer/mergeTagFilter.js","views/app/drawer/mergeTagBox.js","controllers/app/mergeTagBox.js","controllers/app/itemSettingFill.js","controllers/app/confirmPublish.js","controllers/app/rte.js","controllers/app/settingFieldSelect.js","controllers/app/settingFieldList.js","controllers/app/settingHTML.js","controllers/app/settingColor.js","controllers/app/changeMenu.js","controllers/app/mobile.js","controllers/app/notices.js","controllers/app/unloadCheck.js","controllers/app/formContentFilters.js","controllers/app/formContentGutterFilters.js","controllers/app/cloneCollectionDeep.js","controllers/app/trackKeyDown.js","controllers/app/perfectScroll.js","models/app/settingGroupModel.js","models/app/settingGroupCollection.js","controllers/app/getNewSettingGroupCollection.js","controllers/app/settingMedia.js","models/app/typeModel.js","models/app/typeCollection.js","models/fields/typeSectionModel.js","models/fields/typeSectionCollection.js","controllers/fields/types.js","controllers/fields/fieldTypeDrag.js","controllers/fields/stagingDrag.js","controllers/fields/staging.js","controllers/fields/stagingSortable.js","controllers/fields/filterTypes.js","controllers/fields/sortable.js","controllers/fields/data.js","models/app/optionRepeaterModel.js","models/app/optionRepeaterCollection.js","views/app/drawer/optionRepeaterError.js","views/app/drawer/optionRepeaterOption.js","views/app/drawer/optionRepeaterEmpty.js","views/app/drawer/optionRepeaterComposite.js","controllers/app/optionRepeater.js","controllers/fields/editActive.js","controllers/fields/fieldSettings.js","controllers/fields/fieldCreditCard.js","controllers/fields/fieldList.js","controllers/fields/fieldPassword.js","controllers/fields/fieldQuantity.js","controllers/fields/fieldShipping.js","controllers/fields/key.js","controllers/fields/notices.js","controllers/fields/mobile.js","controllers/fields/savedFields.js","controllers/fields/fieldDatepicker.js","controllers/fields/fieldDisplayCalc.js","controllers/actions/types.js","models/actions/actionModel.js","models/actions/actionCollection.js","controllers/actions/data.js","controllers/actions/actionSettings.js","controllers/actions/editActive.js","controllers/actions/addActionTypes.js","controllers/actions/typeDrag.js","controllers/actions/droppable.js","models/actions/typeModel.js","models/actions/typeCollection.js","controllers/actions/filterTypes.js","controllers/actions/newsletterList.js","controllers/advanced/types.js","models/advanced/settingsModel.js","controllers/advanced/data.js","controllers/advanced/formSettings.js","controllers/advanced/editActive.js","controllers/advanced/clickEdit.js","controllers/advanced/calculations.js","controllers/loadControllers.js","views/fields/fieldItem.js","views/fields/mainContentEmpty.js","views/app/formTitle.js","views/loadViews.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","view","Marionette","ItemView","extend","tagName","template","initialize","this","listenTo","nfRadio","channel","render","model","on","onRender","$el","children","unwrap","setElement","events","click a","clickAppMenu","trigger","templateHelpers","renderDashicons","dashicons","renderClasses","classes","currentDomain","request","get","renderUrl","url","formModel","renderTarget","renderDisabled","disabled","appMenuItemView","CollectionView","childView","onShow","el","find","bounceIcon","that","renderPublish","publishWidth","maybeDisabled","maybeRenderCancel","viewChanges","click .publish","click .viewChanges","clickPublish","clickViewChanges","changeModel","effect","times","click .nf-mobile-menu","clickMobileMenu","builderEl","toggleClass","appMenuCollectionView","appMenuButtonsView","mobileMenuButtonView","LayoutView","regions","menu","buttons","mobileMenuButton","appDomainCollection","show","collection","click #nf-logo","clickLogo","appHeaderView","appSubHeaderView","app","formTitle","appSub","changeSubHeader","formData","formSettings","formTitleView","subHeaderView","className","maybeDone","offsetRight","offsetLeft","gutterLeft","body","gutterRight","reply","getMainEl","window","context","resizeBothGutters","setBothGuttersAbsolute","setBothGuttersFixed","updateGutters","bodyView","gutterLeftView","gutterRightView","parent","onAttach","initialGutterResize","onBeforeDestroy","off","resize","resizeGutter","data","leftEl","rightEl","clearTimeout","top","offset","viewHeight","height","topLeft","leftLeft","left","css","position","topRight","leftRight","scrollTop","right","mobileDashicon","mobileMenuItemView","CompositeView","attachHtml","collectionView","append","click .nf-publish","drawerEmptyView","header","content","footer","getEl","loadContent","emptyContent","perfectScrollbar","drawerID","drawer","contentView","headerView","footerView","empty","click .nf-toggle-drawer","clickToggleDrawer","clickTag","active","mergeTagItemView","fieldCollection","updateFields","set","Backbone","Model","defaults","exclude","mergeTagModel","Collection","mergeTagsSectionView","MergeTagCollection","getMergeTagsView","reRender","settingModel","mergeTagCollection","defaultGroups","where","default_group","calcMergeTagGroup","useMergeTags","_","each","remove","include","models","sectionModel","add","mainView","mobileMenuView","drawerView","mergeTagsContentView","menuDrawer","mergeTagsContent","getBuilderEl","getBuilderView","mergeTags","mergeTagsClone","clone","click .nf-open-drawer","click .nf-change-domain","click .nf-close-drawer","openDrawer","closeDrawer","changeDomain","addListener","dataModel","listen","updateSetting","clickExtra","getRemote","settingView","srcElement","addClass","remote","parentValue","action","security","nfAdmin","ajaxNonce","post","ajaxurl","response","JSON","parse","options","controller","clickOpenDrawer","toggleDrawerSize","getClosedDrawerPos","preventClose","enableClose","maybePreventClose","objPreventClose","filterFocused","currentDrawer","removeClass","rightClosed","drawerEl","checkCloseDrawerPos","setInterval","clearInterval","target","currentDomainID","hasFocus","checkOpenDrawerPos","focusFilter","filterEl","focus","closedPos","width","keys","key","getPreventClose","clearFilter","blurFilter","keyup .nf-filter","input .nf-filter","focus input","changeFilter","maybeChangeFilter","keyCode","addObject","trim","val","blur","getFocus","drawerDisabled","defaultHeaderView","defaultFooterView","getHeaderView","getFooterView","drawerModel","click .dashicons-dismiss","removeStagedField","stagedFieldView","stagedFieldsEmptyView","emptyView","activeClass","getStagedFieldsEl","sortable","placeholder","helper","tolerance","over","ui","out","receive","update","start","stop","draggable","opacity","connectToSortable","appendTo","refreshPositions","grid","element","zIndex","onAddChild","onRemoveChild","hasStagedFields","stagingModel","comparator","bindAll","getTypeSection","dragging","drag","disableSelection","click .nf-item","keydown .nf-item","mousedown .nf-item","clickFieldType","mousedownFieldType","maybeClickFieldType","renderFieldTypes","html","fieldTypes","type","nicename","icon","renderType","savedField","fieldTypeSectionView","drawerStagingView","StagingCollection","fieldTypeSectionCollectionView","staging","primary","secondary","filterFieldTypes","removeFieldTypeFilter","savedCollection","primaryCollection","fieldTypeSectionCollection","secondaryCollection","stagingCollection","filteredSectionCollection","reset","childViewOptions","getChildView","itemSettingCollectionView","settings","click .toggle","clickToggleGroup","renderLabel","label","groupLabel","renderArrowDir","display","itemSettingGroupView","itemSettingGroupCollectionView","settingTitle","settingGroups","groupCollection","titleView","maybeRenderTitle","title","renderTypeNicename","domainID","scroll","clickAddAction","open","image","section","renderStyle","actionTypeButtonView","renderNicename","slug","actionTypeCollectionView","filteractionTypes","removeactionTypeFilter","installedActions","availableActions","filteredInstalled","filteredAvailable","click .undoSingle","undoSingle","viewChangesItem","click .undoChanges","clickUndoChanges","settingErrorView","error","renderOnChange","renderError","refresh","drawerOpened","drawerClosed","setting","unescape","silent","onBeforeRender","escape","next","jBox","maxWidth","theme","closeOnClick","mask","input","autoNumeric","aSep","thousandsSeparator","aDec","decimalPoint","currency","currencySymbol","currencySymbols","aSign","text","format","console","log","renderVisible","renderSetting","renderLabelClasses","use_merge_tags","renderTooltip","help","renderMergeTags","hide_merge_tags","renderPlaceholder","change .setting","keyup .setting","click .setting","click .extra","changeSetting","keyUpSetting","clickSetting","itemSettingView","formName","formSubmit","titleSettingModel","addSubmitSettingModel","submitButtons","findWhere","drawerCollection","addFieldView","editSettingsView","editSettingsHeaderView","addActionView","viewChangesView","viewChangesHeaderView","newFormView","newFormHeaderView","mobileItemControlsView","getContentView","typeModel","getDrawerCollection","getDrawer","DefaultSettingsTitleView","EmptyView","hotkeys","getSettingsTitleView","getDefaultSettingsTitleView","getGutterLeftView","getGutterRightView","domainModel","reorderOnSort","getEmptyView","getSortableEl","initSortable","destroySortable","cancel","scrollSensitivity","item","dropping","hide","renderAddButton","button","click .nf-button","clickAddSavedField","addSavedFieldView","renderjBoxContent","addSaved","addSavedjBox","destroy","unset","x","y","outside","onCreated","setContent","attach","displayName","saved","realType","renderSavedStar","star","actionCollection","mouseover .nf-item-control","click .nf-edit-settings","singletap .nf-edit-settings","click .nf-delete","click .nf-duplicate","clickEdit","singleTapEdit","clickDelete","clickDuplicateField","mouseoverItemControl","itemControlsView","itemControls","maybeDeactivate","change input","click","maybeClickEdit","changeToggle","renderToggle","settingName","actionLabel","actionView","droppable","accept","hoverClass","drop","updateActiveClass","editActive","settingItem","objectType","objectDomain","order","fieldType","parentType","updateFieldKey","changedAttributes","keyModel","fieldModel","parseInt","tmpNum","addField","removeField","addNewField","appendNewField","removeFieldResponse","newIDs","removedIDs","at","fieldExists","fieldsSubHeaderView","FieldsMainContentFieldCollectionView","fieldsSettingsTitleView","actionsMainHeaderView","actionsSubHeaderView","actionsMainContentView","settingsMainHeaderView","settingsSubHeaderView","settingsMainContentView","FieldCollection","defaultFormContentView","defaultFormContentLoad","defaultFormContentGutterView","nfi18n","domainFormFields","Esc","Ctrl+Shift+n","Ctrl+Shift+a","Ctrl+Shift+s","Alt+Ctrl+t","up","down","Shift+return","getSubHeaderView","getMainContentView","formContentData","formContentLoadFilters","sortedArray","without","first","formContentViewFilters","formContentView","gutterFilters","gutterView","domainActions","Ctrl+Shift+f","domainAdvanced","previewurl","getDomainCollection","getDomainModel","fieldModels","loading","changeStatus","appModel","clean","mobile","isMobile","getData","getSetting","getCurrentDomain","getCurrentDrawer","updateCurrentDomain","updateCurrentDrawer","currentDrawerID","toggleSettingGroup","errors","updateDB","defaultSaveFilter","jsAction","formContentSaveDataFilters","stringify","fields","field","parent_id","deleted_fields","actions","deleted_actions","autoClose","form","exception","pluck","isNumeric","preloadedFormData","getFormModel","disablePreview","enablePreview","changePreviewNicename","appDomains","preview","publish","changeCollection","cid","ChangeModel","registerChange","getCollection","maybeResetCollection","changes","dashicon","undoChanges","sort","change","undoAll","publishResponse","new_ids","newID","oldID","forms","history","replaceState","changeAppDomain","preventChange","enableChange","objPreventChange","maybePreventChange","mainEl","changePushState","pushState","location","href","reExp","toString","newUrl","changeHotkeys","addNewAction","changeDomainFields","changeDomainActions","changeDomainSettings","document","hotkey","msg","fieldsDomain","actionsDomain","settingsDomain","ignoreAttributes","setAppClean","attr","changedAttr","after","undoChangeSetting","undoAddObject","undoRemoveObject","undoDuplicateObject","undoSortFields","undoAddListOption","undoRemoveListOption","undoSortListOptions","before","maybeRemoveChange","objectModel","results","objectCollection","objModels","optionModel","cloneModelDeep","attributes","clonedCollection","newModel","getSettingChildView","settingChildView","object","maybePreventUI","updateKey","fieldsetView","settingCollection","createSettingsCollection","settingTypeModel","clickDuplicate","tmpID","tagSectionCollection","tagSection","tags","fieldTags","tag","getFieldKeyFormat","calcTags","calcCollection","calcModel","currentElement","clickMergeTag","addFieldTags","deleteFieldTags","updateCalcTags","updateCurrentElement","updateCurrentSetting","getSectionModel","replaceFieldKey","initMergeTags","mergeTagsView","jBoxes","closeOnEsc","maxHeight","onOpen","prev","onClose","tagModel","currentValue","currentPos","caret","newPos","substr","summernote","calcTag","getFieldKeyFormatCalc","fieldID","calc","openMergeTags","returnMergeTags","preventDefault","currentModel","upMergeTags","changeActiveTag","downMergeTags","dir","inc","currentIndex","nextModel","userInfo","system","updateOpen","newKey","oldTag","oldKey","_previousAttributes","oldVal","oldCalcKey","newCalcKey","re","RegExp","newVal","insertTag","mergeTagView","sectionFilter","searchFilter","filter","child","term","toLowerCase","removeActive","onClick","updateTags","setActive","siblings","mergeTagGroupView","keyup input","updateFilter","event","firstFilteredTag","sections","MergeTagModel","MergeTagLookupCollection","MergeTagView","MergeTagListView","MergeTagGroupView","MergeTagGroupListView","MergeTagFilterView","MergeTagBoxLayout","old"," afterAppStart","beforeRenderSetting","beforeDrawerClose","mergeTagsButtonClick","bind","selector","focusCallback","keyupCallback","closest","layout","tagCollection","mergeTagListView","mergeTagGroupListView","getRegion","rteEditor","posY","outerHeight","boxHeight","repeaterRow","scrollLeft","posX","$input","hasClass","str","caretPos","patt","match","exec","string","childNode","childNodes","node","nodeValue","innerHTML","range","createRange","sel","getSelection","setStart","err","collapse","removeAllRanges","addRange","$this","$inputSetting","autocomplete","$overlayElement","dataID","so","mergetags","mergetag","elementClasses","confirmPublish","initSettingModel","destroySetting","meta_image_frame","icons","align","alignCenter","alignJustify","alignLeft","alignRight","indent","outdent","bold","close","code","eraser","italic","link","unlink","magic","minus","orderedlist","redo","square","table","underline","undo","unorderedlist","currentContext","initRTE","linkButton","mediaButton","toolbar","codemirror","lineNumbers","callbacks","onBlur","editor","getValue","updateDataModel","prettifyHtml","onFocus","onKeydown","onKeyup","linkMenu","replaceWith","class","removeRTE","linkDropdown","buttonGroup","contents","tooltip","clickLinkButton","toggle","dropdown","mergeTagsButton","openMediaManager","invoke","wp","media","frames","media_attachment","state","toJSON","insertMedia","textEl","urlEl","isNewWindowEl","isNewWindow","filename","trackKeyChanges","beforeRender","maybeSwitchToFieldsDomain","autoOpenDrawer","filterDrawerContents","SwitchToFieldsDomain","updateFieldMap","contains","fieldFilter","bail","fieldTypeModel","rubble","filterDrawer","switchDomain","fieldDomainModel","fieldListSettings","registerFieldListSettings","updateFieldListSettingKeys","changed","Radio","actionModel","lastChanged","oldValue","init","changedSettingValue","setRenderFalse","closeColorPickers","initColorPicker","wpColorPicker","color","editFormText","changeMenu","formPublish","isNewForm","highlightAddNew","appendEditForm","form_id","isNaN","closeMobileMenu","addNotice","closeNotice","notices","appDefaults","constructOnInit","stack","animation","mobileDefaults","desktopDefaults","openNotice","maybePrompt","viewFilters","saveFilters","loadFilters","addViewFilter","addSaveFilter","addLoadFilter","getViewFilters","getSaveFilters","getLoadFilters","priority","leftFilters","rightFilters","addLeftFilter","addRightFilter","getLeftFilters","getRightFilters","cloneCollectionDeep","constructor","keyDown","keyUp","getKeyDown","movedPos","initPerfectScroll","moveRail","resetRail","suppressScrollX","outerWidth","SettingCollection","settingGroupModel","SettingGroupCollection","getNewSettingGroupCollection","option","typeSectionModel","TypeCollection","SectionCollection","fieldTypeSections","registerSection","fieldTypeData","getFieldType","getTypeCollection","getTypeSections","getSavedFields","shiftKey","startDrag","stopDrag","getCurrentDraggableHelperClone","style","setProperty","draggableHelperClone","stagedFields","num","addStagedField","getStagingCollection","sortStagedFields","clearStagedFields","beforeCloseDrawer","now","tmpField","sortableEl","search","pos","receiveStagedFields","overStagedFields","outStagedFields","startStagedFields","stopStagedFields","addActiveClass","stagedFieldsEl","removeActiveClass","currentHelper","helperClone","filtered","filterCollection","found","alias","receiveFieldsSortable","overfieldsSortable","outFieldsSortable","stopFieldsSortable","startFieldsSortable","updateFieldsSortable","insertedAt","fieldWidth","dragFieldID","dragModel","oldPos","adding","removing","getFieldCollection","getField","redrawFieldCollection","getTmpFieldID","deleteField","sortFields","getAdding","setAdding","getRemoving","setRemoving","renderTrigger","savedType","updateFieldSetting","changeErrors","size","errorsFound","opt","listOptionModel","addOption","renderErrors","ErrorView","columns","parentView","hasErrors","keyup","changeOption","deleteOption","keyupOption","maybeAddOption","findByIndex","getColumns","renderFieldSelect","_return","selected","renderOptions","column","listOptionView","listEmptyView","listOptionCollection","optionCollection","handle","forcePlaceholderSize","importLink","closeButton","clickImport","renderHeaders","col","renderFieldsetClasses","currency_symbol","click .nf-add-new","clickAddOption","textarea","trimLeft","trimRight","lines","isArray","line","row","slugify","separator","listCompositeView","updateOptionSortable","stopOptionSortable","startOptionSortable","convertSettings","optionView","triggerDataModel","modelData","new","default","newOrder","clearEditActive","fieldSettings","getSettingModel","getSettingCollection","dropCreditCardField","newField","stageCreditCardField","ListOptionCollection","updateOptionLabel","updateOptionValue","convertOptions","select","confirm","insertField","productFields","getProductFields","addMask","newFieldKey","updateLabel","d","Date","valueOf","setError","keyExists","testKey","startWiggle","stopWiggle","initWiggle","ClassyWiggle","degrees","delay","updateField","modified","modelClone","fieldData","created_at","formID","newType","newTypeDefaults","settingDefaults","typeCollection","typeSections","addDatepicker","pikadayResponsive","actionTypeData","installed","available","getType","getInstalledActions","getAvailableActions","actionType","addAction","removeAction","getAction","getTmpID","deleteAction","actionSettings","dropActionType","type_slug","actionTypeModel","filterActionTypes","newInstalled","newAvailable","defaultFields","clickListUpdate","maybeRenderFields","maybeRenderGroups","registerFieldsListener","registerGroupsListener","updateFieldMapping","updateInterestGroups","updateLists","lists","always","selectedList","list","groups","group","formSettingTypeData","settingsModel","getSettings","updateCalc","sortCalc","checkName","checkEQ","checkDec","checkAllCalcs","nameExists","eq","errorSelfRef","errorFutureCalc","calcs","calculations","targetCalc","selfRef","futureCalc","dec","errorNonIntDec","checked","Math","abs","nonIntDec","Remote","Drawer","DrawerConfig","DomainConfig","AppData","DrawerToggleSettingGroup","UpdateDB","FormData","PreviewLink","AppMenuButtons","AppTrackChanges","AppUndoChanges","AppPublishResponse","AppChangeDomain","Pushstate","Hotkeys","CleanState","CoreUndo","CloneModelDeep","DrawerSettingChildView","ChangeSettingDefault","Fieldset","ToggleSetting","ItemControls","MergeTags","MergeTagsBox","ItemSettingFill","ConfirmPublish","RTE","SettingFieldSelect","SettingFieldList","SettingHTML","SettingColor","ChangeMenu","AppMobile","AppNotices","AppUnloadCheck","FormContentFilters","FormContentGutterFilters","CloneCollectionDeep","TrackKeyDown","PerfectScroll","GetNewSettingGroupCollection","SettingMedia","FieldTypes","FieldTypeDrag","FieldStagingDrag","StagedFieldsData","StagedFieldsSortable","DrawerFilterFieldTypes","MainContentFieldsSortable","FieldData","OptionRepeater","FieldsEditActive","FieldSettings","FieldCreditCard","FieldList","FieldPassword","FieldQuantity","FieldShipping","FieldKey","Notices","FieldsMobile","SavedFields","FieldDatepicker","FieldDisplayCalc","ActionTypes","ActionData","ActionSettings","ActionEditActive","ActionAddTypes","ActionTypeDrag","ActionDroppable","ActionFilterTypes","ActionNewsletterList","SettingTypes","SettingData","FormSettings","SettingsEditActive","SettingsClickEdit","AdvancedCalculations","doingShortcut","touch","renderRequired","required","getFieldID","renderIcon","mousedown","singletap","swipeleft","swiperight","tapend","maybeShortcut","maybeTapEdit","swipeLeft","startEvnt","swipeRight","renderTitle","fieldItemView","mainContentEmptyView","FormTitleView","getFieldItem","getMainContentEmpty","getFormTitle","ready","$","BuilderView","LoadControllers","LoadViews","NinjaForms","Application","Renderer","onStart","evaluate","interpolate","variable","ninjaForms"],"mappings":"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ACA,4BACA,8BACA,kCACA,iCACA,sBACA,qCACA,mCACA,8BACA,+BACA,6BACA,yBACA,0BACA,8BACA,qCACA,2CACA,sCACA,+BACA,gCACA,+CACA,+BAIA,2BACA,mCACA,iCACA,6BACA,qCACA,iCACA,8BACA,0BACA,iCACA,gCACA,mCACA,qCACA,+BACA,mCACA,mCACA,mCACA,yBACA,6BACA,4BACA,iCACA,qCACA,sCAKA,4BACA,2BACA,qCACA,iCACA,qCACA,+BACA,gCACA,kCACA,qCAKA,6BACA,4BACA,oCACA,kCACA,iCACA,qCAEA,SAIAoxC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAIAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GACAC,GACAC,GACAC,IAGA,GAAAhjC,IAAAxN,WAAA7B,OAAA+B,QACAG,WAAA,WAIA,GAAAwtC,GACA,GAAAC,GACA,GAAAvB,GACA,GAAAf,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAE,GACA,GAAAG,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAG,GACA,GAAAC,GACA,GAAAC,GACA,GAAAK,GACA,GAAAI,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAW,GACA,GAAAV,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAA9B,GACA,GAAAiC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GAQA,GAAArB,GACA,GAAA+B,GAEA,GAAAR,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAA9B,GACA,GAAAE,GACA,GAAAH,GACA,GAAAkC,GACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IAIA,GAAAS,IACA,GAAAR,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IAIA,GAAAE,IACA,GAAAE,IACA,GAAAG,IACA,GAAAJ,IACA,GAAAE,IACA,GAAAC,IAMA,GAAA3E,GACA,GAAA+C,GACA,GAAA5C,GACA,GAAAiB,GACA,GAAAC,GACA,GAAAC,KAIA,OAAA1/B,MAGApT,EAAA,0BAAA,0BAAA,SAAAskB,GCvTA,GAAA3e,GAAAC,WAAA+D,WAAA7D,QACAC,QAAA,MACAC,SAAA,8BACAqwC,eAAA,EAEAzsC,SACA2a,aAAA,qBAGAte,WAAA,WACAC,KAAAK,MAAAC,GAAA,oBAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,eAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,kBAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,YAAAN,KAAAI,OAAAJ,OAGAkG,gBAAA,WACAlG,KAAAK,MAAA8F,IAAA,oBAAAnG,KAAAI,QACAJ,KAAAK,MAAA8F,IAAA,eAAAnG,KAAAI,QACAJ,KAAAK,MAAA8F,IAAA,kBAAAnG,KAAAI,QACAJ,KAAAK,MAAA8F,IAAA,YAAAnG,KAAAI,SAGAG,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,KAEAR,KAAAqe,aAAAta,KAAA,GAAAqa,IAAA/d,MAAAL,KAAAK,SACAb,OAAAQ,KAAAkC,IAAAkQ,mBAEAlS,EAAAC,QAAA,OAAAmB,QAAA,cACA9B,OAAAQ,KAAAkC,IAAA5B,GAAA,UAAA,SAAA/B,EAAA6xC,GACA5wC,OAAAjB,EAAA2P,QAAAqjB,SAAA,sBACA/xB,OAAAQ,MAAAqM,SAAA,oCACA7M,OAAAQ,MAAAwmC,aAAA,SAAAC,SAAA,MAAA,IAAA,MAAA,IAAA,OAAA,KAAA,OAAA,KAAAC,MAAA,SAMA1lC,gBAAA,WACA,OACAG,cAAA,WACA,GAAAC,GAAA,eAIA,OAHApB,MAAAof,aACAhe,GAAA,WAEAA,GAEAivC,eAAA,WACA,MAAA,IAAArwC,KAAAswC,SACA,kCAEA,IAGAC,WAAA,WACA,MAAA/wC,QAAAylB,UAAAjlB,KAAAvB,IACA,SAAAuB,KAAAvB,GAEAuB,KAAAvB,IAGA+xC,WAAA,WACA,GAAA19B,GAAA5S,EAAAC,QAAA,UAAAmB,QAAA,WAAAtB,KAAA8S,KACA,OAAA,sBAAAA,EAAAvR,IAAA,QAAA,eAKAX,QACA8c,6BAAA,uBACA+yB,UAAA,gBACAjyB,MAAA,iBACAkyB,UAAA,eACAC,UAAA,YACAC,WAAA,aACAC,OAAA,UAGApyB,eAAA,SAAAlgB,GACA,MAAAyB,MAAAmwC,eACAnwC,KAAAmwC,eAAA,GACA,SAGA3wC,OAAAjB,EAAA2P,QAAAnI,SAAAwrB,SAAA,uBAAA/xB,OAAAjB,EAAA2P,QAAAnI,SAAAwrB,SAAA,kBAAA/xB,OAAAjB,EAAA2P,QAAAqjB,SAAA,oBAAArxB,EAAAC,QAAA,OAAAmB,QAAA,eACA9B,OAAA,UAAAiQ,OACAvP,EAAAC,QAAA,OAAAY,QAAA,aAAAxC,EAAAyB,KAAAK,UAIAywC,cAAA,SAAAvyC,GACA,GAAAoQ,GAAAzO,EAAAC,QAAA,OAAAmB,QAAA,cAIA,QAAA,GAAAqN,EAAAzS,QAAA,OAMA,GAAAyS,EAAAzS,QAAA,KACAgE,EAAAC,QAAA,OAAAY,QAAA,eAAAxC,EAAAyB,KAAAK,OACAL,KAAAmwC,eAAA,GACA,IACA,GAAAxhC,EAAAzS,QAAA,KACA8D,KAAAmwC,eAAA,EACAjwC,EAAAC,QAAA,OAAAY,QAAA,kBAAAxC,EAAAyB,KAAAK,QACA,GAHA,SAOA0wC,aAAA,SAAAxyC,GACAiB,OAAAjB,EAAA2P,QAAAnI,SAAAwrB,SAAA,uBACArxB,EAAAC,QAAA,OAAAY,QAAA,aAAAxC,EAAAyB,KAAAK,QAIA2wC,UAAA,SAAAzyC,EAAA6xC,GACA5wC,OAAA4wC,EAAAa,UAAA/iC,QAAAuiB,QAAA,OAAAtuB,KAAA,sBAAA4B,OACAvE,OAAA4wC,EAAAa,UAAA/iC,QAAAuiB,QAAA,OAAAtuB,KAAA,mBAAA4B,QAGAmtC,WAAA,SAAA3yC,EAAA6xC,GACA5wC,OAAA4wC,EAAAa,UAAA/iC,QAAAuiB,QAAA,OAAAtuB,KAAA,sBAAAga,OACA3c,OAAA4wC,EAAAa,UAAA/iC,QAAAuiB,QAAA,OAAAtuB,KAAA,mBAAAga,QAGA00B,OAAA,SAAAtyC,EAAA6xC,GACA5wC,OAAAQ,KAAAkC,IAAAskC,aAAA,QACAhnC,OAAAQ,KAAAkC,IAAA0L,YAAA,qCAGArD,OAAA,WACArK,EAAAC,QAAA,UAAAmB,QAAA,gBACAtB,KAAAQ,IAAA2b,KAAA,OAAA,WACA3c,OAAAQ,MAAAuK,WAGAvK,KAAAQ,IAAA+J,SAGArK,EAAAC,QAAA,UAAAmB,QAAA,gBAAA,IAGA6c,qBAAA,SAAA5f,GACAiB,OAAAQ,KAAAkC,IAAAC,KAAA,oBAAA8E,IAAA,UAAA,MAKA,OAAAxH,KAEA3F,EAAA,mCAAA,WC5JA,GAAA2F,GAAAC,WAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,qCAEAoG,gBAAA,WACA1G,OAAAQ,KAAAkC,IAAA6D,SAAA6H,YAAA,6BAAAmR,UAAA,YAGAxe,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,MAGAyB,OAAA,WACAzC,OAAAQ,KAAAkC,IAAA6D,SAAAwrB,SAAA,gBACA/xB,OAAAQ,KAAAkC,IAAA6D,SAAAyK,SAAA,WAEAhR,OAAAQ,KAAAkC,IAAA6D,SAAAsG,SAAA,6BACA7M,OAAAQ,KAAAkC,IAAA6D,SAAAgZ,WACAC,OAAA,SAAA7N,GACA,GAAA3R,OAAA2R,GAAAogB,SAAA,aAAA/xB,OAAA2R,GAAAogB,SAAA,wBACA,OAAA,GAGAjhB,YAAA,sBACA2O,WAAA,qBACAtO,UAAA,UACAC,KAAA,SAAArS,EAAAsS,GACAA,EAAAoL,KAAApL,EAAAM,UACAjR,EAAAC,QAAA,OAAAmB,QAAA,sBAAAuP,IAEAC,IAAA,SAAAvS,EAAAsS,GACAA,EAAAoL,KAAApL,EAAAM,UACAjR,EAAAC,QAAA,OAAAmB,QAAA,qBAAAuP,IAEAqO,KAAA,SAAA3gB,EAAAsS,GACAA,EAAAoL,KAAApL,EAAAM,UACAjR,EAAAC,QAAA,OAAAmB,QAAA,yBAAAuP,EACA,IAAA5H,GAAA/I,EAAAC,QAAA,UAAAmB,QAAA,iBACA2H,GAAAlI,QAAA,QAAAkI,QAMA,OAAAxJ,KCvCA3F,EAAA,yBAAA,WACA,GAAA2F,GAAAC,WAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,6BAEAC,WAAA,WAEAC,KAAAK,MAAAC,GAAA,eAAAN,KAAAI,OAAAJ,OASAgB,gBAAA,WAEA,OACAmwC,YAAA,WACA,GAAA1sC,GAAAvE,EAAAC,QAAA,OAAAmB,QAAA,gBACA,OAAA+I,GAAAmN,OAAA/S,EAAAlD,IAAA,YAAAA,IAAA,cAOA,OAAA9B,KC3BA3F,EAAA,mBAAA,yBAAA,gCAAA,uBAAA,SAAAs3C,EAAAC,EAAAC,GACA,GAAApkC,GAAAxN,WAAA7B,OAAA+B,QACAG,WAAA,WAEAG,EAAAC,QAAA,SAAAiF,MAAA,gBAAApF,KAAAuxC,cAGArxC,EAAAC,QAAA,SAAAiF,MAAA,uBAAApF,KAAAwxC,qBAGAtxC,EAAAC,QAAA,SAAAiF,MAAA,gBAAApF,KAAAyxC,eAGAF,aAAA,SAAAlxC,GACA,MAAA+wC,IAGAI,oBAAA,WACA,MAAAH,IAGAI,aAAA,WACA,MAAAH,KAKA,OAAApkC,IAEA,IAAAhN,GAAAkJ,SAAA0vB,KCpCAt5B,QAAAuoB,UAAA2pB,MAAA,SAAAC,GACA93C,GAAA,oBAAA,8BAAA,mBAAA,SAAA+3C,EAAAC,EAAAC,GAEA,GAAAC,GAAAryC,WAAAsyC,YAAApyC,QAEAG,WAAA,SAAAkN,GAEA,GAAA5K,GAAArC,IACAN,YAAAuyC,SAAA7xC,OAAA,SAAAN,EAAAwG,GACA,GAAAxG,GAAAuC,EAAAvC,SAAAA,EACA,OAAAA,GAAAwG,IAIApG,EAAAC,QAAA,OAAAY,QAAA,yBAAAf,KAEA,IAAA6xC,EAEA3xC,GAAAC,QAAA,OAAAY,QAAA,wBAAAf,MAGAE,EAAAC,QAAA,OAAAY,QAAA,mBAAAf,KACA,IAAA8xC,EAEA5xC,GAAAC,QAAA,OAAAY,QAAA,kBAAAf,MAEAE,EAAAC,QAAA,OAAAiF,MAAA,eAAApF,KAAAF,WAGAoyC,QAAA,WACA,GAAAN,EAEA1xC,GAAAC,QAAA,OAAAY,QAAA,iBAAAf,MAKA,GAAA0M,QAAAs6B,QACA9mC,EAAAC,QAAA,OAAAmB,QAAA,cAAA,aAIAxB,SAAA,SAAAA,GACA,MAAAuK,GAAAvK,SAAA6xC,EAAA7xC,GAAA8S,QACAu/B,SAAA,kBACAC,YAAA,0BACA56B,OAAA,2BACA66B,SAAA,YAKAC,EAAA,GAAAP,EACAO,GAAArhC,YAGAnX,EAAA,OAAA","file":"builder.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","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menuItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-app-menu-item',\n\n\t\tinitialize: function() {\n\t\t\t// Listen for domain changes and re-render when we detect one.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// Listen for clicks on our app menu.\n\t\tevents: {\n\t\t\t'click a': 'clickAppMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click on a menu item, fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * We pass this.model so that we know what item was clicked.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\te event\n\t\t * @return return\n\t\t */\n\t\tclickAppMenu: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t\t\t\t * If we have any dashicons in our model, render them.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDashicons: function() {\n\t\t\t\t\tif ( this.dashicons ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.dashicons + '\"></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\t\t\t\t/**\n\t\t\t\t * Render classes for our menu item, including active.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\n\t\t\t\t\t\tclasses += ' active';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its url.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderUrl: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\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\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its target.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderTarget: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\treturn '_blank';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '_self';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * If our menu item is disabled, output 'disabled'\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\tif ( this.disabled ) {\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\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Collection view that takes our app menu items and renders an individual view for each.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menu',['views/app/menuItem'], function( appMenuItemView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: appMenuItemView,\n\n\t\t/**\n\t\t * When we show this view, get rid of the extra <div> tag added by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonShow: function() {\n\t\t\tjQuery( this.el ).find( 'li:last' ).unwrap();\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Renders the action buttons to the right of the app menu. i.e. Publish\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menuButtons',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'span',\n\t\ttemplate: '#tmpl-nf-app-header-action-button',\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:loading', this.render, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.bounceIcon, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t \t\t/**\n\t \t\t * Render our Publish button. If we're loading, render the loading version.\n\t \t\t *\n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\trenderPublish: function() {\n\t \t\t\tif ( that.publishWidth ) {\n\t \t\t\t\tthis.publishWidth = 'style=\"width:' + that.publishWidth + 'px !important\"';\n\t \t\t\t} else {\n\t \t\t\t\tthis.publishWidth = '';\n\t \t\t\t}\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'loading' ) ) {\n\t \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-header-publish-loading' );\n\t \t\t\t} else {\n\t \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-app-header-publish-button' );\n\t \t\t\t}\n\t \t\t\treturn template( this );\n\t \t\t},\n\n\t \t\t/**\n\t \t\t * If our app state is clean, disable publish.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\n\t \t\t/**\n\t \t\t * If our app isn't clean, render our 'viewChanges' button.\n\t \t\t * @since version\n\t \t\t * @return {[type]} [description]\n\t \t\t */\n\t \t\tmaybeRenderCancel: function() {\n\t \t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\tvar viewChanges = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-app-header-view-changes' );\n\t \t\t\t\treturn viewChanges( this );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tvar publishEL = jQuery( this.el ).find( '.publish' );\n\t\t\t// this.publishWidth = jQuery( publishEL ).outerWidth( true );\n\t\t},\n\n\t\t/**\n\t\t * Listen for clicks on the Publish or view changes button.\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .publish': 'clickPublish',\n\t\t\t'click .viewChanges': 'clickViewChanges'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\n\t\t},\n\n\t\t/**\n\t\t * When we click view changes, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickViewChanges: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:viewChanges', e );\n\t\t},\n\n\t\tbounceIcon: function( changeModel ) {\n\t\t\tjQuery( this.el ).find( '.dashicons-backup' ).effect( 'bounce', { times: 3 }, 600 );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders the action buttons to the right of the app menu. i.e. Publish\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenuButton',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'span',\n\t\ttemplate: '#tmpl-nf-mobile-menu-button',\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\t/**\n\t \t\t * If our app state is clean, disable button.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t}\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Listen for clicks on the mobile menu button.\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .nf-mobile-menu': 'clickMobileMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickMobileMenu: function( e) {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Main application header. Includes links to all of our domains.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/header',['views/app/menu', 'views/app/menuButtons', 'views/app/mobileMenuButton'], function( appMenuCollectionView, appMenuButtonsView, mobileMenuButtonView ) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-app-header',\n\n\t\tregions: {\n\t\t\t// Menu is our main app menu.\n\t\t\tmenu: '.nf-app-menu',\n\t\t\t// Buttons represents the 'view changes' and 'Publish' buttons.\n\t\t\tbuttons: '.nf-app-buttons',\n\t\t\tmobileMenuButton: '.nf-mobile-menu-button'\n\t\t},\n\n\t\t/**\n\t\t * Since this is a layout region, we need to fill the two areas: menu and buttons whenever we show this view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonRender: function() {\n\t\t\t// Get our domains\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\t// show the menu area using the appropriate view, passing our domain collection.\n\t\t\tthis.menu.show( new appMenuCollectionView( { collection: appDomainCollection } ) );\n\t\t\tthis.buttons.show( new appMenuButtonsView() );\n\t\t\tthis.mobileMenuButton.show( new mobileMenuButtonView() );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click #nf-logo': 'clickLogo'\n\t\t},\n\n\t\tclickLogo: function( e ) {\n\t\t\t\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Renders our sub-header. i.e. add new field, add new action, etc.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our builder header.\n *\n * This is a layout view and handles two regions:\n * app - menu/buttons\n * subapp - title, add new field, etc.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/builderHeader',[ 'views/app/header', 'views/app/subHeader' ], function( appHeaderView, appSubHeaderView ) {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: \"div\",\n\t\ttemplate: \"#tmpl-nf-header\",\n\n\t\tregions: {\n\t\t\tapp: \"#nf-app-header\",\n\t\t\tformTitle: \"#nf-app-form-title\",\n\t\t\tappSub: \"#nf-app-sub-header\"\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changeSubHeader );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.app.show( new appHeaderView() );\n\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar formSettings = formData.get( 'settings' );\n\n\t\t\tvar formTitleView = nfRadio.channel( 'views' ).request( 'get:formTitle' );\n\t\t\tthis.formTitle.show( new formTitleView( { model: formSettings } ) );\n\n\t\t\tthis.changeSubHeader();\n\t\t},\n\n\t\tchangeSubHeader: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar subHeaderView = currentDomain.get( 'getSubHeaderView' ).call( currentDomain );\n\t\t\tthis.appSub.show( subHeaderView );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our builder.\n *\n * This is a layout view and handles three regions:\n * gutterLeft - gutter to the left of our main content area\n * body - main content area\n * gutterRight - gutter to the right of our main content area\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/main',[], function() {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main',\n\t\tclassName: 'nf-main-test',\n\t\tmaybeDone: false,\n\n\t\toffsetRight: false,\n\t\toffsetLeft: false,\n\n\t\tregions: {\n\t\t\tgutterLeft: '#nf-main-gutter-left',\n\t\t\tbody: '#nf-main-body',\n\t\t\tgutterRight: '#nf-main-gutter-right'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:mainEl', this.getMainEl, this );\n\n\t\t\t/*\n\t\t\t * Make sure that our gutters resize to match our screen upon resize or drawer open/close.\n\t\t\t */\n\t\t\tjQuery( window ).on( 'resize', { context: this }, this.resizeBothGutters );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:open', this.setBothGuttersAbsolute );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.setBothGuttersFixed );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.setBothGuttersAbsolute );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.setBothGuttersFixed );\n\n\t\t\t/*\n\t\t\t * Reply to messages requesting that we resize our gutters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:gutters', this.updateGutters, this );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tnfRadio.channel( 'main' ).trigger( 'show:main', this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar bodyView = currentDomain.get( 'getMainContentView' ).call( currentDomain );\n\t\t\tthis.body.show( bodyView );\n\n\t\t\tvar gutterLeftView = currentDomain.get( 'getGutterLeftView' ).call( currentDomain );\n\t\t\tthis.gutterLeft.show( gutterLeftView );\n\n\t\t\tvar gutterRightView = currentDomain.get( 'getGutterRightView' ).call( currentDomain );\n\t\t\tthis.gutterRight.show( gutterRightView );\n\t\t\t\n\t\t\tnfRadio.channel( 'main' ).trigger( 'render:main' );\n\t\t},\n\n\t\tgetMainEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tonAttach: function() {\n\t\t\tthis.initialGutterResize();\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( window ).off( 'resize', this.resize );\n\t\t},\n\n\t\tinitialGutterResize: function() {\n\t\t\tthis.resizeGutter( this.gutterLeft.el );\n\t\t\tthis.resizeGutter( this.gutterRight.el );\n\t\t\tthis.setBothGuttersFixed( this );\n\t\t},\n\n\t\tresizeBothGutters: function( e ) {\n\t\t\tvar context = ( e ) ? e.data.context : this;\n\n\t\t\tvar leftEl = context.gutterLeft.el;\n\t\t\tvar rightEl = context.gutterRight.el;\n\t\t\t\n\t\t\tcontext.resizeGutter( leftEl, context );\n\t\t\tcontext.resizeGutter( rightEl, context );\n\n\t\t\tcontext.setBothGuttersAbsolute( context );\n\n\t\t\t/*\n\t\t\t * Clear our timeout. If the timeout runs, it means we've stopped resizing.\n\t\t\t */\t\n\t\t\tclearTimeout( context.maybeDone );\n\t\t\t/*\n\t\t\t * Add our timeout.\n\t\t\t */\n\t\t\tcontext.maybeDone = setTimeout( context.setBothGuttersFixed, 100, context );\n\t\t},\n\n\t\tresizeGutter: function( el, context ) {\n\t\t\tvar top = jQuery( el ).offset().top;\n\t\t\tvar viewHeight = jQuery( window ).height();\n\t\t\tvar height = viewHeight - top;\n\t\t\tjQuery( el ).height( height );\n\t\t},\n\n\t\tsetBothGuttersFixed: function( context ) {\n\t\t\tcontext = context || this;\n\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\tvar topLeft = offsetLeft.top;\n\t\t\tvar leftLeft = offsetLeft.left;\n\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'fixed', left: leftLeft, top: topLeft } );\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\t\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\n\t\t\tvar topRight = offsetRight.top;\n\t\t\tvar leftRight = offsetRight.left;\n\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'fixed', left: leftRight, top: topRight } );\n\t\t},\n\n\t\tsetBothGuttersAbsolute: function( context ) {\n\t\t\tcontext = context || this;\n\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\n\n\t\t\tvar scrollTop = jQuery( '#nf-main' ).scrollTop();\n\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'absolute', left: 0, top: scrollTop } );\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'absolute', top: scrollTop, right: 0, left: 'auto' } );\n\t\t},\n\n\t\tupdateGutters: function() {\n\t\t\tthis.resizeBothGutters();\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenuItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-mobile-menu-item',\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// Listen for clicks on our app menu.\n\t\tevents: {\n\t\t\t'click a': 'clickAppMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click on a menu item, fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * We pass this.model so that we know what item was clicked.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\te event\n\t\t * @return return\n\t\t */\n\t\tclickAppMenu: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t\t\t\t * If we have any dashicons in our model, render them.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDashicons: function() {\n\t\t\t\t\tif ( this.mobileDashicon ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.mobileDashicon + '\"></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\t\t\t\t/**\n\t\t\t\t * Render classes for our menu item, including active.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\n\t\t\t\t\t\tclasses += ' active';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its url.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderUrl: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\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\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its target.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderTarget: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\treturn '_blank';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '_self';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * If our menu item is disabled, output 'disabled'\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\tif ( this.disabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Single item view used for the menu drawer.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenu',['views/app/mobileMenuItem'], function( mobileMenuItemView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-mobile-menu',\n\t\tchildView: mobileMenuItemView,\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.secondary' ).append( childView.el );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t \t\t * If our app state is clean, disable button.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-publish': 'clickPublish'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Empty drawer content view.\n * Called before we close the drawer.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our drawer region\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer',['views/app/drawer/contentEmpty'], function( drawerEmptyView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer',\n\n\t\tregions: {\n\t\t\theader: '#nf-drawer-header',\n\t\t\tcontent: '#nf-drawer-content',\n\t\t\tfooter: '#nf-drawer-footer'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerEl', this.getEl, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'load:drawerContent', this.loadContent, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'empty:drawerContent', this.emptyContent, this );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).parent().perfectScrollbar();\n\t\t\t}\n\t\t},\n\n\t\tloadContent: function( drawerID, data ) {\n\t\t\tvar drawer = nfRadio.channel( 'app' ).request( 'get:drawer', drawerID );\n\t\t\tvar contentView = drawer.get( 'getContentView' ).call( drawer, data );\n\t\t\tvar headerView = drawer.get( 'getHeaderView' ).call( drawer, data );\n\t\t\tvar footerView = drawer.get( 'getFooterView' ).call( drawer, data );\n\n\t\t\tthis.header.show( headerView );\n\t\t\tthis.content.show( contentView );\n\t\t\tthis.footer.show( footerView );\n\n\t\t},\n\n\t\temptyContent: function() {\n\t\t\tthis.header.empty();\n\t\t\tthis.content.empty();\n\t\t\tthis.footer.empty();\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-toggle-drawer': 'clickToggleDrawer'\n\t\t},\n\n\t\tclickToggleDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:toggleDrawerSize' );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Single item view used for merge tags.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'li',\n\n\t\ttemplate: '#tmpl-nf-merge-tags-item',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:active', this.render );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:active', this.render, this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click a': 'clickTag'\n\t\t},\n\n\t\tclickTag: function( e ) {\n\t\t\tnfRadio.channel( 'mergeTags' ).trigger( 'click:mergeTag', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tif ( this.active ) {\n\t\t\t\t\t\treturn 'active';\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Merge tags popup section\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagsSection',['views/app/drawer/mergeTagItem'], function( mergeTagItemView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttagName: 'div',\n\t\tchildView: mergeTagItemView,\n\t\ttemplate: '#tmpl-nf-merge-tags-section',\n\n\t\tinitialize: function() {\n\t\t\tthis.collection = this.model.get( 'tags' );\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\n\t\t\t\t// var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t// fieldCollection.on( 'all', this.updateFields, this );\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change', this.render );\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\tfieldCollection.off( 'all', this.updateFields, this );\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.merge-tags' ).append( childView.el );\n\t\t},\n\n\t\tupdateFields: function() {\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tthis.model.set( 'tags', fieldCollection );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Model that represents our merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tactive: false,\n\t\t\texclude: false\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collections of merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: mergeTagModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Merge tags popup\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagsContent',['views/app/drawer/mergeTagsSection', 'models/app/mergeTagCollection'], function( mergeTagsSectionView, MergeTagCollection ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-merge-tags-content',\n\t\tchildView: mergeTagsSectionView,\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:view', this.getMergeTagsView, this );\n\t\t},\n\n\t\treRender: function( settingModel ) {\n\t\t\tvar mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n\t\t\tvar defaultGroups = mergeTagCollection.where( { default_group: true } );\n\n\t\t\t/*\n\t\t\t * For the Actions Domain, Add Calc Merge Tags as a Default Group.\n\t\t\t */\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tif( 'actions' == currentDomain.get( 'id' ) ){\n\t\t\t\tvar calcMergeTagGroup = mergeTagCollection.where( { id: 'calcs' } );\n defaultGroups = defaultGroups.concat( calcMergeTagGroup );\n }\n\n\t\t\tthis.collection = new MergeTagCollection( defaultGroups );\n\t\t\tvar that = this;\n\t\t\tvar useMergeTags = settingModel.get( 'use_merge_tags' );\n\t\t\tif ( 'object' == typeof useMergeTags ) {\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.exclude ) {\n\t\t\t\t\t_.each( useMergeTags.exclude, function( exclude ) {\n\t\t\t\t\t\tthat.collection.remove( exclude )\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.include ) {\n\t\t\t\t\t_.each( mergeTagCollection.models, function( sectionModel ) {\n\t\t\t\t\t\tif ( -1 != useMergeTags.include.indexOf( sectionModel.get( 'id' ) ) ) {\n\t\t\t\t\t\t\t// console.log( sectionModel );\n\t\t\t\t\t\t\tthat.collection.add( sectionModel );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.render();\n\t\t},\n\n\t\tgetMergeTagsView: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Builder view.\n *\n * This layout view has regions that represent our application areas:\n * header\n * main\n * menuDrawer - Mobile side-menu\n * drawer\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/builder',['views/app/builderHeader', 'views/app/main', 'views/app/mobileMenu', 'views/app/drawer', 'views/app/drawer/mergeTagsContent'], function( headerView, mainView, mobileMenuView, drawerView, mergeTagsContentView ) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: \"#tmpl-nf-builder\",\n\t\tel: '#nf-builder',\n\n\t\tregions: {\n\t\t\theader: \"#nf-header\",\n\t\t\tmain: \"#nf-main\",\n\t\t\tmenuDrawer: \"#nf-menu-drawer\",\n\t\t\tdrawer: \"#nf-drawer\",\n\t\t\tmergeTagsContent: '.merge-tags-content'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Respond to requests asking for the builder dom element.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderEl', this.getBuilderEl, this );\n\t\t\t// Respond to requests asking for the builder view\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderView', this.getBuilderView, this );\n\t\t\t// Layout views aren't self-rendering.\n\t\t\tthis.render();\n\t\t\tvar mergeTags = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n\t\t\tvar mergeTagsClone = mergeTags.clone();\n\t\t\tthis.mergeTagsContent.show( new mergeTagsContentView( { collection: mergeTagsClone } ) );\n\t\t\t// Show our header.\n\t\t\tthis.header.show( new headerView() );\n\t\t\t// Show our main content.\n\t\t\tthis.main.show( new mainView() );\n\t\t\t// Show our mobile menu\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tthis.menuDrawer.show( new mobileMenuView( { collection: appDomainCollection } ) );\n\t\t\t// Show our drawer.\n\t\t\tthis.drawer.show( new drawerView() );\n\n\n\t\t},\n\n\t\tonRender: function() {\n\n\t\t},\n\n\t\tgetBuilderEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\tgetBuilderView: function() {\n\t\t\treturn this;\n\t\t},\n\n\t\t// Listen for clicks\n\t\tevents: {\n\t\t\t'click .nf-open-drawer': 'openDrawer',\n\t\t\t'click .nf-change-domain': 'changeDomain',\n\t\t\t'click .nf-close-drawer': 'closeDrawer'\n\t\t},\n\n\t\t/**\n\t\t * Someone clicked to open a drawer, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Object \te \tevent\n\t\t * @return void\n\t\t */\n\t\topenDrawer: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:openDrawer', e );\n\t\t},\n\t\t/**\n\t\t * Someone clicked to close a drawer, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tcloseDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:closeDrawer' );\n\t\t},\n\t\t/**\n\t\t * Someone clicked to change the domain, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Object \te \tevent\n\t\t * @return void\n\t\t */\n\t\tchangeDomain: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n\n","\ndefine( 'controllers/app/remote',[], function() {\n return Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'setting' ), 'remote', this.addListener );\n },\n\n addListener: function( model, dataModel ) {\n\n var listenTo = model.get( 'remote' ).listen;\n\n // TODO: Change seems to be triggering twice on each update.\n this.listenTo( nfRadio.channel( 'fieldSetting-' + listenTo ), 'update:setting', this.updateSetting );\n this.listenTo( nfRadio.channel( 'actionSetting-' + listenTo ), 'update:setting', this.updateSetting );\n\n this.listenTo( nfRadio.channel( 'setting-type-' + model.get( 'type' ) ), 'click:extra', this.clickExtra );\n\n model.listenTo( nfRadio.channel( 'setting-remote' ), 'get:remote', this.getRemote, model );\n\n // Auto-trigger get:remote on drawer load.\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n clickExtra: function( e, settingModel, dataModel, settingView ) {\n jQuery( e.srcElement ).addClass( 'spin' );\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n updateSetting: function( dataModel, settingModel ) {\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n getRemote: function( dataModel ) {\n\n var remote = this.get( 'remote' );\n\n var data = {\n parentValue: dataModel.get( remote.listen ),\n action: remote.action,\n security: ( remote.security ) ? remote.security : nfAdmin.ajaxNonce\n };\n\n // TODO: Disable setting and lock drawer while updating.\n var that = this;\n jQuery.post( ajaxurl, data, function( response ){\n var response = JSON.parse( response );\n\n if( 'textbox' == that.get( 'type' ) ) {\n dataModel.set( that.get('name'), response.value );\n }\n\n if( 'select' == that.get( 'type' ) ) {\n that.set( 'options', response.options );\n that.trigger( 'rerender' );\n }\n });\n },\n\n });\n} );\n","/**\n * Handles opening and closing our drawer. This is where we display settings for fields, actions, and settings.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawer',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our drawer-related click events.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:openDrawer', this.clickOpenDrawer );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:closeDrawer', this.closeDrawer );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:toggleDrawerSize', this.toggleDrawerSize );\n\n\t\t\t// Reply to direct requests to open or close the drawer.\n\t\t\tnfRadio.channel( 'app' ).reply( 'open:drawer', this.openDrawer, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'close:drawer', this.closeDrawer, this );\n\n\t\t\t/*\n\t\t\t * When we close the drawer, we have to figure out what the right position should be.\n\t\t\t * This listens to requests from other parts of our app asking what the closed right position is.\n\t\t\t */\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:closedRightPos', this.getClosedDrawerPos, this );\n\t\t\t\n\t\t\t// Reply to requests to prevent our drawer from closing\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'prevent:close', this.preventClose, this );\n\t\t\t// Reply to requests to enable drawer closing\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'enable:close', this.enableClose, this );\n\t\t\t// Reply to requests for our disabled/enabled state.\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:preventClose', this.maybePreventClose, this );\n\n\t\t\t/*\n\t\t\t * Object that holds our array of 'prevent close' values.\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\n\t\t\t */\n\t\t\tthis.objPreventClose = {};\n\n\t\t\t/*\n\t\t\t * Listen to focus events on the filter and stop our interval when it happens.\n\t\t\t * This is to fix a bug that can cause the filter to gain focus every few seconds.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:focused', this.filterFocused );\n\t\t},\n\n\t\t/**\n\t\t * Handles closing our drawer\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tcloseDrawer: function() {\n\t\t\t// Get our current domain.\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\n\t\t\tif ( ! currentDrawer || this.maybePreventClose() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Triggers the before close drawer action on our current domain's drawer channel.\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'before:closeDrawer' );\n\t\t\t/*\n\t\t\t * The 'before:closeDrawer' message is deprecated as of version 3.0 in favour of 'before:close'.\n\t\t\t * TODO: Remove this radio message in the future.\n\t\t\t */\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:closeDrawer' );\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:close' );\n\t\t\t\n\t\t\t// Send a message to our drawer to empty its contents.\n\t\t\tnfRadio.channel( 'drawer' ).request( 'empty:drawerContent' );\n\n\t\t\t// To close our drawer, we have to add our closed class to the builder and remove the opened class.\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-closed' ).removeClass( 'nf-drawer-opened' );\n\t\t\tjQuery( builderEl ).removeClass( 'disable-main' );\n\n\t\t\t// Get the right position of our closed drawer. Should be container size in -px.\n\t\t\tvar rightClosed = this.getClosedDrawerPos();\n\n\t\t\t// Get our drawer element and give change the 'right' property to our closed position.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tjQuery( drawerEl ).css( { 'right': rightClosed } );\n\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've closed the drawer.\n\t\t\t *\n\t\t\t * Once our drawer is closed, we:\n\t\t\t * clear our interval\n\t\t\t * request that the app change it's current drawer to false\n\t\t\t * trigger a drawer closed message\n\t\t\t */\n\t\t\tthis.checkCloseDrawerPos = setInterval( function() {\n\t \tif ( rightClosed == jQuery( drawerEl ).css( 'right' ) ) {\n\t \t\tclearInterval( that.checkCloseDrawerPos );\n\t\t \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', false );\n\t\t \t\tnfRadio.channel( 'drawer' ).trigger( 'closed' );\n\t\t \t\t/*\n\t\t \t\t * Reset the add new button z-index to 98.\n\t\t \t\t */\n\t\t \t\tjQuery( '.nf-master-control' ).css( 'z-index', 98 );\n\t\t \t\t// jQuery( drawerEl ).scrollTop( 0 );\n\t \t}\n\t\t\t}, 150 );\n\t\t},\n\n\t\t/**\n\t\t * Click handler for our 'open drawer' event.\n\t\t * @since 3.0\n\t\t * @param e jQuery event\n\t\t * @return void\n\t\t */\n\t\tclickOpenDrawer: function( e ) {\n\t\t\tvar drawerID = jQuery( e.target ).data( 'drawerid' );\n\t\t\tthis.openDrawer( drawerID );\n\t\t},\n\n\t\t/**\n\t\t * Open our drawer.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string drawerID \tID of the drawer we want to open.\n\t\t * @param object data \tOptional data that we want to pass to the drawer.\n\t\t * @return void\n\t\t */\n\t\topenDrawer: function( drawerID, data ) {\n\t\t\tif ( this.maybePreventClose() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If we haven't sent a data object, set the variable to an empty object.\n\t\t\tdata = data || {};\n\n\t\t\t/*\n\t\t\t * If we're dealing with something that has a model, set the proper active state.\n\t\t\t *\n\t\t\t * TODO: Make this more dynamic. I'm not sure that it fits in the drawer controller.\n\t\t\t */\n\t\t\tif ( 'undefined' != typeof data.model ) {\n\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\t\tnfRadio.channel( currentDomainID ).request( 'clear:editActive' );\n\t\t\t\tdata.model.set( 'editActive', true );\n\t\t\t\tthis.dataModel = data.model;\n\t\t\t}\n\n\t\t\t// Send out a message requesting our drawer view to load the content for our drawer ID.\n\t\t\tnfRadio.channel( 'drawer' ).request( 'load:drawerContent', drawerID, data );\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:open' );\n\t\t\t\n\t\t\t// To open our drawer, we have to add our opened class to our builder element and remove the closed class.\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-opened' ).removeClass( 'nf-drawer-closed' );\n\t\t\t\n\t\t\t// To open our drawer, we have to set the right position of our drawer to 0px.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tjQuery( drawerEl ).css( { 'right': '0px' } );\n\t\t\t\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've opened the drawer.\n\t\t\t *\n\t\t\t * Once our drawer is opened, we:\n\t\t\t * clear our interval\n\t\t\t * focus our filter\n\t\t\t * request that the app update its current drawer to the one we opened\n\t\t\t * trigger a drawer opened message\n\t\t\t */\n\t\t\tthis.hasFocus = false;\n\n\t\t\t/*\n\t\t\t * Set our add new button z-index to 0;\n\t\t\t */\n\t\t\tjQuery( '.nf-master-control' ).css( 'z-index', 0 );\n\n\t\t\tthis.checkOpenDrawerPos = setInterval( function() {\n\t \tif ( '0px' == jQuery( drawerEl ).css( 'right' ) ) {\n\t \t\tclearInterval( that.checkOpenDrawerPos );\n\t\t\t\t\tif ( ! that.hasFocus ) {\n\t\t \t\tthat.focusFilter();\n\t\t\t\t\t\tthat.hasFocus = true;\n\t\t\t \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', drawerID );\n\t\t\t \t\tjQuery( drawerEl ).scrollTop( 0 );\n\t\t\t \t\tnfRadio.channel( 'drawer' ).trigger( 'opened' );\n\t\t\t\t\t} \t\t\n\t \t}\n\t\t\t}, 150 );\n\t\t},\n\n\t\t/**\n\t\t * Toggle the drawer from half to full screen and vise-versa\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\ttoggleDrawerSize: function() {\n\t\t\t// Get our drawer element.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\t// toggle our drawer size class.\n\t\t\tjQuery( drawerEl ).toggleClass( 'nf-drawer-expand' );\n\t\t},\n\n\t\t/**\n\t\t * Focus our filter\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n focusFilter: function() {\n \t// Get our filter element\n \tvar filterEl = nfRadio.channel( 'drawer' ).request( 'get:filterEl' );\n \t// Focus\n \tjQuery( filterEl ).focus();\n },\n\n /**\n * Get the CSS right position (in px) of the closed drawer element.\n * This is calculated by:\n * getting the width of the builder element\n * add 300 pixels\n * make it negative\n * \n * @since 3.0\n * @return void\n */\n getClosedDrawerPos: function() {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tvar closedPos = jQuery( builderEl ).width() + 300;\n\t\t\treturn '-' + closedPos + 'px';\n },\n\n /**\n * Check to see if anything has registered a prevent close key.\n * \n * @since 3.0\n * @return boolean\n */\n maybePreventClose: function() {\n \tif ( 0 == Object.keys( this.objPreventClose ).length ) {\n \t\treturn false;\n \t} else {\n \t\treturn true;\n \t}\n },\n\n /**\n * Register a prevent close key.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent close' setting.\n * @return void\n */\n preventClose: function( key ) {\n \tthis.objPreventClose[ key ] = true;\n \t/*\n \t * When we disable closing the drawer, add the disable class.\n \t */\n \t// Get our current drawer.\n\t\t\tthis.dataModel.set( 'drawerDisabled', true );\n },\n\n /**\n * Remove a previously registered prevent close key.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent close' setting.\n * @return void\n */\n enableClose: function( key ) {\n \tdelete this.objPreventClose[ key ];\n \t /*\n \t * When we remove all of our disables preventing closing the drawer, remove the disable class.\n \t */\n \tif ( ! this.maybePreventClose() && 'undefined' != typeof this.dataModel ) {\n\t \t// Get our current drawer.\n\t\t\t\tthis.dataModel.set( 'drawerDisabled', false ); \t\t\n \t}\n },\n\n /**\n * When we focus our filter, make sure that our open drawer interval is cleared.\n * \n * @since 3.0\n * @return void\n */\n filterFocused: function() {\n \tclearInterval( this.checkOpenDrawerPos );\n },\n\n getPreventClose: function() {\n \treturn this.objPreventClose;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * Default drawer header.\n *\n * Includes our filter/search and 'Done' button.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerDefault',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-default',\n\n\t\tinitialize: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\t// Listen for our drawer being disabled.\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When we render, remove the extra div added by backbone and add listeners related to our filter.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonRender: function() {\n\t\t\t// Remove extra wrapping div.\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\t\t\t// Respond to requests related to our filter.\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'clear:filter', this.clearFilter, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'blur:filter', this.blurFilter, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:filterEl', this.getEl, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'keyup .nf-filter'\t: 'maybeChangeFilter',\n\t\t\t'input .nf-filter'\t: 'changeFilter',\n\t\t\t'focus input'\t\t: 'getFocus'\n\t\t},\n\n\t\t/**\n\t\t * When the filter text is changed, trigger an event on our current drawer.\n\t\t * This lets us keep the logic separate from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tchangeFilter: function( e ) {\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'change:filter', e.target.value, e );\n\t\t},\n\n\t\t/**\n\t\t * The user pressed a key. If it's the enter key, then run the change filter function.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tmaybeChangeFilter: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\te.addObject = true;\n\t\t\t\tthis.changeFilter( e );\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Clear our filter.\n\t\t *\n\t\t * This triggers 'input' on the field, which will trigger a change if necessary.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tclearFilter: function() {\n\t\t\tvar filterEl = jQuery( this.el ).find( '.nf-filter' );\n\t\t\tif ( '' != jQuery.trim( filterEl.val() ) ) {\n\t\t\t\tfilterEl.val('');\n\t\t\t\tfilterEl.trigger( 'input' );\n\t\t\t\tfilterEl.focus();\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fire the 'blur' event on our filter. Used to force a change event when the user tabs.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tblurFilter: function() {\n\t\t\tjQuery( this.el ).find( '.nf-filter' ).blur();\n\t\t},\n\n\t\t/**\n\t\t * Return our filter dom element.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).find( '.nf-filter' );\n\t\t},\n\n\t\tgetFocus: function() {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'filter:focused' );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\t// Get our current domain.\n\t\t\t\t\tif ( this.drawerDisabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Default drawer footer\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/footerDefault',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","define( 'models/app/drawerModel',['views/app/drawer/headerDefault', 'views/app/drawer/footerDefault'], function( defaultHeaderView, defaultFooterView ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tgetHeaderView: function( data ) {\n\t\t\t\treturn new defaultHeaderView( data );\n\t\t\t},\n\n\t\t\tgetFooterView: function( data ) {\n\t\t\t\treturn new defaultFooterView( data );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds all of our drawer models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/drawerCollection',['models/app/drawerModel'], function( drawerModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: drawerModel\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/drawer/stagedField',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-staged-field',\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\tevents: {\n\t\t\t'click .dashicons-dismiss': 'removeStagedField'\n\t\t},\n\n\t\tremoveStagedField: function( el ) {\n\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'click:removeStagedField', el, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/stagingEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-staged-fields-empty',\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/fields/drawer/stagingCollection',['views/fields/drawer/stagedField', 'views/fields/drawer/stagingEmpty'], function( stagedFieldView, stagedFieldsEmptyView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: stagedFieldView,\n\t\temptyView: stagedFieldsEmptyView,\n\n\t\tactiveClass: 'nf-staged-fields-active', // CSS Class for showing the reservoir.\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:stagedFieldsEl', this.getStagedFieldsEl, this );\n\t\t},\n\n\t\tonShow: function() {\n\n\t\t\tthis.$el = jQuery( this.el ).parent();\n\t\t\tjQuery( this.$el ).find( 'span:first' ).unwrap();\n\t\t\tthis.setElement( this.$el );\n\n\t\t\tvar that = this;\n\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\tplaceholder: 'nf-staged-fields-sortable-placeholder',\n\t\t\t\thelper: 'clone',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'over:stagedFields', e, ui );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'out:stagedFields', ui );\n\t\t\t\t},\n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'receive:stagedFields', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'start:stagedFields', ui );\n\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stop:stagedFields', ui );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tjQuery( this.el ).parent().draggable( {\n\t\t\t\topacity: 0.9,\n\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\n\t\t\t\tappendTo: '#nf-main',\n\t\t\t\trefreshPositions: true,\n\t\t\t\tgrid: [ 3, 3 ],\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\thelper: function( e ) {\n\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\n\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\n\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\n\t\t\t\t\tvar left = width / 4;\n\t\t\t\t\tvar top = height / 2;\n\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\n\t\t\t\t\tjQuery( element ).zIndex( 1000 );\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:fieldStaging', this, ui );\n\t\t\t\t},\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:fieldStaging', this, ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tgetStagedFieldsEl: function() {\n\t\t\treturn jQuery( this.el );\n\t\t},\n\n\t\tonAddChild: function() {\n\t\t\tjQuery( this.el ).addClass( this.activeClass );\n\t\t},\n\n\t\tonRemoveChild: function() {\n\t\t\tif( this.hasStagedFields() ) return;\n\t\t\tjQuery( this.el ).removeClass( this.activeClass );\n\t\t},\n\n\t\thasStagedFields: function() {\n\t\t\treturn 0 != this.collection.length;\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Model for our staged field.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/stagingModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection of staged fields.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/stagingCollection',['models/fields/stagingModel'], function( stagingModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: stagingModel,\n\t\tcomparator: 'order'\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/drawer/typeSection',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-field-type-section',\n\n\t\tinitialize: function() {\n\t\t\t_.bindAll( this, 'render' );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSection', this.getTypeSection, this );\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\tthis.dragging = false;\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * If we're on a mobile device, we don't want to enable dragging for our field type buttons.\n\t\t\t */\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).find( 'div.nf-field-type-draggable' ).draggable( {\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\ttolerance: 'pointer',\n\t\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\n\t\t\t\t\trefreshPositions: true,\n\t\t\t\t\tgrid: [ 5, 5 ],\n\t\t\t\t\tappendTo: '#nf-builder',\n\n\t\t\t\t\thelper: function( e ) {\n\t\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\n\t\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\n\t\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\n\t\t\t\t\t\tvar left = width / 4;\n\t\t\t\t\t\tvar top = height / 2;\n\t\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\n\t\t\t\t\t\tjQuery( element ).zIndex( 1000 );\n\t\t\t\t\t\treturn element;\n\t\t\t\t\t},\n\n\t\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = true;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = false;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tdrag: function(e, ui) {\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drag:type', this, ui, e );\t\n\t\t\t\t\t}\n\n\t\t\t\t} ).disableSelection();\n\n\t\t\t\tjQuery( this.el ).find( '.nf-item' ).focus( function() {\n\t\t\t \tjQuery( this ).addClass( 'active' );\n\t\t\t } ).blur( function() {\n\t\t\t \tjQuery( this ).removeClass( 'active' );\n\t\t\t } );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-item': 'clickFieldType',\n\t\t\t'keydown .nf-item': 'maybeClickFieldType',\n\t\t\t'mousedown .nf-item': 'mousedownFieldType'\n\t\t},\n\n\t\tclickFieldType: function( e ) {\n\t\t\tif ( ! this.dragging ) {\n\t\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:fieldType', e );\n\t\t\t}\n\t\t},\n\n\t\tmousedownFieldType: function( e ) {\n\t\t\tjQuery( e.target).addClass( 'clicked' );\n\t\t\tsetTimeout( function() {\n\t\t\t\tjQuery( e.target ).removeClass( 'clicked' );\n\t\t\t}, 1500 );\n\t\t},\n\n\t\tmaybeClickFieldType: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\tthis.clickFieldType( e );\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderFieldTypes: function() {\n\t\t\t var html = '';\n\t\t\t var that = this;\n\t\t\t _.each( this.fieldTypes, function( id ) {\n\t\t\t var type = nfRadio.channel( 'fields' ).request( 'get:type', id );\n\t\t\t var nicename = type.get( 'nicename' );\n\t\t\t var icon = type.get( 'icon' );\n\t\t\t var renderType = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-field-type-button' );\n\t\t\t html += renderType( { id: id, nicename: nicename, icon: icon, type: type, savedField: that.savedField } );\n\t\t\t } );\n\t\t\t return html;\n\t\t\t\t},\n\n\t\t\t\tsavedField: function() {\n\t\t\t\t\tif( this.type.get( 'savedField' ) ) {\n\t\t\t\t\t\treturn 'nf-saved';\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\t\t\t}\n\t\t},\n\n\t\tgetTypeSection: function() {\n\t\t\treturn this.el;\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/typeSectionCollection',['views/fields/drawer/typeSection'], function( fieldTypeSectionView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: fieldTypeSectionView,\n\n\t\tonShow: function() {\n\t\t\tjQuery( this.el ).find( '.nf-settings' ).unwrap();\n\t\t\tnfRadio.channel( 'fields' ).request( 'clear:editActive' );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/fields/drawer/addField',['views/fields/drawer/stagingCollection', 'models/fields/stagingCollection', 'views/fields/drawer/typeSectionCollection'], function( drawerStagingView, StagingCollection, fieldTypeSectionCollectionView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-content-add-field',\n\n\t\tregions: {\n\t\t\tstaging: '#nf-drawer-staging .nf-reservoir',\n\t\t\tprimary: '#nf-drawer-primary',\n\t\t\tsecondary: '#nf-drawer-secondary'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:fieldTypes', this.filterFieldTypes );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeFieldTypeFilter );\n\n\t\t\tthis.savedCollection = nfRadio.channel( 'fields' ).request( 'get:savedFields' );\n\t\t\tthis.primaryCollection = this.savedCollection;\n\n\t\t\tthis.fieldTypeSectionCollection = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\tthis.secondaryCollection = this.fieldTypeSectionCollection;\n\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tvar stagingCollection = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\tthis.staging.show( new drawerStagingView( { collection: stagingCollection } ) );\n\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.secondaryCollection } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tfilterFieldTypes: function( filteredSectionCollection ) {\n\t\t\tthis.primary.reset();\n\t\t\tthis.secondary.reset();\n\t\t\tthis.filteredSectionCollection = filteredSectionCollection;\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.filteredSectionCollection } ) );\n\t\t},\n\n\t\tremoveFieldTypeFilter: function () {\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.savedCollection } ) );\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.fieldTypeSectionCollection } ) );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingCollection',[], function() {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t},\n\n\t\tgetChildView: function( model ) {\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:settingChildView', model );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingGroup',['views/app/drawer/itemSettingCollection'], function( itemSettingCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-field-setting-group',\n\t\t\n\t\tregions: {\n\t\t\tsettings: '.nf-field-settings'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t\tthis.dataModel = data.dataModel;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.model.get( 'display' ) ) {\n\t\t\t\tthis.settings.show( new itemSettingCollectionView( { collection: this.model.get( 'settings' ), dataModel: this.dataModel } ) );\n\t\t\t} else {\n\t\t\t\tthis.settings.empty();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'render:settingGroup', this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .toggle': 'clickToggleGroup'\n\t\t},\n\n\t\tclickToggleGroup: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:toggleSettingGroup', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderLabel: function() {\n\t\t\t\t\tif ( '' != this.label ) {\n\t\t\t\t\t\tvar groupLabel = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-content-edit-setting-group-label' );\n\t\t\t\t\t\treturn groupLabel( this );\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\trenderArrowDir: function() {\n\t\t\t\t\tif ( this.display ) {\n\t\t\t\t\t\treturn 'down';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 'right';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingGroupCollection',['views/app/drawer/itemSettingGroup'], function( itemSettingGroupView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: itemSettingGroupView,\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/editSettings',['views/app/drawer/itemSettingGroupCollection'], function( itemSettingGroupCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings',\n\n\t\tregions: {\n\t\t\tsettingTitle: '.nf-setting-title',\n\t\t\tsettingGroups: '.nf-setting-groups'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.dataModel = data.model;\n\t\t\tthis.groupCollection = data.groupCollection;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar titleView = currentDomain.get( 'getSettingsTitleView' ).call( currentDomain, { model: this.model } );\n\n\t\t\tthis.settingTitle.show( titleView );\n\t\t\tthis.settingGroups.show( new itemSettingGroupCollectionView( { collection: this.groupCollection, dataModel: this.dataModel } ) );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\tmaybeRenderTitle: function() {\n\t \t\t\tif ( 'undefined' !== typeof this.type ) {\n\t \t\t\t\tvar title = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-content-edit-settings-title' );\n\t \t\t\t\treturn title( this );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\treturn type.get( 'nicename' );\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Edit Settings drawer header.\n *\n * Includes our 'Done' button.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerEditSettings',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-edit-settings',\n\n\t\tinitialize: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\t// Listen for our drawer being disabled.\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\t// Get our current domain.\n\t\t\t\t\tif ( this.drawerDisabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Button to add an action to the form.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/drawer/typeButton',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-action-type-button',\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\t\n\t\t\tjQuery( this.el ).disableSelection();\n\t\t\t\n\t\t\tif ( 'installed' == this.model.get( 'section') ) {\n\t\t\t\tvar that = this;\n\t\t\t\tjQuery( this.el ).draggable( {\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\ttolerance: 'intersect',\n\t\t\t\t\tscroll: false,\n\t\t\t\t\thelper: 'clone',\n\n\t\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = true;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'startDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = false;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'stopDrag:type', this, ui );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-item': 'clickAddAction'\n\t\t},\n\n\t\tclickAddAction: function( e ) {\n\t\t\tif ( ! this.dragging ) {\n\t\t\t\tif ( 'installed' == this.model.get( 'section' ) ) { // Is this an installed action?\n\t\t\t\t\tnfRadio.channel( 'actions' ).trigger( 'click:addAction', this.model );\n\t\t\t\t} else { // This isn't an installed action\n\t\t\t\t\twindow.open( this.model.get( 'link' ), '_blank' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-item';\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\n\t\t\t\t\t\tclasses += ' nf-has-img';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'installed' == this.section ) {\n\t\t\t\t\t\tclasses += ' nf-action-type';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderStyle: function() {\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\n\t\t\t\t\t\treturn \"style=\\\"background-image: url(\" + this.image + \");\\\"\"\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/actions/drawer/typeCollection',['views/actions/drawer/typeButton'], function( actionTypeButtonView ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-action-type-section',\n\t\tchildView: actionTypeButtonView,\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\trenderNicename: function() {\n\t\t\t\t\treturn that.collection.nicename;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\treturn that.collection.slug;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.action-types' ).append( childView.el );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Add action drawer.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/drawer/addAction',['views/actions/drawer/typeCollection'], function( actionTypeCollectionView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-content-add-action',\n\n\t\tregions: {\n\t\t\tprimary: '#nf-drawer-primary',\n\t\t\tsecondary: '#nf-drawer-secondary'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:actionTypes', this.filteractionTypes );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeactionTypeFilter );\n\t\t\n\t\t\tthis.installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n\t\t\tthis.primaryCollection = this.installedActions;\n\n\t\t\tthis.availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n\t\t\tthis.secondaryCollection = this.availableActions;\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.secondaryCollection } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tfilteractionTypes: function( filteredInstalled, filteredAvailable ) {\n\t\t\tthis.primary.reset();\n\t\t\tthis.secondary.reset();\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: filteredInstalled } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: filteredAvailable } ) );\n\t\t\t\n\t\t},\n\n\t\tremoveactionTypeFilter: function () {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.installedActions } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.availableActions } ) );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Individual change item.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentViewChangesItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-view-changes-item',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:disabled', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:disabled', this.render );\n\t\t},\n\n\t\t/**\n\t\t * When we render this element, remove the extra wrapping <div> that backbone creates.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\tevents: {\n\t\t\t'click .undoSingle': 'undoSingle'\n\t\t},\n\n\t\tundoSingle: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoSingle', this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Changes collection view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentViewChanges',['views/app/drawer/contentViewChangesItem'], function( viewChangesItem ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'table',\n className: 'nf-changes',\n\t\tchildView: viewChangesItem\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Handles clicks on the 'view changes' button in the header.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerViewChanges',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-view-changes',\n\n\t\tevents: {\n\t\t\t'click .undoChanges': 'clickUndoChanges'\n\t\t},\n\n\t\tclickUndoChanges: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoChanges' );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Error view used for settings.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/settingError',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-edit-setting-error'\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSetting',['views/app/drawer/mergeTagsContent', 'views/app/drawer/settingError'], function( mergeTagsContentView, settingErrorView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\n\n\t\tregions: {\n\t\t\terror: '.nf-setting-error'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\t/*\n\t\t\t * Send out a request on the setting-type-{type} channel asking if we should render on dataModel change.\n\t\t\t * Defaults to false.\n\t\t\t * This lets specific settings, like RTEs, say that they don't want to be re-rendered when their data model changes.\n\t\t\t */\n\t\t\tvar renderOnChange = ( 'undefined' == typeof nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' ) ) ? false : nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' );\n\t\t\t\n\t\t\tif ( renderOnChange ) {\n\t\t\t\tthis.dataModel.on( 'change:' + this.model.get( 'name' ), this.render, this );\n\t\t\t}\n\n\t\t\tthis.model.on( 'change:error', this.renderError, this );\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\n var remote = this.model.get( 'remote' );\n\t\t\tif( remote ) {\n\n if( 'undefined' != typeof remote.refresh || remote.refresh ) {\n // Add 'update' icons\n var label = this.model.get('label');\n this.model.set('label', label + ' <a class=\"extra\"><span class=\"dashicons dashicons-update\"></span></a>');\n }\n\n\t\t\t\tnfRadio.channel( 'setting' ).trigger( 'remote', this.model, this.dataModel, this );\n\t\t\t\tthis.model.on( 'rerender', this.render, this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * When our drawer opens, send out a radio message on our setting type channel.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.drawerOpened );\n\n\t\t\t/*\n\t\t\t * When our drawer closes, send out a radio message on our setting type channel.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.drawerClosed );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.dataModel.off( 'change:' + this.model.get( 'name' ), this.render );\n\t\t\tthis.model.off( 'change:error', this.renderError );\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( this.model.get( 'remote' ) ) {\n\t\t\t\tthis.model.off( 'rerender', this.render, this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\n\t\t\n\t\t\t/*\n\t\t\t * Unescape any HTML being saved if we are a textbox.\n\t\t\t */\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\n\t\t\t\tvar setting = this.model.get( 'name' );\n\t\t\t\tvar value = this.dataModel.get( setting );\n\t\t\t\tthis.dataModel.set( setting, _.unescape( value ), { silent: true } );\n\t\t\t}\n\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\t/*\n\t\t\t * We want to escape any HTML being output if we are a textbox.\n\t\t\t */\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\n\t\t\t\tvar setting = this.model.get( 'name' );\n\t\t\t\tvar value = this.dataModel.get( setting );\n\t\t\t\tthis.dataModel.set( setting, _.escape( value ), { silent: true } );\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.mergeTagsContentView = false;\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\n\t\t\tjQuery( this.el ).find( '.nf-help' ).each(function() {\n\t\t\t\tvar content = jQuery(this).next('.nf-help-text');\n\t\t\t\tjQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\tcontent: content,\n\t\t\t\t\tmaxWidth: 200,\n\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\ttrigger: 'click',\n\t\t\t\t\tcloseOnClick: true\n\t\t\t\t})\n\t\t });\n\t\t\t\n\t\t if ( this.model.get( 'use_merge_tags' ) ) {\n\t\t \tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t }\n\n\t\t\t/*\n\t\t\t * Apply Setting Field Masks\n\t\t\t */\n\t\t\tvar mask = this.model.get( 'mask' );\n\n\t\t\tif( typeof mask != \"undefined\" ){\n\n\t\t\t\tvar input = jQuery( this.$el ).find( 'input' );\n\n\t\t\t\tswitch( mask.type ){\n\t\t\t\t\tcase 'numeric':\n\t\t\t\t\t\tinput.autoNumeric({\n\t\t\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\t\t\taDec: decimalPoint\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'currency':\n\n\t\t\t\t\t\tvar currency = nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' );\n\t\t\t\t\t\tvar currencySymbol = nfAdmin.currencySymbols[ currency ] || '';\n\n\t\t\t\t\t\tinput.autoNumeric({\n\t\t\t\t\t\t\taSign: jQuery('<div />').html(currencySymbol).text(),\n\t\t\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\t\t\taDec: decimalPoint\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'custom':\n\t\t\t\t\t\tif( mask.format ) input.mask( mask.format )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// TODO: Error Logging.\n\t\t\t\t\t\tconsole.log( 'Notice: Mask type of \"' + mask.type + '\" is not supported.' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderError();\n\t\t},\n\n\t\tonShow: function() {\t\t\t\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonAttach: function() {\t\t\t\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\trenderError: function() {\n\t\t\tif ( this.model.get( 'error' ) ) {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).addClass( 'nf-error' );\n\t\t\t\tthis.error.show( new settingErrorView( { model: this.model } ) );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).removeClass( 'nf-error' );\n\t\t\t\tthis.error.empty();\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t \t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) != this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\n\t \t\trenderSetting: function(){\n\t \t\t\tif ( 'undefined' != typeof that.dataModel.get( this.name ) ) {\n\t \t\t\t\tthis.value = that.dataModel.get( this.name );\n\t \t\t\t} else if ( 'undefined' == typeof this.value ) {\n\t \t\t\t\tthis.value = '';\n\t \t\t\t}\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( 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 ( this.use_merge_tags ) {\n\t\t\t\t\t\tclasses += ' has-merge-tags';\n\t\t\t\t\t}\n\t\t\t\t\tif ( 'rte' == this.type ) {\n\t\t\t\t\t\tclasses += ' rte';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-setting ';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += 'nf-' + this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' nf-one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( this.help ) {\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</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\trenderMergeTags: function() {\n\t\t\t\t\tif ( this.use_merge_tags && ! this.hide_merge_tags ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></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\trenderPlaceholder: function() {\n\t\t\t\t\tif ( this.placeholder ) {\n\t\t\t\t\t\treturn 'placeholder=\"' + this.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\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .setting': 'changeSetting',\n\t\t\t'keyup .setting': 'keyUpSetting',\n\t\t\t'click .setting': 'clickSetting',\n\t\t\t'click .extra': 'clickExtra'\n\t\t},\n\n\t\tchangeSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:setting', e, this.model, this.dataModel );\n\t\t},\n\n\t\tkeyUpSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'keyup:setting', e, this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'keyup:setting', e, this.model, this.dataModel );\n\t\t},\n\n\t\tclickSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:setting', e, this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:setting', e, this.model, this.dataModel, this );\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-name-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t},\n\n\t\tdrawerOpened: function() {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:opened', this.model, this.dataModel, this );\n\t\t},\n\n\t\tdrawerClosed: function() {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:closed', this.model, this.dataModel, this );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","/**\n * Changes collection view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentNewForm',['views/app/drawer/itemSetting'], function( itemSettingView) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-new-form',\n\n\t\tregions: {\n\t\t\tformName: '.new-form-name',\n\t\t\tformSubmit: '.new-form-submit'\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar titleSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'title' );\n\t\t\tvar addSubmitSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'add_submit' );\n\t\t\tvar dataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tthis.formName.show( new itemSettingView( { model: titleSettingModel, dataModel: dataModel } ) );\n\t\t\t/*\n\t\t\t * If we don't have any submit buttons on the form, prompt the user to add one on publish.\n\t\t\t */\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar submitButtons = fieldCollection.findWhere( { type: 'submit' } );\n\t\t\tif ( 'undefined' == typeof submitButtons ) {\n\t\t\t\tthis.formSubmit.show( new itemSettingView( { model: addSubmitSettingModel, dataModel: dataModel } ) );\n\t\t\t} else {\n\t\t\t\tdataModel.set( 'add_submit', 0 );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .publish': 'clickPublish'\n\t\t},\n\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:confirmPublish', e );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Handles clicks on the 'view changes' button in the header.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerNewForm',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-new-form'\n\t});\n\n\treturn view;\n} );\n","/**\n * Config file for our app drawers.\n *\n * this.collection represents all of our registered drawers.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawerConfig',[\n\t'models/app/drawerCollection',\n\t'views/fields/drawer/addField',\n\t'views/app/drawer/editSettings',\n\t'views/app/drawer/headerEditSettings',\n\t'views/actions/drawer/addAction',\n\t'views/app/drawer/contentViewChanges',\n\t'views/app/drawer/headerViewChanges',\n\t'views/app/drawer/contentNewForm',\n\t'views/app/drawer/headerNewForm'\n\t], function(\n\t\tdrawerCollection,\n\t\taddFieldView,\n\t\teditSettingsView,\n\t\teditSettingsHeaderView,\n\t\taddActionView,\n\t\tviewChangesView,\n\t\tviewChangesHeaderView,\n\t\tnewFormView,\n\t\tnewFormHeaderView,\n\t\tmobileItemControlsView\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\tthis.collection = new drawerCollection( [\n\t\t\t\t{\n\t\t\t\t\tid: 'addField',\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new addFieldView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'addAction',\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new addActionView( data );\n\t\t\t\t\t}\n\t\t\t\t},\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\tid: 'editSettings',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * TODO: Add filtering when editing settings. For now, removing them from settings.\n\t\t\t\t\t */\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Get a custom setting header view if one is set.\n\t\t\t\t\t\t * TODO: Currently, this only works for advanced settings.\n\t\t\t\t\t\t * This could be used to replace the need for a single config file.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( 'undefined' != typeof data.typeModel ) {\n\t\t\t\t\t\t\tvar view = nfRadio.channel( data.typeModel.get( 'id' ) ).request( 'get:drawerHeaderView' ) || editSettingsHeaderView;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar view = editSettingsHeaderView;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new view( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new editSettingsView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'viewChanges',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the viewChanges drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new viewChangesHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new viewChangesView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'newForm',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the newForm drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new newFormHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new newFormView( data );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\t// Listen for requests for our drawer collection.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerCollection', this.getDrawerCollection, this );\n\t\t\t// Listen for requests for specific drawer models.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawer', this.getDrawer, this );\n\t\t},\n\n\t\tgetDrawerCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetDrawer: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Default settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/defaultSettingsTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-default',\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\tif ( 'undefined' != typeof type ) {\n\t \t\t\t\treturn type.get( 'nicename' );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Empty view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/empty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","/**\n * Model for our individual domains.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/domainModel',[ 'views/app/drawer/defaultSettingsTitle', 'views/app/empty' ], function( DefaultSettingsTitleView, EmptyView ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdashicons: '',\n\t\t\tclasses: '',\n\t\t\tactive: false,\n\t\t\turl: '',\n\t\t\thotkeys: false,\n\t\t\tdisabled: false,\n\n\t\t\tgetSettingsTitleView: function( data ) {\n\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t},\n\n\t\t\tgetDefaultSettingsTitleView: function( data ) {\n\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t},\n\n\t\t\tgetGutterLeftView: function( data ) {\n\t\t\t\t/*\n\t\t\t\t * Return empty view\n\t\t\t\t */\n\t\t\t\treturn new EmptyView();\n\t\t\t},\n\n\t\t\tgetGutterRightView: function( data ) {\n\t\t\t\t/* \n\t\t\t\t * Return empty view\n\t\t\t\t */\n\t\t\t\treturn new EmptyView();\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Holds all of our domain models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/domainCollection',['models/app/domainModel'], function( domainModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: domainModel\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-fields'\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/mainContentFieldCollection',[], function() {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\treorderOnSort: true,\n\n\t\tgetChildView: function() {\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:fieldItem' );\n\t\t},\n\n\t\tgetEmptyView: function() {\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:mainContentEmpty' );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:sortableEl', this.getSortableEl, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'init:sortable', this.initSortable, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'destroy:sortable', this.destroySortable, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.collection.models.length > 0 ) {\n\t\t\t\tjQuery( this.el ).addClass( 'nf-field-type-droppable' ).addClass( 'nf-fields-sortable' );\n\t\t\t\tvar that = this;\n\t\t\t\t/* TODO: There's a bug with some Android phones and chrome. The fix below hasn't been implement.\n\n\t\t\t\t * Instantiate our sortable field list, but only if we aren't on a mobile device.\n\t\t\t\t *\n\t\t\t\t * On Android, our sortable list isn't scrollable if it's instantiated at render.\n\t\t\t\t * Instead, for mobile, we need to instantiate our sortable when the user tapholds and then\n\t\t\t\t * destroy it when the drag stops.\n\t\t\t\t */\n\t\t\t\t// if ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\t\tthis.initSortable();\n\t\t\t\t// }\n\t\t\t}\n\t\t\tnfRadio.channel( 'app' ).trigger( 'render:fieldsSortable', this );\n\t\t},\n\n\t\tgetSortableEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\tinitSortable: function() {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tvar tolerance = 'pointer';\n\t\t\t} else {\n\t\t\t\tvar tolerance = 'intersect';\n\t\t\t}\n\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\t//containment: '#nf-main',\n\t\t\t\thelper: 'clone',\n\t\t\t\tcancel: '.nf-item-controls',\n\t\t\t\tplaceholder: 'nf-fields-sortable-placeholder',\n\t\t\t\topacity: 0.95,\n\t\t\t\tgrid: [ 5, 5 ],\n\t\t\t\t// scroll: false,\n\t\t\t\tappendTo: '#nf-main',\n\t\t\t\tscrollSensitivity: 10,\n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'start:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:fieldsSortable', ui, this );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'stop:fieldsSortable', ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tdestroySortable: function() {\n\t\t\tjQuery( this.el ).sortable( 'destroy' );\n\t\t},\n\n\t\tonAddChild: function( childView ) {\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:adding' ) ) {\n\t\t\t\tchildView.$el.hide().show( 'clip' );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', false );\n\t\t\t}\n\t\t}\n\t\t\n\t} );\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/addSavedField',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-add-saved-field',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:addSavedLoading', this.renderAddButton, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.renderAddButton();\n\t\t},\n\n\t\trenderAddButton: function() {\n\t\t\tif ( this.model.get( 'addSavedLoading' ) ) {\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-saved-field-loading' );\n\t\t\t} else {\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-saved-field-button' );\n\t\t\t}\n\t\t\tjQuery( this.el ).find( '.add-button' ).html( button( this ) );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:addSavedLoading', this.render );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-button': 'clickAddSavedField'\n\t\t},\n\n\t\tclickAddSavedField: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:addSavedField', e, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","/**\n * Fields settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/fields/drawer/settingsTitle',['views/fields/drawer/addSavedField'], function( addSavedFieldView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-fields',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:saved', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.renderjBoxContent, this );\n\t\t},\n\n\t\tregions: {\n\t\t\taddSaved: '.nf-add-saved-field'\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:saved', this.render );\n\t\t\tthis.addSavedjBox.destroy();\n\t\t\tthis.model.unset( 'jBox', { silent: true } );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.renderjBoxContent();\n\t\t\tvar that = this;\n\t\t\tthis.addSavedjBox = new jBox( 'Tooltip', {\n\t\t\t\ttrigger: 'click',\n\t\t\t\ttitle: 'Add to Saved Fields',\n\t\t\t\tposition: {\n\t\t\t\t\tx:'left',\n\t\t\t\t\ty:'center'\n\t\t\t\t},\n\t\t\t\toutside:'x',\n\t\t\t\tcloseOnClick: 'body',\n\n\t\t\t\tonCreated: function() {\n\t\t\t\t\tthis.setContent( jQuery( that.el ).find( '.nf-add-saved-field' ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.addSavedjBox.attach( jQuery( this.el ).find( '.dashicons') );\n\t\t\tthis.model.set( 'jBox', this.addSavedjBox, { silent: true } );\n\t\t},\n\n\t\trenderjBoxContent: function() {\n\t\t\tif ( this.addSaved ) {\n\t\t\t\tthis.addSaved.show( new addSavedFieldView( { model: this.model } ) );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\tvar displayName = type.get( 'nicename' );\n\n\t \t\t\tif ( this.saved ) {\n\t \t\t\t\tvar realType = nfRadio.channel( domainID ).request( 'get:type', type.get( 'type' ) );\n\t \t\t\t\tdisplayName += ' - ' + realType.get( 'nicename' );\n\t \t\t\t}\n\t \t\t\treturn displayName;\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\trenderSavedStar: function() {\n\t\t\t\t\tif ( this.saved ) {\n\t\t\t\t\t\tvar star = 'filled';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar star = 'empty';\n\t\t\t\t\t}\n\t\t\t\t\treturn '<span class=\"dashicons dashicons-star-' + star + '\"></span>'\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Add main header.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/mainHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-header-actions',\n\n\t\tinitialize: function() {\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\tthis.listenTo( actionCollection, 'add', this.render );\n\t\t\tthis.listenTo( actionCollection, 'remove', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\tif ( actionCollection.models.length == 0 ) {\n\t\t\t\tjQuery( this.el ).hide();\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).show();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Actions subheader view.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-actions'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/itemControls',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-item-controls',\n\n\t\tinitialize: function() {\n\t\t\t// Listen for domain changes and re-render when we detect one.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t},\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// \n\t\t\tthis.currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'click .nf-edit-settings': 'clickEdit',\n\t\t\t'singletap .nf-edit-settings': 'singleTapEdit',\n\t\t\t'click .nf-delete': 'clickDelete',\n\t\t\t'click .nf-duplicate': 'clickDuplicateField'\n\t\t},\n\n\t\tclickEdit: function( e ) {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tsingleTapEdit: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t},\n\n\t\tclickDelete: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t},\n\n\t\tclickDuplicateField: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'mouseover:itemControl', e, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Single action table row\n *\n * TODO: make dynamic\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/actionItem',['views/app/itemControls'], function( itemControlsView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'tr',\n\t\ttemplate: '#tmpl-nf-action-item',\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:actionItemTemplate' ) || this.template;\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:active', this.maybeDeactivate, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:active', this.maybeDeactivate );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.model.get( 'editActive' ) ) {\n\t\t\t\tjQuery( this.el ).addClass( 'active' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).removeClass( 'active' );\n\t\t\t}\n\n\t\t\tthis.maybeDeactivate();\n\n\t\t\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t},\n\n\t\tmaybeDeactivate: function() {\n\t\t\tif ( 0 == this.model.get( 'active' ) ) {\n\t\t\t\tjQuery( this.el ).addClass( 'deactivated' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).removeClass( 'deactivated' );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change input': 'changeToggle',\n\t\t\t'click': 'maybeClickEdit'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( 'TR' == jQuery( e.target ).parent().prop( 'tagName' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tchangeToggle: function( e ) {\n\t\t\tvar setting = jQuery( e.target ).data( 'setting' );\n\t\t\tvar settingModel = nfRadio.channel( 'actions' ).request( 'get:settingModel', setting );\n\t\t\tconsole.log( settingModel );\n\t\t\tconsole.log( this.model );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:setting', e, settingModel, this.model );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderToggle: function( settingName ) {\n\t\t\t\t\tthis.settingName = settingName || 'active';\n\t\t\t\t\tvar actionLabel = this.label;\n\t\t\t\t\tthis.label = '';\n\t\t\t\t\tthis.value = this[ this.settingName ];\n\t\t\t\t\tthis.name = this.id + '-' + this.settingName;\n\t\t\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-toggle' );\n\t\t\t\t\thtml = html( this );\n\t\t\t\t\tthis.label = actionLabel;\n\t\t\t\t\treturn html;\n\t\t\t\t},\n\n\t\t\t\trenderTypeNicename: function() {\n\t\t\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', this.type );\n\t\t\t\t\tif ( 'undefined' == typeof type ) return;\n\n\t\t\t\t\treturn type.get( 'nicename' );\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( this.help ) {\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</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\trenderMergeTags: function() {\n\t\t\t\t\tif ( this.use_merge_tags ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/actions/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-actions-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().parent().removeClass( 'nf-actions-empty' );\n\t\t\t// jQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\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\tjQuery( this.el ).parent().parent().addClass( 'nf-actions-empty' );\n\t\t\t// if ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t// \tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t// }\n\t\t\t// jQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\t// jQuery( this.el ).parent().droppable( {\n\t\t\t// \taccept: function( draggable ) {\n\t\t\t// \t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t// \t\t\treturn true;\n\t\t\t// \t\t}\n\t\t\t// \t},\n\t\t\t// \thoverClass: 'nf-droppable-hover',\n\t\t\t// \ttolerance: 'pointer',\n\t\t\t// \tover: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t// \t},\n\t\t\t// \tout: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t// \t},\n\t\t\t// \tdrop: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t// \t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t// \t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t// \t},\n\t\t\t// } );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Main content view for our actions.\n *\n * TODO: make dynamic\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/mainContent',['views/actions/actionItem', 'views/actions/mainContentEmpty'], function( actionView, emptyView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttemplate: '#tmpl-nf-action-table',\n\t\tchildView: actionView,\n\t\temptyView: emptyView,\n\n\t\tinitialize: function() {\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:mainContentTemplate' ) || this.template;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tjQuery( this.el ).droppable( {\n\t\t\t\taccept: '.nf-action-type-draggable',\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'drop:actionType', e, ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tif ( 'undefined' == typeof nfRadio.channel( 'actions' ).request( 'get:type', childView.model.get( 'type' ) ) ) return;\n\n\t\t\tjQuery( collectionView.el ).find( 'tbody' ).append( childView.el );\n\t\t},\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/advanced/mainHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-header-settings'\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-settings'\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/settingItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-form-setting-type',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.updateActiveClass );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.updateActiveClass, this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click': 'clickEdit'\n\t\t},\n\n\t\tclickEdit: function( e ) {\n\t\t\tnfRadio.channel( 'settings' ).trigger( 'click:edit', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-setting-wrap ' + this.id;\n\t \t\t\tif ( this.editActive ) {\n\t \t\t\t\tclasses += ' active';\n\t \t\t\t}\n\t \t\t\treturn classes;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateActiveClass: function() {\n\t\t\tif ( this.model.get( 'editActive' ) ) {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).addClass( 'active' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).removeClass( 'active' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/mainContent',['views/advanced/settingItem'], function( settingItem ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\tchildView: settingItem\n\t\t\n\t});\n\n\treturn view;\n} );\n","/**\n * Model that represents our form fields.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/fieldModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Field',\n\t\t\tobjectDomain: 'fields',\n\t\t\teditActive: false,\n\t\t\torder: 999\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tif ( 'undefined' == typeof this.get( 'type' ) ) return;\n\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', this.get( 'type' ) );\n\t\t\tvar parentType = fieldType.get( 'parentType' );\n\n\t\t\t// Loop through our field type \"settingDefaults\" and add any default settings.\n\t\t\t_.each( fieldType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( key ) ) {\n\t\t\t\t\tthis.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\t/*\n\t\t\t * If our field type is a saved field, set our field type to the actual field type\n\t\t\t */\n\t\t\tif ( 'saved' == fieldType.get( 'section' ) ) {\n\t\t\t\tthis.set( 'type', fieldType.get( 'type' ) );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * fields\n\t\t\t * fields-parentType\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:fieldModel', this );\n\t\t\tnfRadio.channel( 'fields-' + parentType ).trigger( 'init:fieldModel', this );\n\t\t\tnfRadio.channel( 'fields-' + this.get( 'type' ) ).trigger( 'init:fieldModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * Fires an event on the fieldSetting-{name} channel saying we've updated a setting.\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n\t\t\tnfRadio.channel( 'fieldSetting-' + _.keys( model.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'update:setting', this, options.settingModel );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field models.\n * This is the actual field data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new fields or removed fields property.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/fieldCollection',['models/fields/fieldModel'], function( fieldModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: fieldModel,\n\t\tcomparator: function( model ){\n\t\t\treturn parseInt( model.get( 'order' ) );\n\t\t},\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addField, this );\n\t\t\tthis.on( 'remove', this.removeField, this );\n\n\t\t\tthis.listenTo( this, 'add:field', this.addNewField );\n\t\t\tthis.listenTo( this, 'append:field', this.appendNewField );\n\t\t\tthis.listenTo( this, 'remove:field', this.removeFieldResponse );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new fields property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddField: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed fields property.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveField: function( model ) {\n\t\t\tthis.removedIDs = this.removedIDs || {};\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t},\n\n\t\taddNewField: function( model ) {\n\t\t\tthis.add( model );\n\t\t},\n\n\t\tappendNewField: function( model ) {\n\t\t\tif ( 0 == this.length ) {\n\t\t\t\tvar order = 0;\n\t\t\t} else {\n\t\t\t\tvar order = this.at( this.length -1 ).get( 'order' ) + 1;\n\t\t\t}\n\n\t\t\tmodel.set( 'order', order, { silent: true } );\n\t\t\tthis.add( model );\n\t\t},\n\n\t\tremoveFieldResponse: function( model ) {\n\t\t\tthis.remove( model );\n\t\t},\n\n\t\tfieldExists: function( fieldModel ) {\n\t\t\treturn -1 != this.indexOf( fieldModel );\n\t\t}\n\t} );\n\treturn collection;\n} );\n\n","/**\n * Config file for our app domains.\n * \n * this.collection represents all of our app domain (fields, actions, settings) information.\n *\n * This doesn't store the current domain, but rather all the data about each.\n * \n * This data includes:\n * hotkeys\n * header view\n * subheader view\n * content view\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/domainConfig',[\n\t// Require our domain collection\n\t'models/app/domainCollection',\n\t// Require our fields domain files\n\t'views/fields/subHeader',\n\t'views/fields/mainContentFieldCollection',\n\t'views/fields/drawer/settingsTitle',\n\t// Require our actions domain files\n\t'views/actions/mainHeader', \n\t'views/actions/subHeader',\n\t'views/actions/mainContent',\n\t// Require our settings domain files\n\t'views/advanced/mainHeader',\n\t'views/advanced/subHeader',\n\t'views/advanced/mainContent',\n\t// Empty View\n\t'views/app/empty',\n\t// FieldCollection: used by the default formContentData filter\n\t'models/fields/fieldCollection'\n\t], \n\tfunction( \n\t\tappDomainCollection,\n\t\tfieldsSubHeaderView,\n\t\tFieldsMainContentFieldCollectionView,\n\t\tfieldsSettingsTitleView,\n\t\tactionsMainHeaderView,\n\t\tactionsSubHeaderView,\n\t\tactionsMainContentView,\n\t\tsettingsMainHeaderView,\n\t\tsettingsSubHeaderView,\n\t\tsettingsMainContentView,\n\t\tEmptyView,\n\t\tFieldCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Add our default formContentView filter.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:viewFilter', this.defaultFormContentView, 10, this );\n\t\t\t\n\t\t\t/*\n\t\t\t * Add our default formContentData filter.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:loadFilter', this.defaultFormContentLoad, 10, this );\n\n\t\t\t/*\n\t\t\t * Add our default formContentGutterView filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:leftFilter', this.defaultFormContentGutterView, 10, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:rightFilter', this.defaultFormContentGutterView, 10, this );\n\n\t\t\t// Define our app domains\n\t\t\tthis.collection = new appDomainCollection( [\n\t\t\t\t{\n\t\t\t\t\tid: 'fields',\n\t\t\t\t\tnicename: nfi18n.domainFormFields,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newField',\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-menu',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new fieldsSubHeaderView();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the formContent view that should be used in our builder.\n\t\t\t\t\t * Uses two filters:\n\t\t\t\t\t * 1) One for our formContentData\n\t\t\t\t\t * 2) One for our formContentView\n\t\t\t\t\t *\n\t\t\t\t\t * If we don't have any view filters, we use the default formContentView.\n\t\t\t\t\t * \n\t\t\t\t\t * @since 3.0\n\t\t\t\t\t * @return formContentView backbone view.\n\t\t\t\t\t */\n\t\t\t\t\tgetMainContentView: function( collection ) {\n\t\t\t\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\n\t\t\t\t\t\t * If we don't have this setting, then we check for this deprecated value.\n\t\t\t\t\t\t * \n\t\t\t\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * TODO: Remove this backwards compatibility eventually.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( ! formContentData ) {\n\t\t\t\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If we don't have a filter for our formContentData, default to fieldCollection.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar formContentLoadFilters = nfRadio.channel( 'formContent' ).request( 'get:loadFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( formContentLoadFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tformContentData = callback( formContentData, nfRadio.channel( 'app' ).request( 'get:formModel' ), true );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar formContentViewFilters = nfRadio.channel( 'formContent' ).request( 'get:viewFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( formContentViewFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tformContentView = callback();\n\n\t\t\t\t\t\tnfRadio.channel( 'settings' ).request( 'update:setting', 'formContentData', formContentData, true );\n\t\t\t\t\t\treturn new formContentView( { collection: formContentData } );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetSettingsTitleView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If we are dealing with a field model, return the fields settings view, otherwise, return the default.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( 'fields' == data.model.get( 'objectDomain' ) ) {\n\t\t\t\t\t\t\treturn new fieldsSettingsTitleView( data );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn this.get( 'getDefaultSettingsTitleView' ).call( this, data );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\n\t\t\t\t\tgetGutterLeftView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:leftFilters' );\n\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tgutterView = callback();\n\n\t\t\t\t\t\treturn new gutterView(); \n\t\t\t\t\t},\n\n\t\t\t\t\tgetGutterRightView: function() {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:rightFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tgutterView = callback();\n\n\t\t\t\t\t\treturn new gutterView(); \n\t\t\t\t\t}\n\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'actions',\n\t\t\t\t\tnicename: nfi18n.domainActions,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newAction',\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-external',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new actionsSubHeaderView();\n\t\t\t\t\t},\n\t\t\t\t\t\n\t\t\t\t\tgetMainContentView: function() {\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\t\t\t\treturn new actionsMainContentView( { collection: collection } );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\tnicename: nfi18n.domainAdvanced,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-admin-generic',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new settingsSubHeaderView();\n\t\t\t\t\t},\n\t\t\t\t\t\n\t\t\t\t\tgetMainContentView: function() {\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n\t\t\t\t\t\treturn new settingsMainContentView( { collection: collection } );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'preview',\n\t\t\t\t\tnicename: 'Preview Form',\n\t\t\t\t\tclasses: 'preview',\n\t\t\t\t\tdashicons: 'dashicons-visibility',\n\t\t\t\t\tmobileDashicon: 'dashicons-visibility',\n\t\t\t\t\turl: nfAdmin.previewurl\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\t/*\n\t\t\t * Send out a radio message with our domain config collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:domainCollection', this.collection );\n\n\t\t\t/*\n\t\t\t * Respond to requests to get the app domain collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainCollection', this.getDomainCollection, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainModel', this.getDomainModel, this );\n\t\t},\n\n\t\tgetDomainCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetDomainModel: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\tdefaultFormContentView: function( formContentData ) {\n\t\t\treturn FieldsMainContentFieldCollectionView;\n\t\t},\n\n\t\tdefaultFormContentLoad: function( formContentData ) {\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\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\n\t\t\tif ( 1 == sortedArray.length || 'undefined' == typeof formContentData || true === formContentData instanceof Backbone.Collection ) return fieldCollection;\n\n\t\t\t/*\n\t\t\t * If another filter is registered, we are calling this from somewhere else.\n\t\t\t */\n\n \tvar fieldModels = _.map( formContentData, function( key ) {\n \t\treturn fieldCollection.findWhere( { key: key } );\n \t}, this );\n\n \treturn new FieldCollection( fieldModels );\n\t\t},\n\n\t\tdefaultFormContentGutterView: function( formContentData ) {\n\t\t\treturn EmptyView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our app data.\n * Listens for changes to the 'clean' attribute and triggers a radio message when the state changes.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/appModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tloading: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes to our 'clean' attribute.\n\t\t\tthis.on( 'change:clean', this.changeStatus, this );\n\t\t},\n\n\t\tchangeStatus: function() {\n\t\t\t// Send out a radio message when the 'clean' attribute changes.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:clean', this.get( 'clean' ) );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Creates and stores a model that represents app-wide data. i.e. current domain, current drawer, clean, etc.\n *\n * clean is a boolean that represents whether or not changes have been made.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/data',['models/app/appModel'], function( appModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Get the collection that represents all the parts of our application.\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\t// Setup our initial model.\n\t\t\tthis.model = new appModel( {\n\t\t\t\tcurrentDrawer: false,\n\t\t\t\tcurrentDomain: appDomainCollection.get( 'fields' ),\n\t\t\t\tclean: true\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Set the mobile setting used to track whether or not we're on a mobile device.\n\t\t\t */\n\t\t\tvar mobile = ( 1 == nfAdmin.mobile ) ? true : false;\n\t\t\tthis.model.set( 'mobile', mobile );\n\n\t\t\t/*\n\t\t\t * Respond to requests to see if we are on mobile.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'is:mobile', this.isMobile, this );\n\n\t\t\t/*\n\t\t\t * Respond to app channel requests for information about the state of our app.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:data', this.getData, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDomain', this.getCurrentDomain, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDrawer', this.getCurrentDrawer, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:current', this.getCurrentDrawer, this );\n\n\t\t\t/*\n\t\t\t * Respond to app channel requests to update app settings.\n\t\t\t */\t\t\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDomain', this.updateCurrentDomain, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDrawer', this.updateCurrentDrawer, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:setting', this.updateSetting, this );\n\n\t\t},\n\n\t\tupdateCurrentDomain: function( model ) {\n\t\t\tthis.updateSetting( 'currentDomain', model );\n\t\t},\n\n\t\tupdateSetting: function( setting, value ) {\n\t\t\tthis.model.set( setting, value );\n\t\t\treturn true;\n\t\t},\n\n\t\tgetSetting: function( setting ) {\n\t\t\treturn this.model.get( setting );\n\t\t},\n\n\t\tgetData: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tgetCurrentDomain: function() {\n\t\t\treturn this.model.get( 'currentDomain' );\n\t\t},\n\n\t\tupdateCurrentDrawer: function( drawerID ) {\n\t\t\tthis.updateSetting( 'currentDrawer', drawerID );\n\t\t\treturn true;\n\t\t},\n\n\t\tgetCurrentDrawer: function() {\n\t\t\tvar currentDrawerID = this.model.get( 'currentDrawer' );\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:drawer', currentDrawerID );\n\t\t},\n\n\t\tisMobile: function() {\n\t\t\treturn this.model.get( 'mobile' );\n\t\t}\n\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for click events to expand/collapse setting groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawerToggleSettingGroup',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for click events on our settings group.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:toggleSettingGroup', this.toggleSettingGroup );\n\t\t},\n\n\t\t/**\n\t\t * Set the 'display' attribute of our group model to true or false to toggle.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \tgroup setting model\n\t\t * @return void\n\t\t */\n\t\ttoggleSettingGroup: function( e, model ) {\n\t\t\tif ( model.get( 'display' ) ) {\n\t\t\t\t/*\n\t\t\t\t * Make sure that none of our settings have errors\n\t\t\t\t */\n\t\t\t\tvar errors = false;\n\t\t\t\t_.each( model.get( 'settings' ).models, function( setting ) {\n\t\t\t\t\tif ( setting.get( 'error' ) ) {\n\t\t\t\t\t\terrors = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( ! errors ) {\n\t\t\t\t\tmodel.set( 'display', false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmodel.set( 'display', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Updates our database with our form data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/updateDB',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the closing of the drawer and update when it's closed.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.updateDB );\n\t\t\t// Respond to requests to update the database.\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:db', this.updateDB, this );\n\t\t\t/*\n\t\t\t * Register our default formContent save filter.\n\t\t\t * This converts our collection into an array of keys.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:saveFilter', this.defaultSaveFilter, 10, this );\n\t\t},\n\n\t\t/**\n\t\t * Update our database.\n\t\t * If action isn't specified, assume we're updating the preview.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \taction preview or publish\n\t\t * @return void\n\t\t */\n\t\tupdateDB: function( action ) {\n\t\t\t// If our app is clean, dont' update.\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Default action to preview.\n\t\t\taction = action || 'preview';\n\n\t\t\t// Setup our ajax actions based on the action we're performing\n\t\t\tif ( 'preview' == action ) {\n\t\t\t\tvar jsAction = 'nf_preview_update';\n\t\t\t} else if ( 'publish' == action ) {\n\t\t\t\tvar jsAction = 'nf_save_form';\n\t\t\t}\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n\t\t\t/*\n\t\t\t * There are pieces of data that are only needed for the builder and not for the front-end.\n\t\t\t * We need to unset those.\n\t\t\t * TODO: Make this more dynamic/filterable.\n\t\t\t */\n\t\t\t_.each( formModel.get( 'fields' ).models, function( fieldModel, index ) {\n\t\t\t\tfieldModel.unset( 'jBox', { silent: true } );\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * The main content of our form is called the formContent.\n\t\t\t * In this next section, we check to see if any add-ons want to modify that contents before we save.\n\t\t\t * If there aren't any filters found, we default to the field collection.\n\t\t\t * \n\t\t\t */\n\t\t\t\n\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\n\t\t\t/*\n\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\n\t\t\t * If we don't have this setting, then we check for this deprecated value.\n\t\t\t * \n\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\n\t\t\t *\n\t\t\t * TODO: Remove this backwards compatibility eventually.\n\t\t\t */\n\t\t\tif ( ! formContentData ) {\n\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\n\t\t\t}\n\n\t\t\tvar formContentSaveDataFilters = nfRadio.channel( 'formContent' ).request( 'get:saveFilters' );\n\t\t\t\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( formContentSaveDataFilters, undefined );\n\t\t\tvar callback = _.first( sortedArray );\n\t\t\t/*\n\t\t\t * Set our formContentData to the callback specified in the filter, passing our current formContentData.\n\t\t\t */\n\t\t\tformContentData = callback( formContentData );\n\t\t\t\n\t\t\tif ( 'publish' == action && formModel.get( 'show_publish_options' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'newForm' );\n\t\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\t\tjQuery( builderEl ).addClass( 'disable-main' );\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Get our form data\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n\t\t\t// Turn our formData model into an object\n\t\t\tvar data = JSON.parse( JSON.stringify( formData ) );\n\t\t\tdata.settings.formContentData = formContentData;\n\t\t\t/**\n\t\t\t * Prepare fields for submission.\n\t\t\t */\n\t\t\t\n\t\t\t// Get the field IDs that we've deleted.\n\t\t\tvar removedIDs = formData.get( 'fields' ).removedIDs;\n\n\t\t\t/*\n\t\t\t * data.fields is an array of objects like:\n\t\t\t * field.label = blah\n\t\t\t * field.label_pos = blah\n\t\t\t * etc.\n\t\t\t *\n\t\t\t * And we need that format to be:\n\t\t\t * field.settings.label = blah\n\t\t\t * field.settings.label_pos = blah\n\t\t\t *\n\t\t\t * So, we loop through our fields and create a field.settings object.\n\t\t\t */\n\t\t\t_.each( data.fields, function( field ) {\n\t\t\t\tvar id = field.id;\n\t\t\t\t// We dont' want to update id or parent_id\n\t\t\t\tdelete field.id;\n\t\t\t\tdelete field.parent_id;\n\t\t\t\tvar settings = {};\n\t\t\t\t// Loop through all the attributes of our fields\n\t\t\t\tfor (var prop in field) {\n\t\t\t\t if ( field.hasOwnProperty( prop ) ) {\n\t\t\t\t \t// Set our settings.prop value.\n\t\t\t\t settings[ prop ] = field[ prop ];\n\t\t\t\t // Delete the property from the field.\n\t\t\t\t delete field[ prop ];\n\t\t\t\t }\n\t\t\t\t}\n\n\t\t\t\tfor( var setting in settings ){\n\t\t\t\t\tif( null === settings[ setting ] ) {\n\t\t\t\t\t\tdelete settings[setting];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update our field object.\n\t\t\t\tfield.settings = settings;\n\t\t\t\tfield.id = id;\n\t\t\t} );\n\n\t\t\t// Set our deleted_fields object so that we can know which fields were removed.\n\t\t\tdata.deleted_fields = removedIDs;\n\n\t\t\t/**\n\t\t\t * Prepare actions for submission.\n\t\t\t */\n\t\t\t\n\t\t\t// Get the action IDs that we've deleted.\n\t\t\tvar removedIDs = formData.get( 'actions' ).removedIDs;\n\n\t\t\t/*\n\t\t\t * data.actions is an array of objects like:\n\t\t\t * action.label = blah\n\t\t\t * action.label_pos = blah\n\t\t\t * etc.\n\t\t\t *\n\t\t\t * And we need that format to be:\n\t\t\t * action.settings.label = blah\n\t\t\t * action.settings.label_pos = blah\n\t\t\t *\n\t\t\t * So, we loop through our actions and create a field.settings object.\n\t\t\t */\n\t\t\t_.each( data.actions, function( action ) {\n\t\t\t\tvar id = action.id;\n\t\t\t\t// We dont' want to update id or parent_id\n\t\t\t\tdelete action.id;\n\t\t\t\tdelete action.parent_id;\n\t\t\t\tvar settings = {};\n\t\t\t\t// Loop through all the attributes of our actions\n\t\t\t\tfor (var prop in action) {\n\t\t\t\t if ( action.hasOwnProperty( prop ) ) {\n\t\t\t\t \t// Set our settings.prop value.\n\t\t\t\t settings[ prop ] = action[ prop ];\n\t\t\t\t // Delete the property from the action.\n\t\t\t\t delete action[ prop ];\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t\t// Update our action object.\n\t\t\t\taction.settings = settings;\n\t\t\t\taction.id = id;\n\t\t\t} );\n\n\t\t\t// Set our deleted_actions object so that we can know which actions were removed.\n\t\t\tdata.deleted_actions = removedIDs;\n\n\t\t\t// Turn our object into a JSON string.\n\t\t\tdata = JSON.stringify( data );\n\t\t\t// Run anything that needs to happen before we update.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:updateDB', data );\n\n\t\t\tif ( 'publish' == action ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', true );\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\t\n\n\t\t\t\t// If we're on mobile, show a notice that we're publishing\n\t\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'publishing', 'Your Changes Are Being Published', { autoClose: false } );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update\n\t\t\tjQuery.post( ajaxurl, { action: jsAction, form: data, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\t\tresponse.action = action;\n\t\t\t\t\t// Run anything that needs to happen after we update.\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'response:updateDB', response );\n\t\t\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) && 'preview' == action ) {\n\t\t\t\t\t\t// nfRadio.channel( 'notices' ).request( 'add', 'previewUpdate', 'Preview Updated'\t);\n\t\t\t\t\t}\n\t\t\t\t} catch( exception ) {\n\t\t\t\t\tconsole.log( 'Something went wrong!' );\n\t\t\t\t\tconsole.log( exception );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} );\n\t\t},\n\n\t\tdefaultSaveFilter: function( formContentData ) {\n\t\t\treturn formContentData.pluck( 'key' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our form data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/formModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\tif ( ! jQuery.isNumeric( this.get( 'id' ) ) ) {\n\t\t\t\tthis.set( 'show_publish_options', true, { silent: true } );\n\t\t\t} else {\n\t\t\t\tthis.set( 'show_publish_options', false, { silent: true } );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Stores our form data and responds to requests for it.\n * Form data stores fields, actions, and settings.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formData',['models/app/formModel'], function( formModel) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Instantiate Form Model\n\t\t\tthis.model = new formModel( { id: preloadedFormData.id } );\n\t\t\t// Set our field collection\n\t\t\tthis.model.set( 'fields', nfRadio.channel( 'fields' ).request( 'get:collection' ) );\n\t\t\t// Set our actions collection\n\t\t\tthis.model.set( 'actions', nfRadio.channel( 'actions' ).request( 'get:collection' ) );\n\t\t\t// Set our settings collection\n\t\t\tthis.model.set( 'settings', nfRadio.channel( 'settings' ).request( 'get:settings' ) );\n\t\t\t// Respond to requests for form data.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:formModel', this.getFormModel, this );\n\t\t},\n\n\t\t/**\n\t\t * Return form data model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return backbone.model\n\t\t */\n\t\tgetFormModel: function() {\n\t\t\treturn this.model;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles changing our preview link when we change the 'clean' state of our app.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/previewLink',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for events that would change our preview link\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:sendChanges', this.disablePreview, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:sendChanges', this.enablePreview, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.changePreviewNicename, this );\n\t\t},\n\n\t\t/**\n\t\t * Disable our preview link before we send data to update our preview.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tdisablePreview: function() {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\t\t\t// Set disabled to true. This will trigger the preview link view to redraw.\n\t\t\tpreview.set( 'disabled', true );\n\t\t},\n\n\t\t/**\n\t\t * Change the preview link text from \"Preview Form\" to \"Preview Changes\" or vice-versa\n\t\t * \n\t\t * @since 3.0\n\t\t * @param boolean \tclean app data state\n\t\t * @return void\n\t\t */\n\t\tchangePreviewNicename: function( clean ) {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\n\t\t\t// If we have unsaved changes, set our text to 'changes' otherwise, set it to 'form'\n\t\t\tif ( ! clean ) {\n\t\t\t\tvar nicename = 'Preview Changes';\n\t\t\t} else {\n\t\t\t\tvar nicename = 'Preview Form';\n\t\t\t}\n\n\t\t\tpreview.set( 'nicename', nicename );\n\t\t},\n\n\t\t/**\n\t\t * Enable our preview button.\n\t\t * This is triggered when we get a response from our preview update.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tenablePreview: function() {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\t\t\t// Set disabled to false. This will trigger the preview link view to redraw.\n\t\t\tpreview.set( 'disabled', false );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for requests to change the current domain.\n *\n * The app menu and the main submenu both contain clickable links that change the current domain.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/menuButtons',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:publish', this.publish );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:viewChanges', this.viewChanges );\n\t\t},\n\n\t\tpublish: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\n\t\t},\n\n\t\tviewChanges: function() {\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'viewChanges', { collection: changeCollection } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our change data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/changeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdisabled: false\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Holds all of our change models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/changeCollection',['models/app/changeModel'], function( domainModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: domainModel,\n\n\t\tcomparator: function( model ) {\n\t\t\tvar id = parseInt( model.cid.replace( 'c', '' ) );\n\t\t\treturn -id;\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Track settings changes across our app.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/trackChanges',['models/app/changeCollection', 'models/app/changeModel'], function( changeCollection, ChangeModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new changeCollection();\n\t\t\t// Respond to any requests to add a change directly.\n\t\t\tnfRadio.channel( 'changes' ).reply( 'register:change', this.registerChange, this );\n\t\t\t// Respond to requests for the change collection\n\t\t\tnfRadio.channel( 'changes' ).reply( 'get:collection', this.getCollection, this );\n\t\t\t// Listen for changes in our clean state. If it goes to clean, clear our collection.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.maybeResetCollection );\n\t\t},\n\n\t\tregisterChange: function( action, model, changes, label, data ) {\n\t\t\tvar data = typeof data !== 'undefined' ? data : {};\n\t\t\tif ( 'undefined' == typeof label.dashicon ) {\n\t\t\t\tlabel.dashicon = 'admin-generic';\n\t\t\t}\n\t\t\tvar changeModel = new ChangeModel({\n\t\t\t\taction: action,\n\t\t\t\tmodel: model,\n\t\t\t\tchanges: changes,\n\t\t\t\tlabel: label,\n\t\t\t\tdata: data\t\t\n\t\t\t} );\n\t\t\tthis.collection.add( changeModel );\n\t\t\treturn changeModel;\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tmaybeResetCollection: function( clean ) {\n\t\t\tif ( clean ) {\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'controllers/app/undoChanges',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoChanges', this.undoChanges, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoSingle', this.undoSingle, this );\n\t\t},\n\n\t\tundoChanges: function() {\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tchangeCollection.sort();\n\t\t\tvar that = this;\n\t\t\t_.each( changeCollection.models, function( change ) {\n\t\t\t\tthat.undoSingle( change, true );\n\t\t\t} );\n\t\t\tchangeCollection.reset();\n\t\t\t// Update preview.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t},\n\n\t\tundoSingle: function( change, undoAll ) {\n\t\t\tnfRadio.channel( 'changes' ).request( 'undo:' + change.get( 'action' ), change, undoAll );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for our update:db response and replaces tmp ids with new ids if we were performing the publish action.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/publishResponse',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our app channel for the updateDB response.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.publishResponse );\n\t\t},\n\n\t\tpublishResponse: function( response ) {\n\t\t\t// If we aren't performing a publish action, bail.\n\t\t\tif ( 'publish' !== response.action ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// Check to see if we have any new ids. \n\t\t\tif ( 'undefined' != typeof response.data.new_ids ) {\n\n\t\t\t\t// If we have any new fields, update their models with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.fields ) {\n\t\t\t\t\t_.each( response.data.new_ids.fields, function( newID, oldID ) {\n\t\t\t\t\t\tvar field = nfRadio.channel( 'fields' ).request( 'get:field', oldID );\n\t\t\t\t\t\tif ( field ) {\n\t\t\t\t\t\t\tfield.set( 'id', newID );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we have any new actions, update their models with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.actions ) {\n\t\t\t\t\t_.each( response.data.new_ids.actions, function( newID, oldID ) {\n\t\t\t\t\t\tvar action = nfRadio.channel( 'actions' ).request( 'get:action', oldID );\n\t\t\t\t\t\tif ( action ) {\n\t\t\t\t\t\t\taction.set( 'id', newID );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we have a new form id, update the model with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.forms ) {\n\t\t\t\t\t_.each( response.data.new_ids.forms, function( newID, oldID ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\tformModel.set( 'id', newID );\n\t\t\t\t\t\thistory.replaceState( '', '', 'admin.php?page=ninja-forms&form_id=' + newID );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', false );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\n\n\t\t\t// If we're on mobile, show a notice that we're publishing\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'close', 'publishing' );\n\t\t\t}\n\t\t\t// Add a notice that we've published.\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'published', 'Changes Published' );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'app:published', response );\n\n\t\t\t// Mark our app as clean. This will disable the publish button and fire anything else that cares about the state.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t}\n\t\t\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for requests to change the current domain.\n *\n * The app menu and the main submenu both contain clickable links that change the current domain.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeDomain',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for both menu and submenu clicks.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.changeAppDomain );\n\t\t\t// Reply to specific requests to change the domain\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:currentDomain', this.changeAppDomain, this );\n\n\t\t\t// Reply to requests to prevent our drawer from closing\n\t\t\tnfRadio.channel( 'app' ).reply( 'prevent:changeDomain', this.preventChange, this );\n\t\t\t// Reply to requests to enable drawer closing\n\t\t\tnfRadio.channel( 'app' ).reply( 'enable:changeDomain', this.enableChange, this );\n\n\t\t\t/*\n\t\t\t * Object that holds our array of 'prevent change' values.\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\n\t\t\t */\n\t\t\tthis.objPreventChange = {};\n\t\t},\n\n\t\tchangeAppDomain: function( e, model ) {\n\t\t\t/*\n\t\t\t * If we have disabled movement between domains, return false.\n\t\t\t */\n\t\t\tif ( this.maybePreventChange() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * If we are passed a model, use that model.\n\t\t\t * Otherwise, get the domain from the event target data.\n\t\t\t */ \n\t\t\tif ( 'undefined' == typeof model ) {\n\t\t\t\tvar domainID = jQuery( e.target ).data( 'domain' );\n\t\t\t\tvar model = nfRadio.channel( 'app' ).request( 'get:domainModel', domainID );\n\t\t\t}\n\t\t\t// If a drawer is open, close it.\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we aren't dealing with an external url (such as preview), update our app data\n\t\t\t * and trigger a radio message saying we've changed the domain.\n\t\t\t */ \n\t\t\tif ( 0 == model.get( 'url' ).length ) {\n\t\t\t\tvar mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:currentDomain', model );\n\t\t\t\tjQuery( mainEl ).scrollTop( 0 );\t\t\t\t\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:currentDomain', model );\n\t\t\t}\n\t\t},\n\n\t\t/**\n * Check to see if anything has registered a key to prevent changing the domain.\n * \n * @since 3.0\n * @return boolean\n */\n maybePreventChange: function() {\n \tif ( 0 == Object.keys( this.objPreventChange ).length ) {\n \t\treturn false;\n \t} else {\n \t\treturn true;\n \t}\n },\n\n /**\n * Register a key to prevent changing the domain.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent change domain' setting.\n * @return void\n */\n preventChange: function( key ) {\n \tthis.objPreventChange[ key ] = true;\n },\n\n /**\n * Remove a previously registered key that is preventing our domain from changing.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent change domain' setting.\n * @return void\n */\n enableChange: function( key ) {\n \tdelete this.objPreventChange[ key ];\n },\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Modify the user's browser history when they click on a domain\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/pushstate',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changePushState );\n\t\t},\n\n\t\tchangePushState: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\thistory.pushState( null, null, window.location.href + '&domain=' + currentDomain.get( 'id' ) );\n\t\t\tvar reExp = /domain=\\\\d+/;\n\t\t\tvar url = window.location.toString();\n\t\t\tvar newUrl = url.replace( reExp, '' );\n\t\t\tconsole.log( newUrl );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles our hotkey execution. Needs to be cleaned up and made more programmatic.\n * \n * Our hotkeys are defined by the domain that we're currently viewing. In each domain's model, there is a hotkey object.\n * \n * Currently too much hotkey data is hard-coded here.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/hotkeys',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we change our domain, change the hotkeys to those within that object.\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'render:main', this.changeHotkeys );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.changeHotkeys );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'render:settingGroup', this.changeHotkeys );\n\t\t\t// Currently, these are the functions that run when the new field or new action hotkey is pressed.\n\t\t\t// TODO: move these into a config module or into something more programmatic and scalable.\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newField', this.addNewField );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newAction', this.addNewAction );\n\t\t\t// Same as above, these functions need to be moved into a more modular/programmatic solution.\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:fields', this.changeDomainFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:actions', this.changeDomainActions );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:settings', this.changeDomainSettings );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'close:drawer', this.closeDrawer );\n\t\t},\n\n\t\tchangeHotkeys: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tjQuery( document ).off( '.nfDomainHotkeys' );\n\t\t\tjQuery( 'input' ).off( '.nfDomainHotkeys' );\n\t\t\tif ( currentDomain.get( 'hotkeys' ) ) {\n\t\t\t\tjQuery.each( currentDomain.get( 'hotkeys' ), function( hotkey, msg ) {\n\t\t\t\t\tjQuery( document ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery( 'input' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery( 'textarea' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\taddNewField: function() {\n\t\t\tif ( 'addField' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\taddNewAction: function() {\n\t\t\tif ( 'addAction' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addAction' );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t},\n\n\t\tchangeDomainFields: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar fieldsDomain = appDomainCollection.get( 'fields' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, fieldsDomain );\n\t\t},\n\n\t\tchangeDomainActions: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar actionsDomain = appDomainCollection.get( 'actions' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, actionsDomain );\n\t\t},\n\n\t\tchangeDomainSettings: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar settingsDomain = appDomainCollection.get( 'settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, settingsDomain );\n\t\t},\n\n\t\tcloseDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Change the clean state of our app when settings are changed.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cleanState',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Set an array of field model attributes to ignore.\n\t\t\t * This list will be filtered just before we ignore anything.\n\t\t\t */ \n\t\t\tthis.ignoreAttributes = [\n\t\t\t\t'editActive'\n\t\t\t];\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:setting', this.setAppClean );\n\t\t},\n\n\t\tsetAppClean: function( model ) {\n\t\t\tfor( var attr in model.changedAttributes() ) {\n\t\t\t\tvar changedAttr = attr;\n\t\t\t\tvar after = model.changedAttributes()[ attr ];\n\t\t\t}\n\n\t\t\tvar ignoreAttributes = nfRadio.channel( 'undo-' + model.get( 'type' ) ).request( 'ignore:attributes', this.ignoreAttributes ) || this.ignoreAttributes;\n\t\t\t\n\t\t\tif ( -1 != this.ignoreAttributes.indexOf( attr ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * All of the core undo functions. Listens on the 'changes' channel for an undo request.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/coreUndo',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:changeSetting', this.undoChangeSetting, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addObject', this.undoAddObject, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeObject', this.undoRemoveObject, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:duplicateObject', this.undoDuplicateObject, this );\n\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortFields', this.undoSortFields, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addListOption', this.undoAddListOption, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeListOption', this.undoRemoveListOption, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortListOptions', this.undoSortListOptions, this );\n\t\t},\n\n\t\t/**\n\t\t * Undo settings that have been changed.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoChangeSetting: function( change, undoAll ) {\n\t\t\tvar fieldModel = change.get( 'model' );\n\t\t\tvar changes = change.get( 'changes' );\n\t\t\tvar attr = changes.attr;\n\t\t\tvar before = changes.before;\n\t\t\tfieldModel.set( attr, before );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo adding a field or an action.\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoAddObject: function( change, undoAll ) {\n\t\t\tvar objectModel = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\n\t\t\tif ( 'undefined' != typeof collection.newIDs ) {\n\t\t\t\tdelete collection.newIDs[ objectModel.get( 'id' ) ];\n\t\t\t}\n\t\t\t\t\t\t\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( model );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tcollection.remove( objectModel );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\t\t\n\n\t\t/**\n\t\t * Undo adding a field or an action.\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoDuplicateObject: function( change, undoAll ) {\n\t\t\tvar objectModel = change.get( 'model' );\n\t\t\tvar objectCollection = change.get( 'data' ).collection;\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( model );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tobjectCollection.remove( objectModel );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo removing a field or an action.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoRemoveObject: function( change, undoAll ) {\n\t\t\tvar dataModel = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\n\t\t\tnfRadio.channel( dataModel.get( 'objectDomain' ) ).request( 'add', dataModel );\n\n\t\t\tdelete collection.removedIDs[ dataModel.get( 'id' ) ];\n\t\t\t\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: dataModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tmodel.set( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\t// Trigger a reset on our field collection so that our view re-renders\n\t\t\tcollection.trigger( 'reset', collection );\n\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo field sorting.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoSortFields: function( change, undoAll ) {\n\t\t\tvar data = change.get( 'data' );\n\t\t\tvar fields = data.fields;\n\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields, function( changeModel ) {\n\t\t\t\tvar before = changeModel.before;\n\t\t\t\tvar fieldModel = changeModel.model;\n\t\t\t\tfieldModel.set( 'order', before );\n\t\t\t\t// console.log( 'set ' + fieldModel.get( 'label' ) + ' to ' + before );\n\t\t\t} );\n\t\t\t// console.log( fieldCollection.where( { label: 'Name' } ) );\n\t\t\t// console.log( fieldCollection.where( { label: 'Email' } ) );\n\n\n\t\t\tfieldCollection.sort();\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoAddListOption: function( change, undoAll ) {\n\t\t\tvar model = change.get( 'model' );\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\t\tif ( changeModel !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( changeModel );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\tmodel.collection.remove( model );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoRemoveListOption: function( change, undoAll ) {\n\t\t\tvar model = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\t\t\tcollection.add( model );\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tmodel.set( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoSortListOptions: function( change, undoAll ) {\n\t\t\tvar data = change.get( 'data' );\n\t\t\tvar collection = data.collection;\n\t\t\t\n\t\t\tvar objModels = data.objModels;\n\n\t\t\t_.each( objModels, function( changeModel ) {\n\t\t\t\tvar before = changeModel.before;\n\t\t\t\tvar optionModel = changeModel.model;\n\t\t\t\toptionModel.set( 'order', before );\n\t\t\t} );\t\t\t\t\n\n\n\t\t\tcollection.sort();\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * If our undo action was requested to 'remove' the change from the collection, remove it.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tremove \tshould we remove this item from our change collection\n\t\t * @return void\n\t\t */\n\t\tmaybeRemoveChange: function( change, undoAll ) {\t\t\t\n\t\t\tvar undoAll = typeof undoAll !== 'undefined' ? undoAll : false;\n\t\t\tif ( ! undoAll ) {\n\t\t\t\t// Update preview.\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tchangeCollection.remove( change );\n\t\t\t\tif ( 0 == changeCollection.length ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns a clone of a backbone model with all the attributes looped through so that collections contained within are propely cloned.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cloneModelDeep',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:modelDeep', this.cloneModelDeep, this );\n\t\t},\n\n\t\tcloneModelDeep: function( model ) {\n\t\t\t// Temporary value used to store any new collections.\n\t\t\tvar replace = {};\n\t\t\t// Loop over every model attribute and if we find a collection, clone each model and instantiate a new collection.\n\t\t\t_.each( model.attributes, function( val, key ) {\n\t\t\t\tif( val instanceof Backbone.Collection ) { // Is this a backbone collection?\n\t\t\t\t\tvar clonedCollection = nfRadio.channel( 'app' ).request( 'clone:collectionDeep', val );\n\t\t\t\t\treplace[ key ] = clonedCollection;\n\t\t\t\t} else if ( val instanceof Backbone.Model ) { // Is this a backbone model?\n\t\t\t\t\treplace[ key ] = this.cloneModelDeep( val );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\t// Clone our original model\n\t\t\tvar newModel = model.clone();\n\t\t\t// Overwrite any collections we created above.\n\t\t\t_.each( replace, function( val, key ) {\n\t\t\t\tnewModel.set( key, val );\n\t\t\t} );\n\n\t\t\treturn newModel;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns the appropriate child view for our settings drawer.\n *\n * This enables settings types to register custom childviews for their settings.\n * The option-repeater setting for the list field is an example.\n * \n * @package Ninja Forms builder\n * @subpackage App - Edit Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/getSettingChildView',['views/app/drawer/itemSetting'], function( itemSettingView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for field settings child views.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t},\n\n\t\t/**\n\t\t * Return the appropriate child setting view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model\tmodel \tField setting\n\t\t * @return backbone.view\n\t\t */\n\t\tgetSettingChildView: function( model ) {\n\t\t\t// Get our setting type.\n\t\t\tvar type = model.get( 'type' );\n\t\t\t// Request a setting childview from our setting type channel. (Setting type, not field type)\n\t\t\tvar settingChildView = nfRadio.channel( type ).request( 'get:settingChildView', model ) || itemSettingView;\n\t\t\t\n\t\t\treturn settingChildView\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Updates our model when the user changes a setting.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeSettingDefault',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to update settings.\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:setting', this.changeSetting, this );\n\n\t\t\t// Listen on our app channel for the change setting event. Fired by the setting view.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.changeSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * When we change our setting, update the model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te event\n\t\t * @param backbone.model \tsettingModel model that holds our field type settings info\n\t\t * @param backbone.model \tdataModel model that holds our field settings\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( e, settingModel, dataModel, value ) {\n\t\t\tvar name = settingModel.get( 'name' );\n\t\t\tvar before = dataModel.get( name );\n\t\t\tvar value = value || null;\n\t\t\tif ( ! value ) {\n\t\t\t\t// Sends out a request on the fields-type (fields-text, fields-checkbox, etc) channel to see if that field type needs to return a special value for saving.\n\t\t\t\tvalue = nfRadio.channel( settingModel.get( 'type' ) ).request( 'before:updateSetting', e, dataModel, name, settingModel );\n\t\t\t}\n\n\t\t\tif( 'undefined' == typeof value ){\n\t\t\t value = jQuery( e.target ).val();\n }\n\t\t\t\n\t\t\t// Update our field model with the new setting value.\n\t\t\tdataModel.set( name, value, { settingModel: settingModel } );\n\t\t\tnfRadio.channel( 'setting-' + name ).trigger( 'after:updateSetting', dataModel, settingModel );\n\t\t\t// Register our setting change with our change tracker\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'views/app/drawer/typeSettingFieldset',['views/app/drawer/itemSetting'], function( itemSettingView ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\n\t\tchildView: itemSettingView,\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.collection = this.model.get( 'settings' );\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.model.on( 'rerender', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\t \t\trenderSetting: function(){\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( this );\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderError: function() {\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\treturn this.error;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.nf-field-sub-settings' ).append( childView.el );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Model that represents our setting.\n *\n * When the model is created, we trigger the init event in two radio channels.\n *\n * This lets specific types of settings modify the model before anything uses it.\n *\n * Fieldset, for instance, uses this hook to instantiate its settings as a collection.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tsettings: false,\n\t\t\thide_merge_tags: false,\n\t\t\terror: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Send out two messages saying that we've initialized a setting model.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:settingModel', this );\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'init:settingModel', this );\n\t\t\tnfRadio.channel( 'setting-name-' + this.get( 'name' ) ).trigger( 'init:settingModel', this );\n\t\t\tthis.on( 'change:error', this.maybePreventUI, this );\n\n\t\t\t/*\n\t\t\t * If we have an objectType set on our collection, then we're creating a model for the generic settings collection.\n\t\t\t * If we're using merge tags in this setting\n\t\t\t */\n\n\t\t\tif( 'undefined' == typeof this.collection ) return;\n\n\t\t\tif ( this.get( 'use_merge_tags' ) && 'undefined' != typeof this.collection.options.objectType ) {\n\t\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', this.updateKey );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, send out a radio message requesting that this setting be checked for the old key.\n\t\t * We want to send the message on the objectType channel.\n\t\t * This means that if this setting is for fields, it will trigger on the fields channel, actions, etc.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Backbone.Model \tkeyModel data model representing the field for which the key just changed\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( keyModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'fire:updateFieldKey', keyModel, this );\n\t\t},\n\n\t\tmaybePreventUI: function() {\n\t\t\tif ( this.get( 'error' ) ) {\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'prevent:close', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'prevent:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\t\t\t\t\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'enable:close', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'enable:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collections of settings for each field type.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingCollection',['models/app/settingModel'], function( settingModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: settingModel,\n\n\t\tinitialize: function( models, options ) {\n\t\t\tthis.options = options || {};\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles actions related to field settings that use a fieldset\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/fieldset',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fieldset' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t\t// When a list type field is initialized, create an option collection.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldset' ), 'init:settingModel', this.createSettingsCollection );\n\t\t},\n\n\t\tgetSettingChildView: function( model ) {\n\t\t\treturn fieldsetView;\n\t\t},\n\n\t\t/**\n\t\t * Instantiate settings collection when a fieldset type is initialized.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tfield model being initialized\n\t\t * @return void\n\t\t */\n\t\tcreateSettingsCollection: function( model ) {\n\t\t\tmodel.set( 'settings', new settingCollection( model.get( 'settings' ) ) );\n\t\t},\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to our toggle field.\n * When we change the toggle, the setting value will be 'on' or ''.\n * We need to change this to 1 or 0.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/toggleSetting',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\n\t\t\tnfRadio.channel( 'setting-type-toggle' ).reply( 'renderOnChange', function(){ return false } );\n\n\t\t\t// Respond to requests for field setting filtering.\n\t\t\tnfRadio.channel( 'toggle' ).reply( 'before:updateSetting', this.updateSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * Return either 1 or 0, depending upon the toggle position.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te event\n\t\t * @param backbone.model \tfieldModel field model\n\t\t * @param string \t\t\tname setting name\n\t\t * @param backbone.model \tsettingTypeModel field type model\n\t\t * @return int 1 or 0\n\t\t */\n\t\tupdateSetting: function( e, fieldModel, name, settingTypeModel ) {\n\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\n\t\t\t\tvar value = 1;\n\t\t\t} else {\n\t\t\t\tvar value = 0;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for clicks on our action item action buttons.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Main Sortable\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/itemControls',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for clicks to edit, delete, duplicate actions.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:edit', this.clickEdit );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:delete', this.clickDelete );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:duplicate', this.clickDuplicate );\n\n\t\t\t// Listen for our drawer close and remove our active edit state\n\t\t},\n\n\t\t/**\n\t\t * Open a drawer with our action model for editing settings.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickEdit: function( e, model ) {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\tvar type = nfRadio.channel( currentDomainID ).request( 'get:type' , model.get( 'type' ) );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: type.get( 'settingGroups' ) } );\n\t\t},\n\n\t\t/**\n\t\t * Delete a action model from our collection\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickDelete: function( e, dataModel ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\t// Add our action deletion to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Removed',\n\t\t\t\tdashicon: 'dismiss'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: dataModel.collection\n\t\t\t};\n\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tvar results = changeCollection.where( { model: dataModel } );\n\n\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\tvar data = changeModel.get( 'data' );\n\t\t\t\tif ( 'undefined' != typeof data.fields ) {\n\t\t\t\t\t_.each( data.fields, function( field, index ) {\n\t\t\t\t\t\tif ( field.model == dataModel ) {\n\t\t\t\t\t\t\tdata.fields[ index ].model = newModel;\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tchangeModel.set( 'data', data );\n\t\t\t\tchangeModel.set( 'model', newModel );\n\t\t\t\tchangeModel.set( 'disabled', true );\n\t\t\t} );\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeObject', newModel, null, label, data );\n\t\t\t\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\tnfRadio.channel( currentDomainID ).request( 'delete', dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Duplicate a action within our collection, adding the word \"copy\" to the label.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickDuplicate: function( e, model ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\n\t\t\t// Change our label.\n\t\t\tnewModel.set( 'label', newModel.get( 'label' ) + ' Copy' );\n\t\t\t// Update our ID to the new tmp id.\n\t\t\tvar tmpID = nfRadio.channel( currentDomainID ).request( 'get:tmpID' );\n\t\t\tnewModel.set( 'id', tmpID );\n\t\t\t// Add new model.\n\t\t\t// Params are: model, silent, renderTrigger, action\n\t\t\tnfRadio.channel( currentDomainID ).request( 'add', newModel, false, false, 'duplicate' );\n\t\t\t\n\t\t\t// Add our action addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: model.get( 'objectType' ),\n\t\t\t\tlabel: model.get( 'label' ),\n\t\t\t\tchange: 'Duplicated',\n\t\t\t\tdashicon: 'admin-page'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( currentDomainID ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'duplicateObject', newModel, null, label, data );\n\t\t\t\n\t\t\tmodel.trigger( 'change:label', model );\n\n\t\t\t// Update preview.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Config file for our merge tags.\n *\n * this.collection represents all of our registered merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/mergeTags',[\n\t'models/app/mergeTagCollection'\n\t], function(\n\tmergeTagCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.tagSectionCollection = new mergeTagCollection();\n\t\t\tvar that = this;\n\t\t\t_.each( mergeTags, function( tagSection ) {\n\t\t\t\tif ( tagSection.tags ) {\n\t\t\t\t\tvar tags = new mergeTagCollection( tagSection.tags );\n\t\t\t\t} else {\n\t\t\t\t\tvar tags = '';\n\t\t\t\t}\n\n\t\t\t\tthat.tagSectionCollection.add( {\n\t\t\t\t\tid: tagSection.id,\n\t\t\t\t\tlabel: tagSection.label,\n\t\t\t\t\ttags: tags,\n\t\t\t\t\tdefault_group: tagSection.default_group\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tvar fieldTags = this.tagSectionCollection.get( 'fields').get( 'tags' );\n\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\t// TODO: Make this dynamic\n\t\t\t\tif ( 'submit' !== field.get( 'type' ) ) {\n\t\t\t\t\tfieldTags.add( {\n\t\t\t\t\t\tid: field.get( 'id' ),\n\t\t\t\t\t\tlabel: field.get( 'label' ),\n\t\t\t\t\t\ttag: that.getFieldKeyFormat( field.get( 'key' ) )\n\t\t\t\t\t} );\t\t\t\t\t\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tvar calcTags = new mergeTagCollection();\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\n\t\t\t_.each( calcCollection.models, function( calcModel ) {\n\t\t\t\tcalcTags.add( {\n\t\t\t\t\tlabel: calcModel.get( 'name' ),\n\t\t\t\t\ttag: '{calc:' + calcModel.get( 'name' ) + '}'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\n\n\t\t\tthis.currentElement = {};\n\t\t\tthis.settingModel = {};\n\t\t\tthis.open = false;\n\n\t\t\t// Unhook jBox Merge Tag stuff.\n\t\t\t// nfRadio.channel( 'mergeTags' ).reply( 'init', this.initMergeTags, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'mergeTags' ), 'click:mergeTag', this.clickMergeTag );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.addFieldTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'delete:field', this.deleteFieldTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalcTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'remove:option', this.updateCalcTags );\n\n\t\t\t\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentElement', this.updateCurrentElement, this );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentSetting', this.updateCurrentSetting, this );\n\n\t\t\t// Listen for requests for our mergeTag collection.\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:mergeTag', this.getSectionModel, this );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.replaceFieldKey );\n\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:fieldKeyFormat', this.getFieldKeyFormat, this );\n\n\t\t\t/*\n\t\t\t * TODO: Hotkey support for adding tags.\n\t\t\t *\n\t\t\t\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'open:mergeTags', this.openMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'up:mergeTags', this.upMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'down:mergeTags', this.downMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'return:mergeTags', this.returnMergeTags );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:open', this.updateOpen, this );\n\t\t\t*/\n\t\t},\n\n\t\t/**\n\t\t * Init merge tags within the passed view.\n\t\t * @since 3.0\n\t\t * @param backbone.view view to be searched for merge tags.\n\t\t * @return void\n\t\t */\n\t\tinitMergeTags: function( view ) {\n\t\t\tvar mergeTagsView = nfRadio.channel( 'mergeTags' ).request( 'get:view' );\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * Apply merge tags jQuery plugin.\n\t\t\t *\n\t\t\t * Prevent jBox from being called multiple times on the same element\n\t\t\t */\n\t\t\tthis.jBoxes = {};\n\t\t\tvar that = this;\n\n\t\t\tjQuery( view.el ).find( '.merge-tags' ).each(function() {\n\t\t\t\tif ( 'undefined' == typeof jQuery( this ).data( 'jBox-id' ) ) {\n\t\t\t\t\tvar jBox = jQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\t\ttitle: 'Insert Merge Tag',\n\t\t\t\t\t\ttrigger: 'click',\n\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\tx: 'center',\n\t\t\t\t\t\t\ty: 'bottom'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcloseOnClick: 'body',\n\t\t\t\t\t\tcloseOnEsc: true,\n\t\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\t\tmaxHeight: 200,\n\n\t\t\t\t\t\tonOpen: function() {\n\t\t\t\t\t\t\tmergeTagsView.reRender( view.model );\n\t\t\t\t\t\t\tthis.setContent( jQuery( '.merge-tags-content' ) );\n\t\t\t\t\t\t\tvar currentElement = jQuery( this.target ).prev( '.setting' );\n\t\t\t\t\t\t\tif ( 0 == currentElement.length ) {\n\t\t\t\t\t\t\t\tcurrentElement = jQuery( view.el ).find( '.setting' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthat.updateCurrentSetting( view.model );\n\t\t\t\t\t\t\tthat.updateCurrentElement( currentElement );\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'prevent:close', 'merge-tags' );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonClose: function() {\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'enable:close', 'merge-tags' );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tjQuery( this ).data( 'jBox-id', jBox.id );\t\t\t\t\t\n\t\t\t\t}\n\t\t });\n\t\t},\n\n\t\tclickMergeTag: function( e, tagModel ) {\n\t\t\t/*\n\t\t\t * TODO: Make this more dynamic.\n\t\t\t * Currently, the RTE is the only section that modifies how merge tags work,\n\t\t\t * but another type of setting might need to do this in the future.\n\t\t\t */\n\n\t\t\tif( 'undefined' != typeof this.settingModel.get( 'settingModel' ) && 'calculations' == this.settingModel.get( 'settingModel' ).get( 'name' ) ) {\n\n\t\t\t\tconsole.log( tagModel );\n\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\n\n\t\t\t\tvar tag = ( 'undefined' != typeof tagModel.get( 'calcTag' ) ) ? tagModel.get( 'calcTag' ) : tagModel.get( 'tag' );\n\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tag + currentValue.substr( currentPos );\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\n\t\t\t} else if( 'rte' == this.settingModel.get( 'type' ) ) {\n\t\t\t\tjQuery( this.currentElement ).summernote( 'insertText', tagModel.get( 'tag' ) );\n\t\t\t} else {\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tagModel.get( 'tag' ) + currentValue.substr( currentPos );\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\n\t\t\t}\n\t\t},\n\n\t\taddFieldTags: function( fieldModel ) {\n\t\t\t// TODO: Make this dynamic\n\t\t\tif ( 'submit' !== fieldModel.get( 'type' ) ) {\n\t\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).add( {\n\t\t\t\t\tid: fieldModel.get( 'id' ),\n\t\t\t\t\tlabel: fieldModel.get( 'label' ),\n\t\t\t\t\ttag: this.getFieldKeyFormat( fieldModel.get( 'key' ) ),\n\t\t\t\t\tcalcTag: this.getFieldKeyFormatCalc( fieldModel.get( 'key' ) )\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tdeleteFieldTags: function( fieldModel ) {\n\t\t\tvar fieldID = fieldModel.get( 'id' );\n\t\t\tvar tagModel = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldID );\n\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).remove( tagModel );\n\t\t},\n\n\t\tupdateCalcTags: function( optionModel ) {\n\t\t\tvar calcTags = new mergeTagCollection();\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\n\n\t\t\t_.each( calcCollection.models, function( calc ) {\n\t\t\t\tcalcTags.add( {\n\t\t\t\t\tlabel: calc.get( 'name' ),\n\t\t\t\t\ttag: '{calc:' + calc.get( 'name' ) + '}'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\n\t\t},\n\n\t\topenMergeTags: function( e ) {\n\t\t\tif ( 'TEXTAREA' == jQuery( e.target )[0].tagName || 'INPUT' == jQuery( e.target )[0].tagName ) {\n\t\t\t\tjQuery( e.target ).parent().find( '.merge-tags' ).click();\n\t\t\t}\n\t\t},\n\n\t\treturnMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\n\t\t\t\tif ( currentModel ) {\n\t\t\t\t\tthis.clickMergeTag( e, currentModel );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.changeActiveTag( 'up' );\n\t\t\t}\n\t\t},\n\n\t\tdownMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.changeActiveTag( 'down' );\n\t\t\t}\n\t\t},\n\n\t\tchangeActiveTag: function( dir ) {\n\t\t\tif ( 'down' == dir ) {\n\t\t\t\tvar inc = 1;\n\t\t\t} else {\n\t\t\t\tvar inc = -1\n\t\t\t}\n\t\t\t// First, check to see if a field is currently active.\n\t\t\tif( 0 < this.fields.where( { 'active': true } ).length ) {\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\n\t\t\t\tvar currentIndex = this.fields.indexOf( currentModel );\n\t\t\t\tcurrentModel.set( 'active', false );\n\n\t\t\t\tvar nextModel = this.fields.models[ currentIndex + inc ];\n\t\t\t\tif ( nextModel ) {\n\t\t\t\t\tnextModel.set( 'active', true );\n\t\t\t\t} else {\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( 0 < this.fields.where( { 'active': true } ) ) { // There aren't any active fields. Check for active system tags.\n\t\t\t\tconsole.log( 'system' );\n\t\t\t} else if ( 0 < this.userInfo.where( { 'active': true } ) ) { // No active user info LIs.\n\t\t\t\tconsole.log( 'userinfo' );\n\t\t\t} else { // No active LIs. We haven't made any active yet, or we've gotten to the bottom of the list.\n\t\t\t\t// Make sure that we have fields\n\t\t\t\tif ( 0 < this.fields.models.length ) {\n\t\t\t\t\t// Set our first field to active.\n\t\t\t\t\tthis.fields.models[0].set( 'active', true );\n\t\t\t\t} else {\n\t\t\t\t\t// Set our first system model to active.\n\t\t\t\t\tthis.system.models[0].set( 'active', true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateCurrentElement: function( element ) {\n\t\t\tthis.currentElement = element;\n\t\t},\n\n\t\tupdateCurrentSetting: function( settingModel ) {\n\t\t\tthis.settingModel = settingModel;\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.tagSectionCollection;\n\t\t},\n\n\t\tgetSectionModel: function( id ) {\n\t\t\treturn this.tagSectionCollection.get( id );\n\t\t},\n\n\t\tupdateOpen: function( open ) {\n\t\t\tthis.open = open;\n\t\t\t_.each( this.tagSectionCollection.get( 'fields' ).models, function( model ) {\n\t\t\t\tmodel.set( 'active', false );\n\t\t\t} );\n\t\t},\n\n\t\tupdateKey: function( fieldModel ) {\n\t\t\tvar newKey = fieldModel.get( 'key' );\n\t\t\tvar oldTag = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldModel.get( 'id' ) );\n\t\t\tif ( 'undefined' != typeof oldTag ) {\n\t\t\t\toldTag.set( 'tag', this.getFieldKeyFormat( newKey ) );\t\t\t\t\n\t\t\t}\n\n\t\t},\n\n\t\tgetFieldKeyFormat: function( key ) {\n\t\t\treturn '{field:' + key + '}';\n\t\t},\n\n\t\tgetFieldKeyFormatCalc: function( key ) {\n\t\t\treturn '{field:' + key + ':calc}';\n\t\t},\n\n\t\treplaceFieldKey: function( dataModel, keyModel, settingModel ) {\n var oldKey = this.getFieldKeyFormat( keyModel._previousAttributes[ 'key' ] );\n\t\t\tvar newKey = this.getFieldKeyFormat( keyModel.get( 'key' ) );\n\t\t\tvar settingName = settingModel.get( 'name' );\n\t\t\tvar oldVal = dataModel.get( settingName );\n if(settingName == 'calculations' && 'undefined' != typeof(dataModel.get('calculations'))) {\n var calcModel = dataModel.get( 'calculations' );\n calcModel.each( function( model ) {\n var oldCalcKey = oldKey.slice( 0, (oldKey.length - 1) ) + ':calc}';\n var newCalcKey = newKey.slice( 0, (newKey.length - 1 ) ) + ':calc}';\n oldVal = model.get( 'eq' );\n if ( 'string' == typeof( oldVal ) ) {\n var re = new RegExp( oldCalcKey, 'g' );\n var newVal = oldVal.replace( re, newCalcKey );\n re = new RegExp( oldKey, 'g' );\n // TODO: We won't need this second replace when we no longer\n // have to append :calc to merge tags.\n newVal = newVal.replace( re, newKey );\n model.set( 'eq', newVal );\n }\n } );\n return false;\n }\n\t\t\tif ( 'string' == typeof oldVal ) {\n\t\t\t\tvar re = new RegExp( oldKey, 'g' );\n\t\t\t\tnewVal = oldVal.replace( re, newKey );\n\t\t\t\tdataModel.set( settingName, newVal );\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagLookupCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\n var collection = Backbone.Collection.extend( {\n model: mergeTagModel\n } );\n return collection;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTag',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'li',\n template: '#tmpl-nf-merge-tag-box-tag',\n\n events: {\n \"click\": \"insertTag\"\n },\n\n insertTag: function() {\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', this.model.get( 'tag' ) );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagList',[ 'views/app/drawer/mergeTag' ], function( mergeTagView ) {\n var view = Marionette.CollectionView.extend({\n tagName: 'ul',\n childView: mergeTagView,\n\n initialize: function() {\n nfRadio.channel( 'merge-tags' ).reply( 'update:taglist', this.sectionFilter, this );\n nfRadio.channel( 'merge-tags' ).reply( 'filtersearch', this.searchFilter, this );\n },\n\n filter: function( child, index, collection ){\n return 'fields' == child.get( 'section' );\n },\n\n sectionFilter: function( section ){\n this.filter = function( child, index, collection ){\n return section == child.get( 'section' );\n }\n this.render();\n nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n },\n\n searchFilter: function( term ){\n this.filter = function( child, index, collection ){\n var label = child.get( 'label' ).toLowerCase().indexOf( term.toLowerCase().replace( ':', '' ) ) >= 0;\n var tag = child.get( 'tag' ).toLowerCase().indexOf( term.toLowerCase() ) >= 0;\n return label || tag;\n }\n this.render();\n nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagGroup',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'li',\n template: '#tmpl-nf-merge-tag-box-section',\n events: {\n \"click\": \"onClick\"\n },\n\n initialize: function () {\n this.listenTo( nfRadio.channel( 'merge-tags' ), 'after:filtersearch', this.removeActive );\n },\n\n onClick: function(){\n this.updateTags();\n this.setActive();\n },\n\n updateTags: function() {\n nfRadio.channel( 'merge-tags' ).request( 'update:taglist', this.model.get( 'id' ) );\n },\n\n setActive: function(){\n this.$el.addClass( 'active' );\n this.$el.siblings().removeClass( 'active' );\n },\n\n removeActive: function(){\n this.$el.removeClass( 'active' );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagGroupList',[ 'views/app/drawer/mergeTagGroup' ], function( mergeTagGroupView ) {\n var view = Marionette.CollectionView.extend({\n tagName: 'ul',\n childView: mergeTagGroupView,\n\n initialize: function(){\n this.listenTo( nfRadio.channel( 'merge-tags' ), 'open', this.render, this );\n },\n\n // TODO: Update filter when a new tag is added. ie Calculations.\n filter: function( child, index, collection ){\n return 0 < child.get( 'tags' ).length;\n },\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagFilter',[], function() {\n var view = Marionette.ItemView.extend({\n template: '#tmpl-nf-merge-tag-box-filter',\n events: {\n \"keyup input\": \"updateFilter\",\n },\n updateFilter: function( event ) {\n\n if( /* ENTER */ 13 == event.keyCode ){ // Copied from Keyup Callback.\n // Get top listed merge tag.\n var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\n\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\n\n // COPIED FROM BELOW\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n return;\n }\n var value = this.$el.find( 'input' ).val();\n nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagBox',[], function() {\n var view = Marionette.LayoutView.extend({\n el: '#merge-tags-box',\n template: \"#tmpl-nf-merge-tag-box\",\n\n regions: {\n filter: '.merge-tag-filter',\n sections: '.merge-tag-sections',\n tags: '.merge-tag-list'\n },\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Merge Tag Box\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1\n */\n\ndefine( 'controllers/app/mergeTagBox',[\n 'models/app/mergeTagModel',\n 'models/app/mergeTagLookupCollection',\n 'views/app/drawer/mergeTag',\n 'views/app/drawer/mergeTagList',\n 'views/app/drawer/mergeTagGroup',\n 'views/app/drawer/mergeTagGroupList',\n 'views/app/drawer/mergeTagFilter',\n 'views/app/drawer/mergeTagBox'\n], function(\n MergeTagModel,\n MergeTagLookupCollection,\n MergeTagView,\n MergeTagListView,\n MergeTagGroupView,\n MergeTagGroupListView,\n MergeTagFilterView,\n MergeTagBoxLayout\n) {\n var controller = Marionette.Object.extend( {\n\n caret: 0, // Track the caret position of the current setting's input.\n old: '', // THe old merge tag that will be replaced.\n\n initialize: function(){\n\n this.listenTo( nfRadio.channel( 'app' ), 'after:appStart', this.afterAppStart );\n this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n this.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.beforeDrawerClose );\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n var that = this;\n nfRadio.channel( 'mergeTags' ).reply( 'set:caret', function( position ){\n that.caret = position;\n });\n nfRadio.channel( 'mergeTags' ).reply( 'get:caret', function(){\n return that.caret;\n });\n\n var that = this;\n nfRadio.channel( 'mergeTags' ).reply( 'set:old', function( value ){\n that.old = value;\n });\n nfRadio.channel( 'mergeTags' ).reply( 'get:old', function(){\n return that.old;\n });\n\n nfRadio.channel( 'mergeTags' ).reply( 'insert:tag', this.insertTag.bind( this ) );\n\n /** OPTION REPEATER */\n this.listenTo( nfRadio.channel( 'option-repeater' ), 'add:option', function( model ){\n var selector = '#' + model.cid + ' .has-merge-tags input.setting';\n jQuery( selector ).on( 'focus', function( event ){\n that.focusCallback( event, selector, 'option-repeater' );\n });\n jQuery( selector ).on( 'keyup', function( event ){\n that.keyupCallback( event, selector, 'option-repeater' );\n });\n jQuery( selector ).siblings( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n /* CALCULATIONS */\n this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', this.renderSetting );\n this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', function( settingModel, dataModel, view ){\n view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n /* SUMMERNOTE */\n this.listenTo( nfRadio.channel( 'summernote' ), 'focus', function( e, selector ) {\n that.focusCallback( false, selector, 'rte' );\n } );\n this.listenTo( nfRadio.channel( 'summernote' ), 'keydown', function( e, selector ){\n jQuery( selector ).closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\n } );\n this.listenTo( nfRadio.channel( 'summernote' ), 'keyup', function( e, selector ){\n that.keyupCallback( e, selector, 'rte' );\n } );\n\n jQuery( document ).on( 'keyup', function( event ){\n if( 27 == event.keyCode ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n // Copied from KeyupCallback.\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).blur();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n });\n },\n\n afterAppStart: function() {\n var mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n var mergeTags = [];\n mergeTagCollection.each( function( section ){\n section.get( 'tags' ).each( function( tag ){\n mergeTags.push({\n label: tag.get( 'label' ),\n tag: tag.get( 'tag' ),\n section: section.get( 'id' )\n });\n });\n });\n var layout = new MergeTagBoxLayout();\n layout.render();\n var tagCollection = new MergeTagLookupCollection( mergeTags );\n var mergeTagListView = new MergeTagListView({\n collection: tagCollection\n });\n var mergeTagGroupListView = new MergeTagGroupListView({\n collection: mergeTagCollection\n });\n\n layout.getRegion('tags').show(mergeTagListView);\n layout.getRegion('sections').show(mergeTagGroupListView);\n layout.getRegion('filter').show(new MergeTagFilterView);\n\n var that = this;\n this.listenTo( nfRadio.channel( 'mergeTags' ), 'open', function(){\n // layout.destroy();\n that.afterAppStart();\n });\n },\n\n beforeRenderSetting: function( settingModel, dataModel ){\n if( 'undefined' == typeof settingModel.get( 'use_merge_tags' ) ) return;\n if( ! settingModel.get( 'use_merge_tags' ) ) return;\n var name = settingModel.get( 'name' );\n this.listenTo( nfRadio.channel( 'setting-' + name ), 'render:setting', this.renderSetting );\n },\n\n renderSetting: function( settingModel, dataModel, view ){\n\n view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n\n if( 0 == jQuery( '#merge-tags-box' ).length ) this.afterAppStart();\n\n // Track Scrolling.\n jQuery( '#nf-drawer' ).on( 'scroll', function(){\n // COPIED AND MODIFIED FROM FOCUS\n if( 0 == jQuery( '.merge-tag-focus' ).length ) return;\n\n var rteEditor = jQuery( '.merge-tag-focus' ).closest( '.nf-setting' ).find( '.note-editor' );\n if( 0 != rteEditor.length ){\n var posY = rteEditor.offset().top - jQuery(window).scrollTop();\n var height = rteEditor.outerHeight();\n } else {\n var posY = jQuery('.merge-tag-focus').offset().top - jQuery(window).scrollTop();\n var height = jQuery('.merge-tag-focus').outerHeight();\n }\n jQuery( '#merge-tags-box' ).css( 'top', posY + height );\n\n var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\n\n var repeaterRow = jQuery( '.merge-tag-focus' ).closest( '.nf-list-options-tbody' );\n if( 0 != repeaterRow.length ){\n var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', left );\n } else {\n var posX = jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).width() );\n }\n });\n\n // On input focus, move the Merge Tag Box into position.\n jQuery( view.el ).find( '.setting' ).on( 'focus', this.focusCallback );\n\n // TODO: Maybe move to view events.\n // On input keyup, maybe show Merge Tag Box.\n jQuery( view.el ).find( '.setting' ).on( 'keyup', this.keyupCallback );\n },\n\n // TODO: Maybe move to view class.\n beforeDrawerClose: function(){\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n // jQuery( 'body' ).append( jQuery( '#merge-tags-box' ) );\n nfRadio.channel( 'mergeTags' ).trigger( 'open' );\n },\n\n insertTag: function( tag ) {\n\n var $input = jQuery( '.merge-tag-focus' );\n\n if( 0 != $input.closest( '.nf-setting' ).first().find( '.note-editable' ).length ){\n $input = $input.closest( '.nf-setting' ).first().find( '.note-editable' );\n }\n\n if( 1 < $input.length ){ $input = $input.first(); }\n\n if( $input.hasClass( 'note-editable' ) ){\n var str = $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code' );\n } else {\n var str = $input.val();\n }\n\n var find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\n var replace = tag;\n var caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\n\n var patt = /{([a-z0-9]|:|_|})*/g;\n\n // Loop through matches to find insert/replace index range.\n // Reference: http://codepen.io/kjohnson/pen/36c3a782644dfff40fe3c1f05f8739d9?editors=0012\n while (match = patt.exec(str)) {\n if (find != match[0]) continue; // This isn't the match you are looking for...\n var string = str.slice(0, match.index) + replace + str.slice(patt.lastIndex); // Fancy replace for the specifc match, using the index/position.\n\n if( $input.hasClass( 'note-editable' ) ){\n $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code', string );\n\n // Reposition the caret. http://stackoverflow.com/a/6249440 TODO: Determine the appropriate childNode.\n var el = $input;\n var childNode = null; // Default to first childNode.\n _.each( el[0].childNodes, function( node, index ){\n if( childNode ) return;\n if( ! node.nodeValue && ! node.innerHTML ) return;\n if( node.nodeValue ) {\n var position = node.nodeValue.indexOf(replace) + find.length;\n } else if( node.innerHTML ){\n var position = node.innerHTML.indexOf(replace) + find.length;\n }\n if( caretPos == position ) childNode = el[0].childNodes[index];\n });\n if( ! childNode ) childNode = el[0].childNodes[0];\n var offset = caretPos - find.length + replace.length;\n var range = document.createRange();\n var sel = window.getSelection();\n if( 0 != childNode.childNodes.length ) {\n try{\n range.setStart(childNode.childNodes[0], offset); \n } catch( err ) {\n console.log( 'error' );\n }\n \n } else {\n try {\n range.setStart(childNode, offset);\n } catch( err ) {\n console.log( 'error' );\n }\n \n }\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n\n\n } else {\n $input.val(string); // Update input value with parsed string.\n $input.change(); // Trigger a change event after inserting the merge tag so that it saves to the model.\n $input.caret(caretPos - find.length + replace.length); // Update Carept Position.\n }\n\n }\n\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n $input.removeClass( 'merge-tag-focus' );\n $input.closest( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n },\n\n mergeTagsButtonClick: function( e ){\n var $this = jQuery( this );\n if( $this.siblings().hasClass( 'merge-tag-focus' ) ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n return;\n }\n\n var $inputSetting = $this.siblings( '.setting' ).first();\n\n if( 0 !== $this.closest( '.nf-setting, .nf-table-row' ).find( '.note-tools' ).length ){\n $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\n } else {\n var text = $inputSetting.val() || '';\n $inputSetting.val( text + '{' ).change();\n nfRadio.channel('mergeTags').request('set:caret', text.length + 1 );\n }\n\n if( $this.parent().hasClass( 'note-tools' ) ){\n // $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\n }\n\n nfRadio.channel('mergeTags').request('set:old', '{' );\n\n $inputSetting.addClass( 'merge-tag-focus' );\n\n // Disable browser autocomplete.\n var autocomplete = $this.attr( 'autocomplete' );\n $this.attr( 'autocomplete', 'off' );\n $this.data( 'autocomplete', autocomplete );\n\n var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\n if( 0 != $overlayElement.find( '.note-editor' ).length ){\n $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\n } else {\n $overlayElement.addClass('merge-tag-focus-overlay');\n }\n\n jQuery( '#merge-tags-box' ).css( 'display', 'block' );\n nfRadio.channel( 'drawer' ).request( 'prevent:close' );\n\n jQuery( '.merge-tag-focus-overlay' ).on( 'click', function( e ) {\n if ( jQuery( e.target ).hasClass( 'note-editor' ) ) {\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n } );\n\n setTimeout(function(){\n jQuery( '#merge-tags-box' ).find( '.merge-tag-filter' ).find( 'input' ).focus();\n }, 500 );\n },\n\n focusCallback: function( e, target, type ){\n\n var type = type || 'setting';\n var $this = ( 'undefined' == typeof target ) ? jQuery( this ) : jQuery( target );\n\n jQuery( '.merge-tag-focus' ).each(function(index, el){\n if( this == el ) return;\n el.removeClass( 'merge-tag-focus' );\n });\n\n if( 'rte' == type ) {\n var posY = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().top - jQuery(window).scrollTop();\n var height = $this.closest( '.nf-setting' ).find( '.note-editor' ).outerHeight();\n } else {\n var posY = $this.offset().top - jQuery(window).scrollTop();\n var height = $this.outerHeight();\n }\n jQuery( '#merge-tags-box' ).css( 'top', posY + height );\n\n var repeaterRow = $this.closest( '.nf-list-options-tbody' );\n if( 0 != repeaterRow.length ) {\n var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', left );\n } else if( 'rte' == type ) {\n var posX = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-setting' ).find( '.note-editor' ).width() );\n }\n else\n {\n var posX = jQuery( this ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-settings' ).width() );\n }\n\n var dataID = jQuery( this ).data( 'id' );\n if( dataID && 'eq' != dataID ) return;\n\n // var offset = jQuery( view.el ).find( '.setting' ).parent().outerHeight();\n // jQuery( view.el ).find( '.setting' ).parent().append( jQuery( '#merge-tags-box' ) );\n // jQuery( '#merge-tags-box' ).css( 'top', offset );\n },\n\n keyupCallback: function( event, target, type ){\n\n var type = type || 'setting';\n\n if( /* ENTER */ 13 == event.keyCode ){\n\n // Get top listed merge tag.\n var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\n\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\n\n // COPIED FROM BELOW\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n\n return;\n }\n\n // Get the value.\n // var value = jQuery( summernote ).summernote( 'code' );\n // Update the value.\n // jQuery( summernote ).closest( '.nf-setting' ).find( '.note-editable' ).html( value );\n\n if( 'undefined' != typeof target ) {\n var $this = jQuery(target);\n } else {\n var $this = jQuery( this );\n }\n\n // TODO: Disable Browser Autocomplete\n // $this.attr()\n\n\n var dataID = jQuery( this ).data( 'id' );\n if( dataID && 'eq' != dataID ) return;\n\n // Store the current caret position.\n if( 'rte' == type ){\n var range = $this.summernote('createRange');\n if( range ) {\n var caretPos = range.so; // or .eo?\n } else {\n var caretPos = 0;\n }\n $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\n } else {\n var caretPos = $this.caret();\n }\n nfRadio.channel( 'mergeTags' ).request( 'set:caret', caretPos );\n\n // Find merge tags.\n if( 'rte' == type ) {\n var mergetags = $this.summernote( 'code' ).match(new RegExp(/{([a-z0-9]|:|_|})*/g));\n } else {\n var mergetags = $this.val().match(new RegExp(/{([a-z0-9]|:|_|})*/g));\n }\n\n // Filter out closed merge tags.\n mergetags = _.filter(mergetags, function(mergetag) {\n return -1 == mergetag.indexOf( '}' ); // Filter out \"closed\" merge tags.\n });\n\n // If an open merge tag is found, show the Merge Tag Box, else hide.\n if( 0 !== mergetags.length ) {\n\n nfRadio.channel( 'mergeTags' ).request( 'set:old', mergetags[0] );\n\n jQuery('#merge-tags-box').css( 'display', 'block' );\n nfRadio.channel( 'drawer' ).request( 'prevent:close' );\n $this.addClass('merge-tag-focus');\n\n var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\n\n // Disable browser autocomplete.\n var autocomplete = $this.attr( 'autocomplete' );\n $this.attr( 'autocomplete', 'off' );\n $this.data( 'autocomplete', autocomplete );\n\n var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\n if( 0 != $overlayElement.find( '.note-editor' ).length ){\n $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\n } else {\n $overlayElement.addClass('merge-tag-focus-overlay');\n }\n\n $overlayElement.on( 'click', function( event ){\n var elementClasses = jQuery( event.target ).attr( 'class' ) || [];\n if( -1 !== elementClasses.indexOf( 'merge-tag-focus-overlay' ) ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n });\n\n var value = mergetags[0].replace( '{', '' );\n nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\n } else {\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n }\n\n } );\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're about to render a setting model that's a select and has 'fields' as the 'fill' setting, add all our field models to its options.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/itemSettingFill',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel ) {\n\t\t\tif ( 'fields' == settingModel.get( 'fill' ) ) {\n\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Modify the user's browser history when they click on a domain\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/confirmPublish',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:confirmPublish', this.confirmPublish );\n\t\t},\n\n\t\tconfirmPublish: function() {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t// Check to see if we need to add a submit button.\n\t\t\tif ( 1 == formModel.get( 'settings' ).get( 'add_submit' ) ) {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add', { type: 'submit', label: 'Submit', order: 9999 } );\n\t\t\t}\n\t\t\tformModel.set( 'show_publish_options', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to settings that utilise the Rich Text Editor\n *\n * @package Ninja Forms builder\n * @subpackage App - Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/rte',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\n\t\t\tnfRadio.channel( 'setting-type-rte' ).reply( 'renderOnChange', function(){ return false } );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'rte' ), 'init:settingModel', this.initSettingModel );\n\n\t\t\t// When an RTE setting is shown, re-render RTE.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'render:setting', this.renderSetting );\n\n\t\t\t// When an RTE setting view is destroyed, remove our RTE.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'destroy:setting', this.destroySetting );\n\n\t\t\t// When an element within the RTE is clicked, check to see if we should insert a link.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), '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\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 this.currentContext = {};\n\t\t},\n\n\t\tinitSettingModel: function( settingModel ) {\n\t\t\tsettingModel.set( 'hide_merge_tags', true );\n\t\t},\n\n\t\tinitRTE: function( settingModel, dataModel, settingView ) {\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\t\t\tvar mergeTags = this.mergeTags();\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 [ 'tools', [ 'mediaButton', 'mergeTags', 'codeview' ] ]\n\t\t\t];\n\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( {\n\t\t\t\ttoolbar: toolbar,\n\t\t\t\tbuttons: {\n\t\t\t\t\tlinkButton: linkButton,\n\t\t\t\t\tmergeTags: mergeTags,\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 callbacks: {\n\t\t\t\t \tonBlur: function( editor ) {\n\t\t\t\t \t\tvar value = editor.getValue();\n\t\t\t\t \t\tthat.updateDataModel( settingModel, dataModel, value );\n\t\t\t\t \t}\n\t\t\t\t }\n\t\t\t\t},\n\t\t\t\tprettifyHtml: true,\n\t\t\t\tcallbacks: {\n\t\t\t\t\tonBlur: function( e, context ) {\n\t\t\t\t\t\tvar value = jQuery( this ).summernote( 'code' );\n\t\t\t\t\t\tthat.updateDataModel( settingModel, dataModel, value );\n nfRadio.channel( 'summernote' ).trigger( 'blur', settingModel, dataModel, value );\n\t\t\t\t\t},\n onFocus: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'focus', e, this, context );\n },\n onKeydown: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'keydown', e, this, context );\n },\n onKeyup: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'keyup', e, this, context );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tupdateDataModel: function( settingModel, dataModel, value ) {\n\t\t\tvar name = settingModel.get( 'name' );\n\t\t\tvar before = dataModel.get( name );\n\t\t\tvar after = value;\n\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\n\n\t\t\tdataModel.set( settingModel.get( 'name' ), after );\n\t\t},\n\n\t\trenderSetting: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.initRTE( settingModel, dataModel,settingView );\n\t\t\tvar linkMenu = jQuery( settingView.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\tdestroySetting: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.removeRTE( settingModel, dataModel, settingView );\n\t\t},\n\n\t\tremoveRTE: function( settingModel, dataModel, settingView ) {\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( 'destroy' );\n\t\t},\n\n\t\tdrawerOpened: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.initRTE( settingModel, dataModel, settingView );\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: 'Insert Link',\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\tmergeTags: function( context ) {\n\t\t\tvar ui = jQuery.summernote.ui;\n\t\t\tvar mergeTagsButton = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-rte-merge-tags-button' );\n\t\t\treturn ui.button({\n\t\t\t\tclassName: 'dropdown-toggle merge-tags',\n\t\t\t\tcontents: mergeTagsButton({}),\n\t\t\t\ttooltip: 'Merge Tags'\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: 'Insert Media',\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.createRange' );\n\t\t\tcontext.invoke( 'editor.saveRange' );\n\t\t\tthis.currentContext = context;\n\t\t\t\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: 'Select a file',\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, settingModel, dataModel, settingView ) {\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\tthis.currentContext.invoke( 'editor.restoreRange' );\n\t\t\tif ( 'image' == media.type ) {\n\t\t\t\tthis.currentContext.invoke( 'editor.insertImage', media.url );\n\t\t\t} else {\n\t\t\t\tthis.currentContext.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\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingFieldSelect',[], function() {\n var controller = Marionette.Object.extend( {\n\n initialize: function() {\n\n // Bind field key listener to field-select setting type.\n this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', this.trackKeyChanges );\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-field-select' ), 'before:renderSetting', this.beforeRender );\n\n // Add setting change listener only in drawers with a field-select setting.\n this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', function() {\n this.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.maybeSwitchToFieldsDomain );\n });\n\n this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.autoOpenDrawer );\n\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.filterDrawerContents );\n this.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.SwitchToFieldsDomain );\n },\n\n trackKeyChanges: function( settingModel ) {\n settingModel.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', settingModel.updateKey );\n\n // Update selected field if the selected field's key changes.\n this.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.updateFieldMap );\n },\n\n updateFieldMap: function( dataModel, keyModel, settingModel ) {\n\n var oldKey = keyModel._previousAttributes[ 'key' ];\n var newKey = keyModel.get( 'key' );\n\n if( 'field-select' == settingModel.get( 'type' ) && dataModel.get( settingModel.get( 'name' ) ) == oldKey ) {\n\n dataModel.set( settingModel.get( 'name' ), newKey );\n }\n },\n\n beforeRender: function( settingModel, dataModel ) {\n\n var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n var fieldTypes = settingModel.get( 'field_types' );\n\n var options = [\n {\n label: '--',\n value: 0\n }\n ];\n _.each( fieldCollection.models, function( field ){\n\n if( dataModel.cid == field.cid ) return;\n\n if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length && ! _.contains( fieldTypes, field.get( 'type' ) ) ) return;\n\n var fieldFilter = settingModel.get( 'field_filter' );\n if( fieldFilter && 'undefined' != typeof fieldFilter[ field.get( 'type' ) ] ) {\n var bail = false;\n _.each( fieldFilter[ field.get( 'type' ) ], function( value, setting ){\n console.log( value + \":\" + field.get( setting ) );\n if( value != field.get( setting ) ) bail = true;\n } );\n if( bail ) return;\n }\n\n var value = field.get( 'key' );\n switch ( settingModel.get( 'field_value_format' ) ) {\n case 'key':\n value = field.get( 'key' );\n break;\n case 'merge_tag':\n default:\n value = '{field:' + field.get( 'key' ) + '}';\n }\n\n options.push({\n label: field.get( 'label' ),\n value: value\n });\n });\n\n if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length ) {\n _.each( fieldTypes, function( fieldType ){\n\n var fieldTypeModel = nfRadio.channel( 'fields' ).request( 'get:type', fieldType );\n\n options.push({\n label: '-- Add ' + fieldTypeModel.get( 'nicename' ) + ' Field',\n value: 'addField:' + fieldType,\n });\n } );\n }\n\n settingModel.set( 'options', options );\n },\n\n maybeSwitchToFieldsDomain: function( e, model, dataModel ) {\n\n if( 'field-select' != model.get( 'type' ) ) return;\n\n var name = model.get( 'name' );\n var value = dataModel.get( name );\n\n if( ! value ) return;\n\n var rubble = value.split( ':' );\n\n if( 'addField' != rubble[0] ) return;\n\n this.openDrawer = 'addField';\n this.filterDrawer = rubble[1];\n\n dataModel.set( name, '' );\n\n this.switchDomain = true;\n nfRadio.channel( 'app' ).request( 'close:drawer' );\n },\n\n SwitchToFieldsDomain: function() {\n if( this.switchDomain ) {\n var fieldDomainModel = nfRadio.channel( 'app' ).request( 'get:domainModel', 'fields' );\n nfRadio.channel('app').request('change:currentDomain', null, fieldDomainModel);\n this.switchDomain = null;\n }\n },\n\n autoOpenDrawer: function() {\n if( this.openDrawer ) {\n nfRadio.channel( 'app' ).request( 'open:drawer', this.openDrawer );\n this.openDrawer = null;\n }\n },\n\n filterDrawerContents: function() {\n if( this.filterDrawer ) {\n nfRadio.channel('drawer-addField').trigger('change:filter', this.filterDrawer);\n this.filterDrawer = null;\n }\n }\n });\n\n return controller;\n} );\n","/**\n * The Field List setting is a container of settings (like the Fieldset setting), in which its children are instantiated.\n * Unlike the Fieldset setting, Field List settings are dynamically created based on the list of form fields.\n *\n * Note: Field references in the dynamic setting names are based on field keys, which may change.\n * Unlike regular field key tracking, a new setting needs to be created with the same value as the previous.\n *\n * @package Ninja Forms builder\n * @subpackage Action Settings\n * @copyright (c) 2016 WP Ninjas\n * @author Kyle B. Johnson\n * @since 3.0\n */\ndefine( 'controllers/app/settingFieldList',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\n return Marionette.Object.extend( {\n\n /**\n * A reference list of Field List setting models.\n */\n fieldListSettings: [],\n\n initialize: function() {\n this.listenTo( nfRadio.channel( 'field-list' ), 'init:settingModel', this.registerFieldListSettings );\n this.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateFieldListSettingKeys );\n nfRadio.channel( 'field-list' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n },\n\n /**\n * Build a reference list of Field List setting models for later reference.\n *\n * @param settingModel\n */\n registerFieldListSettings: function( settingModel ){\n this.fieldListSettings.push( settingModel.get( 'name' ) );\n },\n\n /**\n * Field List settings contain field keys in the setting names.\n * When a field key changes, so too must the Field List setting name.\n *\n * @param fieldModel\n */\n updateFieldListSettingKeys: function( fieldModel ){\n\n // We are only interested in field key changes.\n if( 'undefined' == typeof fieldModel.changed.key ) return;\n\n var oldKey = fieldModel._previousAttributes.key;\n var newKey = fieldModel.changed.key;\n\n /*\n * This is an absolute (functional) mess of nesting. I apologize to my future self, or Kenny.\n *\n * Each setting of each action model must be checked against each registered Field List setting.\n */\n var that = this;\n _.each( Backbone.Radio.channel( 'actions' ).request( 'get:collection' ).models, function( actionModel ) {\n _.each( actionModel.attributes, function( value, setting ) {\n var lastChanged = ''; // Used to avoid resetting the change with a duplicate call.\n _.each( that.fieldListSettings, function( prefix ) {\n if( setting != prefix + '-' + oldKey || lastChanged == oldKey ) return;\n var oldValue = actionModel.get( prefix + '-' + oldKey );\n actionModel.set( prefix + '-' + newKey, oldValue );\n actionModel.set( prefix + '-' + oldKey, 0 );\n lastChanged = oldKey;\n });\n });\n });\n },\n\n /**\n * Set the view for Field List sub-settings, just like the Fieldset setting.\n *\n * @param settingModel\n * @returns {*}\n */\n getSettingChildView: function( settingModel ) {\n\n /**\n * Dynamically build field-list settings as needed for the view.\n */\n\n // Filter fields based on the field_types setting property.\n var fields = _.filter( nfRadio.channel( 'fields' ).request( 'get:collection' ).models, function( field ) {\n return _.contains( settingModel.get( 'field_types' ), field.get( 'type' ) );\n });\n\n // Map fields into setting definitions.\n var settings = _.map( fields, function( field ) {\n return {\n name: settingModel.get( 'name' ) + '-' + field.get( 'key' ),\n type: 'toggle',\n label: field.get( 'label' ),\n width: 'full'\n };\n });\n\n settingModel.set( 'settings', new settingCollection( settings ) );\n\n // return the child view.\n return fieldsetView;\n },\n\n });\n} );\n\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n *\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingHTML',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-html' ), 'before:renderSetting', this.init );\n },\n\n init: function( settingModel, dataModel ) {\n\n if( 'undefined' == settingModel.get( 'mirror' ) ) return;\n\n // Listen to a setting change inside of the dataModel.\n dataModel.on( 'change:' + settingModel.get( 'mirror' ), this.update, settingModel );\n },\n\n update: function( dataModel, changedSettingValue ) {\n\n // Mirror the default value setting value.\n dataModel.set( this.get( 'name' ), changedSettingValue );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingColor',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n // We don't want to re-render this setting type when the data changes.\n nfRadio.channel( 'setting-type-color' ).reply( 'renderOnChange', this.setRenderFalse );\n // We want to close any color pickers before we close our styling tab or drawer.\n this.listenTo( nfRadio.channel( 'setting-type-color' ), 'destroy:setting', this.closeColorPickers );\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-color' ), 'render:setting', this.initColorPicker );\n },\n\n initColorPicker: function( settingModel, dataModel, view ) {\n\n var name = settingModel.get( 'name' );\n var el = jQuery( view.el ).find( 'input' );\n\n jQuery( el ).wpColorPicker( {\n change: function( event, ui ){\n nfRadio.channel( 'app' ).request( 'change:setting', event, settingModel, dataModel, ui.color.toString() );\n }\n } );\n },\n\n setRenderFalse: function() {\n return false;\n },\n\n closeColorPickers: function( settingModel, dataModel, view ) {\n jQuery( view.el ).find( '.wp-color-picker' ).wpColorPicker( 'close' );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for the app to start.\n *\n * If the form is a new form, then highlight the Add New submenu item.\n * Otherwise, append an Edit Form submenu for context.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeMenu',[], function() {\n var controller = Marionette.Object.extend({\n\n editFormText: '',\n\n initialize: function () {\n this.editFormText = nfAdmin.editFormText || 'Edit Form';\n this.listenTo(nfRadio.channel('app'), 'after:appStart', this.changeMenu);\n this.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.formPublish );\n },\n\n changeMenu: function () {\n var form = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n if ( this.isNewForm( form.id ) ) {\n this.highlightAddNew();\n } else {\n this.appendEditForm();\n }\n },\n\n isNewForm: function( form_id ) {\n return isNaN( form_id );\n },\n\n highlightAddNew: function() {\n jQuery( '.wp-submenu li' ).removeClass( 'current' );\n jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().addClass( 'current' );\n },\n\n appendEditForm: function() {\n var html = '<li class=\"current\"><a href=\"#\">' + this.editFormText + '</a></li>';\n if ( jQuery( 'li a:contains(\"' + this.editFormText + '\")' ).length == 0 ) {\n jQuery( '.wp-submenu li' ).removeClass( 'current' );\n jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().after( html );\n }\n },\n\n formPublish: function( response ) {\n if ( 'publish' !== response.action ) return false;\n this.changeMenu();\n }\n });\n\n return controller;\n});\n","/**\n * When we click on a domain link, close the mobile menu.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for clicks on our app menu.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.closeMobileMenu );\n\t\t},\n\n\t\tcloseMobileMenu: function() {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).removeClass( 'nf-menu-expand' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Add a jBox notice to the screen.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'notices' ).reply( 'add', this.addNotice, this );\n\t\t\tnfRadio.channel( 'notices' ).reply( 'close', this.closeNotice, this );\n\t\t\tthis.notices = {};\n\t\t},\n\n\t\taddNotice: function( key, msg, options ) {\n\n\t\t\tvar appDefaults = {\n\t\t\t\tcontent: msg,\n\t\t\t\tcolor: 'green',\n\t\t\t\tzIndex:12000,\n\t\t\t\tconstructOnInit: true,\n\t\t\t\tstack: true,\n\t\t\t\tanimation: {\n\t\t\t\t\topen: 'flip',\n\t\t\t\t\tclose: 'flip'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar mobileDefaults = {\n\t\t\t\tposition: {\n\t\t\t\t\tx: 'center',\n\t\t\t\t\ty: 'top'\n\t\t\t\t},\n\t\t\t\tanimation: {\n\t\t\t\t\topen:'slide:top',\n\t\t\t\t\tclose:'slide:left'\n\t\t\t\t},\n\t\t\t\tautoClose: 2000,\n\t\t\t\toffset: {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 55\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar desktopDefaults = {\n\t\t\t\tattributes: {\n\t\t\t\t\tx: 'left',\n\t\t\t\t\ty: 'bottom'\n\t\t\t\t},\n\t\t\t\tautoClose: 4000\n\t\t\t};\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tvar defaults = mobileDefaults;\t\n\t\t\t} else {\n\t\t\t\tvar defaults = desktopDefaults;\n\t\t\t}\n\t\t\tdefaults = jQuery.extend( defaults, appDefaults );\n\n\t\t\tvar options = jQuery.extend( defaults, options );\n\t\t\t// console.log( options );\n\t\t\tthis.notices[ key ] = new jBox( 'Notice', options );\n\t\t},\n\n\t\tcloseNotice: function( key ) {\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\n\t\t\t\tthis.notices[ key ].close();\n\t\t\t}\n\t\t},\n\n\t\topenNotice: function( key ) {\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\n\t\t\t\tthis.notices[ key ].open();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Prompt the user to save if they attempt to leave the page with unsaved changes.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/unloadCheck',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tjQuery( window ).bind( 'beforeunload', this.maybePrompt );\n\t\t},\n\n\t\tmaybePrompt: function( model ) {\n\t\t\t// If our app is clean, don't show a warning.\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t\t\t\treturn 'You have unsaved changes.';\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Before we save data to the database (on preview update or publish), we check to see if we have anyone\n * that wants to update the 'formContent' form setting. This setting is used on the front-end to allow\n * for custom display of form fields. i.e. layout rows.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formContentFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our formContent view filter array.\n\t\t\t */\n\t\t\tthis.viewFilters = [];\n\t\t\tthis.saveFilters = [];\n\t\t\tthis.loadFilters = [];\n\n\t\t\t/*\n\t\t * Listen for requests to add formContent filters.\n\t\t\t */\n\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:saveFilter', this.addSaveFilter, 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:saveFilters', this.getSaveFilters, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:loadFilters', this.getLoadFilters, this );\n\t\t\t\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\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:saveFilter', this.addSaveFilter, 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 */\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:viewFilters', this.getViewFilters, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:saveFilters', this.getSaveFilters, 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\taddSaveFilter: function( callback, priority ) {\n\t\t\tthis.saveFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetSaveFilters: function() {\n\t\t\treturn this.saveFilters;\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","/**\n * Handles filters for our main content gutter views.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formContentGutterFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our gutter view filter array.\n\t\t\t */\n\t\t\tthis.leftFilters = [];\n\t\t\tthis.rightFilters = [];\n\t\t\t/*\n\t\t * Listen for requests to add gutter filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:leftFilter', this.addLeftFilter, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:rightFilter', this.addRightFilter, this );\n\n\t\t\t/*\n\t\t\t * Listen for requests to get our content gutter filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:leftFilters', this.getLeftFilters, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:rightFilters', this.getRightFilters, this );\n\t\t},\n\n\t\taddLeftFilter: function( callback, priority ) {\n\t\t\tthis.leftFilters[ priority ] = callback;\n\t\t},\n\n\t\taddRightFilter: function( callback, priority ) {\n\t\t\tthis.rightFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetLeftFilters: function() {\n\t\t\treturn this.leftFilters;\n\t\t},\n\n\t\tgetRightFilters: function() {\n\t\t\treturn this.rightFilters;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns a clone of a backbone collection with all the models' attributes looped through so that collections contained within are propely cloned.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cloneCollectionDeep',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:collectionDeep', this.cloneCollectionDeep, this );\n\t\t},\n\n\t\tcloneCollectionDeep: function( collection ) {\n\t\t\tvar models = [];\n\t\t\t// Loop through every model in our collection, clone it, and add it to our model array\n\t\t\t_.each( collection.models, function( model ) {\n\t\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\t\t\t\tmodels.push( newModel );\n\t\t\t} );\n\t\t\t// Create a new instance of our collection\n\t\t\treturn new collection.constructor( models, collection.options );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Tracks which keys have been pressed.\n * Currently only used by fields to see if they should duplicate or delete on click.\n * (Shift + D + click = delete) (Shift + C + click = duplicate)\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/trackKeyDown',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tkeys: [],\n\n\t\tinitialize: function() {\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * Track keydowns and store the keys pressed.\n\t\t\t */\n\t\t\t\n\t\t\tjQuery( document ).on( 'keydown', function( e ) {\n\t\t\t\tthat.keyDown( e, that );\n\t\t\t} );\n\n\t\t\tjQuery( document ).on( 'keyup', function( e ) {\n\t\t\t\tthat.keyUp( e, that );\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Get the keys currently being pressed, if any\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:keydown', this.getKeyDown, this );\n\t\t},\n\n\t\tkeyDown: function( e, context ) {\n\t\t\t/*\n\t\t\t * Add our keycode to our keys array.\n\t\t\t */\n\t\t\tcontext.keys[ e.keyCode ] = e.keyCode;\n\t\t},\n\n\t\tkeyUp: function( e, context ) {\n\t\t\t/*\n\t\t\t * Remove our keycode from our keys array.\n\t\t\t */\n\t\t\tif ( -1 != context.keys.indexOf( e.keyCode ) ) {\n\t\t\t\tdelete context.keys[ e.keyCode ];\n\t\t\t}\n\t\t},\n\n\t\tgetKeyDown: function() {\n\t\t\treturn this.keys;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Initialize the perfectscroll jQuery plugin\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/perfectScroll',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tmovedPos: false,\n\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When we init the main view, init our perfectscroll\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'show:main', this.initPerfectScroll );\n\n\t\t\t/*\n\t\t\t * When our drawer opens and closes, change the position of our scroll rail.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.moveRail );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:closeDrawer', this.resetRail );\n\t\t},\n\n\t\tinitPerfectScroll: function( view ) {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).parent().perfectScrollbar( {\n\t\t\t\t\tsuppressScrollX: true\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tjQuery( 'head' ).append( '<style id=\"ps-scrollbar-css\" type=\"text/css\"></style>' );\n\t\t},\n\n\t\tmoveRail: function() {\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tvar movedPos = jQuery( drawerEl ).outerWidth();\n\n\t\t\tjQuery( '#ps-scrollbar-css' ).text( '.ps-scrollbar-moved { right: ' + movedPos + 'px !important; } ' );\n\t\t\tjQuery( '#nf-main .ps-scrollbar-y-rail' ).addClass( 'ps-scrollbar-moved ' );\n\t\t\t\n\t\t},\n\n\t\tresetRail: function() {\n\t\t\tjQuery( '.ps-scrollbar-y-rail' ).removeClass( 'ps-scrollbar-moved ' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our type settings groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingGroupModel',[ 'models/app/settingCollection' ], function( SettingCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdisplay: false\n\t\t},\n\n\t\tinitialize: function( options ) {\n\t\t\tif ( false == this.get( 'settings' ) instanceof Backbone.Collection ) {\n\t\t\t\tthis.set( 'settings', new SettingCollection( this.get( 'settings' ) ) );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection of our type settings groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingGroupCollection',['models/app/settingGroupModel'], function( settingGroupModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: settingGroupModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Returns a new setting group collection.\n * Used to settings drawers for custom data models (i.e. not fields, actions, or advanced)\n * \n * @package Ninja Forms builder\n * @subpackage App - Edit Settings Drawer\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/getNewSettingGroupCollection',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for a new setting group collection\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingGroupCollectionDefinition', this.getNewSettingGroupCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a new instance of the setting group collection.\n\t\t *\n\t\t * @since 3.0\n\t\t * @return backbone.collection\n\t\t */\n\t\tgetNewSettingGroupCollection: function() {\n\t\t\treturn SettingGroupCollection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.0.30\n */\ndefine( 'controllers/app/settingMedia',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n // When the media button is clicked, open the media manager.\n this.listenTo( nfRadio.channel( 'setting-type-media' ), 'click:extra', this.clickExtra );\n },\n\n clickExtra: function( e, settingModel, dataModel, settingView ) {\n var textEl = jQuery( e.target ).parent().find( '.setting' );\n\n if ( jQuery( e.target ).hasClass( 'open-media-manager' ) ) {\n // If the frame already exists, re-open it.\n if ( this.meta_image_frame ) {\n this.meta_image_frame.open();\n return;\n }\n\n // Sets up the media library frame\n this.meta_image_frame = wp.media.frames.meta_image_frame = wp.media({\n title: 'Select a file',\n button: { text: 'insert' }\n });\n\n var that = this;\n\n // Runs when an image is selected.\n this.meta_image_frame.on('select', function(){\n // Grabs the attachment selection and creates a JSON representation of the model.\n var media_attachment = that.meta_image_frame.state().get('selection').first().toJSON();\n textEl.val( media_attachment.url ).change();\n });\n\n // Opens the media library frame.\n this.meta_image_frame.open();\n }\n },\n });\n\n return controller;\n} );\n","/**\n * Model for our field type\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/typeModel',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\tif ( false === this.get( 'settingGroups' ) instanceof Backbone.Collection ) {\n\t\t\t\tthis.set( 'settingGroups', new SettingGroupCollection( this.get( 'settingGroups' ) ) );\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'init:typeModel', this );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field type models. \n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/typeCollection',['models/app/typeModel'], function( typeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: typeModel,\n\t\ttype: false,\n\n\t\tinitialize: function( models, options ) {\n\t\t\t_.each( options, function( option, key ) {\n\t\t\t\tthis[ key ] = option;\n\t\t\t}, this );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Model that represents our field type section on the add new field drawer.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/typeSectionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tclasses: ''\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/typeSectionCollection',['models/fields/typeSectionModel'], function( typeSectionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: typeSectionModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Creates and stores a collection of field types. This includes all of the settings shown when editing a field.\n *\n * 1) Create our settings sections config\n * 2) Loops over our preloaded data and adds that to our field type collection\n *\n * Also responds to requests for data about field types\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/types',[\n\t\t'models/app/typeCollection',\n\t\t'models/fields/typeSectionCollection'\n\t],\n\tfunction(\n\t\tTypeCollection,\n\t\tSectionCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Config for our settings sections\n\t\t\tthis.sections = new SectionCollection( fieldTypeSections );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'init:typeModel', this.registerSection );\n\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( fieldTypeData, { type: 'fields' } );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:type', this.getFieldType, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeCollection', this.getTypeCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSections', this.getTypeSections, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:savedFields', this.getSavedFields, this );\n\n\t\t\t// Listen to clicks on field types\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:fieldType', this.addField );\n\t\t},\n\n\t\tregisterSection: function( typeModel ) {\n\t\t\tif ( 'fields' != typeModel.collection.type || ! typeModel.get( 'section' ) ) return;\n\n\t\t\tthis.sections.get( typeModel.get( 'section' ) ).get( 'fieldTypes' ).push( typeModel.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetFieldType: function( id ) {\n \treturn this.collection.get( id );\n },\n\n /**\n * Return the entire field type collection\n *\n * @since 3.0\n * @param string \t\t\t\tid \t[description]\n * @return backbone.collection \tfield type collection\n */\n\t\tgetTypeCollection: function( id ) {\n \treturn this.collection;\n },\n\n /**\n * Add a field type to our fields sortable when the field type button is clicked.\n *\n * @since 3.0\n * @param Object e event\n * @return void\n */\n addField: function( e ) {\n\t\t\tvar type = jQuery( e.target ).data( 'id' );\n\n\t\t\tif( e.shiftKey ){\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n\t\t\t\treturn;\n\t\t\t}\n\n \tvar fieldModel = nfRadio.channel( 'fields' ).request( 'add', {\n\t\t\t\ttype: type,\n\t\t\t\tlabel: nfRadio.channel( 'fields' ).request( 'get:type', type ).get( 'nicename' )\n\t\t\t});\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Field',\n\t\t\t\tlabel: fieldModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', fieldModel, null, label, data );\n\n\t\t\t// Re-Draw the Field Collection\n\t\t\tnfRadio.channel( 'fields' ).request( 'redraw:collection' );\n },\n\n /**\n * Return our field type settings sections\n *\n * @since 3.0\n * @return backbone.collection field type settings sections\n */\n getTypeSections: function() {\n return this.sections;\n },\n\n /**\n * Return our saved fields\n *\n * @since 3.0\n * @return backbone.collection\n */\n getSavedFields: function() {\n \tthis.sections.get( 'saved' );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Handles the logic for our field type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldTypeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our field type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addField' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the dragging of our field staging area\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/stagingDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start and stop of our field staging dragging\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.stopDrag );\n\t\t},\n\n\t\t/**\n\t\t * When the user starts dragging the staging area, we have to:\n\t\t * set the overflow property of the drawer to visible !important. If we don't, the button goes underneath the main section.\n\t\t * set the overflow proerty of the main to visible !important. If we don't, the dragged element goes underneath the drawer.\n\t\t * replace our helper with the stacked \"x fields\" template.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t context jQuery UI Draggable\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-staged-fields-drag' );\n\t\t\tjQuery( ui.helper ).html( html( { num: stagedFields.models.length } ) );\n\t\t\tjQuery( ui.helper ).prop( 'id', 'nf-staged-fields-drag' );\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.7' );\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging the staging area, we have to set the overflow property to hidden !important\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t context jQuery UI Draggable\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles most things related to our staging area:\n * 1) Creates a collection\n * 2) Listens for requests to CRUD items from the collection\n * 3) Adds our staged fields to the fields sortable when the drawer is closed\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/staging',['models/fields/stagingCollection'], function( stagingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our staged fields collection\n\t\t\tthis.collection = new stagingCollection();\n\t\t\t// Respond to requests related to our staging area.\n\t\t nfRadio.channel( 'fields' ).reply( 'add:stagedField', this.addStagedField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'remove:stagedField', this.removeStagedField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:staging', this.getStagingCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:staging', this.sortStagedFields, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:staging', this.clearStagedFields, this );\n\t\t\t// Listen to our remove staged field click event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'click:removeStagedField', this.removeStagedField );\n\t\t\t// Listen to our event that fires just before a drawer is closed.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'before:closeDrawer', this.beforeCloseDrawer );\n\t\t},\n\n\t\tgetStagingCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\t/**\n\t\t * Add a field to our staging area\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string type Type of field we're adding\n\t\t * @return tmpID\n\t\t */\n\t\taddStagedField: function( type, silent ) {\n\t\t\tvar silent = silent || false;\n\t\t\t// Get our type model from the string.\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t// Our tmp ID is a string with the time appended to make it unique.\n\t\t\tvar tmpID = 'nf-staged-field-' + jQuery.now();\n\t\t\t// Object that will be added to our staging collection.\n\t\t\tvar data = {\n\t\t\t\tid: tmpID,\n\t\t\t\t// i.e. firstname, textbox, etc.\n\t\t\t\tslug: fieldType.get( 'type' ),\n\t\t\t\t// i.e. First Name, Textbox, etc.\n\t\t\t\tnicename: fieldType.get( 'nicename' ),\n\t\t\t\t// i.e. calendar, envelope, etc.\n\t\t\t\ticon: fieldType.get( 'icon' )\n\t\t\t}\n\t\t\t// \n\t\t\tvar model = this.collection.add( data );\n\n\t\t\tif( ! silent ) nfRadio.channel( 'fields').trigger( 'add:stagedField', model );\n\n\t\t\treturn tmpID;\n\t\t},\n\n\t\t/**\n\t\t * Remove a field from staging\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te \tEvent\n\t\t * @param Backbone.model \tmodel \tstaged field model to remove\n\t\t * @return void\n\t\t */\n\t\tremoveStagedField: function( e, model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'remove:stagedField', model );\n\t\t},\n\n\t\t/**\n\t\t * Adds our staged fields to the main fields sortable before the drawer is closed.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tbeforeCloseDrawer: function() {\n\t\t\tif ( 0 != this.collection.models.length ) { // Make sure that we have models\n\t\t\t\t// Get our field collection.\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n\t\t\t\tvar fields = [];\n\t\t\t\t// Loop through our staging collection\n\t\t\t\t_.each( this.collection.models, function( model ) {\n\t\t\t\t\t// Get a tmp ID for our new field.\n\t\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\n\t\t\t\t\t// Create an object that can be added as a model.\n\t\t\t\t\tvar tmpField = { id: tmpID, label: model.get( 'nicename' ), type: model.get( 'slug' ) };\n\t\t\t\t\t// Add our new field.\n\t\t\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add', tmpField, false );\n\t\t\t\t\t// Add our field addition to our change log.\n\t\t\t\t\tvar label = {\n\t\t\t\t\t\tobject: 'Field',\n\t\t\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\t\t\tchange: 'Added',\n\t\t\t\t\t\tdashicon: 'plus-alt'\n\t\t\t\t\t};\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\tcollection: fieldCollection\n\t\t\t\t\t}\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\t\n\t\t\t\t} );\n\t\t\t\t// Trigger a reset on our field collection so that our view re-renders\n\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t// Empty the staging collection\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t\t// Sort our fields.\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', null, null, false );\n\t\t},\n\n\t\t/**\n\t\t * Sort our staging area by the 'order' attribute.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tsortStagedFields: function() {\n\t\t\t// Get our staged fields sortable.\n\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t// Get the current order using jQuery sortable. Will be an array of IDs: [tmp-blah, tmp-blah]\n\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t// Loop through our models\n\t\t\t_.each( this.collection.models, function( field ) {\n\t\t\t\t// Search our order array for this field.\n\t\t\t\tvar search = field.get( 'id' );\n\t\t\t\tvar pos = order.indexOf( search );\n\t\t\t\t// Update our staged field model with the new order.\n\t\t\t\tfield.set( 'order', pos );\n\t\t\t} );\n\t\t\t// Sort our staging collection.\n\t\t\tthis.collection.sort();\n\t\t},\n\n\t\tclearStagedFields: function() {\n\t\t\tthis.collection.reset();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to our staged fields sortable.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/stagingSortable',['models/fields/stagingCollection'], function( stagingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our field type draggables\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\n\t\t\t// Listen to our sortable events\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'receive:stagedFields', this.receiveStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'over:stagedFields', this.overStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'out:stagedFields', this.outStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'start:stagedFields', this.startStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stop:stagedFields', this.stopStagedFields );\n\t\t},\n\n\t\t/**\n\t\t * Change our dropped field type helper so that it matches the other items in our sortable.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI item\n\t\t * @return void\n\t\t */\n\t\treceiveStagedFields: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drop:fieldType', type );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add an active class to our sortable when a field type item is dragged\n\t\t * \n\t\t * @since 3.0\n\t\t */\n\t\taddActiveClass: function() {\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\tjQuery( stagedFieldsEl ).addClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * Remove the active class from our sortable when the field type item is dropped.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tremoveActiveClass: function() {\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\tjQuery( stagedFieldsEl ).removeClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * When the field type item is dragged over our sortable, we change the helper to match the sortable items.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @param Object \tui jQuery UI Element\n\t\t * @return void\n\t\t */\n\t\toverStagedFields: function( e, ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t\tvar nicename = fieldType.get( 'nicename' );\n\t\t\t\tthis.currentHelper = ui.helper \n\t\t\t\tjQuery( ui.helper ).html( nicename + '<span class=\"dashicons dashicons-dismiss\"></span>' );\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-item-dock' ).css( { 'opacity': '0.8', 'width': '', 'height': '' } );\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * When a field type item is moved away from our sortable, we change the helper to its previous appearance\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toutStagedFields: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\t\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-item-dock' ).addClass( 'nf-field-type-button' );\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t},\n\n\t\t/**\n\t\t * When a user starts to drag a sortable item, we need to set a few properties on the item and the helper.\n\t\t * These keep the original item in place while dragging and changes the opacity of the helper.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartStagedFields: function( ui ) {\n\t\t\tjQuery( ui.item ).show();\n\t\t\tjQuery( ui.item ).css( { 'display': 'inline', 'opacity': '0.7' } );\n\t\t\tjQuery( ui.helper ).css( 'opacity', '0.5' );\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging a sortable item, remove our opacity setting and remove the helper item.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopStagedFields: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Filters our field type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/filterTypes',['models/fields/typeSectionCollection'], function( fieldTypeSectionCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'change:filter', this.filterFieldTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our field types in the add new field drawer\n\t\t * \n\t\t * Takes a search string and finds any field types that match either the name or alias.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string\t search \tstring being searched for\n\t\t * @param object \t e \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterFieldTypes: function( search, e ) {\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != jQuery.trim( search ) ) {\n \t\tvar filtered = [];\n \t\t/**\n \t\t * Call the function that actually filters our collection,\n \t\t * and then loop through our collection, adding each model to our filtered array.\n \t\t */\n \t\t_.each( this.filterCollection( search ), function( model ) {\n \t\t\tfiltered.push( model.get( 'id' ) );\n \t\t} );\n\n \t\t// Create a new Field Type Section collection with the filtered array.\n \t\tvar filteredSectionCollection = new fieldTypeSectionCollection( [\n\t\t\t\t{ \n\t\t\t\t\tid: 'filtered',\n\t\t\t\t\tnicename: 'Filtered Fields',\n\t\t\t\t\tfieldTypes: filtered\n\t\t\t\t}\n\t\t\t\t] );\n\n \t\t// Request that our field types filter be applied, passing the collection we created above.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:fieldTypes', filteredSectionCollection );\n \t\t// If we've pressed the 'enter' key, add the field to staging and clear the filter.\n \t\tif ( 'undefined' != typeof e && e.addObject ) {\n \t\t\tif ( 0 < filtered.length ) {\n \t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', filtered[0] );\n \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n \t\t\t}\n \t\t}\n \t} else {\n \t\t// Clear our filter if the search text is empty.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n \t}\n },\n\n /**\n * Search our field type collection for the search string.\n * \n * @since 3.0\n * @param string\t search \tstring being searched for\n * @return backbone.collection\n */\n filterCollection: function( search ) {\n \tsearch = search.toLowerCase();\n \t// Get our list of field types\n \tvar collection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n \t/*\n \t * Backbone collections have a 'filter' method that loops through every model,\n \t * waiting for you to return true or false. If you return true, the model is kept.\n \t * If you return false, it's removed from the filtered result.\n \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'type' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles all the actions/functions related to our main field sortable.\n * All of the actual logic for our sortable is held here; the view just calls it using nfRadio.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/sortable',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When our field type buttons are dragged, we need to add or remove the active (blue) class.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\n\t\t\t// When our field staging is dragged, we need to add or remove the active (blue) class.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.addActiveClass );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.removeActiveClass );\n\t\t\t\n\t\t\t/*\n\t\t\t * Handles all the events fired by our sortable:\n\t\t\t * receive - dropped from type button or staging\n\t\t\t * over - dragging within or over the sortable\n\t\t\t * out - leaving the sortable\n\t\t\t * stop - stopped sorting/dragging\n\t\t\t * start - started sorting/dragging\n\t\t\t * update - stopped sorting/dragging and order has changed\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'receive:fieldsSortable', this.receiveFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'over:fieldsSortable', this.overfieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'out:fieldsSortable', this.outFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'stop:fieldsSortable', this.stopFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'start:fieldsSortable', this.startFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:fieldsSortable', this.updateFieldsSortable, this );\n\t\t},\n\n\t\t/**\n\t\t * Add the active class to our sortable so that its border is blue.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\taddActiveClass: function() {\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-active' );\t\n\t\t},\n\n\t\t/**\n\t\t * Remove the active class from our sortable\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tremoveActiveClass: function() {\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * Fires when we drop a field type button or staging onto our sortable\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\treceiveFieldsSortable: function( ui ) {\n\t\t\t/*\n\t\t\t * We have to do different things if we're dealing with a field type button or staging area.\n\t\t\t */ \n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type Button\n\t\t\t\t// Get our type string\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\t// Add a field (returns the tmp ID )\n\t\t\t\tvar tmpID = this.addField( type, false );\n\t\t\t\t/*\n\t\t\t\t * Update our helper id to the tmpID.\n\t\t\t\t * We do this so that when we sort, we have the proper ID.\n\t\t\t\t */ \n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\n\t\t\t\t// Remove the helper. Gets rid of a weird type artifact.\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t\t// Trigger a drop field type event.\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'drop:fieldType', type, tmpID );\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// Later, we want to reference 'this' context, so we define it here.\n\t\t\t\tvar that = this;\n\t\t\t\t// Make sure that our staged fields are sorted properly.\t\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\t// Grab our staged fields.\n\t\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\t\t// Get our current field order.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\t\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Sortable isn't empty\n\t\t\t\t\t// If we're dealing with a sortable that isn't empty, get the order.\n\t\t\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t\t} else { // Sortable is empty\n\t\t\t\t\t// Sortable is empty, all we care about is our staged field draggable.\n\t\t\t\t\tvar order = ['nf-staged-fields-drag'];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Get the index of our droped element.\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\n\t\t\t\t// Loop through each staged fields model and insert a field.\n\t\t\t\tvar tmpIDs = [];\n\t\t\t\t_.each( stagedFields.models, function( field, index ) {\n\t\t\t\t\t// Add our field.\n\t\t\t\t\tvar tmpID = that.addField( field.get( 'slug' ) );\n\t\t\t\t\t// Add this newly created field to our order array.\n\t\t\t\t\torder.splice( insertedAt + index, 0, tmpID );\n\t\t\t\t} );\n\n\t\t\t\t// Remove our dropped element from our order array.\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\t\t\t\torder.splice( insertedAt, 1 );\n\t\t\t\t// Sort our fields\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', order );\n\t\t\t\t// Clear our staging\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'clear:staging' );\n\t\t\t\t// Remove our helper. Fixes a weird artifact.\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a field.\n\t\t * Builds the object necessary to add a field to the field model collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \ttype field type\n\t\t * @param boolean \tsilent add silently\n\t\t * @return string \ttmpID\n\t\t */\n\t\taddField: function( type, silent ) {\n\t\t\t// Default to false\n\t\t\tsilent = silent || false;\n\t\t\t// Get our field type model\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type ); \n\t\t\t// Get our tmp ID\n\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\n\t\t\t// Add our field\n\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add', { id: tmpID, label: fieldType.get( 'nicename' ), type: type }, silent );\n\t\t\t// Add our field addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: 'Field',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\n\t\t\treturn tmpID;\n\t\t},\n\n\t\t/**\n\t\t * When the user drags a field type or staging over our sortable, we need to modify the helper.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toverfieldsSortable: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\n\t\t\t\t// String type\n\t\t\t\tvar type = jQuery( ui.helper ).data( 'id' );\n\t\t\t\t// Get our field type model.\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t\t// Get our field type nicename.\n\t\t\t\tvar label = fieldType.get( 'nicename' );\n\t\t\t\t// Get our sortable element.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\t// Get our fieldwidth.\n\t\t\t\tvar fieldWidth = jQuery( sortableEl ).width();\n\t\t\t\t// Set our currentHelper to an object var so that we can access it later.\n\t\t\t\tthis.currentHelper = ui.helper;\n\t\t\t\t// Update our helper label.\n\t\t\t\tjQuery( ui.helper ).html( label );\n\t\t\t\t// Remove the field type draggable classes and add sortable classes.\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-field-wrap' ).css( { 'width': fieldWidth, 'height': '50px' } );\t\t\t\t\t\t\n\t\t\t\t// Add our hover class if our sortable has been initialized.\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// Get our sortable, and if it's initialized add our hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When the user moves a draggable outside of the sortable, we need to change the helper.\n\t\t * This returns the item to its pre-over state.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toutFieldsSortable: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\n\t\t\t\t/*\n\t\t\t\t * Get our helper clone.\n\t\t\t\t * This will let us access the previous label and classes of our helper.\n\t\t\t\t */ \n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\n\t\t\t\t// Set our helper label, remove our sortable class, and add the type class back to the type draggable.\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-field-wrap' ).addClass( 'nf-field-type-button' ).css( { 'width': '', 'height': '' } );\n\t\t\t\t// Get our sortable and if it has been intialized, remove the droppable hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// If we've initialized our sortable, remove the droppable hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging in the sortable:\n\t\t * remove our opacity setting\n\t\t * remove our ui helper\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopFieldsSortable: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:stop', ui );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging in the sortable:\n\t\t * add an opacity setting of 0.5\n\t\t * show our item (jQuery hides the original item by default)\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartFieldsSortable: function( ui ) {\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \n\t\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\n\t\t\t}\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:start', ui );\n\t\t},\n\n\t\t/**\n\t\t * Sort our fields when we change the order.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tupdateFieldsSortable: function( ui, sortable ) {\n\t\t\t\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\n\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \n\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\tvar dragFieldID = jQuery( ui.item ).prop( 'id' ).replace( 'field-', '' );\n\t\t\t\tvar dragModel = fieldCollection.get( dragFieldID );\n\n\t\t\t\t// Add our change event to the change tracker.\n\t\t\t\tvar data = { fields: [] };\n\t\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\t\tvar oldPos = field._previousAttributes.order;\n\t\t\t\t\tvar newPos = field.get( 'order' );\n\t\t\t\t\t\n\t\t\t\t\tdata.fields.push( {\n\t\t\t\t\t\tmodel: field,\n\t\t\t\t\t\tattr: 'order',\n\t\t\t\t\t\tbefore: oldPos,\n\t\t\t\t\t\tafter: newPos\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t\tvar label = {\n\t\t\t\t\tobject: 'Field',\n\t\t\t\t\tlabel: dragModel.get( 'label' ),\n\t\t\t\t\tchange: 'Re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\n\t\t\t\t\tdashicon: 'sort'\n\t\t\t\t};\n\n\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortFields', dragModel, null, label, data );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles interactions with our field collection.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/data',['models/fields/fieldCollection', 'models/fields/fieldModel'], function( fieldCollection, fieldModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tadding: false,\n\t\tremoving: false,\n\t\t\n\t\tinitialize: function() {\n\t\t\t// Load our field collection from our localized form data\n\t\t\tthis.collection = new fieldCollection( preloadedFormData.fields );\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a field is removed so that we can add it to our 'deleted_fields' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about fields and to update/change/delete fields from our collection.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:collection', this.getFieldCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:field', this.getField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'redraw:collection', this.redrawFieldCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:tmpID', this.getTmpFieldID, this );\n\n\t\t\tnfRadio.channel( 'fields' ).reply( 'add', this.addField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'delete', this.deleteField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:fields', this.sortFields, this );\n\n\t\t\t/*\n\t\t\t * Respond to requests to set our 'adding' and 'removing' state. This state is used to track whether or not\n\t\t\t * we should run animations in our fields collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:adding', this.getAdding, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:adding', this.setAdding, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:removing', this.getRemoving, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:removing', this.setRemoving, this );\n\t\t},\n\n\t\tgetFieldCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tredrawFieldCollection: function() {\n\t\t\tthis.collection.trigger( 'reset', this.collection );\n\t\t},\n\n\t\tgetField: function( id ) {\n\t\t\tif ( this.collection.findWhere( { key: id } ) ) {\n\t\t\t\t/*\n\t\t\t\t * First we check to see if a key matches what we were sent.\n\t\t\t\t */\t\t\t\t\n\t\t\t\treturn this.collection.findWhere( { key: id } );\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * If it doesn't, we try to return an ID that matches.\n\t\t\t\t */\n\t\t\t\treturn this.collection.get( id );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a field to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \t\t\tfield data to insert\n\t\t * @param bool \t\tsilent \t\t\tprevent events from firing as a result of adding\n\t\t * @param bool \trenderTrigger\tshould this cause the view to re-render?\n\t\t * @param string \taction\t\t\taction context - are we performing a higher level action? i.e. duplicate\n\t\t */\n\t\taddField: function( data, silent, renderTrigger, action ) {\n\n\t\t\t/*\n\t\t\t * Set our fields 'adding' value to true. This enables our add field animation.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', true );\n\n\t\t\tsilent = silent || false;\n\t\t\taction = action || '';\n\t\t\trenderTrigger = ( 'undefined' == typeof renderTrigger ) ? true : renderTrigger;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tif ( 'undefined' == typeof ( data.id ) ) {\n\t\t\t\t\tdata.id = this.getTmpFieldID();\n\t\t\t\t}\n\t\t\t\tvar model = new fieldModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\t// console.log( model );\n\n\t\t\t/*\n\t\t\t * TODO: Add an nfRadio message filter for the model variable.\n\t\t\t * Currently, we manually replace for saved fields; this should be moved to a separate controller.\n\t\t\t * \n\t\t\t * If we're adding a saved field, make sure that we set the type to the parentType.\n\t\t\t */\n\n\t\t\tif ( jQuery.isNumeric( model.get( 'type' ) ) ) {\n\t\t\t\tvar savedType = nfRadio.channel( 'fields' ).request( 'get:type', model.get( 'type' ) );\n\t\t\t\tmodel.set( 'type', savedType.get( 'parentType' ) );\n\t\t\t}\n\n\t\t\tvar newModel = this.collection.add( model, { silent: silent } );\n\t\t\t\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'add:field', model );\n\t\t\tif ( renderTrigger ) {\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'render:newField', newModel, action );\n\t\t\t}\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'after:addField', model );\n\t\t\t\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Update a field setting by ID\n\t\t * \n\t\t * @since 3.0\n\t\t * @param int \t\tid field id\n\t\t * @param string \tname setting name\n\t\t * @param mixed \tvalue setting value\n\t\t * @return void\n\t\t */\n\t\tupdateFieldSetting: function( id, name, value ) {\n\t\t\tvar fieldModel = this.collection.get( id );\n\t\t\tfieldModel.set( name, value );\n\t\t},\n\n\t\t/**\n\t\t * Get our fields sortable EL\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Array \torder optional order array like: [field-1, field-4, field-2]\n\t\t * @return void\n\t\t */\n\t\tsortFields: function( order, ui, updateDB ) {\n\t\t\tif ( null == updateDB ) {\n\t\t\t\tupdateDB = true;\n\t\t\t}\n\t\t\t// Get our sortable element\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Make sure that sortable is enabled\n\t\t\t\t// JS ternerary for setting our order\n\t\t\t\tvar order = order || jQuery( sortableEl ).sortable( 'toArray' );\n\n\t\t\t\t// Loop through all of our fields and update their order value\n\t\t\t\t_.each( this.collection.models, function( field ) {\n\t\t\t\t\t// Get our current position.\n\t\t\t\t\tvar oldPos = field.get( 'order' );\n\t\t\t\t\tvar id = field.get( 'id' );\n\t\t\t\t\tif ( jQuery.isNumeric( id ) ) {\n\t\t\t\t\t\tvar search = 'field-' + id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar search = id;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Get the index of our field inside our order array\n\t\t\t\t\tvar newPos = order.indexOf( search ) + 1;\n\t\t\t\t\tfield.set( 'order', newPos );\n\t\t\t\t} );\n\t\t\t\tthis.collection.sort();\n\n\t\t\t\tif ( updateDB ) {\n\t\t\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\t\t\t// Update our preview\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Delete a field from our collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tfield model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteField: function( model ) {\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'delete:field', model );\n\t\t\tthis.removing = true;\n\t\t\tthis.collection.remove( model );\n\t\t\t\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\t\t/**\n\t\t * Return a new tmp id for our fields.\n\t\t * Gets the field collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpFieldID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t},\n\n\t\tgetAdding: function() {\n\t\t\treturn this.adding;\n\t\t},\n\n\t\tsetAdding: function( val ) {\n\t\t\tthis.adding = val;\n\t\t},\n\n\t\tgetRemoving: function() {\n\t\t\treturn this.removing;\n\t\t},\n\n\t\tsetRemoving: function( val ) {\n\t\t\tthis.removing = val;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our repeater option.\n * \n * @package Ninja App builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/optionRepeaterModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\terrors: {},\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// When we add errors to the option row, run a function.\n\t\t\tthis.on( 'change:errors', this.changeErrors, this );\n\t\t},\n\n\t\t/**\n\t\t * When we change the errors on our model, check to see if we should add or remove \n\t\t * the error from the setting that this option is a part of.\n\t\t *\n\t\t * Adding an error to the setting model simply disables the drawer and other\n\t\t * navigation. As long as we have one option with an error, it should be set to true.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeErrors: function( model ) {\n\t\t\t/*\n\t\t\t * The errors attribute will be an object, so if we don't have any keys, it's empty.\n\t\t\t * If we have an empty object, check to see if we can remove the error from our setting model.\n\t\t\t */\n\n\t\t\tif ( 0 == _.size( model.get( 'errors' ) ) ) {\n\t\t\t\t/*\n\t\t\t\t * Loop through our collection to see if we have any other errors.\n\t\t\t\t */\n\t\t\t\tvar errorsFound = false;\n\t\t\t\t_.each( model.collection.models, function( opt ) {\n\t\t\t\t\tif ( 0 != _.size( opt.get( 'errors' ) ) ) {\n\t\t\t\t\t\terrorsFound = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( ! errorsFound ) {\n\t\t\t\t\tmodel.collection.settingModel.set( 'error', false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * We have errors, so make sure that the setting model has an error set.\n\t\t\t\t */\n\t\t\t\tmodel.collection.settingModel.set( 'error', true );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Model that represents our list options.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/optionRepeaterCollection',['models/app/optionRepeaterModel'], function( listOptionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: listOptionModel,\n\t\tcomparator: 'order',\n\n\t\tinitialize: function( models, options ) {\n\t\t\t// Listen to the 'sort' event\n\t\t\tthis.on( 'sort', this.changeCollection, this );\n\t\t\t// Listen to the 'add' event\n\t\t\tthis.on( 'add', this.addOption, this );\n\t\t\tthis.settingModel = options.settingModel;\n\t\t},\n\n\t\tchangeCollection: function() {\n\t\t\t// Trigger a 'sort:options' event so that our field model can update\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:options', this );\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'sort:options', this );\n\t\t},\n\n\t\taddOption: function( model, collection ) {\n\t\t\tmodel.set( 'settingModel', this.settingModel );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","define( 'views/app/drawer/optionRepeaterError',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'nf-error',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-error',\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\trenderErrors: function() {\n\t\t\t\t if ( 'undefined' != typeof that.errors ) {\n \t\t\t\t\treturn that.errors[ Object.keys( errors )[0] ];\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/optionRepeaterOption',['views/app/drawer/optionRepeaterError'], function( ErrorView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'nf-table-row',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-default-row',\n\t\tid: function() {\n\t\t\treturn this.model.cid;\n\t\t},\n\n\t\tregions: {\n\t\t\terror: '.nf-option-error'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.settingModel = data.settingModel;\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tthis.collection = data.collection;\n\t\t\tthis.columns = data.columns;\n\t\t\tthis.parentView = data.parentView;\n\t\t\tthis.model.on( 'change:errors', this.renderErrors, this );\n\n\t\t\t// Removed because the re-render was breaking tag insertion for merge tags.\n\t\t\t// this.model.on( 'change', this.render, this );\n\n\t\t\tif ( 'undefined' != typeof this.settingModel.get( 'tmpl_row' ) ) {\n\t\t\t\tthis.template = '#' + this.settingModel.get( 'tmpl_row' );\n\t\t\t}\n\n\t\t\tthis.hasErrors = false;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\t\n\t\t\tthis.model.off( 'change', this.render );\n\t\t\tthis.model.off( 'change:errors', this.renderErrors );\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\t/*\n\t\t\t * We want to escape any HTML being output for our label.\n\t\t\t */\n\t\t\tif ( this.model.get( 'label' ) ) {\n\t\t\t\tvar label = this.model.get( 'label' );\n\t\t\t\tthis.model.set( 'label', _.escape( label ), { silent: true } );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.settingModel.get( 'name' ) + '-option' ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\t/*\n\t\t\t * We want to unescape any HTML being output for our label.\n\t\t\t */\n\t\t\tif ( this.model.get( 'label' ) ) {\n\t\t\t\tvar label = this.model.get( 'label' );\n\t\t\t\tthis.model.set( 'label', _.unescape( label ), { silent: true } );\n\t\t\t}\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( this.model.get( 'new' ) ) {\n\t\t\t\tjQuery( this.el ).find( 'input:first' ).focus();\n\t\t\t\tthis.model.set( 'new', false );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .setting': 'changeOption',\n\t\t\t'click .nf-delete': 'deleteOption',\n\t\t\t'keyup': 'keyupOption'\n\t\t},\n\n\t\tchangeOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'change:option', e, this.model, this.dataModel, this.settingModel, this );\n\t\t},\n\n\t\tdeleteOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:deleteOption', this.model, this.collection, this.dataModel, this );\n\t\t},\n\n\t\tkeyupOption: function( e ) {\n\t\t\tthis.maybeAddOption( e );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n\t\t},\n\n\t\tmaybeAddOption: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel, this );\n\t\t\t\tjQuery( this.parentView.children.findByIndex(this.parentView.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n\t\t\t}\n\t\t},\n\n\t\trenderErrors: function() {\n\t\t\t\n\t\t\t// if ( jQuery.isEmptyObject( this.model.get( 'errors' ) ) ) {\n\t\t\t// \treturn false;\n\t\t\t// }\n\n\t\t\t/*\n\t\t\t * We don't want to redraw the entire row, which would remove focus from the eq textarea,\n\t\t\t * so we add and remove error classes manually.\n\t\t\t */\n\t\t\tif ( 0 == Object.keys( this.model.get( 'errors' ) ) ) {\n if ( this.hasErrors ) {\n\t\t\t\t this.error.empty();\n\t\t\t\t jQuery( this.el ).removeClass( 'nf-error' );\n }\n\t\t\t} else {\n\t\t\t\tthis.hasErrors = true;\n\t\t\t\tthis.error.show( new ErrorView( { model: this.model } ) );\n\t\t\t\tjQuery( this.el ).addClass( 'nf-error' );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\tgetColumns: function() {\n\t\t\t\t\treturn that.columns;\n\t\t\t\t},\n\t\t\t\trenderFieldSelect: function( dataID, value ){\n\t\t\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tvar _return = '<label class=\"nf-select\"><select class=\"setting\" data-id=\"' + dataID + '\">';\n\t\t\t\t\tfields.each( function( field ){\n\t\t\t\t\t\tvar selected = ( value == field.get( 'key' ) ) ? ' selected' : '';\n\t\t\t\t\t\t_return += '<option value=\"' + field.get( 'key' ) + '\"' + selected + '>' + field.get( 'label' ) + '</option>';\n\t\t\t\t\t});\n\t\t\t\t\t_return += '</select><div></div></label>';\n\t\t\t\t\treturn _return;\n\t\t\t\t},\n\t\t\t\trenderOptions: function( column, value ) {\n\n\t\t\t\t\tif( 'undefined' == typeof that.options.columns[ column ] ) return;\n\n\t\t\t\t\tvar html = '';\n\t\t\t\t\t_.each( that.options.columns[ column ].options, function( option ){\n\t\t\t\t\t\tvar selected = ( value == option.value ) ? ' selected' : '';\n\t\t\t\t\t\thtml += '<option value=\"' + option.value + '\"' + selected + '>' + option.label + '</option>';\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\treturn html;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/app/drawer/optionRepeaterEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'tr',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-empty'\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/optionRepeaterComposite',['views/app/drawer/optionRepeaterOption', 'views/app/drawer/optionRepeaterEmpty', 'models/app/optionRepeaterCollection'], function( listOptionView, listEmptyView, listOptionCollection ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-wrap',\n\t\tchildView: listOptionView,\n\t\temptyView: listEmptyView,\n\t\treorderOnSort: false,\n\n\t\tinitialize: function( data ) {\n\n\t\t\t/*\n\t\t\t * Our options are stored in our database as objects, not collections.\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n\t\t\t */ \n\t\t\tvar optionCollection = data.dataModel.get( this.model.get( 'name' ) );\n\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: this.model } );\n\t\t\t\toptionCollection.add( data.dataModel.get( this.model.get( 'name' ) ) );\n\t\t\t\tdata.dataModel.set( this.model.get( 'name' ), optionCollection, { silent: true } );\n\t\t\t}\n\n\t\t\tthis.collection = optionCollection;\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tthis.childViewOptions = { parentView: this, settingModel: this.model, collection: this.collection, dataModel: data.dataModel, columns: this.model.get( 'columns' ) };\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\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\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\t\tvar that = this;\n\t\t\tjQuery( this.el ).find( '.nf-list-options-tbody' ).sortable( {\n\t\t\t\thandle: '.handle',\n\t\t\t\thelper: 'clone',\n\t\t\t\tplaceholder: 'nf-list-options-sortable-placeholder',\n\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\topacity: 0.95,\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'start:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'stop:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'update:optionSortable', ui, this, that );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\n\t\t},\n\n\t\tonAttach: function() {\n \n\t\t\tvar importLink = jQuery( this.el ).find( '.nf-open-import-tooltip' );\n\t\t\tvar jBox = jQuery( importLink ).jBox( 'Tooltip', {\n title: '<h3>Please enter your options below:</h3>',\n content: jQuery( this.el ).find( '.nf-import-options' ),\n trigger: 'click',\n closeOnClick: 'body',\n closeButton: 'box',\n offset: { x: 20, y: 0 },\n addClass: 'import-options',\n\n onOpen: function() {\n \tvar that = this;\n \tsetTimeout( function() { jQuery( that.content ).find( 'textarea' ).focus(); }, 200 );\n }\n } );\n\n\t\t\tjQuery( this.el ).find( '.nf-import' ).on( 'click', { view: this, jBox: jBox }, this.clickImport );\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderHeaders: function() {\n\t \t\t\tvar columns = '<div> </div>';\n\t \t\t\t_.each( this.columns, function( col ) {\n\t \t\t\t\tcolumns += '<div>' + col.header + '</div>';\n\t \t\t\t} );\n\t \t\t\tcolumns += '<div> </div>';\n\t\t\t\t\treturn columns;\n\t\t\t\t},\n\n\t \t\trenderSetting: function() {\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( this );\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\n\t\t\t\trenderError: function() {\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\treturn this.error;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\n\t\t\t\trenderFieldsetClasses: function() {\n\t\t\t\t\treturn that.model.get( 'name' );\n\t\t\t\t},\n\n\t\t\t\tcurrencySymbol: function() {\n\t\t\t\t\treturn nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' ) || nfi18n.currency_symbol;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.nf-list-options-tbody' ).append( childView.el );\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-add-new': 'clickAddOption',\n\t\t\t'click .extra': 'clickExtra'\n\t\t},\n\n\t\tclickAddOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel );\n\t\t\tjQuery( this.children.findByIndex(this.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:extra', e, this.collection, this.dataModel );\n\t\t\tnfRadio.channel( 'option-repeater-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.collection, this.dataModel );\n\t\t},\n\n\t\tclickImport: function( e ) {\n\t\t\tvar textarea = jQuery( e.data.jBox.content ).find( 'textarea' );\n\t\t\tvar value = textarea.val().trimLeft().trimRight();\n\t\t\t/*\n\t\t\t * Return early if we have no strings.\n\t\t\t */\n\t\t\tif ( 0 == value.length ) {\n\t\t\t\te.data.jBox.close();\n\t\t\t\treturn false;\n\t\t\t}\t\t\t\n\t\t\t/*\n\t\t\t * Split our value based on new lines.\n\t\t\t */\n\n\t\t\tvar lines = value.split(/\\n/);\n\t\t\tif ( _.isArray( lines ) ) {\n\t\t\t\t/*\n\t\t\t\t * Loop over \n\t\t\t\t */\n\t\t\t\t_.each( lines, function( line ) {\n\t\t\t\t\tvar row = line.split( ',' );\n\t\t\t\t\tvar label = row[0];\n\t\t\t\t\tvar value = row[1] || jQuery.slugify( label, { separator: '-' } );\n\t\t\t\t\tvar calc = row[2] || '';\n\n\t\t\t\t\tlabel = label.trimLeft().trimRight();\n\t\t\t\t\tvalue = value.trimLeft().trimRight();\n\t\t\t\t\tcalc = calc.trimLeft().trimRight();\n\t\t\t\t\t/*\n\t\t\t\t\t * Add our row to the collection\n\t\t\t\t\t */\n\t\t\t\t\tvar model = e.data.view.collection.add( { label: row[0], value: value, calc: calc } );\n\t\t\t\t\t// Add our field addition to our change log.\n\t\t\t\t\tvar label = {\n\t\t\t\t\t\tobject: 'field',\n\t\t\t\t\t\tlabel: row[0],\n\t\t\t\t\t\tchange: 'Option Added',\n\t\t\t\t\t\tdashicon: 'plus-alt'\n\t\t\t\t\t};\n\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\n\t\t\t\t\tnfRadio.channel( 'option-repeater-' + e.data.view.model.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\n\t\t\t\t}, this );\n\t\t\t\t/*\n\t\t\t\t * Set our state to unclean so that the user can publish.\n\t\t\t\t */\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * TODO: Error Handling Here\n\t\t\t\t */\n\t\t\t}\n\t\t\ttextarea.val( '' );\n\t\t\te.data.jBox.close();\n\t\t},\n\t} );\n\n\treturn view;\n} );\n","/**\n * Handles tasks associated with our option-repeater.\n * \n * Return our repeater child view.\n *\n * Also listens for changes to the options settings.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/optionRepeater',['models/app/optionRepeaterModel', 'models/app/optionRepeaterCollection', 'views/app/drawer/optionRepeaterComposite'], function( listOptionModel, listOptionCollection, listCompositeView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for the childView for list type fields.\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t\t\n\t\t\t// Listen for changes to our list options.\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'change:option', this.changeOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:addOption', this.addOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:deleteOption', this.deleteOption );\n\n\t\t\t// Respond to requests related to our list options sortable.\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'update:optionSortable', this.updateOptionSortable, this );\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'stop:optionSortable', this.stopOptionSortable, this );\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'start:optionSortable', this.startOptionSortable, this );\n\t\t\n\t\t\t/**\n\t\t\t * When we init our setting model, we need to convert our array/objects into collections/models\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'init:dataModel', this.convertSettings );\n\t\t},\n\n\t\t/**\n\t\t * Update an option value in our model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te event\n\t\t * @param backbone.model \tmodel option model\n\t\t * @param backbone.model \tdataModel\n\t\t * @return void\n\t\t */\n\t\tchangeOption: function( e, model, dataModel, settingModel, optionView ) {\n\t\t\tvar name = jQuery( e.target ).data( 'id' );\n\t\t\tif ( 'selected' == name ) {\n\t\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\n\t\t\t\t\tvar value = 1;\n\t\t\t\t} else {\n\t\t\t\t\tvar value = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t}\n\t\t\t\n\t\t\tvar before = model.get( name );\n\t\t\t\n\t\t\tmodel.set( name, value );\n\t\t\t// Trigger an update on our dataModel\n\t\t\tthis.triggerDataModel( model, dataModel );\n\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + model.get( 'label' ) + ' ' + name + ' changed from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', model, changes, label );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-option-' + name ).trigger( 'update:option', e, model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-' + settingModel.get( 'name' ) ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t},\n\n\t\t/**\n\t\t * Add an option to our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\taddOption: function( collection, dataModel ) {\n\t\t\tvar modelData = {\n\t\t\t\torder: collection.length,\n\t\t\t\tnew: true,\n\t\t\t\toptions: {}\n\t\t\t};\n\t\t\t_.each( collection.settingModel.get( 'columns' ), function( col, key ) {\n\t\t\t\tmodelData[ key ] = col.default;\n\n\t\t\t\tif( 'undefined' != typeof col.options ){\n\t\t\t\t\tmodelData.options[ key ] = col.options;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvar model = new listOptionModel( modelData );\n\t\t\tcollection.add( model );\n\n\t\t\t// Add our field addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\n\t\t\tthis.triggerDataModel( model, dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Delete an option from our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \t\tmodel list option model\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\tdeleteOption: function( model, collection, dataModel ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\n\t\t\t// Add our field deletion to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + newModel.get( 'label' ) + ' Removed',\n\t\t\t\tdashicon: 'dismiss'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: collection\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeListOption', newModel, null, label, data );\n\t\t\t\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\tif ( 'object' == typeof changeModel.get( 'data' ) ) {\n\t\t\t\t\t_.each( changeModel.get( 'data' ), function( dataModel ) {\n\t\t\t\t\t\tif ( dataModel.model == dataModel ) {\n\t\t\t\t\t\t\tdataModel.model = newModel;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tchangeModel.set( 'model', newModel );\n\t\t\t\tchangeModel.set( 'disabled', true );\n\t\t\t} );\n\n\t\t\tcollection.remove( model );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'remove:option', model );\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'remove:option', model );\n\t\t\tthis.triggerDataModel( model, dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Creates an arbitrary value on our collection, then clones and updates that collection.\n\t\t * This forces a change event to be fired on the dataModel where the list option collection data is stored.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\ttriggerDataModel: function( model, dataModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\t\n\t\t},\n\n\t\t/**\n\t\t * Return our list composite view to the setting collection view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tsettings model\n\t\t * @return void\n\t\t */\n\t\tgetSettingChildView: function( model ) {\n\t\t\treturn listCompositeView;\n\t\t},\n\n\t\t/**\n\t\t * When we sort our list options, change the order in our option model and trigger a change.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t \t\tsortable \tjQuery UI element\n\t\t * @param backbone.view \tsetting \tSetting view\n\t\t * @return void\n\t\t */\n\t\tupdateOptionSortable: function( ui, sortable, setting ) {\n\t\t\tvar newOrder = jQuery( sortable ).sortable( 'toArray' );\n\t\t\tvar dragModel = setting.collection.get( { cid: jQuery( ui.item ).prop( 'id' ) } );\n\t\t\tvar data = {\n\t\t\t\tcollection: setting.collection,\n\t\t\t\tobjModels: []\n\t\t\t};\n\n\t\t\t_.each( newOrder, function( cid, index ) {\n\t\t\t\tvar optionModel = setting.collection.get( { cid: cid } );\n\t\t\t\tvar oldPos = optionModel.get( 'order' );\n\t\t\t\toptionModel.set( 'order', index );\n\t\t\t\tvar newPos = index;\n\n\t\t\t\tdata.objModels.push( {\n\t\t\t\t\tmodel: optionModel,\n\t\t\t\t\tattr: 'order',\n\t\t\t\t\tbefore: oldPos,\n\t\t\t\t\tafter: newPos\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t\n\t\t\tsetting.collection.sort( { silent: true } );\n\t\t\t\n\t\t\tvar label = {\n\t\t\t\tobject: setting.dataModel.get( 'objectType' ),\n\t\t\t\tlabel: setting.dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + dragModel.get( 'label' ) + ' re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\n\t\t\t\tdashicon: 'sort'\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortListOptions', dragModel, null, label, data );\n\t\t\tthis.triggerDataModel( dragModel, setting.dataModel );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:option', dragModel, setting );\n\t\t\tnfRadio.channel( 'option-repeater-' + setting.model.get( 'name' ) ).trigger( 'sort:option', dragModel, setting );\n\t\t},\n\n\t\t/**\n\t\t * When we stop sorting our list options, reset our item opacity.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopOptionSortable: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t},\n\n\t\t/**\n\t\t * When we start sorting our list options, remove containing divs and set our item opacity to 0.5\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Objects ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartOptionSortable: function( ui ) {\n\t\t\tjQuery( ui.placeholder ).find( 'div' ).remove();\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\n\t\t},\n\n\t\t/**\n\t\t * Convert settings from an array/object to a collection/model\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Backbone.Model dataModel\n\t\t * @param Backbone.Model settingModel\n\t\t * @return void\n\t\t */\n\t\tconvertSettings: function( dataModel, settingModel ) {\n\t\t\t/*\n\t\t\t * Our options are stored in our database as objects, not collections.\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n\t\t\t */ \n\t\t\tvar optionCollection = dataModel.get( settingModel.get( 'name' ) );\n\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: settingModel } );\n\t\t\t\toptionCollection.add( dataModel.get( settingModel.get( 'name' ) ) );\n\t\t\t\tdataModel.set( settingModel.get( 'name' ), optionCollection, { silent: true } );\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a field currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n _.each( fieldCollection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( fieldSettings, { objectType: 'fields' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t\t\n\t\t\t// Responds to requests for our collection.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingCollection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldCreditCard',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.dropCreditCardField );\n },\n\n dropCreditCardField: function( fieldModel ) {\n\n if( 'creditcard' == fieldModel.get( 'type' ) ) {\n\n var order = fieldModel.get( 'order' );\n\n nfRadio.channel( 'fields' ).request( 'delete', fieldModel );\n\n _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\n\n var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n var newField = {\n id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n type: type,\n label: fieldType.get( 'nicename' ),\n order: order\n };\n\n nfRadio.channel( 'fields' ).request( 'add', newField );\n });\n }\n\n },\n\n stageCreditCardField: function( model ) {\n\n if( 'creditcard' == model.get( 'slug' ) ) {\n\n nfRadio.channel( 'fields' ).request( 'remove:stagedField', '', model );\n\n _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\n nfRadio.channel('fields').request('add:stagedField', type );\n });\n }\n }\n\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel to add the individual List Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldList',[ 'models/app/optionRepeaterCollection' ], function( ListOptionCollection ) {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'option-repeater-option-label' ), 'update:option', this.updateOptionLabel );\n this.listenTo( nfRadio.channel( 'option-repeater-option-value' ), 'update:option', this.updateOptionValue );\n \n /*\n * When we init our model, convert our options from an array of objects to a collection of models.\n */\n this.listenTo( nfRadio.channel( 'fields-list' ), 'init:fieldModel', this.convertOptions );\n },\n\n updateOptionLabel: function( e, model, dataModel, settingModel, optionView ) {\n\n if( 'list' != _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } ).parentType ) return;\n\n if( model.get( 'manual_value' ) ) return;\n\n value = jQuery.slugify( model.get( 'label' ), { separator: '-' } );\n\n model.set( 'value', value );\n model.trigger( 'change', model );\n\n // Set focus on value input\n jQuery( optionView.el ).find( '[data-id=\"value\"]' ).focus().select();\n },\n\n updateOptionValue: function( e, model, dataModel, settingModel, optionView ) {\n\n var findWhere = _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } );\n if( 'undefined' == typeof findWhere ) return;\n if( 'list' != findWhere.parentType ) return;\n\n model.set( 'manual_value', true );\n \n // Set focus on calc input\n jQuery( optionView.el ).find( '[data-id=\"calc\"]' ).focus().select();\n },\n\n convertOptions: function( fieldModel ) {\n /*\n * Our options are stored in our database as objects, not collections.\n * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n */ \n var options = fieldModel.get( 'options' );\n\n var settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'options' );\n\n if ( false == options instanceof Backbone.Collection ) {\n options = new ListOptionCollection( [], { settingModel: settingModel } );\n options.add( fieldModel.get( 'options' ) );\n fieldModel.set( 'options', options, { silent: true } );\n }\n }\n\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldPassword',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.addField );\n },\n\n addField: function( model ) {\n\n if( 'password' == model.get( 'type' ) ) {\n\n var order = model.get( 'order' );\n\n var confirm = this.insertField( 'passwordconfirm', order + 1 );\n\n confirm.set( 'confirm_field', model.get( 'key' ) );\n }\n },\n\n insertField: function( type, order ) {\n var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n var newField = {\n id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n type: type,\n label: fieldType.get( 'nicename' ),\n order: order\n };\n\n return nfRadio.channel('fields').request('add', newField );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldQuantity',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\tif ( 'product_assignment' == settingModel.get( 'name' ) ) {\n\t\t\t\tvar productFields = this.getProductFields( settingModel );\n\t\t\t\tsettingModel.set( 'options', productFields );\n\t\t\t}\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldShipping',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options' ), 'render:setting', this.addMask );\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options-option' ), 'render:setting', this.addMask );\n\t\t},\n\n\t\taddMask: function( settingModel, dataModel, view ) {\n\t\t\tjQuery( view.el ).find( '[data-id=\"value\"]' ).each( function() {\n\t\t\t\tjQuery( this ).autoNumeric({\n\t\t\t\t\taSign: '$', // TODO: Use form setting\n\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\taDec: decimalPoint\n\t\t\t\t});\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * When we add a new field, update its key.\n *\n * When we change the key, update any refs to the key.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/key',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we add a field, update its key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.newFieldKey );\n\n\t\t\t// When we edit a label, update our key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-label' ), 'update:setting', this.updateLabel );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// When we type inside the admin key field, we need to save our manual_key setting.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-key' ), 'keyup:setting', this.keyUp );\n\t\t},\n\n\t\t/**\n\t\t * Add a key to our new field model.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model new field model\n\t\t * @return void\n\t\t */\n\t\tnewFieldKey: function( model ) {\n\t\t\tvar d = new Date();\n\t\t\tvar n = d.valueOf();\n\t\t\tvar key = this.slugify( model.get( 'type' ) + '_' + n );\n\n\t\t\tmodel.set( 'key', key, { silent: true } );\n\n\t\t\tif( 'undefined' == model.get( 'manual_key' ) ) {\n\t\t\t\tmodel.set('manual_key', false, {silent: true});\n\t\t\t}\n\t\t},\n\n\t\tupdateLabel: function( model ) {\n\n\t\t\t/*\n\t\t\t * If we haven't entered a key manually, update our key when our label changes.\n\t\t\t */\n\t\t\tif ( ! model.get( 'manual_key' ) && 0 != jQuery.trim( model.get( 'label' ) ).length ) {\n\t\t\t\t/*\n\t\t\t\t * When we're editing settings, we expect the edits to fire one at a time.\n\t\t\t\t * Since we're calling this in the middle of our label update, anything that inquires about what has changed after we set our key will see both label and key.\n\t\t\t\t * We need to remove the label from our model.changed property so that all that has changed is the key.\n\t\t\t\t *\n\t\t\t\t */\n\t\t\t\tdelete model.changed.label;\n\t\t\t\tvar d = new Date();\n\t\t\t\tvar n = d.valueOf();\n\t\t\t\tvar key = this.slugify( model.get( 'label' ) + '_' + n );\n\t\t\t\tmodel.set( 'key', key );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, find any merge tags using the key and update them.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model field model\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( dataModel ) {\n\t\t\tvar key = dataModel.get( 'key' );\n\t\t\tthis.settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'key' );\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tkeyUp: function( e, settingModel, dataModel ) {\n\t\t\tdataModel.set( 'manual_key', true );\n\t\t\tthis.settingModel = settingModel;\n\t\t\tvar key = jQuery( e.target ).val();\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tsetError: function( key, dataModel ) {\n\t\t\tvar error = false;\n\t\t\tif ( '' == jQuery.trim( key ) ) {\n\t\t\t\terror = 'Field keys can\\'t be empty. Please enter a key.';\n\t\t\t} else if ( key != key.toLowerCase() ) {\n\t\t\t\terror = 'Field keys must be lowercase.';\n\t\t\t} else if ( key != key.replace( ' ', '_' ) ) {\n\t\t\t\terror = 'Field keys must cannot use spaces. Separate with \"_\" instead.';\n\t\t\t} else if ( '_' == key.slice( -1 ) ) {\n\t\t\t\terror = 'Field keys cannot end with a \"_\"';\n\t\t\t} else if ( key != this.slugify( key ) ) {\n\t\t\t\terror = 'Invalid Format.';\n\t\t\t} else if ( key != this.keyExists( key, dataModel ) ) {\n\t\t\t\terror = 'Field keys must be unique. Please enter another key.'\n\t\t\t}\n\n\t\t\tif ( error ) {\n\t\t\t\tthis.settingModel.set( 'error', error );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:fieldKey', dataModel );\n\t\t\t\tthis.settingModel.set( 'error', false );\n\t\t\t}\n\t\t},\n\n\t\tkeyExists: function( key, dataModel ) {\n\t\t\tvar newKey = this.slugify( key );\n\t\t\tif ( 0 != newKey.length ) {\n\t\t\t\tkey = newKey;\n\t\t\t}\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar x = 1;\n\t\t\tvar testKey = key;\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\tif ( dataModel != field && testKey == field.get( 'key' ) ) {\n\t\t\t\t\ttestKey = key + '_' + x;\n\t\t\t\t\tx++;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tkey = testKey;\n\n\t\t\treturn key;\n\t\t},\n\n\t\tslugify: function( string ){\n\t\t\treturn jQuery.slugify( string, { separator: '_' } )\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Creates notices for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:stagedField', this.addStagedField );\n\t\t},\n\n\t\taddStagedField: function( model ) {\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addStagedField', model.get( 'nicename' ) + ' added to staging' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles mobile-specific JS for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start of our sorting.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'render:fieldsSortable', this.initWiggle );\n\t\t\t// Listen for when we start sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:start', this.startWiggle );\n\t\t\t// Listen for when we stop sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:stop', this.stopWiggle );\n\t\t},\n\n\t\tinitWiggle: function( view ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).find( '.nf-field-wrap' ).on( 'taphold', function() {\n\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tstartWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper' ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.helper ).css( 'opacity', '0.75' ).ClassyWiggle( 'start', { degrees: ['.5', '1', '.5', '0', '-.5', '-1', '-.5', '0'] } );\n\t\t\t}\n\t\t},\n\n\t\tstopWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.helper ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * If we add a saved field to our form and then update it, set the \"saved\" flag to false.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/savedFields',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tignoreAttributes: [\n\t\t\t'editActive',\n\t\t\t'order',\n\t\t\t'saved',\n\t\t\t'jBox'\n\t\t],\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateField );\n\t\t\t// Listen to clicks on our add saved field button.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:addSavedField', this.clickAddSavedField, this );\n\t\t},\n\n\t\tupdateField: function( dataModel ) {\n\t\t\tif ( dataModel.get( 'saved' ) ) {\n\t\t\t\t\n\t\t\t\tvar modified = false;\n\t\t\t\tvar changedAttributes = _.keys( dataModel.changedAttributes() );\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( changedAttributes, function( changed ) {\n\t\t\t\t\tif ( -1 == that.ignoreAttributes.indexOf( changed ) ) {\n\t\t\t\t\t\tmodified = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t\n\t\t\t\tif ( modified ) {\n\t\t\t\t\tdataModel.set( 'saved', false );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tclickAddSavedField: function( e, dataModel ) {\n\t\t\tvar modelClone = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\tvar fieldData = modelClone.attributes;\n\t\t\tfieldData.saved = true;\n\n\t\t\tdelete fieldData.jBox;\n\t\t\tdelete fieldData.editActive;\n\t\t\tdelete fieldData.created_at;\n\t\t\tdelete fieldData.order;\n\t\t\tdelete fieldData.id;\n\t\t\tdelete fieldData.formID;\n\t\t\tdelete fieldData.parent_id;\n\t\t\t\n\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', fieldData.type );\n\t\t\tvar newType = _.clone( type.attributes );\n\n\t\t\tvar nicename = jQuery( e.target ).parent().parent().find( 'input' ).val();\n\t\t\tconsole.log( nicename );\n\t\t\tnewType.nicename = nicename;\n\t\t\tfieldData.label = nicename;\n\t\t\tfieldData.nicename = nicename;\n\t\t\tdataModel.set( 'addSavedLoading', true );\n\t\t\tvar newTypeDefaults = JSON.stringify( fieldData );\n\n\t\t\tjQuery.post( ajaxurl, { action: 'nf_create_saved_field', field: newTypeDefaults, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\tnewType.id = response.data.id;\n\t\t\t\tnewType.nicename = nicename;\n\t\t\t\tnewType.settingDefaults = fieldData;\n\n\t\t\t\tvar typeCollection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n\t\t\t\tvar newModel = typeCollection.add( newType );\n\n\t\t\t\tvar typeSections = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\t\ttypeSections.get( 'saved' ).get( 'fieldTypes' ).push( newType.id );\n\n\t\t\t\t// dataModel.set( 'type', response.data.id );\n\t\t\t\tdataModel.set( 'addSavedLoading', false );\n\t\t\t\tdataModel.unset( 'addSavedLoading', { silent: true } );\n\t\t\t\tdataModel.get( 'jBox' ).close();\n\t\t\t\t// dataModel.set( 'saved', true );\n\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addSaved', 'Saved Field Added' );\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a datepicker setting, add our datepicker.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDatepicker',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-datepicker' ), 'render:setting', this.addDatepicker );\n\t\t},\n\n\t\taddDatepicker: function( settingModel, dataModel, view ) {\n\t\t\tvar dateObject = pikadayResponsive( jQuery( view.el ).find( '.setting' )[0] );\t\t\t\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDisplayCalc',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-calc_var' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\t// console.log( 'render!' );\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Creates and stores a collection of action types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our action type collection\n *\n * Also responds to requests for data about action types\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/types',[ 'models/app/typeCollection' ], function( TypeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\t/*\n\t\t\t * Instantiate \"installed\" actions collection.\n\t\t\t */\n\t\t\tthis.installedActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'installed';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'installed',\n\t\t\t\t\tnicename: nfi18n.installed\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.availableActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'available';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'available',\n\t\t\t\t\tnicename: nfi18n.available\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:installedActions', this.getInstalledActions, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:availableActions', this.getAvailableActions, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\t// Search our installed actions first\n\t\t\tvar type = this.installedActions.get( id );\n\t\t\tif ( ! type ) {\n\t\t\t\ttype = this.availableActions.get( id );\n\t\t\t}\n \treturn type;\n },\n\n /**\n * Return the installed action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetInstalledActions: function() {\n \treturn this.installedActions;\n },\n\n /**\n * Return the available action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetAvailableActions: function() {\n \treturn this.availableActions;\n },\n\n /**\n * Add a field type to our staging area when the field type button is clicked.\n *\n * @since 3.0\n * @param Object e event\n * @return void\n */\n addStagedField: function( e ) {\n \tvar type = jQuery( e.target ).data( 'id' );\n \tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n },\n\n /**\n * Return our field type settings sections\n *\n * @since 3.0\n * @return backbone.collection field type settings sections\n */\n getTypeSections: function() {\n return this.fieldTypeSections;\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form action.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Action',\n\t\t\tobjectDomain: 'actions',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar actionType = nfRadio.channel( 'actions' ).request( 'get:type', this.get( 'type' ) );\n\n\t\t\tif( 'undefined' == typeof actionType ) return;\n\n\t\t\t// Loop through our action type \"settingDefaults\" and add any default settings.\n\t\t\tvar that = this;\n\t\t\t_.each( actionType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( ! that.get( key ) ) {\n\t\t\t\t\tthat.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * actions\n\t\t\t * action-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( 'actions' ).trigger( 'init:actionModel', this );\n\t\t\tnfRadio.channel( 'actions-' + this.get( 'type' ) ).trigger( 'init:actionModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n nfRadio.channel( 'actionSetting-' + _.keys( this.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'actions').trigger( 'update:setting', this, options.settingModel );\n nfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action models. \n * This is the actual action data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new action or removed action property.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionCollection',['models/actions/actionModel'], function( actionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionModel,\n\t\tcomparator: 'order',\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addAction, this );\n\t\t\tthis.on( 'remove', this.removeAction, this );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new action property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddAction: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed action property.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveAction: function( model ) {\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles interactions with our actions collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/data',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.collection = new actionCollection( preloadedFormData.actions );\n\t\t\tthis.collection.tmpNum = 1;\n\n\t\t\tif ( 0 != this.collection.models.length ) {\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( this.collection.models, function( action ) {\n\t\t\t\t\tif ( ! jQuery.isNumeric( action.get( 'id' ) ) ) {\n\t\t\t\t\t\tthat.collection.tmpNum++;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a action is removed so that we can add it to our 'deleted_actions' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about actions and to update/change/delete actions from our collection.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:action', this.getAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:tmpID', this.getTmpID, this );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add', this.addAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'delete', this.deleteAction, this );\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetAction: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\t/**\n\t\t * Add a action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( data, silent ) {\n\t\t\tsilent = silent || false;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tvar model = new actionModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\tthis.collection.add( model, { silent: silent } );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Delete a action from our collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \taction model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteAction: function( model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\n\t\t/**\n\t\t * Return a new tmp id for our actions.\n\t\t * Gets the action collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/actionSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( actionSettings, { objectType: 'actions' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a action currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - Edit Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our actions.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our actions collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n _.each( actionCollection.models, function( action ) {\n\t\t\t\taction.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Handles clicks and dragging for our action types.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/addActionTypes',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'actions' ), 'click:addAction', this.addAction );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add:actionType', this.addAction, this );\n\t\t},\n\n\t\t/**\n\t\t * Add an action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( type ) {\n\n\t\t\tvar data = {\n\t\t\t\tid: nfRadio.channel( 'actions' ).request( 'get:tmpID' ),\n\t\t\t\ttype: type.get( 'id' ),\n\t\t\t\tlabel: type.get( 'settingDefaults').label || type.get( 'nicename' )\n\t\t\t}\n\n\t\t\tvar newModel = nfRadio.channel( 'actions' ).request( 'add', data );\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Action',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'actions' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', {}, newModel );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/typeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our action type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addAction' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type droppable.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/droppable',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'app' ).reply( 'drop:actionType', this.dropActionType, this );\n\t\t},\n\n\t\tdropActionType: function( e, ui ) {\n\t\t\tvar type_slug = jQuery( ui.helper ).data( 'type' );\n\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', type_slug );\n\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', type );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our action type\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action type models. \n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeCollection',['models/actions/typeModel'], function( actionTypeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionTypeModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Filters our action type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/filterTypes',['models/actions/typeCollection'], function( typeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'change:filter', this.filterActionTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our action types in the add new action drawer\n\t\t * \n\t\t * Takes a search string and finds any action types that match either the name or alias.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string\t search \tstring being searched for\n\t\t * @param object \t e \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterActionTypes: function( search, e ) {\n\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != jQuery.trim( search ) ) {\n\n \t\tvar filteredInstalled = [];\n \t\t/**\n \t\t * Call the function that actually filters our collection,\n \t\t * and then loop through our collection, adding each model to our filteredInstalled array.\n \t\t */\n\t\t\t\tvar installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n \t\t_.each( this.filterCollection( search, installedActions ), function( model ) {\n \t\t\tfilteredInstalled.push( model );\n \t\t} );\n\n \t\tvar filteredAvailable = [];\n \t\tvar availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n \t\t_.each( this.filterCollection( search, availableActions ), function( model ) {\n \t\t\tfilteredAvailable.push( model );\n \t\t} );\n\n \t\t// Create a new Action Type Section collection with the filtered array.\n \t\tvar newInstalled = new typeCollection( filteredInstalled );\n \t\tnewInstalled.slug = 'installed';\n \t\tnewInstalled.nicename = 'Installed';\n\n \t\tvar newAvailable = new typeCollection( filteredAvailable );\n \t\tnewAvailable.slug = 'available';\n \t\tnewAvailable.nicename = 'Available';\n\n \t\t// Request that our action types filter be applied, passing the collection we created above.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:actionTypes', newInstalled, newAvailable );\n \t\t// If we've pressed the 'enter' key, add the action to staging and clear the filter.\n \t\tif ( e.addObject ) {\n \t\t\tif ( 0 < newInstalled.length ) {\n \t\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', newInstalled.models[0] );\n \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n \t\t\t}\n \t\t}\n \t} else {\n \t\t// Clear our filter if the search text is empty.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n \t}\n },\n\n /**\n * Search our action type collection for the search string.\n * \n * @since 3.0\n * @param string\t search \tstring being searched for\n * @return backbone.collection\n */\n filterCollection: function( search, collection ) {\n \tsearch = search.toLowerCase();\n \t/*\n \t * Backbone collections have a 'filter' method that loops through every model,\n \t * waiting for you to return true or false. If you return true, the model is kept.\n \t * If you return false, it's removed from the filtered result.\n \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'id' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/newsletterList',[], function( ) {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'setting-newsletter_list' ), 'show:setting', this.defaultFields );\n this.listenTo( nfRadio.channel( 'setting-type-newsletter_list' ), 'click:extra', this.clickListUpdate );\n this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ), 'update:setting', this.maybeRenderFields );\n this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ), 'update:setting', this.maybeRenderGroups );\n this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_fields' ), 'init:settingModel', this.registerFieldsListener );\n this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_groups' ), 'init:settingModel', this.registerGroupsListener );\n },\n\n defaultFields: function( settingModel, dataModel ) {\n this.maybeRenderFields( dataModel, settingModel );\n this.maybeRenderGroups( dataModel, settingModel );\n },\n\n registerFieldsListener: function ( model ) {\n model.listenTo( nfRadio.channel( 'newsletter_list_fields' ), 'update:fieldMapping', this.updateFieldMapping, model );\n },\n\n registerGroupsListener: function ( model ) {\n model.listenTo( nfRadio.channel( 'newsletter_list_groups' ), 'update:interestGroups', this.updateInterestGroups, model );\n },\n\n clickListUpdate: function( e, settingModel, dataModel, settingView ) {\n\n var data = {\n action: 'nf_' + dataModel.attributes.type + '_get_lists',\n security: nfAdmin.ajaxNonce\n };\n\n var that = this;\n jQuery( e.srcElement ).addClass( 'spin' );\n jQuery.post( ajaxurl, data, function( response ){\n var response = JSON.parse( response );\n that.updateLists( settingModel, response.lists, settingView, dataModel );\n dataModel.set( 'newsletter_list', response.lists[0].value, { settingModel: settingModel } );\n }).always( function() {\n jQuery( e.srcElement ).removeClass( 'spin' );\n });\n },\n\n updateLists: function( settingModel, lists, settingView, dataModel ) {\n settingModel.set( 'options', lists );\n settingView.render();\n },\n\n maybeRenderFields: function( dataModel, settingModel ) {\n\n if( 'undefined' == typeof settingModel ) return;\n\n var selectedList = dataModel.get( 'newsletter_list' );\n var lists = settingModel.get( 'options' );\n _.each( lists, function( list ) {\n if ( selectedList == list.value ) {\n nfRadio.channel( 'newsletter_list_fields').trigger( 'update:fieldMapping', list.fields );\n }\n } );\n\n dataModel.set( 'newsletter_list_fields', 0 );\n },\n\n maybeRenderGroups: function( dataModel, settingModel ) {\n if( 'undefined' == typeof settingModel ) return;\n\n var selectedList = dataModel.get( 'newsletter_list' );\n var lists = settingModel.get( 'options' );\n _.each( lists, function( list ) {\n if ( selectedList == list.value ) {\n nfRadio.channel( 'newsletter_list_groups').trigger( 'update:interestGroups', list.groups );\n }\n } );\n\n dataModel.set( 'newsletter_list_fields', 0 );\n },\n\n updateFieldMapping: function( fields ) {\n var settings = this.get( 'settings' );\n settings.reset();\n _.each( fields, function( field ){\n\n settings.add({\n name: field.value,\n type: 'textbox',\n label: field.label,\n width: 'full',\n use_merge_tags: { exclude: [ 'user', 'post', 'system', 'querystrings' ] }\n });\n });\n this.set( 'settings', settings );\n },\n\n updateInterestGroups: function( groups ) {\n var settings = this.get( 'settings' );\n settings.reset();\n _.each( groups, function( group ){\n\n settings.add({\n name: group.value,\n type: 'toggle',\n label: group.label,\n width: 'full',\n });\n });\n this.set( 'settings', settings );\n },\n\n });\n\n return controller;\n} );\n\n","/**\n * Creates and stores a collection of form setting types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our form setting type collection\n *\n * Also responds to requests for data about form setting types\n *\n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/types',[\n\t\t'models/app/typeCollection'\n\t],\n\tfunction(\n\t\tTypeCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( formSettingTypeData );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:typeCollection', this.getCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\treturn this.collection.get( id );\n },\n\n /**\n * Return the installed action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetCollection: function() {\n \treturn this.collection;\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form settings.\n * \n * @package Ninja Forms builder\n * @subpackage Form Settings\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/advanced/settingsModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Form Setting',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.bind( 'change', this.changeSetting, this );\n\t\t\t/*\n\t\t\t * Check to see if we have any setting defaults to set.\n\t\t\t */\n\t\t\tvar formSettings = nfRadio.channel( 'settings' ).request( 'get:collection' );\n\t\t\t_.each( formSettings.models, function( settingModel ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( settingModel.get( 'name' ) ) ) {\n\t\t\t\t\tthis.set( settingModel.get( 'name' ), settingModel.get( 'value' ), { silent: true } );\n\t\t\t\t}\n\t\t\t\tnfRadio.channel( settingModel.get( 'type' ) ).trigger( 'init:dataModel', this, settingModel );\n\t\t\t}, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Handles interactions with our form settings collection.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/data',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.model = new settingsModel( preloadedFormData.settings );\n\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settings', this.getSettings, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'update:setting', this.updateSetting, this );\n\t\t},\n\n\t\tgetSettings: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tupdateSetting: function( name, value, silent ) {\n\t\t\tsilent = silent || false;\n\t\t\tthis.model.set( name, value, { silent: silent } );\n\t\t},\n\n\t\tgetSetting: function( name ) {\n\t\t\treturn this.model.get( name );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/formSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( formSettings, { objectType: 'settings' } );\n\t\t\t\t\t\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settingModel', this.getSettingModel, this );\n\n\t\t\t// Responds to requests for our setting collection\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:collection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from form settings currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n _.each( collection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Listens for clicks on our form settings sections.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/clickEdit',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'settings' ), 'click:edit', this.clickEdit );\n\t\t},\n\n\t\tclickEdit: function( e, typeModel ) {\n\t\t\tvar model = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: typeModel.get( 'settingGroups' ), typeModel: typeModel } );\n\t\t\tvar preventClose = nfRadio.channel( 'drawer' ).request( 'get:preventClose' );\n\t\t\tif ( ! preventClose ) {\n\t\t\t\ttypeModel.set( 'editActive', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Makes sure that calculations don't reference calculations with a lower order.\n *\n * For example, our first caclulation can't reference the second, but the second can reference the first.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/calculations',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When someone types in the \"name\" or \"eq\" portion of our calculation, we need to make sure\n\t\t\t * that they haven't duplicated a name or made a bad EQ reference.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'keyup:option', this.keyUp );\n\t\t\t/*\n\t\t\t * Same thing for when our calculation option is updated\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalc );\n\t\t\t/*\n\t\t\t * When we sort our calcluations, we need to make sure that we don't get any bad EQ\n\t\t\t * references.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'sort:option', this.sortCalc );\n\t\t},\n\n\t\tkeyUp: function( e, optionModel ) {\n\t\t\t// Get our current value\n\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t// Check to see if we're editing a name or eq\n var id = jQuery( e.target ).data( 'id' );\n\t\t\tif( 'name' == id ) { // We are editing the name field\n\t\t\t\t// Check to see if our name already exists.\n\t\t\t\tthis.checkName( value, optionModel );\n\t\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\t} else if( 'eq' == id ) { // We're editing the eq\n\t\t\t\t// Check to see if there are any calcs referenced in our eq\n\t\t\t\tthis.checkEQ( value, optionModel );\n\t\t\t} else if( 'dec' == id ) { // We're editing the dec\n // Check to see that we have a non-negative integer\n this.checkDec( value, optionModel );\n }\n\t\t},\n\n\t\tupdateCalc: function( optionModel ) {\n\t\t\tthis.checkName( optionModel.get( 'name' ), optionModel, false );\n\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\tthis.checkDec( optionModel.get( 'dec' ), optionModel );\n\t\t},\n\n\t\tsortCalc: function( optionModel, setting ) {\n\t\t\tthis.checkAllCalcs( setting.collection );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if a calc name exists.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \t\t\tname calc name to check\n\t\t * @param backbone.model \toptionModel \n\t\t * @return void\n\t\t */\n\t\tcheckName: function( name, optionModel, silent ) {\n\t\t\tsilent = silent || true;\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t// Search our calc collection for our name\n\t\t\tvar found = optionModel.collection.where( { name: jQuery.trim( name ) } );\n\n\t\t\t// If the name that was passed is the same as our current name, return false.\n\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\tfound = [];\n\t\t\t}\n\n\t\t\t// If our name exists, add an errors to the option model\n\t\t\tif ( 0 != found.length ) {\n\t\t\t\terrors.nameExists = 'Calculation names must be unique. Please enter another name.';\n\t\t\t} else {\n\t\t\t\toptionModel.set( 'name', name, { silent: silent } );\n\t\t\t\tdelete errors.nameExists;\n\t\t\t}\n\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if an eq contains a reference to a calc at a lower priority.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\teq our equation\n\t\t * @param backbone.model \toptionModel\n\t\t * @return void\n\t\t */\n\t\tcheckEQ: function( eq, optionModel ) {\n\t\t\t// Get any current errors on our optionModel\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t/*\n\t\t\t * We're looking for two errors:\n\t\t\t * - Calculations that are below the current one can't be processed.\n\t\t\t * - Calculations can't refer to themselves.\n\t\t\t */ \n\t\t\tvar errorSelfRef = false;\n\t\t\tvar errorFutureCalc = false;\n\t\t\t// Regex that searches for {calc:key}\n\t\t\tvar calcs = eq.match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\t/*\n\t\t\t * Calcs will be an array like:\n\t\t\t * ['{calc:test}'], ['{calc:another}']\n\t\t\t * \n\t\t\t * If we have any calcs in the eq, loop through them and search for the errors.\n\t\t\t */\n\t\t\tif ( calcs ) {\n\t\t\t\tvar calculations = optionModel.collection;\n\t\t\t\t// Maps a function to each item in our calcs array.\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 optionModel from our calculations collection.\n\t\t\t\t\tvar targetCalc = calculations.findWhere( { name: name } );\n\t\t\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\t\t\t// If we already have a calc with this name, set an error.\n\t\t\t\t\t\terrors.selfRef = 'A calculation can\\'t reference itself!';\n\t\t\t\t\t\terrorSelfRef = true;\n\t\t\t\t\t} else if ( targetCalc && targetCalc.get( 'order' ) > optionModel.get( 'order' ) ) {\n\t\t\t\t\t\t// If the calc is after this one, set an error. \n\t\t\t\t\t\terrorFutureCalc = true;\n\t\t\t\t\t\terrors.futureCalc = 'Can\\'t reference a future calculation!';\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// If we didn't find any self ref errors, remove the key.\n\t\t\tif ( ! errorSelfRef ) {\n\t\t\t\tdelete errors.selfRef;\n\t\t\t}\n\n\t\t\t// If we didn't find any future calc errors, remove the key.\n\t\t\tif ( ! errorFutureCalc ) {\n\t\t\t\tdelete errors.futureCalc;\n\t\t\t}\n\n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\n\t\t},\n\n /**\n * Ceck to see if a dec is an integer value.\n * \n * @since 3.1\n * @param string dec our decimal value\n * @param backbone.model optionModel\n * @return void\n */\n checkDec: function( dec, optionModel ) {\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n /**\n * We're looking for one error:\n * - dec is not a non-negative integer.\n */\n var errorNonIntDec = false;\n \n // Get our target value and see if it matches what we got.\n var checked = Math.abs( parseInt( dec.trim() ) );\n if ( dec.trim() !== '' && checked.toString() !== dec.trim() ) {\n errorNonIntDec = true;\n errors.nonIntDec = 'Decimals must be a non-negative integer!';\n }\n \n // If our dec value is a non-negative integer.\n if ( ! errorNonIntDec ) {\n delete errors.nonIntDec;\n }\n \n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n \n },\n \n\t\tcheckAllCalcs: function( collection ) {\n\t\t\tvar that = this;\n\t\t\tcollection.models.map( function( opt ) {\n\t\t\t\tthat.checkName( opt.get( 'name' ), opt );\n\t\t\t\tthat.checkEQ( opt.get( 'eq' ), opt );\n that.checkDec( opt.get( 'dec' ), opt );\n\t\t\t} );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Loads all of our controllers using Require JS.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine(\n\t'controllers/loadControllers',[\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\t'controllers/app/remote',\n\t\t'controllers/app/drawer',\n\t\t'controllers/app/drawerConfig',\n\t\t'controllers/app/domainConfig',\n\t\t'controllers/app/data',\t\t\n\t\t'controllers/app/drawerToggleSettingGroup',\n\t\t'controllers/app/updateDB',\n\t\t'controllers/app/formData',\n\t\t'controllers/app/previewLink',\n\t\t'controllers/app/menuButtons',\n\t\t'controllers/app/trackChanges',\n\t\t'controllers/app/undoChanges',\n\t\t'controllers/app/publishResponse',\n\t\t'controllers/app/changeDomain',\n\t\t'controllers/app/pushstate',\n\t\t'controllers/app/hotkeys',\n\t\t'controllers/app/cleanState',\n\t\t'controllers/app/coreUndo',\n\t\t'controllers/app/cloneModelDeep',\n\t\t'controllers/app/getSettingChildView',\n\t\t'controllers/app/changeSettingDefault',\n\t\t'controllers/app/fieldset',\n\t\t'controllers/app/toggleSetting',\n\t\t'controllers/app/itemControls',\n\t\t'controllers/app/mergeTags',\n\t\t'controllers/app/mergeTagBox',\n\t\t'controllers/app/itemSettingFill',\n\t\t'controllers/app/confirmPublish',\n\t\t'controllers/app/rte',\n\t\t'controllers/app/settingFieldSelect',\n\t\t'controllers/app/settingFieldList',\n\t\t'controllers/app/settingHTML',\n\t\t'controllers/app/settingColor',\n\t\t'controllers/app/changeMenu',\n\t\t'controllers/app/mobile',\n\t\t'controllers/app/notices',\n\t\t'controllers/app/unloadCheck',\n\t\t'controllers/app/formContentFilters',\n\t\t'controllers/app/formContentGutterFilters',\n\t\t'controllers/app/cloneCollectionDeep',\n\t\t'controllers/app/trackKeyDown',\n\t\t'controllers/app/perfectScroll',\n\t\t'controllers/app/getNewSettingGroupCollection',\n\t\t'controllers/app/settingMedia',\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\t'controllers/fields/types',\n\t\t'controllers/fields/fieldTypeDrag',\n\t\t'controllers/fields/stagingDrag',\n\t\t'controllers/fields/staging',\n\t\t'controllers/fields/stagingSortable',\n\t\t'controllers/fields/filterTypes',\n\t\t'controllers/fields/sortable',\n\t\t'controllers/fields/data',\n\t\t'controllers/app/optionRepeater',\n\t\t'controllers/fields/editActive',\n\t\t'controllers/fields/fieldSettings',\n\t\t'controllers/fields/fieldCreditCard',\n\t\t'controllers/fields/fieldList',\n\t\t'controllers/fields/fieldPassword',\n\t\t'controllers/fields/fieldQuantity',\n\t\t'controllers/fields/fieldShipping',\n\t\t'controllers/fields/key',\n\t\t'controllers/fields/notices',\n\t\t'controllers/fields/mobile',\n\t\t'controllers/fields/savedFields',\n\t\t'controllers/fields/fieldDatepicker',\n\t\t'controllers/fields/fieldDisplayCalc',\n\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\t'controllers/actions/types',\n\t\t'controllers/actions/data',\n\t\t'controllers/actions/actionSettings',\n\t\t'controllers/actions/editActive',\n\t\t'controllers/actions/addActionTypes',\n\t\t'controllers/actions/typeDrag',\n\t\t'controllers/actions/droppable',\n\t\t'controllers/actions/filterTypes',\n\t\t'controllers/actions/newsletterList',\n\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\t'controllers/advanced/types',\n\t\t'controllers/advanced/data',\n\t\t'controllers/advanced/formSettings',\n\t\t'controllers/advanced/editActive',\n\t\t'controllers/advanced/clickEdit',\n\t\t'controllers/advanced/calculations'\n\t],\n\tfunction(\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\tRemote,\n\t\tDrawer,\n\t\tDrawerConfig,\n\t\tDomainConfig,\n\t\tAppData,\n\t\tDrawerToggleSettingGroup,\n\t\tUpdateDB,\n\t\tFormData,\n\t\tPreviewLink,\n\t\tAppMenuButtons,\n\t\tAppTrackChanges,\n\t\tAppUndoChanges,\n\t\tAppPublishResponse,\n\t\tAppChangeDomain,\n\t\tPushstate,\n\t\tHotkeys,\n\t\tCleanState,\n\t\tCoreUndo,\n\t\tCloneModelDeep,\n\t\tDrawerSettingChildView,\n\t\tChangeSettingDefault,\n\t\tFieldset,\n\t\tToggleSetting,\n\t\tItemControls,\n\t\tMergeTags,\n\t\tMergeTagsBox,\n\t\tItemSettingFill,\n\t\tConfirmPublish,\n\t\tRTE,\n\t\tSettingFieldSelect,\n\t\tSettingFieldList,\n\t\tSettingHTML,\n\t\tSettingColor,\n\t\tChangeMenu,\n\t\tAppMobile,\n\t\tAppNotices,\n\t\tAppUnloadCheck,\n\t\tFormContentFilters,\n\t\tFormContentGutterFilters,\n\t\tCloneCollectionDeep,\n\t\tTrackKeyDown,\n\t\tPerfectScroll,\n\t\tGetNewSettingGroupCollection,\n\t\tSettingMedia,\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\tFieldTypes,\n\t\tFieldTypeDrag,\n\t\tFieldStagingDrag,\n\t\tStagedFieldsData,\n\t\tStagedFieldsSortable,\n\t\tDrawerFilterFieldTypes,\n\t\tMainContentFieldsSortable,\n\t\tFieldData,\n\t\tOptionRepeater,\n\t\tFieldsEditActive,\n\t\tFieldSettings,\n\t\tFieldCreditCard,\n\t\tFieldList,\n\t\tFieldPassword,\n\t\tFieldQuantity,\n\t\tFieldShipping,\n\t\tFieldKey,\n\t\tNotices,\n\t\tFieldsMobile,\n\t\tSavedFields,\n\t\tFieldDatepicker,\n\t\tFieldDisplayCalc,\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\tActionTypes,\n\t\tActionData,\n\t\tActionSettings,\n\t\tActionEditActive,\n\t\tActionAddTypes,\n\t\tActionTypeDrag,\n\t\tActionDroppable,\n\t\tActionFilterTypes,\n\t\tActionNewsletterList,\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\tSettingTypes,\n\t\tSettingData,\n\t\tFormSettings,\n\t\tSettingsEditActive,\n\t\tSettingsClickEdit,\n\t\tAdvancedCalculations\n\t\t\n\t) {\n\t\tvar controller = Marionette.Object.extend( {\n\t\t\tinitialize: function() {\n\t\t\t\t/*\n\t\t\t\t * Application controllers\n\t\t\t\t */\n\t\t\t\tnew FormContentFilters();\n\t\t\t\tnew FormContentGutterFilters();\n\t\t\t\tnew Hotkeys();\n\t\t\t\tnew Remote();\n\t\t\t\tnew Drawer();\n\t\t\t\tnew DrawerConfig();\n\t\t\t\tnew DomainConfig();\n\t\t\t\tnew DrawerToggleSettingGroup();\n\t\t\t\tnew PreviewLink();\n\t\t\t\tnew AppMenuButtons();\n\t\t\t\tnew AppTrackChanges();\n\t\t\t\tnew AppUndoChanges();\n\t\t\t\tnew AppPublishResponse();\n\t\t\t\tnew AppChangeDomain();\n\t\t\t\tnew CleanState();\n\t\t\t\tnew CoreUndo();\n\t\t\t\tnew CloneModelDeep();\n\t\t\t\tnew ItemControls();\n\t\t\t\tnew ConfirmPublish();\n\t\t\t\tnew RTE();\n\t\t\t\tnew SettingFieldSelect();\n\t\t\t\tnew SettingFieldList();\n\t\t\t\tnew SettingHTML();\n\t\t\t\tnew SettingColor();\n\t\t\t\tnew SettingMedia();\n\t\t\t\tnew ChangeMenu();\n\t\t\t\tnew AppMobile();\n\t\t\t\tnew AppNotices();\n\t\t\t\tnew AppUnloadCheck();\n\t\t\t\tnew UpdateDB();\n\t\t\t\tnew CloneCollectionDeep();\n\t\t\t\tnew TrackKeyDown();\n\t\t\t\tnew PerfectScroll();\n\t\t\t\tnew GetNewSettingGroupCollection();\n\t\t\t\t// new Pushstate();\n\t\t\t\t/*\n\t\t\t\t * Fields domain controllers\n\t\t\t\t * \n\t\t\t\t * Field-specific controllers should be loaded before our field type controller.\n\t\t\t\t * This ensures that any 'init' hooks are properly registered.\n\t\t\t\t */\n\t\t\t\tnew Fieldset();\n\t\t\t\tnew OptionRepeater();\n\n\t\t\t\tnew FieldTypes();\n\t\t\t\tnew FieldTypeDrag();\n\t\t\t\tnew FieldStagingDrag();\n\t\t\t\tnew StagedFieldsData();\n\t\t\t\tnew StagedFieldsSortable();\n\t\t\t\tnew DrawerFilterFieldTypes();\n\t\t\t\tnew MainContentFieldsSortable();\n\t\t\t\tnew ChangeSettingDefault();\n\t\t\t\tnew ToggleSetting();\n\t\t\t\tnew DrawerSettingChildView();\n\t\t\t\tnew FieldsEditActive();\n\t\t\t\tnew FieldSettings();\n\t\t\t\tnew FieldCreditCard();\n\t\t\t\tnew FieldList();\n\t\t\t\tnew FieldPassword;\n\t\t\t\tnew FieldQuantity();\n\t\t\t\tnew FieldShipping();\n\t\t\t\tnew FieldKey();\n\t\t\t\tnew Notices();\n\t\t\t\tnew FieldsMobile();\n\t\t\t\tnew SavedFields();\n\t\t\t\tnew FieldDatepicker();\n\t\t\t\tnew FieldDisplayCalc();\n\t\t\t\t/*\n\t\t\t\t * TODO: Actions domain controllers\n\t\t\t\t */\n\t\t\t\tnew ActionNewsletterList();\n\t\t\t\tnew ActionTypes();\n\t\t\t\tnew ActionData();\n\t\t\t\tnew ActionSettings();\n\t\t\t\tnew ActionEditActive();\n\t\t\t\tnew ActionAddTypes();\n\t\t\t\tnew ActionTypeDrag();\n\t\t\t\tnew ActionDroppable();\n\t\t\t\tnew ActionFilterTypes();\n\t\t\t\t/*\n\t\t\t\t * TODO: Settings domain controllers\n\t\t\t\t */\n\t\t\t\tnew SettingTypes();\n\t\t\t\tnew FormSettings();\n\t\t\t\tnew AdvancedCalculations();\n\t\t\t\tnew SettingData();\n\t\t\t\tnew SettingsEditActive();\n\t\t\t\tnew SettingsClickEdit();\n\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Data controllers need to be set after every other controller has been setup, even if they aren't domain-specific.\n\t\t\t\t * AppData() was after FormData();\n\t\t\t\t */\n\t\t\t\tnew AppData();\n\t\t\t\tnew FieldData();\n\t\t\t\tnew FormData();\n\t\t\t\tnew MergeTags();\n\t\t\t\tnew MergeTagsBox();\n\t\t\t\tnew ItemSettingFill();\n\t\t\t}\n\t\t});\n\n\t\treturn controller;\n} );\n\n","define( 'views/fields/fieldItem',['views/app/itemControls'], function( itemControlsView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-field',\n\t\tdoingShortcut: false,\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:required', this.render, this );\n\t\t\tthis.model.on( 'change:id', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:required', this.render );\n\t\t\tthis.model.off( 'change:id', this.render );\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\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t\tjQuery( this.el ).disableSelection();\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).on( 'taphold', function( e, touch ) {\n\t\t\t\t\tif ( ! jQuery( e.target ).hasClass( 'nf-edit-settings' ) ) {\n\t\t\t\t\t\tjQuery( this ).addClass( 'ui-sortable-helper drag-selected' );\n\t\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderClasses: function() {\n\t \t\t\tvar classes = 'nf-field-wrap';\n\t \t\t\tif ( this.editActive ) {\n\t \t\t\t\tclasses += ' active';\n\t \t\t\t}\n\t \t\t\treturn classes;\n\t \t\t},\n\t \t\trenderRequired: function() {\n\t \t\t\tif ( 1 == this.required ) {\n\t \t\t\t\treturn '<span class=\"required\">*</span>';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\t \t\tgetFieldID: function() {\n\t\t\t\t\tif ( jQuery.isNumeric( this.id ) ) {\n\t\t\t\t\t\treturn 'field-' + this.id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn this.id;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trenderIcon: function() {\n\t\t\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', this.type );\n\t\t\t\t\treturn '<span class=\"fa fa-' + type.get( 'icon' ) + '\"></span>';\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'mousedown': 'maybeShortcut',\n\t\t\t'click': 'maybeClickEdit',\n\t\t\t'singletap': 'maybeTapEdit',\n\t\t\t'swipeleft': 'swipeLeft',\n\t\t\t'swiperight': 'swipeRight',\n\t\t\t'tapend': 'tapend'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( this.doingShortcut ) {\n\t\t\t\tthis.doingShortcut = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) || jQuery( e.target ).parent().hasClass( 'nf-field-wrap' ) || jQuery( e.target ).hasClass( 'nf-field-wrap' ) ) && ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ':focus' ).blur();\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tmaybeShortcut: function( e ) {\n\t\t\tvar keys = nfRadio.channel( 'app' ).request( 'get:keydown' );\n\t\t\t/*\n\t\t\t * If the shift key isn't held down, return.\n\t\t\t */\n\t\t\tif ( -1 == keys.indexOf( 16 ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we are pressing D, delete this field.\n\t\t\t */\n\t\t\tif ( -1 != keys.indexOf( 68 ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\treturn false;\n\t\t\t} else if ( -1 != keys.indexOf( 67 ) ) {\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tmaybeTapEdit: function( e ) {\n\t\t\tif ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tswipeLeft: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).show();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).show();\n\t\t},\n\n\t\tswipeRight: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).hide();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).hide();\n\t\t},\n\n\t\ttapend: function( e, touch ) {\n\t\t\tjQuery( this.el ).ClassyWiggle( 'stop' );\n\t\t\tjQuery( this.el ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t},\n\n\t\tremove: function(){\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:removing' ) ) {\n\t\t\t\tthis.$el.hide( 'clip', function(){\n\t\t\t\t\tjQuery( this ).remove();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.$el.remove();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:removing', false );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tjQuery( this.el ).find( '.nf-item-control' ).css( 'display', '' );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-fields-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\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\tif ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t\tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t}\n\t\t\tjQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\tjQuery( this.el ).parent().droppable( {\n\t\t\t\taccept: function( draggable ) {\n\t\t\t\t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t},\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our form title.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/formTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-header-form-title',\n\n\t\tinitialize: function() {\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change:title', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderTitle: function(){\n\t \t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t \t\t\treturn _.escape( formData.get( 'settings' ).get( 'title' ) );\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\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( 'views/loadViews',[ 'views/fields/fieldItem', 'views/fields/mainContentEmpty', 'views/app/formTitle' ], function( fieldItemView, mainContentEmptyView, FormTitleView ) {\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\t\t\n\t\t\t// Reply to requests for our empty content view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:mainContentEmpty', this.getMainContentEmpty );\n\t\t\n\t\t\t// Reply to requests for our form title view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:formTitle', this.getFormTitle );\n\t\t},\n\n\t\tgetFieldItem: function( model ) {\n\t\t\treturn fieldItemView;\n\t\t},\n\n\t\tgetMainContentEmpty: function() {\n\t\t\treturn mainContentEmptyView;\n\t\t},\n\n\t\tgetFormTitle: function() {\n\t\t\treturn FormTitleView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","var nfRadio = Backbone.Radio;\n\njQuery( document ).ready( function( $ ) {\n\trequire( ['views/app/builder', 'controllers/loadControllers', 'views/loadViews'], function( BuilderView, LoadControllers, LoadViews ) {\n\n\t\tvar NinjaForms = Marionette.Application.extend( {\n\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// Trigger an event before we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadControllers', this );\n\t\t\t\t// Load our controllers.\n\t\t\t\tvar loadControllers = new LoadControllers();\n\t\t\t\t// Trigger an event after we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadControllers', this );\n\n\t\t\t\t// Trigger an event before we load un-instantiated views\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadViews', this );\n\t\t\t\tvar loadViews = new LoadViews();\n\t\t\t\t// Trigger an event after we load un-instantiated views.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadViews', this );\n\n\t\t\t\tnfRadio.channel( 'app' ).reply( 'get:template', this.template );\n\t\t\t},\n\n\t\t\tonStart: function() {\n\t\t\t\tvar builderView = new BuilderView();\n\t\t\t\t// Trigger our after start event.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:appStart', this );\n\n\t\t\t\t/*\n\t\t\t\t * If we're on the new forms builder, open the add fields drawer.\n\t\t\t\t */\n\t\t\t\tif ( 0 == nfAdmin.formID ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\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();\n\t} );\n} );\ndefine(\"main\", function(){});\n\n"],"sourceRoot":"/source/"}1 {"version":3,"sources":["../../../config-wrap-start-default.js","../lib/almond.js","views/app/menuItem.js","views/app/menu.js","views/app/menuButtons.js","views/app/mobileMenuButton.js","views/app/header.js","views/app/subHeader.js","views/app/builderHeader.js","views/app/main.js","views/app/mobileMenuItem.js","views/app/mobileMenu.js","views/app/drawer/contentEmpty.js","views/app/drawer.js","views/app/drawer/mergeTagItem.js","views/app/drawer/mergeTagsSection.js","models/app/mergeTagModel.js","models/app/mergeTagCollection.js","views/app/drawer/mergeTagsContent.js","views/app/builder.js","controllers/app/remote.js","controllers/app/drawer.js","views/app/drawer/headerDefault.js","views/app/drawer/footerDefault.js","models/app/drawerModel.js","models/app/drawerCollection.js","views/fields/drawer/stagedField.js","views/fields/drawer/stagingEmpty.js","views/fields/drawer/stagingCollection.js","models/fields/stagingModel.js","models/fields/stagingCollection.js","views/fields/drawer/typeSection.js","views/fields/drawer/typeSectionCollection.js","views/fields/drawer/addField.js","views/app/drawer/itemSettingCollection.js","views/app/drawer/itemSettingGroup.js","views/app/drawer/itemSettingGroupCollection.js","views/app/drawer/editSettings.js","views/app/drawer/headerEditSettings.js","views/actions/drawer/typeButton.js","views/actions/drawer/typeCollection.js","views/actions/drawer/addAction.js","views/app/drawer/contentViewChangesItem.js","views/app/drawer/contentViewChanges.js","views/app/drawer/headerViewChanges.js","views/app/drawer/settingError.js","views/app/drawer/itemSetting.js","views/app/drawer/contentNewForm.js","views/app/drawer/headerNewForm.js","controllers/app/drawerConfig.js","views/app/drawer/defaultSettingsTitle.js","views/app/empty.js","models/app/domainModel.js","models/app/domainCollection.js","views/fields/subHeader.js","views/fields/mainContentFieldCollection.js","views/fields/drawer/addSavedField.js","views/fields/drawer/settingsTitle.js","views/actions/mainHeader.js","views/actions/subHeader.js","views/app/itemControls.js","views/actions/actionItem.js","views/actions/mainContentEmpty.js","views/actions/mainContent.js","views/advanced/mainHeader.js","views/advanced/subHeader.js","views/advanced/settingItem.js","views/advanced/mainContent.js","models/fields/fieldModel.js","models/fields/fieldCollection.js","controllers/app/domainConfig.js","models/app/appModel.js","controllers/app/data.js","controllers/app/drawerToggleSettingGroup.js","controllers/app/updateDB.js","models/app/formModel.js","controllers/app/formData.js","controllers/app/previewLink.js","controllers/app/menuButtons.js","models/app/changeModel.js","models/app/changeCollection.js","controllers/app/trackChanges.js","controllers/app/undoChanges.js","controllers/app/publishResponse.js","controllers/app/changeDomain.js","controllers/app/pushstate.js","controllers/app/hotkeys.js","controllers/app/cleanState.js","controllers/app/coreUndo.js","controllers/app/cloneModelDeep.js","controllers/app/getSettingChildView.js","controllers/app/changeSettingDefault.js","views/app/drawer/typeSettingFieldset.js","models/app/settingModel.js","models/app/settingCollection.js","controllers/app/fieldset.js","controllers/app/toggleSetting.js","controllers/app/itemControls.js","controllers/app/mergeTags.js","models/app/mergeTagLookupCollection.js","views/app/drawer/mergeTag.js","views/app/drawer/mergeTagList.js","views/app/drawer/mergeTagGroup.js","views/app/drawer/mergeTagGroupList.js","views/app/drawer/mergeTagFilter.js","views/app/drawer/mergeTagBox.js","controllers/app/mergeTagBox.js","controllers/app/itemSettingFill.js","controllers/app/confirmPublish.js","controllers/app/rte.js","controllers/app/settingFieldSelect.js","controllers/app/settingFieldList.js","controllers/app/settingHTML.js","controllers/app/settingColor.js","controllers/app/changeMenu.js","controllers/app/mobile.js","controllers/app/notices.js","controllers/app/unloadCheck.js","controllers/app/formContentFilters.js","controllers/app/formContentGutterFilters.js","controllers/app/cloneCollectionDeep.js","controllers/app/trackKeyDown.js","controllers/app/perfectScroll.js","models/app/settingGroupModel.js","models/app/settingGroupCollection.js","controllers/app/getNewSettingGroupCollection.js","controllers/app/settingMedia.js","models/app/typeModel.js","models/app/typeCollection.js","models/fields/typeSectionModel.js","models/fields/typeSectionCollection.js","controllers/fields/types.js","controllers/fields/fieldTypeDrag.js","controllers/fields/stagingDrag.js","controllers/fields/staging.js","controllers/fields/stagingSortable.js","controllers/fields/filterTypes.js","controllers/fields/sortable.js","controllers/fields/data.js","models/app/optionRepeaterModel.js","models/app/optionRepeaterCollection.js","views/app/drawer/optionRepeaterError.js","views/app/drawer/optionRepeaterOption.js","views/app/drawer/optionRepeaterEmpty.js","views/app/drawer/optionRepeaterComposite.js","controllers/app/optionRepeater.js","controllers/fields/editActive.js","controllers/fields/fieldSettings.js","controllers/fields/fieldCreditCard.js","controllers/fields/fieldList.js","controllers/fields/fieldPassword.js","controllers/fields/fieldQuantity.js","controllers/fields/fieldShipping.js","controllers/fields/key.js","controllers/fields/notices.js","controllers/fields/mobile.js","controllers/fields/savedFields.js","controllers/fields/fieldDatepicker.js","controllers/fields/fieldDisplayCalc.js","controllers/actions/types.js","models/actions/actionModel.js","models/actions/actionCollection.js","controllers/actions/data.js","controllers/actions/actionSettings.js","controllers/actions/editActive.js","controllers/actions/addActionTypes.js","controllers/actions/typeDrag.js","controllers/actions/droppable.js","models/actions/typeModel.js","models/actions/typeCollection.js","controllers/actions/filterTypes.js","controllers/actions/newsletterList.js","controllers/advanced/types.js","models/advanced/settingsModel.js","controllers/advanced/data.js","controllers/advanced/formSettings.js","controllers/advanced/editActive.js","controllers/advanced/clickEdit.js","controllers/advanced/calculations.js","controllers/loadControllers.js","views/fields/fieldItem.js","views/fields/mainContentEmpty.js","views/app/formTitle.js","views/loadViews.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","view","Marionette","ItemView","extend","tagName","template","initialize","this","listenTo","nfRadio","channel","render","model","on","onRender","$el","children","unwrap","setElement","events","click a","clickAppMenu","trigger","templateHelpers","renderDashicons","dashicons","renderClasses","classes","currentDomain","request","get","renderUrl","url","formModel","renderTarget","renderDisabled","disabled","appMenuItemView","CollectionView","childView","onShow","el","find","bounceIcon","that","renderPublish","publishWidth","maybeDisabled","maybeRenderCancel","viewChanges","click .publish","click .viewChanges","clickPublish","clickViewChanges","changeModel","effect","times","click .nf-mobile-menu","clickMobileMenu","builderEl","toggleClass","appMenuCollectionView","appMenuButtonsView","mobileMenuButtonView","LayoutView","regions","menu","buttons","mobileMenuButton","appDomainCollection","show","collection","click #nf-logo","clickLogo","appHeaderView","appSubHeaderView","app","formTitle","appSub","changeSubHeader","formData","formSettings","formTitleView","subHeaderView","className","maybeDone","offsetRight","offsetLeft","gutterLeft","body","gutterRight","reply","getMainEl","window","context","resizeBothGutters","setBothGuttersAbsolute","setBothGuttersFixed","updateGutters","bodyView","gutterLeftView","gutterRightView","parent","onAttach","initialGutterResize","onBeforeDestroy","off","resize","resizeGutter","data","leftEl","rightEl","clearTimeout","top","offset","viewHeight","height","topLeft","leftLeft","left","css","position","topRight","leftRight","scrollTop","right","mobileDashicon","mobileMenuItemView","CompositeView","attachHtml","collectionView","append","click .nf-publish","drawerEmptyView","header","content","footer","getEl","loadContent","emptyContent","perfectScrollbar","drawerID","drawer","contentView","headerView","footerView","empty","click .nf-toggle-drawer","clickToggleDrawer","clickTag","active","mergeTagItemView","fieldCollection","updateFields","set","Backbone","Model","defaults","exclude","mergeTagModel","Collection","mergeTagsSectionView","MergeTagCollection","getMergeTagsView","reRender","settingModel","mergeTagCollection","defaultGroups","where","default_group","calcMergeTagGroup","useMergeTags","_","each","remove","include","models","sectionModel","add","mainView","mobileMenuView","drawerView","mergeTagsContentView","menuDrawer","mergeTagsContent","getBuilderEl","getBuilderView","mergeTags","mergeTagsClone","clone","click .nf-open-drawer","click .nf-change-domain","click .nf-close-drawer","openDrawer","closeDrawer","changeDomain","addListener","dataModel","listen","updateSetting","clickExtra","getRemote","settingView","srcElement","addClass","remote","parentValue","action","security","nfAdmin","ajaxNonce","post","ajaxurl","response","JSON","parse","options","controller","clickOpenDrawer","toggleDrawerSize","getClosedDrawerPos","preventClose","enableClose","maybePreventClose","objPreventClose","filterFocused","currentDrawer","removeClass","rightClosed","drawerEl","checkCloseDrawerPos","setInterval","clearInterval","target","currentDomainID","hasFocus","checkOpenDrawerPos","focusFilter","filterEl","focus","closedPos","width","keys","key","getPreventClose","clearFilter","blurFilter","keyup .nf-filter","input .nf-filter","focus input","changeFilter","maybeChangeFilter","keyCode","addObject","trim","val","blur","getFocus","drawerDisabled","defaultHeaderView","defaultFooterView","getHeaderView","getFooterView","drawerModel","click .dashicons-dismiss","removeStagedField","stagedFieldView","stagedFieldsEmptyView","emptyView","activeClass","getStagedFieldsEl","sortable","placeholder","helper","tolerance","over","ui","out","receive","update","start","stop","draggable","opacity","connectToSortable","appendTo","refreshPositions","grid","element","zIndex","onAddChild","onRemoveChild","hasStagedFields","stagingModel","comparator","bindAll","getTypeSection","dragging","drag","disableSelection","click .nf-item","keydown .nf-item","mousedown .nf-item","clickFieldType","mousedownFieldType","maybeClickFieldType","renderFieldTypes","html","fieldTypes","type","nicename","icon","renderType","savedField","fieldTypeSectionView","drawerStagingView","StagingCollection","fieldTypeSectionCollectionView","staging","primary","secondary","filterFieldTypes","removeFieldTypeFilter","savedCollection","primaryCollection","fieldTypeSectionCollection","secondaryCollection","stagingCollection","filteredSectionCollection","reset","childViewOptions","getChildView","itemSettingCollectionView","settings","click .toggle","clickToggleGroup","renderLabel","label","groupLabel","renderArrowDir","display","itemSettingGroupView","itemSettingGroupCollectionView","settingTitle","settingGroups","groupCollection","titleView","maybeRenderTitle","title","renderTypeNicename","domainID","scroll","clickAddAction","open","image","section","renderStyle","actionTypeButtonView","renderNicename","slug","actionTypeCollectionView","filteractionTypes","removeactionTypeFilter","installedActions","availableActions","filteredInstalled","filteredAvailable","click .undoSingle","undoSingle","viewChangesItem","click .undoChanges","clickUndoChanges","settingErrorView","error","renderOnChange","renderError","refresh","drawerOpened","drawerClosed","setting","unescape","silent","onBeforeRender","escape","next","jBox","maxWidth","theme","closeOnClick","mask","input","autoNumeric","aSep","thousandsSeparator","aDec","decimalPoint","currency","currencySymbol","currencySymbols","aSign","text","format","console","log","renderVisible","renderSetting","renderLabelClasses","use_merge_tags","renderTooltip","help","renderMergeTags","hide_merge_tags","renderPlaceholder","change .setting","keyup .setting","click .setting","click .extra","changeSetting","keyUpSetting","clickSetting","itemSettingView","formName","formSubmit","titleSettingModel","addSubmitSettingModel","submitButtons","findWhere","drawerCollection","addFieldView","editSettingsView","editSettingsHeaderView","addActionView","viewChangesView","viewChangesHeaderView","newFormView","newFormHeaderView","mobileItemControlsView","getContentView","typeModel","getDrawerCollection","getDrawer","DefaultSettingsTitleView","EmptyView","hotkeys","getSettingsTitleView","getDefaultSettingsTitleView","getGutterLeftView","getGutterRightView","domainModel","reorderOnSort","getEmptyView","getSortableEl","initSortable","destroySortable","cancel","scrollSensitivity","item","dropping","hide","renderAddButton","button","click .nf-button","clickAddSavedField","addSavedFieldView","renderjBoxContent","addSaved","addSavedjBox","destroy","unset","x","y","outside","onCreated","setContent","attach","displayName","saved","realType","renderSavedStar","star","actionCollection","mouseover .nf-item-control","click .nf-edit-settings","singletap .nf-edit-settings","click .nf-delete","click .nf-duplicate","clickEdit","singleTapEdit","clickDelete","clickDuplicateField","mouseoverItemControl","itemControlsView","itemControls","maybeDeactivate","change input","click","maybeClickEdit","changeToggle","renderToggle","settingName","actionLabel","actionView","droppable","accept","hoverClass","drop","updateActiveClass","editActive","settingItem","objectType","objectDomain","order","fieldType","parentType","updateFieldKey","changedAttributes","keyModel","fieldModel","parseInt","tmpNum","addField","removeField","addNewField","appendNewField","removeFieldResponse","newIDs","removedIDs","at","fieldExists","fieldsSubHeaderView","FieldsMainContentFieldCollectionView","fieldsSettingsTitleView","actionsMainHeaderView","actionsSubHeaderView","actionsMainContentView","settingsMainHeaderView","settingsSubHeaderView","settingsMainContentView","FieldCollection","defaultFormContentView","defaultFormContentLoad","defaultFormContentGutterView","nfi18n","domainFormFields","Esc","Ctrl+Shift+n","Ctrl+Shift+a","Ctrl+Shift+s","Alt+Ctrl+t","up","down","Shift+return","getSubHeaderView","getMainContentView","formContentData","formContentLoadFilters","sortedArray","without","first","formContentViewFilters","formContentView","gutterFilters","gutterView","domainActions","Ctrl+Shift+f","domainAdvanced","previewurl","getDomainCollection","getDomainModel","fieldModels","loading","changeStatus","appModel","clean","mobile","isMobile","getData","getSetting","getCurrentDomain","getCurrentDrawer","updateCurrentDomain","updateCurrentDrawer","currentDrawerID","toggleSettingGroup","errors","updateDB","defaultSaveFilter","jsAction","formContentSaveDataFilters","stringify","fields","field","parent_id","deleted_fields","actions","deleted_actions","autoClose","form","exception","pluck","isNumeric","preloadedFormData","getFormModel","disablePreview","enablePreview","changePreviewNicename","appDomains","preview","publish","changeCollection","cid","ChangeModel","registerChange","getCollection","maybeResetCollection","changes","dashicon","undoChanges","sort","change","undoAll","publishResponse","new_ids","newID","oldID","forms","history","replaceState","changeAppDomain","preventChange","enableChange","objPreventChange","maybePreventChange","mainEl","changePushState","pushState","location","href","reExp","toString","newUrl","changeHotkeys","addNewAction","changeDomainFields","changeDomainActions","changeDomainSettings","document","hotkey","msg","fieldsDomain","actionsDomain","settingsDomain","ignoreAttributes","setAppClean","attr","changedAttr","after","undoChangeSetting","undoAddObject","undoRemoveObject","undoDuplicateObject","undoSortFields","undoAddListOption","undoRemoveListOption","undoSortListOptions","before","maybeRemoveChange","objectModel","results","objectCollection","objModels","optionModel","cloneModelDeep","attributes","clonedCollection","newModel","getSettingChildView","settingChildView","object","maybePreventUI","updateKey","fieldsetView","settingCollection","createSettingsCollection","settingTypeModel","clickDuplicate","tmpID","tagSectionCollection","tagSection","tags","fieldTags","tag","getFieldKeyFormat","calcTags","calcCollection","calcModel","currentElement","clickMergeTag","addFieldTags","deleteFieldTags","updateCalcTags","updateCurrentElement","updateCurrentSetting","getSectionModel","replaceFieldKey","initMergeTags","mergeTagsView","jBoxes","closeOnEsc","maxHeight","onOpen","prev","onClose","tagModel","currentValue","currentPos","caret","newPos","substr","summernote","calcTag","getFieldKeyFormatCalc","fieldID","calc","openMergeTags","returnMergeTags","preventDefault","currentModel","upMergeTags","changeActiveTag","downMergeTags","dir","inc","currentIndex","nextModel","userInfo","system","updateOpen","newKey","oldTag","oldKey","_previousAttributes","oldVal","oldCalcKey","newCalcKey","re","RegExp","newVal","insertTag","mergeTagView","sectionFilter","searchFilter","filter","child","term","toLowerCase","removeActive","onClick","updateTags","setActive","siblings","mergeTagGroupView","keyup input","updateFilter","event","firstFilteredTag","sections","MergeTagModel","MergeTagLookupCollection","MergeTagView","MergeTagListView","MergeTagGroupView","MergeTagGroupListView","MergeTagFilterView","MergeTagBoxLayout","old","mergeTagsButtonClick","afterAppStart","beforeRenderSetting","beforeDrawerClose","bind","selector","focusCallback","keyupCallback","closest","layout","tagCollection","mergeTagListView","mergeTagGroupListView","getRegion","rteEditor","posY","outerHeight","boxHeight","repeaterRow","scrollLeft","posX","$input","hasClass","str","caretPos","patt","match","exec","string","childNode","childNodes","node","nodeValue","innerHTML","range","createRange","sel","getSelection","setStart","err","collapse","removeAllRanges","addRange","$this","$inputSetting","autocomplete","$overlayElement","dataID","so","mergetags","mergetag","elementClasses","confirmPublish","initSettingModel","destroySetting","meta_image_frame","icons","align","alignCenter","alignJustify","alignLeft","alignRight","indent","outdent","bold","close","code","eraser","italic","link","unlink","magic","minus","orderedlist","redo","square","table","underline","undo","unorderedlist","currentContext","initRTE","linkButton","mediaButton","toolbar","codemirror","lineNumbers","callbacks","onBlur","editor","getValue","updateDataModel","prettifyHtml","onFocus","onKeydown","onKeyup","linkMenu","replaceWith","class","removeRTE","linkDropdown","buttonGroup","contents","tooltip","clickLinkButton","toggle","dropdown","mergeTagsButton","openMediaManager","invoke","wp","media","frames","media_attachment","state","toJSON","insertMedia","textEl","urlEl","isNewWindowEl","isNewWindow","filename","trackKeyChanges","beforeRender","maybeSwitchToFieldsDomain","autoOpenDrawer","filterDrawerContents","SwitchToFieldsDomain","updateFieldMap","contains","fieldFilter","bail","fieldTypeModel","rubble","filterDrawer","switchDomain","fieldDomainModel","fieldListSettings","registerFieldListSettings","updateFieldListSettingKeys","changed","Radio","actionModel","lastChanged","oldValue","init","changedSettingValue","setRenderFalse","closeColorPickers","initColorPicker","wpColorPicker","color","editFormText","changeMenu","formPublish","isNewForm","highlightAddNew","appendEditForm","form_id","isNaN","closeMobileMenu","addNotice","closeNotice","notices","appDefaults","constructOnInit","stack","animation","mobileDefaults","desktopDefaults","openNotice","maybePrompt","viewFilters","saveFilters","loadFilters","addViewFilter","addSaveFilter","addLoadFilter","getViewFilters","getSaveFilters","getLoadFilters","priority","leftFilters","rightFilters","addLeftFilter","addRightFilter","getLeftFilters","getRightFilters","cloneCollectionDeep","constructor","keyDown","keyUp","getKeyDown","movedPos","initPerfectScroll","moveRail","resetRail","suppressScrollX","outerWidth","SettingCollection","settingGroupModel","SettingGroupCollection","getNewSettingGroupCollection","option","typeSectionModel","TypeCollection","SectionCollection","fieldTypeSections","registerSection","fieldTypeData","getFieldType","getTypeCollection","getTypeSections","getSavedFields","shiftKey","startDrag","stopDrag","getCurrentDraggableHelperClone","style","setProperty","draggableHelperClone","stagedFields","num","addStagedField","getStagingCollection","sortStagedFields","clearStagedFields","beforeCloseDrawer","now","tmpField","sortableEl","search","pos","receiveStagedFields","overStagedFields","outStagedFields","startStagedFields","stopStagedFields","addActiveClass","stagedFieldsEl","removeActiveClass","currentHelper","helperClone","filtered","filterCollection","found","alias","receiveFieldsSortable","overfieldsSortable","outFieldsSortable","stopFieldsSortable","startFieldsSortable","updateFieldsSortable","insertedAt","fieldWidth","dragFieldID","dragModel","oldPos","adding","removing","getFieldCollection","getField","redrawFieldCollection","getTmpFieldID","deleteField","sortFields","getAdding","setAdding","getRemoving","setRemoving","renderTrigger","savedType","updateFieldSetting","changeErrors","size","errorsFound","opt","listOptionModel","addOption","renderErrors","ErrorView","columns","parentView","hasErrors","keyup","changeOption","deleteOption","keyupOption","maybeAddOption","findByIndex","getColumns","renderFieldSelect","_return","selected","renderOptions","column","listOptionView","listEmptyView","listOptionCollection","optionCollection","handle","forcePlaceholderSize","importLink","closeButton","clickImport","renderHeaders","col","renderFieldsetClasses","currency_symbol","click .nf-add-new","clickAddOption","textarea","trimLeft","trimRight","lines","isArray","line","row","slugify","separator","listCompositeView","updateOptionSortable","stopOptionSortable","startOptionSortable","convertSettings","optionView","triggerDataModel","modelData","new","default","newOrder","clearEditActive","fieldSettings","getSettingModel","getSettingCollection","dropCreditCardField","newField","stageCreditCardField","ListOptionCollection","updateOptionLabel","updateOptionValue","convertOptions","select","confirm","insertField","productFields","getProductFields","addMask","newFieldKey","updateLabel","d","Date","valueOf","setError","keyExists","testKey","startWiggle","stopWiggle","initWiggle","ClassyWiggle","degrees","delay","updateField","modified","modelClone","fieldData","created_at","formID","newType","newTypeDefaults","settingDefaults","typeCollection","typeSections","addDatepicker","pikadayResponsive","actionTypeData","installed","available","getType","getInstalledActions","getAvailableActions","actionType","addAction","removeAction","getAction","getTmpID","deleteAction","actionSettings","dropActionType","type_slug","actionTypeModel","filterActionTypes","newInstalled","newAvailable","defaultFields","clickListUpdate","maybeRenderFields","maybeRenderGroups","registerFieldsListener","registerGroupsListener","updateFieldMapping","updateInterestGroups","updateLists","lists","always","selectedList","list","groups","group","formSettingTypeData","settingsModel","getSettings","updateCalc","sortCalc","checkName","checkEQ","checkDec","checkAllCalcs","nameExists","eq","errorSelfRef","errorFutureCalc","calcs","calculations","targetCalc","selfRef","futureCalc","dec","errorNonIntDec","checked","Math","abs","nonIntDec","Remote","Drawer","DrawerConfig","DomainConfig","AppData","DrawerToggleSettingGroup","UpdateDB","FormData","PreviewLink","AppMenuButtons","AppTrackChanges","AppUndoChanges","AppPublishResponse","AppChangeDomain","Pushstate","Hotkeys","CleanState","CoreUndo","CloneModelDeep","DrawerSettingChildView","ChangeSettingDefault","Fieldset","ToggleSetting","ItemControls","MergeTags","MergeTagsBox","ItemSettingFill","ConfirmPublish","RTE","SettingFieldSelect","SettingFieldList","SettingHTML","SettingColor","ChangeMenu","AppMobile","AppNotices","AppUnloadCheck","FormContentFilters","FormContentGutterFilters","CloneCollectionDeep","TrackKeyDown","PerfectScroll","GetNewSettingGroupCollection","SettingMedia","FieldTypes","FieldTypeDrag","FieldStagingDrag","StagedFieldsData","StagedFieldsSortable","DrawerFilterFieldTypes","MainContentFieldsSortable","FieldData","OptionRepeater","FieldsEditActive","FieldSettings","FieldCreditCard","FieldList","FieldPassword","FieldQuantity","FieldShipping","FieldKey","Notices","FieldsMobile","SavedFields","FieldDatepicker","FieldDisplayCalc","ActionTypes","ActionData","ActionSettings","ActionEditActive","ActionAddTypes","ActionTypeDrag","ActionDroppable","ActionFilterTypes","ActionNewsletterList","SettingTypes","SettingData","FormSettings","SettingsEditActive","SettingsClickEdit","AdvancedCalculations","doingShortcut","touch","renderRequired","required","getFieldID","renderIcon","mousedown","singletap","swipeleft","swiperight","tapend","maybeShortcut","maybeTapEdit","swipeLeft","startEvnt","swipeRight","renderTitle","fieldItemView","mainContentEmptyView","FormTitleView","getFieldItem","getMainContentEmpty","getFormTitle","ready","$","BuilderView","LoadControllers","LoadViews","NinjaForms","Application","Renderer","onStart","evaluate","interpolate","variable","ninjaForms"],"mappings":"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rgB,IAAA,SAAA8a,GACAuF,EAAAzoB,QAAA,gBAAAyoB,IAIA0gB,cAAA,SAAAlmC,GACA,GAAA3B,GAAArC,IACAgE,GAAAyG,OAAApP,IAAA,SAAAgmC,GACAh/B,EAAA0nC,UAAA1I,EAAA9/B,IAAA,QAAA8/B,GACAh/B,EAAA2nC,QAAA3I,EAAA9/B,IAAA,MAAA8/B,GACAh/B,EAAA4nC,SAAA5I,EAAA9/B,IAAA,OAAA8/B,OAMA,OAAAn0B,KC/LApT,EACA,+BAIA,yBACA,yBACA,+BACA,+BACA,uBACA,2CACA,2BACA,2BACA,8BACA,8BACA,+BACA,8BACA,kCACA,+BACA,4BACA,0BACA,6BACA,2BACA,iCACA,sCACA,uCACA,2BACA,gCACA,+BACA,4BACA,8BACA,kCACA,iCACA,sBACA,qCACA,mCACA,8BACA,+BACA,6BACA,yBACA,0BACA,8BACA,qCACA,2CACA,sCACA,+BACA,gCACA,+CACA,+BAIA,2BACA,mCACA,iCACA,6BACA,qCACA,iCACA,8BACA,0BACA,iCACA,gCACA,mCACA,qCACA,+BACA,mCACA,mCACA,mCACA,yBACA,6BACA,4BACA,iCACA,qCACA,sCAKA,4BACA,2BACA,qCACA,iCACA,qCACA,+BACA,gCACA,kCACA,qCAKA,6BACA,4BACA,oCACA,kCACA,iCACA,qCAEA,SAIAoxC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAIAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GACAC,GACAC,GAC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","file":"builder.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","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menuItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-app-menu-item',\n\n\t\tinitialize: function() {\n\t\t\t// Listen for domain changes and re-render when we detect one.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// Listen for clicks on our app menu.\n\t\tevents: {\n\t\t\t'click a': 'clickAppMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click on a menu item, fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * We pass this.model so that we know what item was clicked.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\te event\n\t\t * @return return\n\t\t */\n\t\tclickAppMenu: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t\t\t\t * If we have any dashicons in our model, render them.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDashicons: function() {\n\t\t\t\t\tif ( this.dashicons ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.dashicons + '\"></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\t\t\t\t/**\n\t\t\t\t * Render classes for our menu item, including active.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\n\t\t\t\t\t\tclasses += ' active';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its url.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderUrl: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\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\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its target.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderTarget: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\treturn '_blank';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '_self';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * If our menu item is disabled, output 'disabled'\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\tif ( this.disabled ) {\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\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Collection view that takes our app menu items and renders an individual view for each.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menu',['views/app/menuItem'], function( appMenuItemView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: appMenuItemView,\n\n\t\t/**\n\t\t * When we show this view, get rid of the extra <div> tag added by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonShow: function() {\n\t\t\tjQuery( this.el ).find( 'li:last' ).unwrap();\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Renders the action buttons to the right of the app menu. i.e. Publish\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menuButtons',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'span',\n\t\ttemplate: '#tmpl-nf-app-header-action-button',\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:loading', this.render, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.bounceIcon, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t \t\t/**\n\t \t\t * Render our Publish button. If we're loading, render the loading version.\n\t \t\t *\n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\trenderPublish: function() {\n\t \t\t\tif ( that.publishWidth ) {\n\t \t\t\t\tthis.publishWidth = 'style=\"width:' + that.publishWidth + 'px !important\"';\n\t \t\t\t} else {\n\t \t\t\t\tthis.publishWidth = '';\n\t \t\t\t}\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'loading' ) ) {\n\t \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-header-publish-loading' );\n\t \t\t\t} else {\n\t \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-app-header-publish-button' );\n\t \t\t\t}\n\t \t\t\treturn template( this );\n\t \t\t},\n\n\t \t\t/**\n\t \t\t * If our app state is clean, disable publish.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\n\t \t\t/**\n\t \t\t * If our app isn't clean, render our 'viewChanges' button.\n\t \t\t * @since version\n\t \t\t * @return {[type]} [description]\n\t \t\t */\n\t \t\tmaybeRenderCancel: function() {\n\t \t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\tvar viewChanges = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-app-header-view-changes' );\n\t \t\t\t\treturn viewChanges( this );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tvar publishEL = jQuery( this.el ).find( '.publish' );\n\t\t\t// this.publishWidth = jQuery( publishEL ).outerWidth( true );\n\t\t},\n\n\t\t/**\n\t\t * Listen for clicks on the Publish or view changes button.\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .publish': 'clickPublish',\n\t\t\t'click .viewChanges': 'clickViewChanges'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\n\t\t},\n\n\t\t/**\n\t\t * When we click view changes, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickViewChanges: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:viewChanges', e );\n\t\t},\n\n\t\tbounceIcon: function( changeModel ) {\n\t\t\tjQuery( this.el ).find( '.dashicons-backup' ).effect( 'bounce', { times: 3 }, 600 );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders the action buttons to the right of the app menu. i.e. Publish\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenuButton',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'span',\n\t\ttemplate: '#tmpl-nf-mobile-menu-button',\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\t/**\n\t \t\t * If our app state is clean, disable button.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t}\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Listen for clicks on the mobile menu button.\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .nf-mobile-menu': 'clickMobileMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickMobileMenu: function( e) {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Main application header. Includes links to all of our domains.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/header',['views/app/menu', 'views/app/menuButtons', 'views/app/mobileMenuButton'], function( appMenuCollectionView, appMenuButtonsView, mobileMenuButtonView ) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-app-header',\n\n\t\tregions: {\n\t\t\t// Menu is our main app menu.\n\t\t\tmenu: '.nf-app-menu',\n\t\t\t// Buttons represents the 'view changes' and 'Publish' buttons.\n\t\t\tbuttons: '.nf-app-buttons',\n\t\t\tmobileMenuButton: '.nf-mobile-menu-button'\n\t\t},\n\n\t\t/**\n\t\t * Since this is a layout region, we need to fill the two areas: menu and buttons whenever we show this view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonRender: function() {\n\t\t\t// Get our domains\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\t// show the menu area using the appropriate view, passing our domain collection.\n\t\t\tthis.menu.show( new appMenuCollectionView( { collection: appDomainCollection } ) );\n\t\t\tthis.buttons.show( new appMenuButtonsView() );\n\t\t\tthis.mobileMenuButton.show( new mobileMenuButtonView() );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click #nf-logo': 'clickLogo'\n\t\t},\n\n\t\tclickLogo: function( e ) {\n\t\t\t\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Renders our sub-header. i.e. add new field, add new action, etc.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our builder header.\n *\n * This is a layout view and handles two regions:\n * app - menu/buttons\n * subapp - title, add new field, etc.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/builderHeader',[ 'views/app/header', 'views/app/subHeader' ], function( appHeaderView, appSubHeaderView ) {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: \"div\",\n\t\ttemplate: \"#tmpl-nf-header\",\n\n\t\tregions: {\n\t\t\tapp: \"#nf-app-header\",\n\t\t\tformTitle: \"#nf-app-form-title\",\n\t\t\tappSub: \"#nf-app-sub-header\"\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changeSubHeader );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.app.show( new appHeaderView() );\n\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar formSettings = formData.get( 'settings' );\n\n\t\t\tvar formTitleView = nfRadio.channel( 'views' ).request( 'get:formTitle' );\n\t\t\tthis.formTitle.show( new formTitleView( { model: formSettings } ) );\n\n\t\t\tthis.changeSubHeader();\n\t\t},\n\n\t\tchangeSubHeader: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar subHeaderView = currentDomain.get( 'getSubHeaderView' ).call( currentDomain );\n\t\t\tthis.appSub.show( subHeaderView );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our builder.\n *\n * This is a layout view and handles three regions:\n * gutterLeft - gutter to the left of our main content area\n * body - main content area\n * gutterRight - gutter to the right of our main content area\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/main',[], function() {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main',\n\t\tclassName: 'nf-main-test',\n\t\tmaybeDone: false,\n\n\t\toffsetRight: false,\n\t\toffsetLeft: false,\n\n\t\tregions: {\n\t\t\tgutterLeft: '#nf-main-gutter-left',\n\t\t\tbody: '#nf-main-body',\n\t\t\tgutterRight: '#nf-main-gutter-right'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:mainEl', this.getMainEl, this );\n\n\t\t\t/*\n\t\t\t * Make sure that our gutters resize to match our screen upon resize or drawer open/close.\n\t\t\t */\n\t\t\tjQuery( window ).on( 'resize', { context: this }, this.resizeBothGutters );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:open', this.setBothGuttersAbsolute );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.setBothGuttersFixed );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.setBothGuttersAbsolute );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.setBothGuttersFixed );\n\n\t\t\t/*\n\t\t\t * Reply to messages requesting that we resize our gutters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:gutters', this.updateGutters, this );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tnfRadio.channel( 'main' ).trigger( 'show:main', this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar bodyView = currentDomain.get( 'getMainContentView' ).call( currentDomain );\n\t\t\tthis.body.show( bodyView );\n\n\t\t\tvar gutterLeftView = currentDomain.get( 'getGutterLeftView' ).call( currentDomain );\n\t\t\tthis.gutterLeft.show( gutterLeftView );\n\n\t\t\tvar gutterRightView = currentDomain.get( 'getGutterRightView' ).call( currentDomain );\n\t\t\tthis.gutterRight.show( gutterRightView );\n\t\t\t\n\t\t\tnfRadio.channel( 'main' ).trigger( 'render:main' );\n\t\t},\n\n\t\tgetMainEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tonAttach: function() {\n\t\t\tthis.initialGutterResize();\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( window ).off( 'resize', this.resize );\n\t\t},\n\n\t\tinitialGutterResize: function() {\n\t\t\tthis.resizeGutter( this.gutterLeft.el );\n\t\t\tthis.resizeGutter( this.gutterRight.el );\n\t\t\tthis.setBothGuttersFixed( this );\n\t\t},\n\n\t\tresizeBothGutters: function( e ) {\n\t\t\tvar context = ( e ) ? e.data.context : this;\n\n\t\t\tvar leftEl = context.gutterLeft.el;\n\t\t\tvar rightEl = context.gutterRight.el;\n\t\t\t\n\t\t\tcontext.resizeGutter( leftEl, context );\n\t\t\tcontext.resizeGutter( rightEl, context );\n\n\t\t\tcontext.setBothGuttersAbsolute( context );\n\n\t\t\t/*\n\t\t\t * Clear our timeout. If the timeout runs, it means we've stopped resizing.\n\t\t\t */\t\n\t\t\tclearTimeout( context.maybeDone );\n\t\t\t/*\n\t\t\t * Add our timeout.\n\t\t\t */\n\t\t\tcontext.maybeDone = setTimeout( context.setBothGuttersFixed, 100, context );\n\t\t},\n\n\t\tresizeGutter: function( el, context ) {\n\t\t\tvar top = jQuery( el ).offset().top;\n\t\t\tvar viewHeight = jQuery( window ).height();\n\t\t\tvar height = viewHeight - top;\n\t\t\tjQuery( el ).height( height );\n\t\t},\n\n\t\tsetBothGuttersFixed: function( context ) {\n\t\t\tcontext = context || this;\n\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\tvar topLeft = offsetLeft.top;\n\t\t\tvar leftLeft = offsetLeft.left;\n\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'fixed', left: leftLeft, top: topLeft } );\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\t\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\n\t\t\tvar topRight = offsetRight.top;\n\t\t\tvar leftRight = offsetRight.left;\n\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'fixed', left: leftRight, top: topRight } );\n\t\t},\n\n\t\tsetBothGuttersAbsolute: function( context ) {\n\t\t\tcontext = context || this;\n\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\n\n\t\t\tvar scrollTop = jQuery( '#nf-main' ).scrollTop();\n\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'absolute', left: 0, top: scrollTop } );\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'absolute', top: scrollTop, right: 0, left: 'auto' } );\n\t\t},\n\n\t\tupdateGutters: function() {\n\t\t\tthis.resizeBothGutters();\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenuItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-mobile-menu-item',\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// Listen for clicks on our app menu.\n\t\tevents: {\n\t\t\t'click a': 'clickAppMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click on a menu item, fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * We pass this.model so that we know what item was clicked.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\te event\n\t\t * @return return\n\t\t */\n\t\tclickAppMenu: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t\t\t\t * If we have any dashicons in our model, render them.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDashicons: function() {\n\t\t\t\t\tif ( this.mobileDashicon ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.mobileDashicon + '\"></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\t\t\t\t/**\n\t\t\t\t * Render classes for our menu item, including active.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\n\t\t\t\t\t\tclasses += ' active';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its url.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderUrl: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\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\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its target.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderTarget: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\treturn '_blank';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '_self';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * If our menu item is disabled, output 'disabled'\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\tif ( this.disabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Single item view used for the menu drawer.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenu',['views/app/mobileMenuItem'], function( mobileMenuItemView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-mobile-menu',\n\t\tchildView: mobileMenuItemView,\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.secondary' ).append( childView.el );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t \t\t * If our app state is clean, disable button.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-publish': 'clickPublish'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Empty drawer content view.\n * Called before we close the drawer.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our drawer region\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer',['views/app/drawer/contentEmpty'], function( drawerEmptyView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer',\n\n\t\tregions: {\n\t\t\theader: '#nf-drawer-header',\n\t\t\tcontent: '#nf-drawer-content',\n\t\t\tfooter: '#nf-drawer-footer'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerEl', this.getEl, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'load:drawerContent', this.loadContent, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'empty:drawerContent', this.emptyContent, this );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).parent().perfectScrollbar();\n\t\t\t}\n\t\t},\n\n\t\tloadContent: function( drawerID, data ) {\n\t\t\tvar drawer = nfRadio.channel( 'app' ).request( 'get:drawer', drawerID );\n\t\t\tvar contentView = drawer.get( 'getContentView' ).call( drawer, data );\n\t\t\tvar headerView = drawer.get( 'getHeaderView' ).call( drawer, data );\n\t\t\tvar footerView = drawer.get( 'getFooterView' ).call( drawer, data );\n\n\t\t\tthis.header.show( headerView );\n\t\t\tthis.content.show( contentView );\n\t\t\tthis.footer.show( footerView );\n\n\t\t},\n\n\t\temptyContent: function() {\n\t\t\tthis.header.empty();\n\t\t\tthis.content.empty();\n\t\t\tthis.footer.empty();\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-toggle-drawer': 'clickToggleDrawer'\n\t\t},\n\n\t\tclickToggleDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:toggleDrawerSize' );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Single item view used for merge tags.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'li',\n\n\t\ttemplate: '#tmpl-nf-merge-tags-item',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:active', this.render );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:active', this.render, this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click a': 'clickTag'\n\t\t},\n\n\t\tclickTag: function( e ) {\n\t\t\tnfRadio.channel( 'mergeTags' ).trigger( 'click:mergeTag', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tif ( this.active ) {\n\t\t\t\t\t\treturn 'active';\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Merge tags popup section\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagsSection',['views/app/drawer/mergeTagItem'], function( mergeTagItemView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttagName: 'div',\n\t\tchildView: mergeTagItemView,\n\t\ttemplate: '#tmpl-nf-merge-tags-section',\n\n\t\tinitialize: function() {\n\t\t\tthis.collection = this.model.get( 'tags' );\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\n\t\t\t\t// var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t// fieldCollection.on( 'all', this.updateFields, this );\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change', this.render );\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\tfieldCollection.off( 'all', this.updateFields, this );\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.merge-tags' ).append( childView.el );\n\t\t},\n\n\t\tupdateFields: function() {\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tthis.model.set( 'tags', fieldCollection );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Model that represents our merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tactive: false,\n\t\t\texclude: false\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collections of merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: mergeTagModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Merge tags popup\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagsContent',['views/app/drawer/mergeTagsSection', 'models/app/mergeTagCollection'], function( mergeTagsSectionView, MergeTagCollection ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-merge-tags-content',\n\t\tchildView: mergeTagsSectionView,\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:view', this.getMergeTagsView, this );\n\t\t},\n\n\t\treRender: function( settingModel ) {\n\t\t\tvar mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n\t\t\tvar defaultGroups = mergeTagCollection.where( { default_group: true } );\n\n\t\t\t/*\n\t\t\t * For the Actions Domain, Add Calc Merge Tags as a Default Group.\n\t\t\t */\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tif( 'actions' == currentDomain.get( 'id' ) ){\n\t\t\t\tvar calcMergeTagGroup = mergeTagCollection.where( { id: 'calcs' } );\n defaultGroups = defaultGroups.concat( calcMergeTagGroup );\n }\n\n\t\t\tthis.collection = new MergeTagCollection( defaultGroups );\n\t\t\tvar that = this;\n\t\t\tvar useMergeTags = settingModel.get( 'use_merge_tags' );\n\t\t\tif ( 'object' == typeof useMergeTags ) {\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.exclude ) {\n\t\t\t\t\t_.each( useMergeTags.exclude, function( exclude ) {\n\t\t\t\t\t\tthat.collection.remove( exclude )\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.include ) {\n\t\t\t\t\t_.each( mergeTagCollection.models, function( sectionModel ) {\n\t\t\t\t\t\tif ( -1 != useMergeTags.include.indexOf( sectionModel.get( 'id' ) ) ) {\n\t\t\t\t\t\t\t// console.log( sectionModel );\n\t\t\t\t\t\t\tthat.collection.add( sectionModel );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.render();\n\t\t},\n\n\t\tgetMergeTagsView: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Builder view.\n *\n * This layout view has regions that represent our application areas:\n * header\n * main\n * menuDrawer - Mobile side-menu\n * drawer\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/builder',['views/app/builderHeader', 'views/app/main', 'views/app/mobileMenu', 'views/app/drawer', 'views/app/drawer/mergeTagsContent'], function( headerView, mainView, mobileMenuView, drawerView, mergeTagsContentView ) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: \"#tmpl-nf-builder\",\n\t\tel: '#nf-builder',\n\n\t\tregions: {\n\t\t\theader: \"#nf-header\",\n\t\t\tmain: \"#nf-main\",\n\t\t\tmenuDrawer: \"#nf-menu-drawer\",\n\t\t\tdrawer: \"#nf-drawer\",\n\t\t\tmergeTagsContent: '.merge-tags-content'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Respond to requests asking for the builder dom element.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderEl', this.getBuilderEl, this );\n\t\t\t// Respond to requests asking for the builder view\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderView', this.getBuilderView, this );\n\t\t\t// Layout views aren't self-rendering.\n\t\t\tthis.render();\n\t\t\tvar mergeTags = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n\t\t\tvar mergeTagsClone = mergeTags.clone();\n\t\t\tthis.mergeTagsContent.show( new mergeTagsContentView( { collection: mergeTagsClone } ) );\n\t\t\t// Show our header.\n\t\t\tthis.header.show( new headerView() );\n\t\t\t// Show our main content.\n\t\t\tthis.main.show( new mainView() );\n\t\t\t// Show our mobile menu\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tthis.menuDrawer.show( new mobileMenuView( { collection: appDomainCollection } ) );\n\t\t\t// Show our drawer.\n\t\t\tthis.drawer.show( new drawerView() );\n\n\n\t\t},\n\n\t\tonRender: function() {\n\n\t\t},\n\n\t\tgetBuilderEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\tgetBuilderView: function() {\n\t\t\treturn this;\n\t\t},\n\n\t\t// Listen for clicks\n\t\tevents: {\n\t\t\t'click .nf-open-drawer': 'openDrawer',\n\t\t\t'click .nf-change-domain': 'changeDomain',\n\t\t\t'click .nf-close-drawer': 'closeDrawer'\n\t\t},\n\n\t\t/**\n\t\t * Someone clicked to open a drawer, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Object \te \tevent\n\t\t * @return void\n\t\t */\n\t\topenDrawer: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:openDrawer', e );\n\t\t},\n\t\t/**\n\t\t * Someone clicked to close a drawer, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tcloseDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:closeDrawer' );\n\t\t},\n\t\t/**\n\t\t * Someone clicked to change the domain, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Object \te \tevent\n\t\t * @return void\n\t\t */\n\t\tchangeDomain: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n\n","\ndefine( 'controllers/app/remote',[], function() {\n return Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'setting' ), 'remote', this.addListener );\n },\n\n addListener: function( model, dataModel ) {\n\n var listenTo = model.get( 'remote' ).listen;\n\n // TODO: Change seems to be triggering twice on each update.\n this.listenTo( nfRadio.channel( 'fieldSetting-' + listenTo ), 'update:setting', this.updateSetting );\n this.listenTo( nfRadio.channel( 'actionSetting-' + listenTo ), 'update:setting', this.updateSetting );\n\n this.listenTo( nfRadio.channel( 'setting-type-' + model.get( 'type' ) ), 'click:extra', this.clickExtra );\n\n model.listenTo( nfRadio.channel( 'setting-remote' ), 'get:remote', this.getRemote, model );\n\n // Auto-trigger get:remote on drawer load.\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n clickExtra: function( e, settingModel, dataModel, settingView ) {\n jQuery( e.srcElement ).addClass( 'spin' );\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n updateSetting: function( dataModel, settingModel ) {\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n getRemote: function( dataModel ) {\n\n var remote = this.get( 'remote' );\n\n var data = {\n parentValue: dataModel.get( remote.listen ),\n action: remote.action,\n security: ( remote.security ) ? remote.security : nfAdmin.ajaxNonce\n };\n\n // TODO: Disable setting and lock drawer while updating.\n var that = this;\n jQuery.post( ajaxurl, data, function( response ){\n var response = JSON.parse( response );\n\n if( 'textbox' == that.get( 'type' ) ) {\n dataModel.set( that.get('name'), response.value );\n }\n\n if( 'select' == that.get( 'type' ) ) {\n that.set( 'options', response.options );\n that.trigger( 'rerender' );\n }\n });\n },\n\n });\n} );\n","/**\n * Handles opening and closing our drawer. This is where we display settings for fields, actions, and settings.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawer',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our drawer-related click events.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:openDrawer', this.clickOpenDrawer );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:closeDrawer', this.closeDrawer );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:toggleDrawerSize', this.toggleDrawerSize );\n\n\t\t\t// Reply to direct requests to open or close the drawer.\n\t\t\tnfRadio.channel( 'app' ).reply( 'open:drawer', this.openDrawer, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'close:drawer', this.closeDrawer, this );\n\n\t\t\t/*\n\t\t\t * When we close the drawer, we have to figure out what the right position should be.\n\t\t\t * This listens to requests from other parts of our app asking what the closed right position is.\n\t\t\t */\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:closedRightPos', this.getClosedDrawerPos, this );\n\t\t\t\n\t\t\t// Reply to requests to prevent our drawer from closing\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'prevent:close', this.preventClose, this );\n\t\t\t// Reply to requests to enable drawer closing\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'enable:close', this.enableClose, this );\n\t\t\t// Reply to requests for our disabled/enabled state.\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:preventClose', this.maybePreventClose, this );\n\n\t\t\t/*\n\t\t\t * Object that holds our array of 'prevent close' values.\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\n\t\t\t */\n\t\t\tthis.objPreventClose = {};\n\n\t\t\t/*\n\t\t\t * Listen to focus events on the filter and stop our interval when it happens.\n\t\t\t * This is to fix a bug that can cause the filter to gain focus every few seconds.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:focused', this.filterFocused );\n\t\t},\n\n\t\t/**\n\t\t * Handles closing our drawer\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tcloseDrawer: function() {\n\t\t\t// Get our current domain.\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\n\t\t\tif ( ! currentDrawer || this.maybePreventClose() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Triggers the before close drawer action on our current domain's drawer channel.\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'before:closeDrawer' );\n\t\t\t/*\n\t\t\t * The 'before:closeDrawer' message is deprecated as of version 3.0 in favour of 'before:close'.\n\t\t\t * TODO: Remove this radio message in the future.\n\t\t\t */\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:closeDrawer' );\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:close' );\n\t\t\t\n\t\t\t// Send a message to our drawer to empty its contents.\n\t\t\tnfRadio.channel( 'drawer' ).request( 'empty:drawerContent' );\n\n\t\t\t// To close our drawer, we have to add our closed class to the builder and remove the opened class.\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-closed' ).removeClass( 'nf-drawer-opened' );\n\t\t\tjQuery( builderEl ).removeClass( 'disable-main' );\n\n\t\t\t// Get the right position of our closed drawer. Should be container size in -px.\n\t\t\tvar rightClosed = this.getClosedDrawerPos();\n\n\t\t\t// Get our drawer element and give change the 'right' property to our closed position.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tjQuery( drawerEl ).css( { 'right': rightClosed } );\n\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've closed the drawer.\n\t\t\t *\n\t\t\t * Once our drawer is closed, we:\n\t\t\t * clear our interval\n\t\t\t * request that the app change it's current drawer to false\n\t\t\t * trigger a drawer closed message\n\t\t\t */\n\t\t\tthis.checkCloseDrawerPos = setInterval( function() {\n\t \tif ( rightClosed == jQuery( drawerEl ).css( 'right' ) ) {\n\t \t\tclearInterval( that.checkCloseDrawerPos );\n\t\t \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', false );\n\t\t \t\tnfRadio.channel( 'drawer' ).trigger( 'closed' );\n\t\t \t\t/*\n\t\t \t\t * Reset the add new button z-index to 98.\n\t\t \t\t */\n\t\t \t\tjQuery( '.nf-master-control' ).css( 'z-index', 98 );\n\t\t \t\t// jQuery( drawerEl ).scrollTop( 0 );\n\t \t}\n\t\t\t}, 150 );\n\t\t},\n\n\t\t/**\n\t\t * Click handler for our 'open drawer' event.\n\t\t * @since 3.0\n\t\t * @param e jQuery event\n\t\t * @return void\n\t\t */\n\t\tclickOpenDrawer: function( e ) {\n\t\t\tvar drawerID = jQuery( e.target ).data( 'drawerid' );\n\t\t\tthis.openDrawer( drawerID );\n\t\t},\n\n\t\t/**\n\t\t * Open our drawer.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string drawerID \tID of the drawer we want to open.\n\t\t * @param object data \tOptional data that we want to pass to the drawer.\n\t\t * @return void\n\t\t */\n\t\topenDrawer: function( drawerID, data ) {\n\t\t\tif ( this.maybePreventClose() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If we haven't sent a data object, set the variable to an empty object.\n\t\t\tdata = data || {};\n\n\t\t\t/*\n\t\t\t * If we're dealing with something that has a model, set the proper active state.\n\t\t\t *\n\t\t\t * TODO: Make this more dynamic. I'm not sure that it fits in the drawer controller.\n\t\t\t */\n\t\t\tif ( 'undefined' != typeof data.model ) {\n\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\t\tnfRadio.channel( currentDomainID ).request( 'clear:editActive' );\n\t\t\t\tdata.model.set( 'editActive', true );\n\t\t\t\tthis.dataModel = data.model;\n\t\t\t}\n\n\t\t\t// Send out a message requesting our drawer view to load the content for our drawer ID.\n\t\t\tnfRadio.channel( 'drawer' ).request( 'load:drawerContent', drawerID, data );\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:open' );\n\t\t\t\n\t\t\t// To open our drawer, we have to add our opened class to our builder element and remove the closed class.\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-opened' ).removeClass( 'nf-drawer-closed' );\n\t\t\t\n\t\t\t// To open our drawer, we have to set the right position of our drawer to 0px.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tjQuery( drawerEl ).css( { 'right': '0px' } );\n\t\t\t\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've opened the drawer.\n\t\t\t *\n\t\t\t * Once our drawer is opened, we:\n\t\t\t * clear our interval\n\t\t\t * focus our filter\n\t\t\t * request that the app update its current drawer to the one we opened\n\t\t\t * trigger a drawer opened message\n\t\t\t */\n\t\t\tthis.hasFocus = false;\n\n\t\t\t/*\n\t\t\t * Set our add new button z-index to 0;\n\t\t\t */\n\t\t\tjQuery( '.nf-master-control' ).css( 'z-index', 0 );\n\n\t\t\tthis.checkOpenDrawerPos = setInterval( function() {\n\t \tif ( '0px' == jQuery( drawerEl ).css( 'right' ) ) {\n\t \t\tclearInterval( that.checkOpenDrawerPos );\n\t\t\t\t\tif ( ! that.hasFocus ) {\n\t\t \t\tthat.focusFilter();\n\t\t\t\t\t\tthat.hasFocus = true;\n\t\t\t \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', drawerID );\n\t\t\t \t\tjQuery( drawerEl ).scrollTop( 0 );\n\t\t\t \t\tnfRadio.channel( 'drawer' ).trigger( 'opened' );\n\t\t\t\t\t} \t\t\n\t \t}\n\t\t\t}, 150 );\n\t\t},\n\n\t\t/**\n\t\t * Toggle the drawer from half to full screen and vise-versa\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\ttoggleDrawerSize: function() {\n\t\t\t// Get our drawer element.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\t// toggle our drawer size class.\n\t\t\tjQuery( drawerEl ).toggleClass( 'nf-drawer-expand' );\n\t\t},\n\n\t\t/**\n\t\t * Focus our filter\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n focusFilter: function() {\n \t// Get our filter element\n \tvar filterEl = nfRadio.channel( 'drawer' ).request( 'get:filterEl' );\n \t// Focus\n \tjQuery( filterEl ).focus();\n },\n\n /**\n * Get the CSS right position (in px) of the closed drawer element.\n * This is calculated by:\n * getting the width of the builder element\n * add 300 pixels\n * make it negative\n * \n * @since 3.0\n * @return void\n */\n getClosedDrawerPos: function() {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tvar closedPos = jQuery( builderEl ).width() + 300;\n\t\t\treturn '-' + closedPos + 'px';\n },\n\n /**\n * Check to see if anything has registered a prevent close key.\n * \n * @since 3.0\n * @return boolean\n */\n maybePreventClose: function() {\n \tif ( 0 == Object.keys( this.objPreventClose ).length ) {\n \t\treturn false;\n \t} else {\n \t\treturn true;\n \t}\n },\n\n /**\n * Register a prevent close key.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent close' setting.\n * @return void\n */\n preventClose: function( key ) {\n \tthis.objPreventClose[ key ] = true;\n \t/*\n \t * When we disable closing the drawer, add the disable class.\n \t */\n \t// Get our current drawer.\n\t\t\tthis.dataModel.set( 'drawerDisabled', true );\n },\n\n /**\n * Remove a previously registered prevent close key.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent close' setting.\n * @return void\n */\n enableClose: function( key ) {\n \tdelete this.objPreventClose[ key ];\n \t /*\n \t * When we remove all of our disables preventing closing the drawer, remove the disable class.\n \t */\n \tif ( ! this.maybePreventClose() && 'undefined' != typeof this.dataModel ) {\n\t \t// Get our current drawer.\n\t\t\t\tthis.dataModel.set( 'drawerDisabled', false ); \t\t\n \t}\n },\n\n /**\n * When we focus our filter, make sure that our open drawer interval is cleared.\n * \n * @since 3.0\n * @return void\n */\n filterFocused: function() {\n \tclearInterval( this.checkOpenDrawerPos );\n },\n\n getPreventClose: function() {\n \treturn this.objPreventClose;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * Default drawer header.\n *\n * Includes our filter/search and 'Done' button.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerDefault',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-default',\n\n\t\tinitialize: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\t// Listen for our drawer being disabled.\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When we render, remove the extra div added by backbone and add listeners related to our filter.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonRender: function() {\n\t\t\t// Remove extra wrapping div.\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\t\t\t// Respond to requests related to our filter.\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'clear:filter', this.clearFilter, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'blur:filter', this.blurFilter, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:filterEl', this.getEl, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'keyup .nf-filter'\t: 'maybeChangeFilter',\n\t\t\t'input .nf-filter'\t: 'changeFilter',\n\t\t\t'focus input'\t\t: 'getFocus'\n\t\t},\n\n\t\t/**\n\t\t * When the filter text is changed, trigger an event on our current drawer.\n\t\t * This lets us keep the logic separate from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tchangeFilter: function( e ) {\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'change:filter', e.target.value, e );\n\t\t},\n\n\t\t/**\n\t\t * The user pressed a key. If it's the enter key, then run the change filter function.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tmaybeChangeFilter: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\te.addObject = true;\n\t\t\t\tthis.changeFilter( e );\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Clear our filter.\n\t\t *\n\t\t * This triggers 'input' on the field, which will trigger a change if necessary.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tclearFilter: function() {\n\t\t\tvar filterEl = jQuery( this.el ).find( '.nf-filter' );\n\t\t\tif ( '' != jQuery.trim( filterEl.val() ) ) {\n\t\t\t\tfilterEl.val('');\n\t\t\t\tfilterEl.trigger( 'input' );\n\t\t\t\tfilterEl.focus();\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fire the 'blur' event on our filter. Used to force a change event when the user tabs.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tblurFilter: function() {\n\t\t\tjQuery( this.el ).find( '.nf-filter' ).blur();\n\t\t},\n\n\t\t/**\n\t\t * Return our filter dom element.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).find( '.nf-filter' );\n\t\t},\n\n\t\tgetFocus: function() {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'filter:focused' );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\t// Get our current domain.\n\t\t\t\t\tif ( this.drawerDisabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Default drawer footer\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/footerDefault',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","define( 'models/app/drawerModel',['views/app/drawer/headerDefault', 'views/app/drawer/footerDefault'], function( defaultHeaderView, defaultFooterView ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tgetHeaderView: function( data ) {\n\t\t\t\treturn new defaultHeaderView( data );\n\t\t\t},\n\n\t\t\tgetFooterView: function( data ) {\n\t\t\t\treturn new defaultFooterView( data );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds all of our drawer models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/drawerCollection',['models/app/drawerModel'], function( drawerModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: drawerModel\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/drawer/stagedField',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-staged-field',\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\tevents: {\n\t\t\t'click .dashicons-dismiss': 'removeStagedField'\n\t\t},\n\n\t\tremoveStagedField: function( el ) {\n\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'click:removeStagedField', el, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/stagingEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-staged-fields-empty',\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/fields/drawer/stagingCollection',['views/fields/drawer/stagedField', 'views/fields/drawer/stagingEmpty'], function( stagedFieldView, stagedFieldsEmptyView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: stagedFieldView,\n\t\temptyView: stagedFieldsEmptyView,\n\n\t\tactiveClass: 'nf-staged-fields-active', // CSS Class for showing the reservoir.\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:stagedFieldsEl', this.getStagedFieldsEl, this );\n\t\t},\n\n\t\tonShow: function() {\n\n\t\t\tthis.$el = jQuery( this.el ).parent();\n\t\t\tjQuery( this.$el ).find( 'span:first' ).unwrap();\n\t\t\tthis.setElement( this.$el );\n\n\t\t\tvar that = this;\n\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\tplaceholder: 'nf-staged-fields-sortable-placeholder',\n\t\t\t\thelper: 'clone',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'over:stagedFields', e, ui );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'out:stagedFields', ui );\n\t\t\t\t},\n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'receive:stagedFields', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'start:stagedFields', ui );\n\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stop:stagedFields', ui );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tjQuery( this.el ).parent().draggable( {\n\t\t\t\topacity: 0.9,\n\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\n\t\t\t\tappendTo: '#nf-main',\n\t\t\t\trefreshPositions: true,\n\t\t\t\tgrid: [ 3, 3 ],\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\thelper: function( e ) {\n\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\n\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\n\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\n\t\t\t\t\tvar left = width / 4;\n\t\t\t\t\tvar top = height / 2;\n\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\n\t\t\t\t\tjQuery( element ).zIndex( 1000 );\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:fieldStaging', this, ui );\n\t\t\t\t},\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:fieldStaging', this, ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tgetStagedFieldsEl: function() {\n\t\t\treturn jQuery( this.el );\n\t\t},\n\n\t\tonAddChild: function() {\n\t\t\tjQuery( this.el ).addClass( this.activeClass );\n\t\t},\n\n\t\tonRemoveChild: function() {\n\t\t\tif( this.hasStagedFields() ) return;\n\t\t\tjQuery( this.el ).removeClass( this.activeClass );\n\t\t},\n\n\t\thasStagedFields: function() {\n\t\t\treturn 0 != this.collection.length;\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Model for our staged field.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/stagingModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection of staged fields.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/stagingCollection',['models/fields/stagingModel'], function( stagingModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: stagingModel,\n\t\tcomparator: 'order'\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/drawer/typeSection',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-field-type-section',\n\n\t\tinitialize: function() {\n\t\t\t_.bindAll( this, 'render' );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSection', this.getTypeSection, this );\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\tthis.dragging = false;\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * If we're on a mobile device, we don't want to enable dragging for our field type buttons.\n\t\t\t */\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).find( 'div.nf-field-type-draggable' ).draggable( {\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\ttolerance: 'pointer',\n\t\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\n\t\t\t\t\trefreshPositions: true,\n\t\t\t\t\tgrid: [ 5, 5 ],\n\t\t\t\t\tappendTo: '#nf-builder',\n\n\t\t\t\t\thelper: function( e ) {\n\t\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\n\t\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\n\t\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\n\t\t\t\t\t\tvar left = width / 4;\n\t\t\t\t\t\tvar top = height / 2;\n\t\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\n\t\t\t\t\t\tjQuery( element ).zIndex( 1000 );\n\t\t\t\t\t\treturn element;\n\t\t\t\t\t},\n\n\t\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = true;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = false;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tdrag: function(e, ui) {\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drag:type', this, ui, e );\t\n\t\t\t\t\t}\n\n\t\t\t\t} ).disableSelection();\n\n\t\t\t\tjQuery( this.el ).find( '.nf-item' ).focus( function() {\n\t\t\t \tjQuery( this ).addClass( 'active' );\n\t\t\t } ).blur( function() {\n\t\t\t \tjQuery( this ).removeClass( 'active' );\n\t\t\t } );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-item': 'clickFieldType',\n\t\t\t'keydown .nf-item': 'maybeClickFieldType',\n\t\t\t'mousedown .nf-item': 'mousedownFieldType'\n\t\t},\n\n\t\tclickFieldType: function( e ) {\n\t\t\tif ( ! this.dragging ) {\n\t\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:fieldType', e );\n\t\t\t}\n\t\t},\n\n\t\tmousedownFieldType: function( e ) {\n\t\t\tjQuery( e.target).addClass( 'clicked' );\n\t\t\tsetTimeout( function() {\n\t\t\t\tjQuery( e.target ).removeClass( 'clicked' );\n\t\t\t}, 1500 );\n\t\t},\n\n\t\tmaybeClickFieldType: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\tthis.clickFieldType( e );\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderFieldTypes: function() {\n\t\t\t var html = '';\n\t\t\t var that = this;\n\t\t\t _.each( this.fieldTypes, function( id ) {\n\t\t\t var type = nfRadio.channel( 'fields' ).request( 'get:type', id );\n\t\t\t var nicename = type.get( 'nicename' );\n\t\t\t var icon = type.get( 'icon' );\n\t\t\t var renderType = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-field-type-button' );\n\t\t\t html += renderType( { id: id, nicename: nicename, icon: icon, type: type, savedField: that.savedField } );\n\t\t\t } );\n\t\t\t return html;\n\t\t\t\t},\n\n\t\t\t\tsavedField: function() {\n\t\t\t\t\tif( this.type.get( 'savedField' ) ) {\n\t\t\t\t\t\treturn 'nf-saved';\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\t\t\t}\n\t\t},\n\n\t\tgetTypeSection: function() {\n\t\t\treturn this.el;\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/typeSectionCollection',['views/fields/drawer/typeSection'], function( fieldTypeSectionView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: fieldTypeSectionView,\n\n\t\tonShow: function() {\n\t\t\tjQuery( this.el ).find( '.nf-settings' ).unwrap();\n\t\t\tnfRadio.channel( 'fields' ).request( 'clear:editActive' );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/fields/drawer/addField',['views/fields/drawer/stagingCollection', 'models/fields/stagingCollection', 'views/fields/drawer/typeSectionCollection'], function( drawerStagingView, StagingCollection, fieldTypeSectionCollectionView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-content-add-field',\n\n\t\tregions: {\n\t\t\tstaging: '#nf-drawer-staging .nf-reservoir',\n\t\t\tprimary: '#nf-drawer-primary',\n\t\t\tsecondary: '#nf-drawer-secondary'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:fieldTypes', this.filterFieldTypes );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeFieldTypeFilter );\n\n\t\t\tthis.savedCollection = nfRadio.channel( 'fields' ).request( 'get:savedFields' );\n\t\t\tthis.primaryCollection = this.savedCollection;\n\n\t\t\tthis.fieldTypeSectionCollection = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\tthis.secondaryCollection = this.fieldTypeSectionCollection;\n\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tvar stagingCollection = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\tthis.staging.show( new drawerStagingView( { collection: stagingCollection } ) );\n\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.secondaryCollection } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tfilterFieldTypes: function( filteredSectionCollection ) {\n\t\t\tthis.primary.reset();\n\t\t\tthis.secondary.reset();\n\t\t\tthis.filteredSectionCollection = filteredSectionCollection;\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.filteredSectionCollection } ) );\n\t\t},\n\n\t\tremoveFieldTypeFilter: function () {\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.savedCollection } ) );\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.fieldTypeSectionCollection } ) );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingCollection',[], function() {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t},\n\n\t\tgetChildView: function( model ) {\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:settingChildView', model );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingGroup',['views/app/drawer/itemSettingCollection'], function( itemSettingCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-field-setting-group',\n\t\t\n\t\tregions: {\n\t\t\tsettings: '.nf-field-settings'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t\tthis.dataModel = data.dataModel;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.model.get( 'display' ) ) {\n\t\t\t\tthis.settings.show( new itemSettingCollectionView( { collection: this.model.get( 'settings' ), dataModel: this.dataModel } ) );\n\t\t\t} else {\n\t\t\t\tthis.settings.empty();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'render:settingGroup', this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .toggle': 'clickToggleGroup'\n\t\t},\n\n\t\tclickToggleGroup: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:toggleSettingGroup', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderLabel: function() {\n\t\t\t\t\tif ( '' != this.label ) {\n\t\t\t\t\t\tvar groupLabel = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-content-edit-setting-group-label' );\n\t\t\t\t\t\treturn groupLabel( this );\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\trenderArrowDir: function() {\n\t\t\t\t\tif ( this.display ) {\n\t\t\t\t\t\treturn 'down';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 'right';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingGroupCollection',['views/app/drawer/itemSettingGroup'], function( itemSettingGroupView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: itemSettingGroupView,\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/editSettings',['views/app/drawer/itemSettingGroupCollection'], function( itemSettingGroupCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings',\n\n\t\tregions: {\n\t\t\tsettingTitle: '.nf-setting-title',\n\t\t\tsettingGroups: '.nf-setting-groups'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.dataModel = data.model;\n\t\t\tthis.groupCollection = data.groupCollection;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar titleView = currentDomain.get( 'getSettingsTitleView' ).call( currentDomain, { model: this.model } );\n\n\t\t\tthis.settingTitle.show( titleView );\n\t\t\tthis.settingGroups.show( new itemSettingGroupCollectionView( { collection: this.groupCollection, dataModel: this.dataModel } ) );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\tmaybeRenderTitle: function() {\n\t \t\t\tif ( 'undefined' !== typeof this.type ) {\n\t \t\t\t\tvar title = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-content-edit-settings-title' );\n\t \t\t\t\treturn title( this );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\treturn type.get( 'nicename' );\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Edit Settings drawer header.\n *\n * Includes our 'Done' button.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerEditSettings',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-edit-settings',\n\n\t\tinitialize: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\t// Listen for our drawer being disabled.\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\t// Get our current domain.\n\t\t\t\t\tif ( this.drawerDisabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Button to add an action to the form.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/drawer/typeButton',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-action-type-button',\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\t\n\t\t\tjQuery( this.el ).disableSelection();\n\t\t\t\n\t\t\tif ( 'installed' == this.model.get( 'section') ) {\n\t\t\t\tvar that = this;\n\t\t\t\tjQuery( this.el ).draggable( {\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\ttolerance: 'intersect',\n\t\t\t\t\tscroll: false,\n\t\t\t\t\thelper: 'clone',\n\n\t\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = true;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'startDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = false;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'stopDrag:type', this, ui );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-item': 'clickAddAction'\n\t\t},\n\n\t\tclickAddAction: function( e ) {\n\t\t\tif ( ! this.dragging ) {\n\t\t\t\tif ( 'installed' == this.model.get( 'section' ) ) { // Is this an installed action?\n\t\t\t\t\tnfRadio.channel( 'actions' ).trigger( 'click:addAction', this.model );\n\t\t\t\t} else { // This isn't an installed action\n\t\t\t\t\twindow.open( this.model.get( 'link' ), '_blank' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-item';\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\n\t\t\t\t\t\tclasses += ' nf-has-img';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'installed' == this.section ) {\n\t\t\t\t\t\tclasses += ' nf-action-type';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderStyle: function() {\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\n\t\t\t\t\t\treturn \"style=\\\"background-image: url(\" + this.image + \");\\\"\"\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/actions/drawer/typeCollection',['views/actions/drawer/typeButton'], function( actionTypeButtonView ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-action-type-section',\n\t\tchildView: actionTypeButtonView,\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\trenderNicename: function() {\n\t\t\t\t\treturn that.collection.nicename;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\treturn that.collection.slug;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.action-types' ).append( childView.el );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Add action drawer.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/drawer/addAction',['views/actions/drawer/typeCollection'], function( actionTypeCollectionView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-content-add-action',\n\n\t\tregions: {\n\t\t\tprimary: '#nf-drawer-primary',\n\t\t\tsecondary: '#nf-drawer-secondary'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:actionTypes', this.filteractionTypes );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeactionTypeFilter );\n\t\t\n\t\t\tthis.installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n\t\t\tthis.primaryCollection = this.installedActions;\n\n\t\t\tthis.availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n\t\t\tthis.secondaryCollection = this.availableActions;\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.secondaryCollection } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tfilteractionTypes: function( filteredInstalled, filteredAvailable ) {\n\t\t\tthis.primary.reset();\n\t\t\tthis.secondary.reset();\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: filteredInstalled } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: filteredAvailable } ) );\n\t\t\t\n\t\t},\n\n\t\tremoveactionTypeFilter: function () {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.installedActions } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.availableActions } ) );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Individual change item.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentViewChangesItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-view-changes-item',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:disabled', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:disabled', this.render );\n\t\t},\n\n\t\t/**\n\t\t * When we render this element, remove the extra wrapping <div> that backbone creates.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\tevents: {\n\t\t\t'click .undoSingle': 'undoSingle'\n\t\t},\n\n\t\tundoSingle: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoSingle', this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Changes collection view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentViewChanges',['views/app/drawer/contentViewChangesItem'], function( viewChangesItem ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'table',\n className: 'nf-changes',\n\t\tchildView: viewChangesItem\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Handles clicks on the 'view changes' button in the header.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerViewChanges',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-view-changes',\n\n\t\tevents: {\n\t\t\t'click .undoChanges': 'clickUndoChanges'\n\t\t},\n\n\t\tclickUndoChanges: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoChanges' );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Error view used for settings.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/settingError',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-edit-setting-error'\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSetting',['views/app/drawer/mergeTagsContent', 'views/app/drawer/settingError'], function( mergeTagsContentView, settingErrorView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\n\n\t\tregions: {\n\t\t\terror: '.nf-setting-error'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\t/*\n\t\t\t * Send out a request on the setting-type-{type} channel asking if we should render on dataModel change.\n\t\t\t * Defaults to false.\n\t\t\t * This lets specific settings, like RTEs, say that they don't want to be re-rendered when their data model changes.\n\t\t\t */\n\t\t\tvar renderOnChange = ( 'undefined' == typeof nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' ) ) ? false : nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' );\n\t\t\t\n\t\t\tif ( renderOnChange ) {\n\t\t\t\tthis.dataModel.on( 'change:' + this.model.get( 'name' ), this.render, this );\n\t\t\t}\n\n\t\t\tthis.model.on( 'change:error', this.renderError, this );\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\n var remote = this.model.get( 'remote' );\n\t\t\tif( remote ) {\n\n if( 'undefined' != typeof remote.refresh || remote.refresh ) {\n // Add 'update' icons\n var label = this.model.get('label');\n this.model.set('label', label + ' <a class=\"extra\"><span class=\"dashicons dashicons-update\"></span></a>');\n }\n\n\t\t\t\tnfRadio.channel( 'setting' ).trigger( 'remote', this.model, this.dataModel, this );\n\t\t\t\tthis.model.on( 'rerender', this.render, this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * When our drawer opens, send out a radio message on our setting type channel.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.drawerOpened );\n\n\t\t\t/*\n\t\t\t * When our drawer closes, send out a radio message on our setting type channel.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.drawerClosed );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.dataModel.off( 'change:' + this.model.get( 'name' ), this.render );\n\t\t\tthis.model.off( 'change:error', this.renderError );\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( this.model.get( 'remote' ) ) {\n\t\t\t\tthis.model.off( 'rerender', this.render, this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\n\t\t\n\t\t\t/*\n\t\t\t * Unescape any HTML being saved if we are a textbox.\n\t\t\t */\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\n\t\t\t\tvar setting = this.model.get( 'name' );\n\t\t\t\tvar value = this.dataModel.get( setting );\n\t\t\t\tthis.dataModel.set( setting, _.unescape( value ), { silent: true } );\n\t\t\t}\n\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\t/*\n\t\t\t * We want to escape any HTML being output if we are a textbox.\n\t\t\t */\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\n\t\t\t\tvar setting = this.model.get( 'name' );\n\t\t\t\tvar value = this.dataModel.get( setting );\n\t\t\t\tthis.dataModel.set( setting, _.escape( value ), { silent: true } );\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.mergeTagsContentView = false;\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\n\t\t\tjQuery( this.el ).find( '.nf-help' ).each(function() {\n\t\t\t\tvar content = jQuery(this).next('.nf-help-text');\n\t\t\t\tjQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\tcontent: content,\n\t\t\t\t\tmaxWidth: 200,\n\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\ttrigger: 'click',\n\t\t\t\t\tcloseOnClick: true\n\t\t\t\t})\n\t\t });\n\t\t\t\n\t\t if ( this.model.get( 'use_merge_tags' ) ) {\n\t\t \tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t }\n\n\t\t\t/*\n\t\t\t * Apply Setting Field Masks\n\t\t\t */\n\t\t\tvar mask = this.model.get( 'mask' );\n\n\t\t\tif( typeof mask != \"undefined\" ){\n\n\t\t\t\tvar input = jQuery( this.$el ).find( 'input' );\n\n\t\t\t\tswitch( mask.type ){\n\t\t\t\t\tcase 'numeric':\n\t\t\t\t\t\tinput.autoNumeric({\n\t\t\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\t\t\taDec: decimalPoint\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'currency':\n\n\t\t\t\t\t\tvar currency = nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' );\n\t\t\t\t\t\tvar currencySymbol = nfAdmin.currencySymbols[ currency ] || '';\n\n\t\t\t\t\t\tinput.autoNumeric({\n\t\t\t\t\t\t\taSign: jQuery('<div />').html(currencySymbol).text(),\n\t\t\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\t\t\taDec: decimalPoint\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'custom':\n\t\t\t\t\t\tif( mask.format ) input.mask( mask.format )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// TODO: Error Logging.\n\t\t\t\t\t\tconsole.log( 'Notice: Mask type of \"' + mask.type + '\" is not supported.' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderError();\n\t\t},\n\n\t\tonShow: function() {\t\t\t\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonAttach: function() {\t\t\t\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\trenderError: function() {\n\t\t\tif ( this.model.get( 'error' ) ) {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).addClass( 'nf-error' );\n\t\t\t\tthis.error.show( new settingErrorView( { model: this.model } ) );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).removeClass( 'nf-error' );\n\t\t\t\tthis.error.empty();\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t \t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) != this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\n\t \t\trenderSetting: function(){\n\t \t\t\tif ( 'undefined' != typeof that.dataModel.get( this.name ) ) {\n\t \t\t\t\tthis.value = that.dataModel.get( this.name );\n\t \t\t\t} else if ( 'undefined' == typeof this.value ) {\n\t \t\t\t\tthis.value = '';\n\t \t\t\t}\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( 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 ( this.use_merge_tags ) {\n\t\t\t\t\t\tclasses += ' has-merge-tags';\n\t\t\t\t\t}\n\t\t\t\t\tif ( 'rte' == this.type ) {\n\t\t\t\t\t\tclasses += ' rte';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-setting ';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += 'nf-' + this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' nf-one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( this.help ) {\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</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\trenderMergeTags: function() {\n\t\t\t\t\tif ( this.use_merge_tags && ! this.hide_merge_tags ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></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\trenderPlaceholder: function() {\n\t\t\t\t\tif ( this.placeholder ) {\n\t\t\t\t\t\treturn 'placeholder=\"' + this.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\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .setting': 'changeSetting',\n\t\t\t'keyup .setting': 'keyUpSetting',\n\t\t\t'click .setting': 'clickSetting',\n\t\t\t'click .extra': 'clickExtra'\n\t\t},\n\n\t\tchangeSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:setting', e, this.model, this.dataModel );\n\t\t},\n\n\t\tkeyUpSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'keyup:setting', e, this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'keyup:setting', e, this.model, this.dataModel );\n\t\t},\n\n\t\tclickSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:setting', e, this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:setting', e, this.model, this.dataModel, this );\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-name-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t},\n\n\t\tdrawerOpened: function() {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:opened', this.model, this.dataModel, this );\n\t\t},\n\n\t\tdrawerClosed: function() {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:closed', this.model, this.dataModel, this );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","/**\n * Changes collection view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentNewForm',['views/app/drawer/itemSetting'], function( itemSettingView) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-new-form',\n\n\t\tregions: {\n\t\t\tformName: '.new-form-name',\n\t\t\tformSubmit: '.new-form-submit'\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar titleSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'title' );\n\t\t\tvar addSubmitSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'add_submit' );\n\t\t\tvar dataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tthis.formName.show( new itemSettingView( { model: titleSettingModel, dataModel: dataModel } ) );\n\t\t\t/*\n\t\t\t * If we don't have any submit buttons on the form, prompt the user to add one on publish.\n\t\t\t */\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar submitButtons = fieldCollection.findWhere( { type: 'submit' } );\n\t\t\tif ( 'undefined' == typeof submitButtons ) {\n\t\t\t\tthis.formSubmit.show( new itemSettingView( { model: addSubmitSettingModel, dataModel: dataModel } ) );\n\t\t\t} else {\n\t\t\t\tdataModel.set( 'add_submit', 0 );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .publish': 'clickPublish'\n\t\t},\n\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:confirmPublish', e );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Handles clicks on the 'view changes' button in the header.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerNewForm',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-new-form'\n\t});\n\n\treturn view;\n} );\n","/**\n * Config file for our app drawers.\n *\n * this.collection represents all of our registered drawers.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawerConfig',[\n\t'models/app/drawerCollection',\n\t'views/fields/drawer/addField',\n\t'views/app/drawer/editSettings',\n\t'views/app/drawer/headerEditSettings',\n\t'views/actions/drawer/addAction',\n\t'views/app/drawer/contentViewChanges',\n\t'views/app/drawer/headerViewChanges',\n\t'views/app/drawer/contentNewForm',\n\t'views/app/drawer/headerNewForm'\n\t], function(\n\t\tdrawerCollection,\n\t\taddFieldView,\n\t\teditSettingsView,\n\t\teditSettingsHeaderView,\n\t\taddActionView,\n\t\tviewChangesView,\n\t\tviewChangesHeaderView,\n\t\tnewFormView,\n\t\tnewFormHeaderView,\n\t\tmobileItemControlsView\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\tthis.collection = new drawerCollection( [\n\t\t\t\t{\n\t\t\t\t\tid: 'addField',\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new addFieldView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'addAction',\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new addActionView( data );\n\t\t\t\t\t}\n\t\t\t\t},\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\tid: 'editSettings',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * TODO: Add filtering when editing settings. For now, removing them from settings.\n\t\t\t\t\t */\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Get a custom setting header view if one is set.\n\t\t\t\t\t\t * TODO: Currently, this only works for advanced settings.\n\t\t\t\t\t\t * This could be used to replace the need for a single config file.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( 'undefined' != typeof data.typeModel ) {\n\t\t\t\t\t\t\tvar view = nfRadio.channel( data.typeModel.get( 'id' ) ).request( 'get:drawerHeaderView' ) || editSettingsHeaderView;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar view = editSettingsHeaderView;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new view( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new editSettingsView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'viewChanges',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the viewChanges drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new viewChangesHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new viewChangesView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'newForm',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the newForm drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new newFormHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new newFormView( data );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\t// Listen for requests for our drawer collection.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerCollection', this.getDrawerCollection, this );\n\t\t\t// Listen for requests for specific drawer models.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawer', this.getDrawer, this );\n\t\t},\n\n\t\tgetDrawerCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetDrawer: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Default settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/defaultSettingsTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-default',\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\tif ( 'undefined' != typeof type ) {\n\t \t\t\t\treturn type.get( 'nicename' );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Empty view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/empty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","/**\n * Model for our individual domains.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/domainModel',[ 'views/app/drawer/defaultSettingsTitle', 'views/app/empty' ], function( DefaultSettingsTitleView, EmptyView ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdashicons: '',\n\t\t\tclasses: '',\n\t\t\tactive: false,\n\t\t\turl: '',\n\t\t\thotkeys: false,\n\t\t\tdisabled: false,\n\n\t\t\tgetSettingsTitleView: function( data ) {\n\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t},\n\n\t\t\tgetDefaultSettingsTitleView: function( data ) {\n\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t},\n\n\t\t\tgetGutterLeftView: function( data ) {\n\t\t\t\t/*\n\t\t\t\t * Return empty view\n\t\t\t\t */\n\t\t\t\treturn new EmptyView();\n\t\t\t},\n\n\t\t\tgetGutterRightView: function( data ) {\n\t\t\t\t/* \n\t\t\t\t * Return empty view\n\t\t\t\t */\n\t\t\t\treturn new EmptyView();\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Holds all of our domain models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/domainCollection',['models/app/domainModel'], function( domainModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: domainModel\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-fields'\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/mainContentFieldCollection',[], function() {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\treorderOnSort: true,\n\n\t\tgetChildView: function() {\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:fieldItem' );\n\t\t},\n\n\t\tgetEmptyView: function() {\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:mainContentEmpty' );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:sortableEl', this.getSortableEl, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'init:sortable', this.initSortable, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'destroy:sortable', this.destroySortable, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.collection.models.length > 0 ) {\n\t\t\t\tjQuery( this.el ).addClass( 'nf-field-type-droppable' ).addClass( 'nf-fields-sortable' );\n\t\t\t\tvar that = this;\n\t\t\t\t/* TODO: There's a bug with some Android phones and chrome. The fix below hasn't been implement.\n\n\t\t\t\t * Instantiate our sortable field list, but only if we aren't on a mobile device.\n\t\t\t\t *\n\t\t\t\t * On Android, our sortable list isn't scrollable if it's instantiated at render.\n\t\t\t\t * Instead, for mobile, we need to instantiate our sortable when the user tapholds and then\n\t\t\t\t * destroy it when the drag stops.\n\t\t\t\t */\n\t\t\t\t// if ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\t\tthis.initSortable();\n\t\t\t\t// }\n\t\t\t}\n\t\t\tnfRadio.channel( 'app' ).trigger( 'render:fieldsSortable', this );\n\t\t},\n\n\t\tgetSortableEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\tinitSortable: function() {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tvar tolerance = 'pointer';\n\t\t\t} else {\n\t\t\t\tvar tolerance = 'intersect';\n\t\t\t}\n\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\t//containment: '#nf-main',\n\t\t\t\thelper: 'clone',\n\t\t\t\tcancel: '.nf-item-controls',\n\t\t\t\tplaceholder: 'nf-fields-sortable-placeholder',\n\t\t\t\topacity: 0.95,\n\t\t\t\tgrid: [ 5, 5 ],\n\t\t\t\t// scroll: false,\n\t\t\t\tappendTo: '#nf-main',\n\t\t\t\tscrollSensitivity: 10,\n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'start:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:fieldsSortable', ui, this );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'stop:fieldsSortable', ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tdestroySortable: function() {\n\t\t\tjQuery( this.el ).sortable( 'destroy' );\n\t\t},\n\n\t\tonAddChild: function( childView ) {\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:adding' ) ) {\n\t\t\t\tchildView.$el.hide().show( 'clip' );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', false );\n\t\t\t}\n\t\t}\n\t\t\n\t} );\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/addSavedField',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-add-saved-field',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:addSavedLoading', this.renderAddButton, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.renderAddButton();\n\t\t},\n\n\t\trenderAddButton: function() {\n\t\t\tif ( this.model.get( 'addSavedLoading' ) ) {\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-saved-field-loading' );\n\t\t\t} else {\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-saved-field-button' );\n\t\t\t}\n\t\t\tjQuery( this.el ).find( '.add-button' ).html( button( this ) );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:addSavedLoading', this.render );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-button': 'clickAddSavedField'\n\t\t},\n\n\t\tclickAddSavedField: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:addSavedField', e, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","/**\n * Fields settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/fields/drawer/settingsTitle',['views/fields/drawer/addSavedField'], function( addSavedFieldView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-fields',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:saved', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.renderjBoxContent, this );\n\t\t},\n\n\t\tregions: {\n\t\t\taddSaved: '.nf-add-saved-field'\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:saved', this.render );\n\t\t\tthis.addSavedjBox.destroy();\n\t\t\tthis.model.unset( 'jBox', { silent: true } );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.renderjBoxContent();\n\t\t\tvar that = this;\n\t\t\tthis.addSavedjBox = new jBox( 'Tooltip', {\n\t\t\t\ttrigger: 'click',\n\t\t\t\ttitle: 'Add to Saved Fields',\n\t\t\t\tposition: {\n\t\t\t\t\tx:'left',\n\t\t\t\t\ty:'center'\n\t\t\t\t},\n\t\t\t\toutside:'x',\n\t\t\t\tcloseOnClick: 'body',\n\n\t\t\t\tonCreated: function() {\n\t\t\t\t\tthis.setContent( jQuery( that.el ).find( '.nf-add-saved-field' ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.addSavedjBox.attach( jQuery( this.el ).find( '.dashicons') );\n\t\t\tthis.model.set( 'jBox', this.addSavedjBox, { silent: true } );\n\t\t},\n\n\t\trenderjBoxContent: function() {\n\t\t\tif ( this.addSaved ) {\n\t\t\t\tthis.addSaved.show( new addSavedFieldView( { model: this.model } ) );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\tvar displayName = type.get( 'nicename' );\n\n\t \t\t\tif ( this.saved ) {\n\t \t\t\t\tvar realType = nfRadio.channel( domainID ).request( 'get:type', type.get( 'type' ) );\n\t \t\t\t\tdisplayName += ' - ' + realType.get( 'nicename' );\n\t \t\t\t}\n\t \t\t\treturn displayName;\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\trenderSavedStar: function() {\n\t\t\t\t\tif ( this.saved ) {\n\t\t\t\t\t\tvar star = 'filled';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar star = 'empty';\n\t\t\t\t\t}\n\t\t\t\t\treturn '<span class=\"dashicons dashicons-star-' + star + '\"></span>'\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Add main header.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/mainHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-header-actions',\n\n\t\tinitialize: function() {\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\tthis.listenTo( actionCollection, 'add', this.render );\n\t\t\tthis.listenTo( actionCollection, 'remove', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\tif ( actionCollection.models.length == 0 ) {\n\t\t\t\tjQuery( this.el ).hide();\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).show();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Actions subheader view.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-actions'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/itemControls',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-item-controls',\n\n\t\tinitialize: function() {\n\t\t\t// Listen for domain changes and re-render when we detect one.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t},\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// \n\t\t\tthis.currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'click .nf-edit-settings': 'clickEdit',\n\t\t\t'singletap .nf-edit-settings': 'singleTapEdit',\n\t\t\t'click .nf-delete': 'clickDelete',\n\t\t\t'click .nf-duplicate': 'clickDuplicateField'\n\t\t},\n\n\t\tclickEdit: function( e ) {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tsingleTapEdit: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t},\n\n\t\tclickDelete: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t},\n\n\t\tclickDuplicateField: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'mouseover:itemControl', e, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Single action table row\n *\n * TODO: make dynamic\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/actionItem',['views/app/itemControls'], function( itemControlsView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'tr',\n\t\ttemplate: '#tmpl-nf-action-item',\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:actionItemTemplate' ) || this.template;\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:active', this.maybeDeactivate, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:active', this.maybeDeactivate );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.model.get( 'editActive' ) ) {\n\t\t\t\tjQuery( this.el ).addClass( 'active' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).removeClass( 'active' );\n\t\t\t}\n\n\t\t\tthis.maybeDeactivate();\n\n\t\t\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t},\n\n\t\tmaybeDeactivate: function() {\n\t\t\tif ( 0 == this.model.get( 'active' ) ) {\n\t\t\t\tjQuery( this.el ).addClass( 'deactivated' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).removeClass( 'deactivated' );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change input': 'changeToggle',\n\t\t\t'click': 'maybeClickEdit'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( 'TR' == jQuery( e.target ).parent().prop( 'tagName' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tchangeToggle: function( e ) {\n\t\t\tvar setting = jQuery( e.target ).data( 'setting' );\n\t\t\tvar settingModel = nfRadio.channel( 'actions' ).request( 'get:settingModel', setting );\n\t\t\tconsole.log( settingModel );\n\t\t\tconsole.log( this.model );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:setting', e, settingModel, this.model );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderToggle: function( settingName ) {\n\t\t\t\t\tthis.settingName = settingName || 'active';\n\t\t\t\t\tvar actionLabel = this.label;\n\t\t\t\t\tthis.label = '';\n\t\t\t\t\tthis.value = this[ this.settingName ];\n\t\t\t\t\tthis.name = this.id + '-' + this.settingName;\n\t\t\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-toggle' );\n\t\t\t\t\thtml = html( this );\n\t\t\t\t\tthis.label = actionLabel;\n\t\t\t\t\treturn html;\n\t\t\t\t},\n\n\t\t\t\trenderTypeNicename: function() {\n\t\t\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', this.type );\n\t\t\t\t\tif ( 'undefined' == typeof type ) return;\n\n\t\t\t\t\treturn type.get( 'nicename' );\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( this.help ) {\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</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\trenderMergeTags: function() {\n\t\t\t\t\tif ( this.use_merge_tags ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/actions/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-actions-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().parent().removeClass( 'nf-actions-empty' );\n\t\t\t// jQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\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\tjQuery( this.el ).parent().parent().addClass( 'nf-actions-empty' );\n\t\t\t// if ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t// \tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t// }\n\t\t\t// jQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\t// jQuery( this.el ).parent().droppable( {\n\t\t\t// \taccept: function( draggable ) {\n\t\t\t// \t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t// \t\t\treturn true;\n\t\t\t// \t\t}\n\t\t\t// \t},\n\t\t\t// \thoverClass: 'nf-droppable-hover',\n\t\t\t// \ttolerance: 'pointer',\n\t\t\t// \tover: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t// \t},\n\t\t\t// \tout: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t// \t},\n\t\t\t// \tdrop: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t// \t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t// \t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t// \t},\n\t\t\t// } );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Main content view for our actions.\n *\n * TODO: make dynamic\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/mainContent',['views/actions/actionItem', 'views/actions/mainContentEmpty'], function( actionView, emptyView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttemplate: '#tmpl-nf-action-table',\n\t\tchildView: actionView,\n\t\temptyView: emptyView,\n\n\t\tinitialize: function() {\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:mainContentTemplate' ) || this.template;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tjQuery( this.el ).droppable( {\n\t\t\t\taccept: '.nf-action-type-draggable',\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'drop:actionType', e, ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tif ( 'undefined' == typeof nfRadio.channel( 'actions' ).request( 'get:type', childView.model.get( 'type' ) ) ) return;\n\n\t\t\tjQuery( collectionView.el ).find( 'tbody' ).append( childView.el );\n\t\t},\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/advanced/mainHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-header-settings'\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-settings'\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/settingItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-form-setting-type',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.updateActiveClass );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.updateActiveClass, this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click': 'clickEdit'\n\t\t},\n\n\t\tclickEdit: function( e ) {\n\t\t\tnfRadio.channel( 'settings' ).trigger( 'click:edit', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-setting-wrap ' + this.id;\n\t \t\t\tif ( this.editActive ) {\n\t \t\t\t\tclasses += ' active';\n\t \t\t\t}\n\t \t\t\treturn classes;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateActiveClass: function() {\n\t\t\tif ( this.model.get( 'editActive' ) ) {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).addClass( 'active' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).removeClass( 'active' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/mainContent',['views/advanced/settingItem'], function( settingItem ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\tchildView: settingItem\n\t\t\n\t});\n\n\treturn view;\n} );\n","/**\n * Model that represents our form fields.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/fieldModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Field',\n\t\t\tobjectDomain: 'fields',\n\t\t\teditActive: false,\n\t\t\torder: 999\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tif ( 'undefined' == typeof this.get( 'type' ) ) return;\n\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', this.get( 'type' ) );\n\t\t\tvar parentType = fieldType.get( 'parentType' );\n\n\t\t\t// Loop through our field type \"settingDefaults\" and add any default settings.\n\t\t\t_.each( fieldType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( key ) ) {\n\t\t\t\t\tthis.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\t/*\n\t\t\t * If our field type is a saved field, set our field type to the actual field type\n\t\t\t */\n\t\t\tif ( 'saved' == fieldType.get( 'section' ) ) {\n\t\t\t\tthis.set( 'type', fieldType.get( 'type' ) );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * fields\n\t\t\t * fields-parentType\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:fieldModel', this );\n\t\t\tnfRadio.channel( 'fields-' + parentType ).trigger( 'init:fieldModel', this );\n\t\t\tnfRadio.channel( 'fields-' + this.get( 'type' ) ).trigger( 'init:fieldModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * Fires an event on the fieldSetting-{name} channel saying we've updated a setting.\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n\t\t\tnfRadio.channel( 'fieldSetting-' + _.keys( model.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'update:setting', this, options.settingModel );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field models.\n * This is the actual field data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new fields or removed fields property.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/fieldCollection',['models/fields/fieldModel'], function( fieldModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: fieldModel,\n\t\tcomparator: function( model ){\n\t\t\treturn parseInt( model.get( 'order' ) );\n\t\t},\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addField, this );\n\t\t\tthis.on( 'remove', this.removeField, this );\n\n\t\t\tthis.listenTo( this, 'add:field', this.addNewField );\n\t\t\tthis.listenTo( this, 'append:field', this.appendNewField );\n\t\t\tthis.listenTo( this, 'remove:field', this.removeFieldResponse );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new fields property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddField: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed fields property.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveField: function( model ) {\n\t\t\tthis.removedIDs = this.removedIDs || {};\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t},\n\n\t\taddNewField: function( model ) {\n\t\t\tthis.add( model );\n\t\t},\n\n\t\tappendNewField: function( model ) {\n\t\t\tif ( 0 == this.length ) {\n\t\t\t\tvar order = 0;\n\t\t\t} else {\n\t\t\t\tvar order = this.at( this.length -1 ).get( 'order' ) + 1;\n\t\t\t}\n\n\t\t\tmodel.set( 'order', order, { silent: true } );\n\t\t\tthis.add( model );\n\t\t},\n\n\t\tremoveFieldResponse: function( model ) {\n\t\t\tthis.remove( model );\n\t\t},\n\n\t\tfieldExists: function( fieldModel ) {\n\t\t\treturn -1 != this.indexOf( fieldModel );\n\t\t}\n\t} );\n\treturn collection;\n} );\n\n","/**\n * Config file for our app domains.\n * \n * this.collection represents all of our app domain (fields, actions, settings) information.\n *\n * This doesn't store the current domain, but rather all the data about each.\n * \n * This data includes:\n * hotkeys\n * header view\n * subheader view\n * content view\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/domainConfig',[\n\t// Require our domain collection\n\t'models/app/domainCollection',\n\t// Require our fields domain files\n\t'views/fields/subHeader',\n\t'views/fields/mainContentFieldCollection',\n\t'views/fields/drawer/settingsTitle',\n\t// Require our actions domain files\n\t'views/actions/mainHeader', \n\t'views/actions/subHeader',\n\t'views/actions/mainContent',\n\t// Require our settings domain files\n\t'views/advanced/mainHeader',\n\t'views/advanced/subHeader',\n\t'views/advanced/mainContent',\n\t// Empty View\n\t'views/app/empty',\n\t// FieldCollection: used by the default formContentData filter\n\t'models/fields/fieldCollection'\n\t], \n\tfunction( \n\t\tappDomainCollection,\n\t\tfieldsSubHeaderView,\n\t\tFieldsMainContentFieldCollectionView,\n\t\tfieldsSettingsTitleView,\n\t\tactionsMainHeaderView,\n\t\tactionsSubHeaderView,\n\t\tactionsMainContentView,\n\t\tsettingsMainHeaderView,\n\t\tsettingsSubHeaderView,\n\t\tsettingsMainContentView,\n\t\tEmptyView,\n\t\tFieldCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Add our default formContentView filter.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:viewFilter', this.defaultFormContentView, 10, this );\n\t\t\t\n\t\t\t/*\n\t\t\t * Add our default formContentData filter.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:loadFilter', this.defaultFormContentLoad, 10, this );\n\n\t\t\t/*\n\t\t\t * Add our default formContentGutterView filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:leftFilter', this.defaultFormContentGutterView, 10, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:rightFilter', this.defaultFormContentGutterView, 10, this );\n\n\t\t\t// Define our app domains\n\t\t\tthis.collection = new appDomainCollection( [\n\t\t\t\t{\n\t\t\t\t\tid: 'fields',\n\t\t\t\t\tnicename: nfi18n.domainFormFields,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newField',\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-menu',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new fieldsSubHeaderView();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the formContent view that should be used in our builder.\n\t\t\t\t\t * Uses two filters:\n\t\t\t\t\t * 1) One for our formContentData\n\t\t\t\t\t * 2) One for our formContentView\n\t\t\t\t\t *\n\t\t\t\t\t * If we don't have any view filters, we use the default formContentView.\n\t\t\t\t\t * \n\t\t\t\t\t * @since 3.0\n\t\t\t\t\t * @return formContentView backbone view.\n\t\t\t\t\t */\n\t\t\t\t\tgetMainContentView: function( collection ) {\n\t\t\t\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\n\t\t\t\t\t\t * If we don't have this setting, then we check for this deprecated value.\n\t\t\t\t\t\t * \n\t\t\t\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * TODO: Remove this backwards compatibility eventually.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( ! formContentData ) {\n\t\t\t\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If we don't have a filter for our formContentData, default to fieldCollection.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar formContentLoadFilters = nfRadio.channel( 'formContent' ).request( 'get:loadFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( formContentLoadFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tformContentData = callback( formContentData, nfRadio.channel( 'app' ).request( 'get:formModel' ), true );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar formContentViewFilters = nfRadio.channel( 'formContent' ).request( 'get:viewFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( formContentViewFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tformContentView = callback();\n\n\t\t\t\t\t\tnfRadio.channel( 'settings' ).request( 'update:setting', 'formContentData', formContentData, true );\n\t\t\t\t\t\treturn new formContentView( { collection: formContentData } );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetSettingsTitleView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If we are dealing with a field model, return the fields settings view, otherwise, return the default.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( 'fields' == data.model.get( 'objectDomain' ) ) {\n\t\t\t\t\t\t\treturn new fieldsSettingsTitleView( data );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn this.get( 'getDefaultSettingsTitleView' ).call( this, data );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\n\t\t\t\t\tgetGutterLeftView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:leftFilters' );\n\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tgutterView = callback();\n\n\t\t\t\t\t\treturn new gutterView(); \n\t\t\t\t\t},\n\n\t\t\t\t\tgetGutterRightView: function() {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:rightFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tgutterView = callback();\n\n\t\t\t\t\t\treturn new gutterView(); \n\t\t\t\t\t}\n\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'actions',\n\t\t\t\t\tnicename: nfi18n.domainActions,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newAction',\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-external',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new actionsSubHeaderView();\n\t\t\t\t\t},\n\t\t\t\t\t\n\t\t\t\t\tgetMainContentView: function() {\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\t\t\t\treturn new actionsMainContentView( { collection: collection } );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\tnicename: nfi18n.domainAdvanced,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-admin-generic',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new settingsSubHeaderView();\n\t\t\t\t\t},\n\t\t\t\t\t\n\t\t\t\t\tgetMainContentView: function() {\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n\t\t\t\t\t\treturn new settingsMainContentView( { collection: collection } );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'preview',\n\t\t\t\t\tnicename: 'Preview Form',\n\t\t\t\t\tclasses: 'preview',\n\t\t\t\t\tdashicons: 'dashicons-visibility',\n\t\t\t\t\tmobileDashicon: 'dashicons-visibility',\n\t\t\t\t\turl: nfAdmin.previewurl\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\t/*\n\t\t\t * Send out a radio message with our domain config collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:domainCollection', this.collection );\n\n\t\t\t/*\n\t\t\t * Respond to requests to get the app domain collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainCollection', this.getDomainCollection, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainModel', this.getDomainModel, this );\n\t\t},\n\n\t\tgetDomainCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetDomainModel: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\tdefaultFormContentView: function( formContentData ) {\n\t\t\treturn FieldsMainContentFieldCollectionView;\n\t\t},\n\n\t\tdefaultFormContentLoad: function( formContentData ) {\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\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\n\t\t\tif ( 1 == sortedArray.length || 'undefined' == typeof formContentData || true === formContentData instanceof Backbone.Collection ) return fieldCollection;\n\n\t\t\t/*\n\t\t\t * If another filter is registered, we are calling this from somewhere else.\n\t\t\t */\n\n \tvar fieldModels = _.map( formContentData, function( key ) {\n \t\treturn fieldCollection.findWhere( { key: key } );\n \t}, this );\n\n \treturn new FieldCollection( fieldModels );\n\t\t},\n\n\t\tdefaultFormContentGutterView: function( formContentData ) {\n\t\t\treturn EmptyView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our app data.\n * Listens for changes to the 'clean' attribute and triggers a radio message when the state changes.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/appModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tloading: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes to our 'clean' attribute.\n\t\t\tthis.on( 'change:clean', this.changeStatus, this );\n\t\t},\n\n\t\tchangeStatus: function() {\n\t\t\t// Send out a radio message when the 'clean' attribute changes.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:clean', this.get( 'clean' ) );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Creates and stores a model that represents app-wide data. i.e. current domain, current drawer, clean, etc.\n *\n * clean is a boolean that represents whether or not changes have been made.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/data',['models/app/appModel'], function( appModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Get the collection that represents all the parts of our application.\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\t// Setup our initial model.\n\t\t\tthis.model = new appModel( {\n\t\t\t\tcurrentDrawer: false,\n\t\t\t\tcurrentDomain: appDomainCollection.get( 'fields' ),\n\t\t\t\tclean: true\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Set the mobile setting used to track whether or not we're on a mobile device.\n\t\t\t */\n\t\t\tvar mobile = ( 1 == nfAdmin.mobile ) ? true : false;\n\t\t\tthis.model.set( 'mobile', mobile );\n\n\t\t\t/*\n\t\t\t * Respond to requests to see if we are on mobile.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'is:mobile', this.isMobile, this );\n\n\t\t\t/*\n\t\t\t * Respond to app channel requests for information about the state of our app.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:data', this.getData, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDomain', this.getCurrentDomain, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDrawer', this.getCurrentDrawer, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:current', this.getCurrentDrawer, this );\n\n\t\t\t/*\n\t\t\t * Respond to app channel requests to update app settings.\n\t\t\t */\t\t\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDomain', this.updateCurrentDomain, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDrawer', this.updateCurrentDrawer, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:setting', this.updateSetting, this );\n\n\t\t},\n\n\t\tupdateCurrentDomain: function( model ) {\n\t\t\tthis.updateSetting( 'currentDomain', model );\n\t\t},\n\n\t\tupdateSetting: function( setting, value ) {\n\t\t\tthis.model.set( setting, value );\n\t\t\treturn true;\n\t\t},\n\n\t\tgetSetting: function( setting ) {\n\t\t\treturn this.model.get( setting );\n\t\t},\n\n\t\tgetData: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tgetCurrentDomain: function() {\n\t\t\treturn this.model.get( 'currentDomain' );\n\t\t},\n\n\t\tupdateCurrentDrawer: function( drawerID ) {\n\t\t\tthis.updateSetting( 'currentDrawer', drawerID );\n\t\t\treturn true;\n\t\t},\n\n\t\tgetCurrentDrawer: function() {\n\t\t\tvar currentDrawerID = this.model.get( 'currentDrawer' );\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:drawer', currentDrawerID );\n\t\t},\n\n\t\tisMobile: function() {\n\t\t\treturn this.model.get( 'mobile' );\n\t\t}\n\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for click events to expand/collapse setting groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawerToggleSettingGroup',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for click events on our settings group.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:toggleSettingGroup', this.toggleSettingGroup );\n\t\t},\n\n\t\t/**\n\t\t * Set the 'display' attribute of our group model to true or false to toggle.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \tgroup setting model\n\t\t * @return void\n\t\t */\n\t\ttoggleSettingGroup: function( e, model ) {\n\t\t\tif ( model.get( 'display' ) ) {\n\t\t\t\t/*\n\t\t\t\t * Make sure that none of our settings have errors\n\t\t\t\t */\n\t\t\t\tvar errors = false;\n\t\t\t\t_.each( model.get( 'settings' ).models, function( setting ) {\n\t\t\t\t\tif ( setting.get( 'error' ) ) {\n\t\t\t\t\t\terrors = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( ! errors ) {\n\t\t\t\t\tmodel.set( 'display', false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmodel.set( 'display', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Updates our database with our form data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/updateDB',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the closing of the drawer and update when it's closed.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.updateDB );\n\t\t\t// Respond to requests to update the database.\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:db', this.updateDB, this );\n\t\t\t/*\n\t\t\t * Register our default formContent save filter.\n\t\t\t * This converts our collection into an array of keys.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:saveFilter', this.defaultSaveFilter, 10, this );\n\t\t},\n\n\t\t/**\n\t\t * Update our database.\n\t\t * If action isn't specified, assume we're updating the preview.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \taction preview or publish\n\t\t * @return void\n\t\t */\n\t\tupdateDB: function( action ) {\n\t\t\t// If our app is clean, dont' update.\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Default action to preview.\n\t\t\taction = action || 'preview';\n\n\t\t\t// Setup our ajax actions based on the action we're performing\n\t\t\tif ( 'preview' == action ) {\n\t\t\t\tvar jsAction = 'nf_preview_update';\n\t\t\t} else if ( 'publish' == action ) {\n\t\t\t\tvar jsAction = 'nf_save_form';\n\t\t\t}\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n\t\t\t/*\n\t\t\t * There are pieces of data that are only needed for the builder and not for the front-end.\n\t\t\t * We need to unset those.\n\t\t\t * TODO: Make this more dynamic/filterable.\n\t\t\t */\n\t\t\t_.each( formModel.get( 'fields' ).models, function( fieldModel, index ) {\n\t\t\t\tfieldModel.unset( 'jBox', { silent: true } );\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * The main content of our form is called the formContent.\n\t\t\t * In this next section, we check to see if any add-ons want to modify that contents before we save.\n\t\t\t * If there aren't any filters found, we default to the field collection.\n\t\t\t * \n\t\t\t */\n\t\t\t\n\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\n\t\t\t/*\n\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\n\t\t\t * If we don't have this setting, then we check for this deprecated value.\n\t\t\t * \n\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\n\t\t\t *\n\t\t\t * TODO: Remove this backwards compatibility eventually.\n\t\t\t */\n\t\t\tif ( ! formContentData ) {\n\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\n\t\t\t}\n\n\t\t\tvar formContentSaveDataFilters = nfRadio.channel( 'formContent' ).request( 'get:saveFilters' );\n\t\t\t\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( formContentSaveDataFilters, undefined );\n\t\t\tvar callback = _.first( sortedArray );\n\t\t\t/*\n\t\t\t * Set our formContentData to the callback specified in the filter, passing our current formContentData.\n\t\t\t */\n\t\t\tformContentData = callback( formContentData );\n\t\t\t\n\t\t\tif ( 'publish' == action && formModel.get( 'show_publish_options' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'newForm' );\n\t\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\t\tjQuery( builderEl ).addClass( 'disable-main' );\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Get our form data\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n\t\t\t// Turn our formData model into an object\n\t\t\tvar data = JSON.parse( JSON.stringify( formData ) );\n\t\t\tdata.settings.formContentData = formContentData;\n\t\t\t/**\n\t\t\t * Prepare fields for submission.\n\t\t\t */\n\t\t\t\n\t\t\t// Get the field IDs that we've deleted.\n\t\t\tvar removedIDs = formData.get( 'fields' ).removedIDs;\n\n\t\t\t/*\n\t\t\t * data.fields is an array of objects like:\n\t\t\t * field.label = blah\n\t\t\t * field.label_pos = blah\n\t\t\t * etc.\n\t\t\t *\n\t\t\t * And we need that format to be:\n\t\t\t * field.settings.label = blah\n\t\t\t * field.settings.label_pos = blah\n\t\t\t *\n\t\t\t * So, we loop through our fields and create a field.settings object.\n\t\t\t */\n\t\t\t_.each( data.fields, function( field ) {\n\t\t\t\tvar id = field.id;\n\t\t\t\t// We dont' want to update id or parent_id\n\t\t\t\tdelete field.id;\n\t\t\t\tdelete field.parent_id;\n\t\t\t\tvar settings = {};\n\t\t\t\t// Loop through all the attributes of our fields\n\t\t\t\tfor (var prop in field) {\n\t\t\t\t if ( field.hasOwnProperty( prop ) ) {\n\t\t\t\t \t// Set our settings.prop value.\n\t\t\t\t settings[ prop ] = field[ prop ];\n\t\t\t\t // Delete the property from the field.\n\t\t\t\t delete field[ prop ];\n\t\t\t\t }\n\t\t\t\t}\n\n\t\t\t\tfor( var setting in settings ){\n\t\t\t\t\tif( null === settings[ setting ] ) {\n\t\t\t\t\t\tdelete settings[setting];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update our field object.\n\t\t\t\tfield.settings = settings;\n\t\t\t\tfield.id = id;\n\t\t\t} );\n\n\t\t\t// Set our deleted_fields object so that we can know which fields were removed.\n\t\t\tdata.deleted_fields = removedIDs;\n\n\t\t\t/**\n\t\t\t * Prepare actions for submission.\n\t\t\t */\n\t\t\t\n\t\t\t// Get the action IDs that we've deleted.\n\t\t\tvar removedIDs = formData.get( 'actions' ).removedIDs;\n\n\t\t\t/*\n\t\t\t * data.actions is an array of objects like:\n\t\t\t * action.label = blah\n\t\t\t * action.label_pos = blah\n\t\t\t * etc.\n\t\t\t *\n\t\t\t * And we need that format to be:\n\t\t\t * action.settings.label = blah\n\t\t\t * action.settings.label_pos = blah\n\t\t\t *\n\t\t\t * So, we loop through our actions and create a field.settings object.\n\t\t\t */\n\t\t\t_.each( data.actions, function( action ) {\n\t\t\t\tvar id = action.id;\n\t\t\t\t// We dont' want to update id or parent_id\n\t\t\t\tdelete action.id;\n\t\t\t\tdelete action.parent_id;\n\t\t\t\tvar settings = {};\n\t\t\t\t// Loop through all the attributes of our actions\n\t\t\t\tfor (var prop in action) {\n\t\t\t\t if ( action.hasOwnProperty( prop ) ) {\n\t\t\t\t \t// Set our settings.prop value.\n\t\t\t\t settings[ prop ] = action[ prop ];\n\t\t\t\t // Delete the property from the action.\n\t\t\t\t delete action[ prop ];\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t\t// Update our action object.\n\t\t\t\taction.settings = settings;\n\t\t\t\taction.id = id;\n\t\t\t} );\n\n\t\t\t// Set our deleted_actions object so that we can know which actions were removed.\n\t\t\tdata.deleted_actions = removedIDs;\n\n\t\t\t// Turn our object into a JSON string.\n\t\t\tdata = JSON.stringify( data );\n\t\t\t// Run anything that needs to happen before we update.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:updateDB', data );\n\n\t\t\tif ( 'publish' == action ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', true );\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\t\n\n\t\t\t\t// If we're on mobile, show a notice that we're publishing\n\t\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'publishing', 'Your Changes Are Being Published', { autoClose: false } );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update\n\t\t\tjQuery.post( ajaxurl, { action: jsAction, form: data, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\t\tresponse.action = action;\n\t\t\t\t\t// Run anything that needs to happen after we update.\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'response:updateDB', response );\n\t\t\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) && 'preview' == action ) {\n\t\t\t\t\t\t// nfRadio.channel( 'notices' ).request( 'add', 'previewUpdate', 'Preview Updated'\t);\n\t\t\t\t\t}\n\t\t\t\t} catch( exception ) {\n\t\t\t\t\tconsole.log( 'Something went wrong!' );\n\t\t\t\t\tconsole.log( exception );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} );\n\t\t},\n\n\t\tdefaultSaveFilter: function( formContentData ) {\n\t\t\treturn formContentData.pluck( 'key' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our form data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/formModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\tif ( ! jQuery.isNumeric( this.get( 'id' ) ) ) {\n\t\t\t\tthis.set( 'show_publish_options', true, { silent: true } );\n\t\t\t} else {\n\t\t\t\tthis.set( 'show_publish_options', false, { silent: true } );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Stores our form data and responds to requests for it.\n * Form data stores fields, actions, and settings.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formData',['models/app/formModel'], function( formModel) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Instantiate Form Model\n\t\t\tthis.model = new formModel( { id: preloadedFormData.id } );\n\t\t\t// Set our field collection\n\t\t\tthis.model.set( 'fields', nfRadio.channel( 'fields' ).request( 'get:collection' ) );\n\t\t\t// Set our actions collection\n\t\t\tthis.model.set( 'actions', nfRadio.channel( 'actions' ).request( 'get:collection' ) );\n\t\t\t// Set our settings collection\n\t\t\tthis.model.set( 'settings', nfRadio.channel( 'settings' ).request( 'get:settings' ) );\n\t\t\t// Respond to requests for form data.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:formModel', this.getFormModel, this );\n\t\t},\n\n\t\t/**\n\t\t * Return form data model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return backbone.model\n\t\t */\n\t\tgetFormModel: function() {\n\t\t\treturn this.model;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles changing our preview link when we change the 'clean' state of our app.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/previewLink',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for events that would change our preview link\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:sendChanges', this.disablePreview, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:sendChanges', this.enablePreview, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.changePreviewNicename, this );\n\t\t},\n\n\t\t/**\n\t\t * Disable our preview link before we send data to update our preview.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tdisablePreview: function() {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\t\t\t// Set disabled to true. This will trigger the preview link view to redraw.\n\t\t\tpreview.set( 'disabled', true );\n\t\t},\n\n\t\t/**\n\t\t * Change the preview link text from \"Preview Form\" to \"Preview Changes\" or vice-versa\n\t\t * \n\t\t * @since 3.0\n\t\t * @param boolean \tclean app data state\n\t\t * @return void\n\t\t */\n\t\tchangePreviewNicename: function( clean ) {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\n\t\t\t// If we have unsaved changes, set our text to 'changes' otherwise, set it to 'form'\n\t\t\tif ( ! clean ) {\n\t\t\t\tvar nicename = 'Preview Changes';\n\t\t\t} else {\n\t\t\t\tvar nicename = 'Preview Form';\n\t\t\t}\n\n\t\t\tpreview.set( 'nicename', nicename );\n\t\t},\n\n\t\t/**\n\t\t * Enable our preview button.\n\t\t * This is triggered when we get a response from our preview update.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tenablePreview: function() {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\t\t\t// Set disabled to false. This will trigger the preview link view to redraw.\n\t\t\tpreview.set( 'disabled', false );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for requests to change the current domain.\n *\n * The app menu and the main submenu both contain clickable links that change the current domain.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/menuButtons',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:publish', this.publish );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:viewChanges', this.viewChanges );\n\t\t},\n\n\t\tpublish: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\n\t\t},\n\n\t\tviewChanges: function() {\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'viewChanges', { collection: changeCollection } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our change data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/changeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdisabled: false\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Holds all of our change models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/changeCollection',['models/app/changeModel'], function( domainModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: domainModel,\n\n\t\tcomparator: function( model ) {\n\t\t\tvar id = parseInt( model.cid.replace( 'c', '' ) );\n\t\t\treturn -id;\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Track settings changes across our app.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/trackChanges',['models/app/changeCollection', 'models/app/changeModel'], function( changeCollection, ChangeModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new changeCollection();\n\t\t\t// Respond to any requests to add a change directly.\n\t\t\tnfRadio.channel( 'changes' ).reply( 'register:change', this.registerChange, this );\n\t\t\t// Respond to requests for the change collection\n\t\t\tnfRadio.channel( 'changes' ).reply( 'get:collection', this.getCollection, this );\n\t\t\t// Listen for changes in our clean state. If it goes to clean, clear our collection.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.maybeResetCollection );\n\t\t},\n\n\t\tregisterChange: function( action, model, changes, label, data ) {\n\t\t\tvar data = typeof data !== 'undefined' ? data : {};\n\t\t\tif ( 'undefined' == typeof label.dashicon ) {\n\t\t\t\tlabel.dashicon = 'admin-generic';\n\t\t\t}\n\t\t\tvar changeModel = new ChangeModel({\n\t\t\t\taction: action,\n\t\t\t\tmodel: model,\n\t\t\t\tchanges: changes,\n\t\t\t\tlabel: label,\n\t\t\t\tdata: data\t\t\n\t\t\t} );\n\t\t\tthis.collection.add( changeModel );\n\t\t\treturn changeModel;\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tmaybeResetCollection: function( clean ) {\n\t\t\tif ( clean ) {\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'controllers/app/undoChanges',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoChanges', this.undoChanges, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoSingle', this.undoSingle, this );\n\t\t},\n\n\t\tundoChanges: function() {\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tchangeCollection.sort();\n\t\t\tvar that = this;\n\t\t\t_.each( changeCollection.models, function( change ) {\n\t\t\t\tthat.undoSingle( change, true );\n\t\t\t} );\n\t\t\tchangeCollection.reset();\n\t\t\t// Update preview.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t},\n\n\t\tundoSingle: function( change, undoAll ) {\n\t\t\tnfRadio.channel( 'changes' ).request( 'undo:' + change.get( 'action' ), change, undoAll );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for our update:db response and replaces tmp ids with new ids if we were performing the publish action.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/publishResponse',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our app channel for the updateDB response.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.publishResponse );\n\t\t},\n\n\t\tpublishResponse: function( response ) {\n\t\t\t// If we aren't performing a publish action, bail.\n\t\t\tif ( 'publish' !== response.action ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// Check to see if we have any new ids. \n\t\t\tif ( 'undefined' != typeof response.data.new_ids ) {\n\n\t\t\t\t// If we have any new fields, update their models with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.fields ) {\n\t\t\t\t\t_.each( response.data.new_ids.fields, function( newID, oldID ) {\n\t\t\t\t\t\tvar field = nfRadio.channel( 'fields' ).request( 'get:field', oldID );\n\t\t\t\t\t\tif ( field ) {\n\t\t\t\t\t\t\tfield.set( 'id', newID );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we have any new actions, update their models with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.actions ) {\n\t\t\t\t\t_.each( response.data.new_ids.actions, function( newID, oldID ) {\n\t\t\t\t\t\tvar action = nfRadio.channel( 'actions' ).request( 'get:action', oldID );\n\t\t\t\t\t\tif ( action ) {\n\t\t\t\t\t\t\taction.set( 'id', newID );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we have a new form id, update the model with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.forms ) {\n\t\t\t\t\t_.each( response.data.new_ids.forms, function( newID, oldID ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\tformModel.set( 'id', newID );\n\t\t\t\t\t\thistory.replaceState( '', '', 'admin.php?page=ninja-forms&form_id=' + newID );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', false );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\n\n\t\t\t// If we're on mobile, show a notice that we're publishing\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'close', 'publishing' );\n\t\t\t}\n\t\t\t// Add a notice that we've published.\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'published', 'Changes Published' );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'app:published', response );\n\n\t\t\t// Mark our app as clean. This will disable the publish button and fire anything else that cares about the state.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t}\n\t\t\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for requests to change the current domain.\n *\n * The app menu and the main submenu both contain clickable links that change the current domain.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeDomain',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for both menu and submenu clicks.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.changeAppDomain );\n\t\t\t// Reply to specific requests to change the domain\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:currentDomain', this.changeAppDomain, this );\n\n\t\t\t// Reply to requests to prevent our drawer from closing\n\t\t\tnfRadio.channel( 'app' ).reply( 'prevent:changeDomain', this.preventChange, this );\n\t\t\t// Reply to requests to enable drawer closing\n\t\t\tnfRadio.channel( 'app' ).reply( 'enable:changeDomain', this.enableChange, this );\n\n\t\t\t/*\n\t\t\t * Object that holds our array of 'prevent change' values.\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\n\t\t\t */\n\t\t\tthis.objPreventChange = {};\n\t\t},\n\n\t\tchangeAppDomain: function( e, model ) {\n\t\t\t/*\n\t\t\t * If we have disabled movement between domains, return false.\n\t\t\t */\n\t\t\tif ( this.maybePreventChange() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * If we are passed a model, use that model.\n\t\t\t * Otherwise, get the domain from the event target data.\n\t\t\t */ \n\t\t\tif ( 'undefined' == typeof model ) {\n\t\t\t\tvar domainID = jQuery( e.target ).data( 'domain' );\n\t\t\t\tvar model = nfRadio.channel( 'app' ).request( 'get:domainModel', domainID );\n\t\t\t}\n\t\t\t// If a drawer is open, close it.\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we aren't dealing with an external url (such as preview), update our app data\n\t\t\t * and trigger a radio message saying we've changed the domain.\n\t\t\t */ \n\t\t\tif ( 0 == model.get( 'url' ).length ) {\n\t\t\t\tvar mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:currentDomain', model );\n\t\t\t\tjQuery( mainEl ).scrollTop( 0 );\t\t\t\t\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:currentDomain', model );\n\t\t\t}\n\t\t},\n\n\t\t/**\n * Check to see if anything has registered a key to prevent changing the domain.\n * \n * @since 3.0\n * @return boolean\n */\n maybePreventChange: function() {\n \tif ( 0 == Object.keys( this.objPreventChange ).length ) {\n \t\treturn false;\n \t} else {\n \t\treturn true;\n \t}\n },\n\n /**\n * Register a key to prevent changing the domain.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent change domain' setting.\n * @return void\n */\n preventChange: function( key ) {\n \tthis.objPreventChange[ key ] = true;\n },\n\n /**\n * Remove a previously registered key that is preventing our domain from changing.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent change domain' setting.\n * @return void\n */\n enableChange: function( key ) {\n \tdelete this.objPreventChange[ key ];\n },\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Modify the user's browser history when they click on a domain\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/pushstate',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changePushState );\n\t\t},\n\n\t\tchangePushState: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\thistory.pushState( null, null, window.location.href + '&domain=' + currentDomain.get( 'id' ) );\n\t\t\tvar reExp = /domain=\\\\d+/;\n\t\t\tvar url = window.location.toString();\n\t\t\tvar newUrl = url.replace( reExp, '' );\n\t\t\tconsole.log( newUrl );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles our hotkey execution. Needs to be cleaned up and made more programmatic.\n * \n * Our hotkeys are defined by the domain that we're currently viewing. In each domain's model, there is a hotkey object.\n * \n * Currently too much hotkey data is hard-coded here.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/hotkeys',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we change our domain, change the hotkeys to those within that object.\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'render:main', this.changeHotkeys );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.changeHotkeys );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'render:settingGroup', this.changeHotkeys );\n\t\t\t// Currently, these are the functions that run when the new field or new action hotkey is pressed.\n\t\t\t// TODO: move these into a config module or into something more programmatic and scalable.\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newField', this.addNewField );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newAction', this.addNewAction );\n\t\t\t// Same as above, these functions need to be moved into a more modular/programmatic solution.\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:fields', this.changeDomainFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:actions', this.changeDomainActions );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:settings', this.changeDomainSettings );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'close:drawer', this.closeDrawer );\n\t\t},\n\n\t\tchangeHotkeys: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tjQuery( document ).off( '.nfDomainHotkeys' );\n\t\t\tjQuery( 'input' ).off( '.nfDomainHotkeys' );\n\t\t\tif ( currentDomain.get( 'hotkeys' ) ) {\n\t\t\t\tjQuery.each( currentDomain.get( 'hotkeys' ), function( hotkey, msg ) {\n\t\t\t\t\tjQuery( document ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery( 'input' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery( 'textarea' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\taddNewField: function() {\n\t\t\tif ( 'addField' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\taddNewAction: function() {\n\t\t\tif ( 'addAction' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addAction' );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t},\n\n\t\tchangeDomainFields: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar fieldsDomain = appDomainCollection.get( 'fields' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, fieldsDomain );\n\t\t},\n\n\t\tchangeDomainActions: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar actionsDomain = appDomainCollection.get( 'actions' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, actionsDomain );\n\t\t},\n\n\t\tchangeDomainSettings: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar settingsDomain = appDomainCollection.get( 'settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, settingsDomain );\n\t\t},\n\n\t\tcloseDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Change the clean state of our app when settings are changed.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cleanState',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Set an array of field model attributes to ignore.\n\t\t\t * This list will be filtered just before we ignore anything.\n\t\t\t */ \n\t\t\tthis.ignoreAttributes = [\n\t\t\t\t'editActive'\n\t\t\t];\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:setting', this.setAppClean );\n\t\t},\n\n\t\tsetAppClean: function( model ) {\n\t\t\tfor( var attr in model.changedAttributes() ) {\n\t\t\t\tvar changedAttr = attr;\n\t\t\t\tvar after = model.changedAttributes()[ attr ];\n\t\t\t}\n\n\t\t\tvar ignoreAttributes = nfRadio.channel( 'undo-' + model.get( 'type' ) ).request( 'ignore:attributes', this.ignoreAttributes ) || this.ignoreAttributes;\n\t\t\t\n\t\t\tif ( -1 != this.ignoreAttributes.indexOf( attr ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * All of the core undo functions. Listens on the 'changes' channel for an undo request.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/coreUndo',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:changeSetting', this.undoChangeSetting, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addObject', this.undoAddObject, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeObject', this.undoRemoveObject, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:duplicateObject', this.undoDuplicateObject, this );\n\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortFields', this.undoSortFields, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addListOption', this.undoAddListOption, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeListOption', this.undoRemoveListOption, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortListOptions', this.undoSortListOptions, this );\n\t\t},\n\n\t\t/**\n\t\t * Undo settings that have been changed.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoChangeSetting: function( change, undoAll ) {\n\t\t\tvar fieldModel = change.get( 'model' );\n\t\t\tvar changes = change.get( 'changes' );\n\t\t\tvar attr = changes.attr;\n\t\t\tvar before = changes.before;\n\t\t\tfieldModel.set( attr, before );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo adding a field or an action.\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoAddObject: function( change, undoAll ) {\n\t\t\tvar objectModel = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\n\t\t\tif ( 'undefined' != typeof collection.newIDs ) {\n\t\t\t\tdelete collection.newIDs[ objectModel.get( 'id' ) ];\n\t\t\t}\n\t\t\t\t\t\t\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( model );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tcollection.remove( objectModel );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\t\t\n\n\t\t/**\n\t\t * Undo adding a field or an action.\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoDuplicateObject: function( change, undoAll ) {\n\t\t\tvar objectModel = change.get( 'model' );\n\t\t\tvar objectCollection = change.get( 'data' ).collection;\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( model );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tobjectCollection.remove( objectModel );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo removing a field or an action.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoRemoveObject: function( change, undoAll ) {\n\t\t\tvar dataModel = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\n\t\t\tnfRadio.channel( dataModel.get( 'objectDomain' ) ).request( 'add', dataModel );\n\n\t\t\tdelete collection.removedIDs[ dataModel.get( 'id' ) ];\n\t\t\t\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: dataModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tmodel.set( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\t// Trigger a reset on our field collection so that our view re-renders\n\t\t\tcollection.trigger( 'reset', collection );\n\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo field sorting.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoSortFields: function( change, undoAll ) {\n\t\t\tvar data = change.get( 'data' );\n\t\t\tvar fields = data.fields;\n\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields, function( changeModel ) {\n\t\t\t\tvar before = changeModel.before;\n\t\t\t\tvar fieldModel = changeModel.model;\n\t\t\t\tfieldModel.set( 'order', before );\n\t\t\t\t// console.log( 'set ' + fieldModel.get( 'label' ) + ' to ' + before );\n\t\t\t} );\n\t\t\t// console.log( fieldCollection.where( { label: 'Name' } ) );\n\t\t\t// console.log( fieldCollection.where( { label: 'Email' } ) );\n\n\n\t\t\tfieldCollection.sort();\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoAddListOption: function( change, undoAll ) {\n\t\t\tvar model = change.get( 'model' );\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\t\tif ( changeModel !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( changeModel );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\tmodel.collection.remove( model );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoRemoveListOption: function( change, undoAll ) {\n\t\t\tvar model = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\t\t\tcollection.add( model );\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tmodel.set( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoSortListOptions: function( change, undoAll ) {\n\t\t\tvar data = change.get( 'data' );\n\t\t\tvar collection = data.collection;\n\t\t\t\n\t\t\tvar objModels = data.objModels;\n\n\t\t\t_.each( objModels, function( changeModel ) {\n\t\t\t\tvar before = changeModel.before;\n\t\t\t\tvar optionModel = changeModel.model;\n\t\t\t\toptionModel.set( 'order', before );\n\t\t\t} );\t\t\t\t\n\n\n\t\t\tcollection.sort();\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * If our undo action was requested to 'remove' the change from the collection, remove it.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tremove \tshould we remove this item from our change collection\n\t\t * @return void\n\t\t */\n\t\tmaybeRemoveChange: function( change, undoAll ) {\t\t\t\n\t\t\tvar undoAll = typeof undoAll !== 'undefined' ? undoAll : false;\n\t\t\tif ( ! undoAll ) {\n\t\t\t\t// Update preview.\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tchangeCollection.remove( change );\n\t\t\t\tif ( 0 == changeCollection.length ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns a clone of a backbone model with all the attributes looped through so that collections contained within are propely cloned.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cloneModelDeep',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:modelDeep', this.cloneModelDeep, this );\n\t\t},\n\n\t\tcloneModelDeep: function( model ) {\n\t\t\t// Temporary value used to store any new collections.\n\t\t\tvar replace = {};\n\t\t\t// Loop over every model attribute and if we find a collection, clone each model and instantiate a new collection.\n\t\t\t_.each( model.attributes, function( val, key ) {\n\t\t\t\tif( val instanceof Backbone.Collection ) { // Is this a backbone collection?\n\t\t\t\t\tvar clonedCollection = nfRadio.channel( 'app' ).request( 'clone:collectionDeep', val );\n\t\t\t\t\treplace[ key ] = clonedCollection;\n\t\t\t\t} else if ( val instanceof Backbone.Model ) { // Is this a backbone model?\n\t\t\t\t\treplace[ key ] = this.cloneModelDeep( val );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\t// Clone our original model\n\t\t\tvar newModel = model.clone();\n\t\t\t// Overwrite any collections we created above.\n\t\t\t_.each( replace, function( val, key ) {\n\t\t\t\tnewModel.set( key, val );\n\t\t\t} );\n\n\t\t\treturn newModel;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns the appropriate child view for our settings drawer.\n *\n * This enables settings types to register custom childviews for their settings.\n * The option-repeater setting for the list field is an example.\n * \n * @package Ninja Forms builder\n * @subpackage App - Edit Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/getSettingChildView',['views/app/drawer/itemSetting'], function( itemSettingView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for field settings child views.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t},\n\n\t\t/**\n\t\t * Return the appropriate child setting view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model\tmodel \tField setting\n\t\t * @return backbone.view\n\t\t */\n\t\tgetSettingChildView: function( model ) {\n\t\t\t// Get our setting type.\n\t\t\tvar type = model.get( 'type' );\n\t\t\t// Request a setting childview from our setting type channel. (Setting type, not field type)\n\t\t\tvar settingChildView = nfRadio.channel( type ).request( 'get:settingChildView', model ) || itemSettingView;\n\t\t\t\n\t\t\treturn settingChildView\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Updates our model when the user changes a setting.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeSettingDefault',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to update settings.\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:setting', this.changeSetting, this );\n\n\t\t\t// Listen on our app channel for the change setting event. Fired by the setting view.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.changeSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * When we change our setting, update the model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te event\n\t\t * @param backbone.model \tsettingModel model that holds our field type settings info\n\t\t * @param backbone.model \tdataModel model that holds our field settings\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( e, settingModel, dataModel, value ) {\n\t\t\tvar name = settingModel.get( 'name' );\n\t\t\tvar before = dataModel.get( name );\n\t\t\tvar value = value || null;\n\t\t\tif ( ! value ) {\n\t\t\t\t// Sends out a request on the fields-type (fields-text, fields-checkbox, etc) channel to see if that field type needs to return a special value for saving.\n\t\t\t\tvalue = nfRadio.channel( settingModel.get( 'type' ) ).request( 'before:updateSetting', e, dataModel, name, settingModel );\n\t\t\t}\n\n\t\t\tif( 'undefined' == typeof value ){\n\t\t\t value = jQuery( e.target ).val();\n }\n\t\t\t\n\t\t\t// Update our field model with the new setting value.\n\t\t\tdataModel.set( name, value, { settingModel: settingModel } );\n\t\t\tnfRadio.channel( 'setting-' + name ).trigger( 'after:updateSetting', dataModel, settingModel );\n\t\t\t// Register our setting change with our change tracker\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'views/app/drawer/typeSettingFieldset',['views/app/drawer/itemSetting'], function( itemSettingView ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\n\t\tchildView: itemSettingView,\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.collection = this.model.get( 'settings' );\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.model.on( 'rerender', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\t \t\trenderSetting: function(){\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( this );\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderError: function() {\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\treturn this.error;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.nf-field-sub-settings' ).append( childView.el );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Model that represents our setting.\n *\n * When the model is created, we trigger the init event in two radio channels.\n *\n * This lets specific types of settings modify the model before anything uses it.\n *\n * Fieldset, for instance, uses this hook to instantiate its settings as a collection.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tsettings: false,\n\t\t\thide_merge_tags: false,\n\t\t\terror: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Send out two messages saying that we've initialized a setting model.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:settingModel', this );\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'init:settingModel', this );\n\t\t\tnfRadio.channel( 'setting-name-' + this.get( 'name' ) ).trigger( 'init:settingModel', this );\n\t\t\tthis.on( 'change:error', this.maybePreventUI, this );\n\n\t\t\t/*\n\t\t\t * If we have an objectType set on our collection, then we're creating a model for the generic settings collection.\n\t\t\t * If we're using merge tags in this setting\n\t\t\t */\n\n\t\t\tif( 'undefined' == typeof this.collection ) return;\n\n\t\t\tif ( this.get( 'use_merge_tags' ) && 'undefined' != typeof this.collection.options.objectType ) {\n\t\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', this.updateKey );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, send out a radio message requesting that this setting be checked for the old key.\n\t\t * We want to send the message on the objectType channel.\n\t\t * This means that if this setting is for fields, it will trigger on the fields channel, actions, etc.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Backbone.Model \tkeyModel data model representing the field for which the key just changed\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( keyModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'fire:updateFieldKey', keyModel, this );\n\t\t},\n\n\t\tmaybePreventUI: function() {\n\t\t\tif ( this.get( 'error' ) ) {\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'prevent:close', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'prevent:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\t\t\t\t\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'enable:close', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'enable:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collections of settings for each field type.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingCollection',['models/app/settingModel'], function( settingModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: settingModel,\n\n\t\tinitialize: function( models, options ) {\n\t\t\tthis.options = options || {};\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles actions related to field settings that use a fieldset\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/fieldset',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fieldset' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t\t// When a list type field is initialized, create an option collection.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldset' ), 'init:settingModel', this.createSettingsCollection );\n\t\t},\n\n\t\tgetSettingChildView: function( model ) {\n\t\t\treturn fieldsetView;\n\t\t},\n\n\t\t/**\n\t\t * Instantiate settings collection when a fieldset type is initialized.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tfield model being initialized\n\t\t * @return void\n\t\t */\n\t\tcreateSettingsCollection: function( model ) {\n\t\t\tmodel.set( 'settings', new settingCollection( model.get( 'settings' ) ) );\n\t\t},\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to our toggle field.\n * When we change the toggle, the setting value will be 'on' or ''.\n * We need to change this to 1 or 0.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/toggleSetting',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\n\t\t\tnfRadio.channel( 'setting-type-toggle' ).reply( 'renderOnChange', function(){ return false } );\n\n\t\t\t// Respond to requests for field setting filtering.\n\t\t\tnfRadio.channel( 'toggle' ).reply( 'before:updateSetting', this.updateSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * Return either 1 or 0, depending upon the toggle position.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te event\n\t\t * @param backbone.model \tfieldModel field model\n\t\t * @param string \t\t\tname setting name\n\t\t * @param backbone.model \tsettingTypeModel field type model\n\t\t * @return int 1 or 0\n\t\t */\n\t\tupdateSetting: function( e, fieldModel, name, settingTypeModel ) {\n\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\n\t\t\t\tvar value = 1;\n\t\t\t} else {\n\t\t\t\tvar value = 0;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for clicks on our action item action buttons.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Main Sortable\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/itemControls',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for clicks to edit, delete, duplicate actions.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:edit', this.clickEdit );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:delete', this.clickDelete );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:duplicate', this.clickDuplicate );\n\n\t\t\t// Listen for our drawer close and remove our active edit state\n\t\t},\n\n\t\t/**\n\t\t * Open a drawer with our action model for editing settings.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickEdit: function( e, model ) {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\tvar type = nfRadio.channel( currentDomainID ).request( 'get:type' , model.get( 'type' ) );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: type.get( 'settingGroups' ) } );\n\t\t},\n\n\t\t/**\n\t\t * Delete a action model from our collection\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickDelete: function( e, dataModel ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\t// Add our action deletion to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Removed',\n\t\t\t\tdashicon: 'dismiss'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: dataModel.collection\n\t\t\t};\n\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tvar results = changeCollection.where( { model: dataModel } );\n\n\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\tvar data = changeModel.get( 'data' );\n\t\t\t\tif ( 'undefined' != typeof data.fields ) {\n\t\t\t\t\t_.each( data.fields, function( field, index ) {\n\t\t\t\t\t\tif ( field.model == dataModel ) {\n\t\t\t\t\t\t\tdata.fields[ index ].model = newModel;\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tchangeModel.set( 'data', data );\n\t\t\t\tchangeModel.set( 'model', newModel );\n\t\t\t\tchangeModel.set( 'disabled', true );\n\t\t\t} );\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeObject', newModel, null, label, data );\n\t\t\t\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\tnfRadio.channel( currentDomainID ).request( 'delete', dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Duplicate a action within our collection, adding the word \"copy\" to the label.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickDuplicate: function( e, model ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\n\t\t\t// Change our label.\n\t\t\tnewModel.set( 'label', newModel.get( 'label' ) + ' Copy' );\n\t\t\t// Update our ID to the new tmp id.\n\t\t\tvar tmpID = nfRadio.channel( currentDomainID ).request( 'get:tmpID' );\n\t\t\tnewModel.set( 'id', tmpID );\n\t\t\t// Add new model.\n\t\t\t// Params are: model, silent, renderTrigger, action\n\t\t\tnfRadio.channel( currentDomainID ).request( 'add', newModel, false, false, 'duplicate' );\n\t\t\t\n\t\t\t// Add our action addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: model.get( 'objectType' ),\n\t\t\t\tlabel: model.get( 'label' ),\n\t\t\t\tchange: 'Duplicated',\n\t\t\t\tdashicon: 'admin-page'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( currentDomainID ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'duplicateObject', newModel, null, label, data );\n\t\t\t\n\t\t\tmodel.trigger( 'change:label', model );\n\n\t\t\t// Update preview.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Config file for our merge tags.\n *\n * this.collection represents all of our registered merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/mergeTags',[\n\t'models/app/mergeTagCollection'\n\t], function(\n\tmergeTagCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.tagSectionCollection = new mergeTagCollection();\n\t\t\tvar that = this;\n\t\t\t_.each( mergeTags, function( tagSection ) {\n\t\t\t\tif ( tagSection.tags ) {\n\t\t\t\t\tvar tags = new mergeTagCollection( tagSection.tags );\n\t\t\t\t} else {\n\t\t\t\t\tvar tags = '';\n\t\t\t\t}\n\n\t\t\t\tthat.tagSectionCollection.add( {\n\t\t\t\t\tid: tagSection.id,\n\t\t\t\t\tlabel: tagSection.label,\n\t\t\t\t\ttags: tags,\n\t\t\t\t\tdefault_group: tagSection.default_group\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tvar fieldTags = this.tagSectionCollection.get( 'fields').get( 'tags' );\n\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\t// TODO: Make this dynamic\n\t\t\t\tif ( 'submit' !== field.get( 'type' ) ) {\n\t\t\t\t\tfieldTags.add( {\n\t\t\t\t\t\tid: field.get( 'id' ),\n\t\t\t\t\t\tlabel: field.get( 'label' ),\n\t\t\t\t\t\ttag: that.getFieldKeyFormat( field.get( 'key' ) )\n\t\t\t\t\t} );\t\t\t\t\t\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tvar calcTags = new mergeTagCollection();\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\n\t\t\t_.each( calcCollection.models, function( calcModel ) {\n\t\t\t\tcalcTags.add( {\n\t\t\t\t\tlabel: calcModel.get( 'name' ),\n\t\t\t\t\ttag: '{calc:' + calcModel.get( 'name' ) + '}'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\n\n\t\t\tthis.currentElement = {};\n\t\t\tthis.settingModel = {};\n\t\t\tthis.open = false;\n\n\t\t\t// Unhook jBox Merge Tag stuff.\n\t\t\t// nfRadio.channel( 'mergeTags' ).reply( 'init', this.initMergeTags, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'mergeTags' ), 'click:mergeTag', this.clickMergeTag );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.addFieldTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'delete:field', this.deleteFieldTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalcTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'remove:option', this.updateCalcTags );\n\n\t\t\t\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentElement', this.updateCurrentElement, this );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentSetting', this.updateCurrentSetting, this );\n\n\t\t\t// Listen for requests for our mergeTag collection.\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:mergeTag', this.getSectionModel, this );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.replaceFieldKey );\n\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:fieldKeyFormat', this.getFieldKeyFormat, this );\n\n\t\t\t/*\n\t\t\t * TODO: Hotkey support for adding tags.\n\t\t\t *\n\t\t\t\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'open:mergeTags', this.openMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'up:mergeTags', this.upMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'down:mergeTags', this.downMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'return:mergeTags', this.returnMergeTags );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:open', this.updateOpen, this );\n\t\t\t*/\n\t\t},\n\n\t\t/**\n\t\t * Init merge tags within the passed view.\n\t\t * @since 3.0\n\t\t * @param backbone.view view to be searched for merge tags.\n\t\t * @return void\n\t\t */\n\t\tinitMergeTags: function( view ) {\n\t\t\tvar mergeTagsView = nfRadio.channel( 'mergeTags' ).request( 'get:view' );\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * Apply merge tags jQuery plugin.\n\t\t\t *\n\t\t\t * Prevent jBox from being called multiple times on the same element\n\t\t\t */\n\t\t\tthis.jBoxes = {};\n\t\t\tvar that = this;\n\n\t\t\tjQuery( view.el ).find( '.merge-tags' ).each(function() {\n\t\t\t\tif ( 'undefined' == typeof jQuery( this ).data( 'jBox-id' ) ) {\n\t\t\t\t\tvar jBox = jQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\t\ttitle: 'Insert Merge Tag',\n\t\t\t\t\t\ttrigger: 'click',\n\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\tx: 'center',\n\t\t\t\t\t\t\ty: 'bottom'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcloseOnClick: 'body',\n\t\t\t\t\t\tcloseOnEsc: true,\n\t\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\t\tmaxHeight: 200,\n\n\t\t\t\t\t\tonOpen: function() {\n\t\t\t\t\t\t\tmergeTagsView.reRender( view.model );\n\t\t\t\t\t\t\tthis.setContent( jQuery( '.merge-tags-content' ) );\n\t\t\t\t\t\t\tvar currentElement = jQuery( this.target ).prev( '.setting' );\n\t\t\t\t\t\t\tif ( 0 == currentElement.length ) {\n\t\t\t\t\t\t\t\tcurrentElement = jQuery( view.el ).find( '.setting' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthat.updateCurrentSetting( view.model );\n\t\t\t\t\t\t\tthat.updateCurrentElement( currentElement );\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'prevent:close', 'merge-tags' );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonClose: function() {\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'enable:close', 'merge-tags' );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tjQuery( this ).data( 'jBox-id', jBox.id );\t\t\t\t\t\n\t\t\t\t}\n\t\t });\n\t\t},\n\n\t\tclickMergeTag: function( e, tagModel ) {\n\t\t\t/*\n\t\t\t * TODO: Make this more dynamic.\n\t\t\t * Currently, the RTE is the only section that modifies how merge tags work,\n\t\t\t * but another type of setting might need to do this in the future.\n\t\t\t */\n\n\t\t\tif( 'undefined' != typeof this.settingModel.get( 'settingModel' ) && 'calculations' == this.settingModel.get( 'settingModel' ).get( 'name' ) ) {\n\n\t\t\t\tconsole.log( tagModel );\n\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\n\n\t\t\t\tvar tag = ( 'undefined' != typeof tagModel.get( 'calcTag' ) ) ? tagModel.get( 'calcTag' ) : tagModel.get( 'tag' );\n\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tag + currentValue.substr( currentPos );\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\n\t\t\t} else if( 'rte' == this.settingModel.get( 'type' ) ) {\n\t\t\t\tjQuery( this.currentElement ).summernote( 'insertText', tagModel.get( 'tag' ) );\n\t\t\t} else {\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tagModel.get( 'tag' ) + currentValue.substr( currentPos );\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\n\t\t\t}\n\t\t},\n\n\t\taddFieldTags: function( fieldModel ) {\n\t\t\t// TODO: Make this dynamic\n\t\t\tif ( 'submit' !== fieldModel.get( 'type' ) ) {\n\t\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).add( {\n\t\t\t\t\tid: fieldModel.get( 'id' ),\n\t\t\t\t\tlabel: fieldModel.get( 'label' ),\n\t\t\t\t\ttag: this.getFieldKeyFormat( fieldModel.get( 'key' ) ),\n\t\t\t\t\tcalcTag: this.getFieldKeyFormatCalc( fieldModel.get( 'key' ) )\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tdeleteFieldTags: function( fieldModel ) {\n\t\t\tvar fieldID = fieldModel.get( 'id' );\n\t\t\tvar tagModel = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldID );\n\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).remove( tagModel );\n\t\t},\n\n\t\tupdateCalcTags: function( optionModel ) {\n\t\t\tvar calcTags = new mergeTagCollection();\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\n\n\t\t\t_.each( calcCollection.models, function( calc ) {\n\t\t\t\tcalcTags.add( {\n\t\t\t\t\tlabel: calc.get( 'name' ),\n\t\t\t\t\ttag: '{calc:' + calc.get( 'name' ) + '}'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\n\t\t},\n\n\t\topenMergeTags: function( e ) {\n\t\t\tif ( 'TEXTAREA' == jQuery( e.target )[0].tagName || 'INPUT' == jQuery( e.target )[0].tagName ) {\n\t\t\t\tjQuery( e.target ).parent().find( '.merge-tags' ).click();\n\t\t\t}\n\t\t},\n\n\t\treturnMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\n\t\t\t\tif ( currentModel ) {\n\t\t\t\t\tthis.clickMergeTag( e, currentModel );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.changeActiveTag( 'up' );\n\t\t\t}\n\t\t},\n\n\t\tdownMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.changeActiveTag( 'down' );\n\t\t\t}\n\t\t},\n\n\t\tchangeActiveTag: function( dir ) {\n\t\t\tif ( 'down' == dir ) {\n\t\t\t\tvar inc = 1;\n\t\t\t} else {\n\t\t\t\tvar inc = -1\n\t\t\t}\n\t\t\t// First, check to see if a field is currently active.\n\t\t\tif( 0 < this.fields.where( { 'active': true } ).length ) {\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\n\t\t\t\tvar currentIndex = this.fields.indexOf( currentModel );\n\t\t\t\tcurrentModel.set( 'active', false );\n\n\t\t\t\tvar nextModel = this.fields.models[ currentIndex + inc ];\n\t\t\t\tif ( nextModel ) {\n\t\t\t\t\tnextModel.set( 'active', true );\n\t\t\t\t} else {\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( 0 < this.fields.where( { 'active': true } ) ) { // There aren't any active fields. Check for active system tags.\n\t\t\t\tconsole.log( 'system' );\n\t\t\t} else if ( 0 < this.userInfo.where( { 'active': true } ) ) { // No active user info LIs.\n\t\t\t\tconsole.log( 'userinfo' );\n\t\t\t} else { // No active LIs. We haven't made any active yet, or we've gotten to the bottom of the list.\n\t\t\t\t// Make sure that we have fields\n\t\t\t\tif ( 0 < this.fields.models.length ) {\n\t\t\t\t\t// Set our first field to active.\n\t\t\t\t\tthis.fields.models[0].set( 'active', true );\n\t\t\t\t} else {\n\t\t\t\t\t// Set our first system model to active.\n\t\t\t\t\tthis.system.models[0].set( 'active', true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateCurrentElement: function( element ) {\n\t\t\tthis.currentElement = element;\n\t\t},\n\n\t\tupdateCurrentSetting: function( settingModel ) {\n\t\t\tthis.settingModel = settingModel;\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.tagSectionCollection;\n\t\t},\n\n\t\tgetSectionModel: function( id ) {\n\t\t\treturn this.tagSectionCollection.get( id );\n\t\t},\n\n\t\tupdateOpen: function( open ) {\n\t\t\tthis.open = open;\n\t\t\t_.each( this.tagSectionCollection.get( 'fields' ).models, function( model ) {\n\t\t\t\tmodel.set( 'active', false );\n\t\t\t} );\n\t\t},\n\n\t\tupdateKey: function( fieldModel ) {\n\t\t\tvar newKey = fieldModel.get( 'key' );\n\t\t\tvar oldTag = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldModel.get( 'id' ) );\n\t\t\tif ( 'undefined' != typeof oldTag ) {\n\t\t\t\toldTag.set( 'tag', this.getFieldKeyFormat( newKey ) );\t\t\t\t\n\t\t\t}\n\n\t\t},\n\n\t\tgetFieldKeyFormat: function( key ) {\n\t\t\treturn '{field:' + key + '}';\n\t\t},\n\n\t\tgetFieldKeyFormatCalc: function( key ) {\n\t\t\treturn '{field:' + key + ':calc}';\n\t\t},\n\n\t\treplaceFieldKey: function( dataModel, keyModel, settingModel ) {\n var oldKey = this.getFieldKeyFormat( keyModel._previousAttributes[ 'key' ] );\n\t\t\tvar newKey = this.getFieldKeyFormat( keyModel.get( 'key' ) );\n\t\t\tvar settingName = settingModel.get( 'name' );\n\t\t\tvar oldVal = dataModel.get( settingName );\n if(settingName == 'calculations' && 'undefined' != typeof(dataModel.get('calculations'))) {\n var calcModel = dataModel.get( 'calculations' );\n calcModel.each( function( model ) {\n var oldCalcKey = oldKey.slice( 0, (oldKey.length - 1) ) + ':calc}';\n var newCalcKey = newKey.slice( 0, (newKey.length - 1 ) ) + ':calc}';\n oldVal = model.get( 'eq' );\n if ( 'string' == typeof( oldVal ) ) {\n var re = new RegExp( oldCalcKey, 'g' );\n var newVal = oldVal.replace( re, newCalcKey );\n re = new RegExp( oldKey, 'g' );\n // TODO: We won't need this second replace when we no longer\n // have to append :calc to merge tags.\n newVal = newVal.replace( re, newKey );\n model.set( 'eq', newVal );\n }\n } );\n return false;\n }\n\t\t\tif ( 'string' == typeof oldVal ) {\n\t\t\t\tvar re = new RegExp( oldKey, 'g' );\n\t\t\t\tnewVal = oldVal.replace( re, newKey );\n\t\t\t\tdataModel.set( settingName, newVal );\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagLookupCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\n var collection = Backbone.Collection.extend( {\n model: mergeTagModel\n } );\n return collection;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTag',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'li',\n template: '#tmpl-nf-merge-tag-box-tag',\n\n events: {\n \"click\": \"insertTag\"\n },\n\n insertTag: function() {\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', this.model.get( 'tag' ) );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagList',[ 'views/app/drawer/mergeTag' ], function( mergeTagView ) {\n var view = Marionette.CollectionView.extend({\n tagName: 'ul',\n childView: mergeTagView,\n\n initialize: function() {\n nfRadio.channel( 'merge-tags' ).reply( 'update:taglist', this.sectionFilter, this );\n nfRadio.channel( 'merge-tags' ).reply( 'filtersearch', this.searchFilter, this );\n },\n\n filter: function( child, index, collection ){\n return 'fields' == child.get( 'section' );\n },\n\n sectionFilter: function( section ){\n this.filter = function( child, index, collection ){\n return section == child.get( 'section' );\n }\n this.render();\n nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n },\n\n searchFilter: function( term ){\n this.filter = function( child, index, collection ){\n var label = child.get( 'label' ).toLowerCase().indexOf( term.toLowerCase().replace( ':', '' ) ) >= 0;\n var tag = child.get( 'tag' ).toLowerCase().indexOf( term.toLowerCase() ) >= 0;\n return label || tag;\n }\n this.render();\n nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagGroup',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'li',\n template: '#tmpl-nf-merge-tag-box-section',\n events: {\n \"click\": \"onClick\"\n },\n\n initialize: function () {\n this.listenTo( nfRadio.channel( 'merge-tags' ), 'after:filtersearch', this.removeActive );\n },\n\n onClick: function(){\n this.updateTags();\n this.setActive();\n },\n\n updateTags: function() {\n nfRadio.channel( 'merge-tags' ).request( 'update:taglist', this.model.get( 'id' ) );\n },\n\n setActive: function(){\n this.$el.addClass( 'active' );\n this.$el.siblings().removeClass( 'active' );\n },\n\n removeActive: function(){\n this.$el.removeClass( 'active' );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagGroupList',[ 'views/app/drawer/mergeTagGroup' ], function( mergeTagGroupView ) {\n var view = Marionette.CollectionView.extend({\n tagName: 'ul',\n childView: mergeTagGroupView,\n\n initialize: function(){\n this.listenTo( nfRadio.channel( 'merge-tags' ), 'open', this.render, this );\n },\n\n // TODO: Update filter when a new tag is added. ie Calculations.\n filter: function( child, index, collection ){\n return 0 < child.get( 'tags' ).length;\n },\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagFilter',[], function() {\n var view = Marionette.ItemView.extend({\n template: '#tmpl-nf-merge-tag-box-filter',\n events: {\n \"keyup input\": \"updateFilter\",\n },\n updateFilter: function( event ) {\n\n if( /* ENTER */ 13 == event.keyCode ){ // Copied from Keyup Callback.\n // Get top listed merge tag.\n var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\n\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\n\n // COPIED FROM BELOW\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n return;\n }\n var value = this.$el.find( 'input' ).val();\n nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagBox',[], function() {\n var view = Marionette.LayoutView.extend({\n el: '#merge-tags-box',\n template: \"#tmpl-nf-merge-tag-box\",\n\n regions: {\n filter: '.merge-tag-filter',\n sections: '.merge-tag-sections',\n tags: '.merge-tag-list'\n },\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Merge Tag Box\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1\n */\n\ndefine( 'controllers/app/mergeTagBox',[\n 'models/app/mergeTagModel',\n 'models/app/mergeTagLookupCollection',\n 'views/app/drawer/mergeTag',\n 'views/app/drawer/mergeTagList',\n 'views/app/drawer/mergeTagGroup',\n 'views/app/drawer/mergeTagGroupList',\n 'views/app/drawer/mergeTagFilter',\n 'views/app/drawer/mergeTagBox'\n], function(\n MergeTagModel,\n MergeTagLookupCollection,\n MergeTagView,\n MergeTagListView,\n MergeTagGroupView,\n MergeTagGroupListView,\n MergeTagFilterView,\n MergeTagBoxLayout\n) {\n var controller = Marionette.Object.extend( {\n\n caret: 0, // Track the caret position of the current setting's input.\n old: '', // THe old merge tag that will be replaced.\n\n initialize: function(){\n\n this.listenTo( nfRadio.channel( 'drawer' ), 'render:settingGroup', function(){\n jQuery( '.merge-tags' ).off( 'click' );\n jQuery( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n });\n\n this.listenTo( nfRadio.channel( 'app' ), 'after:appStart', this.afterAppStart );\n this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n this.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.beforeDrawerClose );\n\n var that = this;\n nfRadio.channel( 'mergeTags' ).reply( 'set:caret', function( position ){\n that.caret = position;\n });\n nfRadio.channel( 'mergeTags' ).reply( 'get:caret', function(){\n return that.caret;\n });\n\n var that = this;\n nfRadio.channel( 'mergeTags' ).reply( 'set:old', function( value ){\n that.old = value;\n });\n nfRadio.channel( 'mergeTags' ).reply( 'get:old', function(){\n return that.old;\n });\n\n nfRadio.channel( 'mergeTags' ).reply( 'insert:tag', this.insertTag.bind( this ) );\n\n /** OPTION REPEATER */\n this.listenTo( nfRadio.channel( 'option-repeater' ), 'add:option', function( model ){\n var selector = '#' + model.cid + ' .has-merge-tags input.setting';\n jQuery( selector ).on( 'focus', function( event ){\n that.focusCallback( event, selector, 'option-repeater' );\n });\n jQuery( selector ).on( 'keyup', function( event ){\n that.keyupCallback( event, selector, 'option-repeater' );\n });\n jQuery( selector ).siblings( '.nf-list-options .merge-tags' ).off( 'click' );\n jQuery( selector ).siblings( '.nf-list-options .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.nf-list-options .merge-tags' ).off( 'click' );\n jQuery( '.nf-list-options .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n /* CALCULATIONS */\n this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', this.renderSetting );\n // this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', function( settingModel, dataModel, view ){\n // view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n // } );\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.nf-list-options.calculations .merge-tags' ).off( 'click' );\n jQuery( '.nf-list-options.calculations .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n /* SUMMERNOTE */\n this.listenTo( nfRadio.channel( 'summernote' ), 'focus', function( e, selector ) {\n that.focusCallback( false, selector, 'rte' );\n } );\n this.listenTo( nfRadio.channel( 'summernote' ), 'keydown', function( e, selector ){\n jQuery( selector ).closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\n } );\n this.listenTo( nfRadio.channel( 'summernote' ), 'keyup', function( e, selector ){\n that.keyupCallback( e, selector, 'rte' );\n } );\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.note-editor .merge-tags' ).off( 'click' );\n jQuery( '.note-editor .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n jQuery( document ).on( 'keyup', function( event ){\n if( 27 == event.keyCode ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n // Copied from KeyupCallback.\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).blur();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n });\n },\n\n afterAppStart: function() {\n var mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n var mergeTags = [];\n mergeTagCollection.each( function( section ){\n section.get( 'tags' ).each( function( tag ){\n mergeTags.push({\n label: tag.get( 'label' ),\n tag: tag.get( 'tag' ),\n section: section.get( 'id' )\n });\n });\n });\n var layout = new MergeTagBoxLayout();\n layout.render();\n var tagCollection = new MergeTagLookupCollection( mergeTags );\n var mergeTagListView = new MergeTagListView({\n collection: tagCollection\n });\n var mergeTagGroupListView = new MergeTagGroupListView({\n collection: mergeTagCollection\n });\n\n layout.getRegion('tags').show(mergeTagListView);\n layout.getRegion('sections').show(mergeTagGroupListView);\n layout.getRegion('filter').show(new MergeTagFilterView);\n\n var that = this;\n this.listenTo( nfRadio.channel( 'mergeTags' ), 'open', function(){\n // layout.destroy();\n that.afterAppStart();\n });\n },\n\n beforeRenderSetting: function( settingModel, dataModel ){\n if( 'undefined' == typeof settingModel.get( 'use_merge_tags' ) ) return;\n if( ! settingModel.get( 'use_merge_tags' ) ) return;\n var name = settingModel.get( 'name' );\n this.listenTo( nfRadio.channel( 'setting-' + name ), 'render:setting', this.renderSetting );\n },\n\n renderSetting: function( settingModel, dataModel, view ){\n\n view.$el.find( '.merge-tags' ).off( 'click' );\n view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n\n if( 0 == jQuery( '#merge-tags-box' ).length ) this.afterAppStart();\n\n // Track Scrolling.\n jQuery( '#nf-drawer' ).on( 'scroll', function(){\n // COPIED AND MODIFIED FROM FOCUS\n if( 0 == jQuery( '.merge-tag-focus' ).length ) return;\n\n var rteEditor = jQuery( '.merge-tag-focus' ).closest( '.nf-setting' ).find( '.note-editor' );\n if( 0 != rteEditor.length ){\n var posY = rteEditor.offset().top - jQuery(window).scrollTop();\n var height = rteEditor.outerHeight();\n } else {\n var posY = jQuery('.merge-tag-focus').offset().top - jQuery(window).scrollTop();\n var height = jQuery('.merge-tag-focus').outerHeight();\n }\n jQuery( '#merge-tags-box' ).css( 'top', posY + height );\n\n var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\n\n var repeaterRow = jQuery( '.merge-tag-focus' ).closest( '.nf-list-options-tbody' );\n if( 0 != repeaterRow.length ){\n var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', left );\n } else {\n var posX = jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).width() );\n }\n });\n\n // On input focus, move the Merge Tag Box into position.\n jQuery( view.el ).find( '.setting' ).on( 'focus', this.focusCallback );\n\n // TODO: Maybe move to view events.\n // On input keyup, maybe show Merge Tag Box.\n jQuery( view.el ).find( '.setting' ).on( 'keyup', this.keyupCallback );\n },\n\n // TODO: Maybe move to view class.\n beforeDrawerClose: function(){\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n // jQuery( 'body' ).append( jQuery( '#merge-tags-box' ) );\n nfRadio.channel( 'mergeTags' ).trigger( 'open' );\n },\n\n insertTag: function( tag ) {\n\n var $input = jQuery( '.merge-tag-focus' );\n\n if( 0 != $input.closest( '.nf-setting' ).first().find( '.note-editable' ).length ){\n $input = $input.closest( '.nf-setting' ).first().find( '.note-editable' );\n }\n\n if( 1 < $input.length ){ $input = $input.first(); }\n\n if( $input.hasClass( 'note-editable' ) ){\n var str = $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code' );\n } else {\n var str = $input.val();\n }\n\n var find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\n var replace = tag;\n var caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\n\n var patt = /{([a-z0-9]|:|_||-})*/g;\n\n // Loop through matches to find insert/replace index range.\n // Reference: http://codepen.io/kjohnson/pen/36c3a782644dfff40fe3c1f05f8739d9?editors=0012\n while (match = patt.exec(str)) {\n if (find != match[0]) continue; // This isn't the match you are looking for...\n var string = str.slice(0, match.index) + replace + str.slice(patt.lastIndex); // Fancy replace for the specifc match, using the index/position.\n\n if( $input.hasClass( 'note-editable' ) ){\n $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code', string );\n\n // Reposition the caret. http://stackoverflow.com/a/6249440 TODO: Determine the appropriate childNode.\n var el = $input;\n var childNode = null; // Default to first childNode.\n _.each( el[0].childNodes, function( node, index ){\n if( childNode ) return;\n if( ! node.nodeValue && ! node.innerHTML ) return;\n if( node.nodeValue ) {\n var position = node.nodeValue.indexOf(replace) + find.length;\n } else if( node.innerHTML ){\n var position = node.innerHTML.indexOf(replace) + find.length;\n }\n if( caretPos == position ) childNode = el[0].childNodes[index];\n });\n if( ! childNode ) childNode = el[0].childNodes[0];\n var offset = caretPos - find.length + replace.length;\n var range = document.createRange();\n var sel = window.getSelection();\n if( 0 != childNode.childNodes.length ) {\n try{\n range.setStart(childNode.childNodes[0], offset); \n } catch( err ) {\n console.log( 'error' );\n }\n \n } else {\n try {\n range.setStart(childNode, offset);\n } catch( err ) {\n console.log( 'error' );\n }\n \n }\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n\n\n } else {\n $input.val(string); // Update input value with parsed string.\n $input.change(); // Trigger a change event after inserting the merge tag so that it saves to the model.\n $input.caret(caretPos - find.length + replace.length); // Update Carept Position.\n }\n\n }\n\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n $input.removeClass( 'merge-tag-focus' );\n $input.closest( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n },\n\n mergeTagsButtonClick: function( e ){\n\n var $this = jQuery( this );\n\n if( $this.siblings().hasClass( 'merge-tag-focus' ) ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n return;\n }\n\n if( 0 !== $this.closest( '.nf-setting, .nf-table-row' ).find( '.note-tools' ).length ){\n var $inputSetting = $this.closest( '.note-editor' ).siblings( '.setting' ).first();\n $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\n } else {\n var $inputSetting = $this.siblings( '.setting' ).first();\n var text = $inputSetting.val() || '';\n $inputSetting.val( text + '{' ).change();\n nfRadio.channel('mergeTags').request('set:caret', text.length + 1 );\n }\n\n if( $this.parent().hasClass( 'note-tools' ) ){\n // $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\n }\n\n nfRadio.channel('mergeTags').request('set:old', '{' );\n\n $inputSetting.addClass( 'merge-tag-focus' );\n\n // Disable browser autocomplete.\n var autocomplete = $this.attr( 'autocomplete' );\n $this.attr( 'autocomplete', 'off' );\n $this.data( 'autocomplete', autocomplete );\n\n var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\n if( 0 != $overlayElement.find( '.note-editor' ).length ){\n $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\n } else {\n $overlayElement.addClass('merge-tag-focus-overlay');\n }\n\n jQuery( '#merge-tags-box' ).css( 'display', 'block' );\n nfRadio.channel( 'drawer' ).request( 'prevent:close' );\n\n jQuery( '.merge-tag-focus-overlay' ).off( 'click' );\n jQuery( '.merge-tag-focus-overlay' ).on( 'click', function( e ) {\n if ( jQuery( e.target ).hasClass( 'note-editor' ) ) {\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n } );\n\n setTimeout(function(){\n jQuery( '#merge-tags-box' ).find( '.merge-tag-filter' ).find( 'input' ).focus();\n }, 500 );\n },\n\n focusCallback: function( e, target, type ){\n\n var type = type || 'setting';\n var $this = ( 'undefined' == typeof target ) ? jQuery( this ) : jQuery( target );\n\n jQuery( '.merge-tag-focus' ).each(function(index, el){\n if( this == el ) return;\n el.removeClass( 'merge-tag-focus' );\n });\n\n if( 'rte' == type ) {\n var posY = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().top - jQuery(window).scrollTop();\n var height = $this.closest( '.nf-setting' ).find( '.note-editor' ).outerHeight();\n } else {\n var posY = $this.offset().top - jQuery(window).scrollTop();\n var height = $this.outerHeight();\n }\n jQuery( '#merge-tags-box' ).css( 'top', posY + height );\n\n var repeaterRow = $this.closest( '.nf-list-options-tbody' );\n if( 0 != repeaterRow.length ) {\n var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', left );\n } else if( 'rte' == type ) {\n var posX = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-setting' ).find( '.note-editor' ).width() );\n }\n else\n {\n var posX = jQuery( this ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-settings' ).width() );\n }\n\n var dataID = jQuery( this ).data( 'id' );\n if( dataID && 'eq' != dataID ) return;\n\n // var offset = jQuery( view.el ).find( '.setting' ).parent().outerHeight();\n // jQuery( view.el ).find( '.setting' ).parent().append( jQuery( '#merge-tags-box' ) );\n // jQuery( '#merge-tags-box' ).css( 'top', offset );\n },\n\n keyupCallback: function( event, target, type ){\n\n var type = type || 'setting';\n\n if( /* ENTER */ 13 == event.keyCode ){\n\n // Get top listed merge tag.\n var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\n\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\n\n // COPIED FROM BELOW\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n\n return;\n }\n\n // Get the value.\n // var value = jQuery( summernote ).summernote( 'code' );\n // Update the value.\n // jQuery( summernote ).closest( '.nf-setting' ).find( '.note-editable' ).html( value );\n\n if( 'undefined' != typeof target ) {\n var $this = jQuery(target);\n } else {\n var $this = jQuery( this );\n }\n\n // TODO: Disable Browser Autocomplete\n // $this.attr()\n\n\n var dataID = jQuery( this ).data( 'id' );\n if( dataID && 'eq' != dataID ) return;\n\n // Store the current caret position.\n if( 'rte' == type ){\n var range = $this.summernote('createRange');\n if( range ) {\n var caretPos = range.so; // or .eo?\n } else {\n var caretPos = 0;\n }\n $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\n } else {\n var caretPos = $this.caret();\n }\n nfRadio.channel( 'mergeTags' ).request( 'set:caret', caretPos );\n\n // Find merge tags.\n if( 'rte' == type ) {\n var mergetags = $this.summernote( 'code' ).match(new RegExp(/{([a-z0-9]|:|_|-|})*/g));\n } else {\n var mergetags = $this.val().match(new RegExp(/{([a-z0-9]|:|_|-|})*/g));\n }\n\n // Filter out closed merge tags.\n mergetags = _.filter(mergetags, function(mergetag) {\n return -1 == mergetag.indexOf( '}' ); // Filter out \"closed\" merge tags.\n });\n\n // If an open merge tag is found, show the Merge Tag Box, else hide.\n if( 0 !== mergetags.length ) {\n\n nfRadio.channel( 'mergeTags' ).request( 'set:old', mergetags[0] );\n\n jQuery('#merge-tags-box').css( 'display', 'block' );\n nfRadio.channel( 'drawer' ).request( 'prevent:close' );\n $this.addClass('merge-tag-focus');\n\n var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\n\n // Disable browser autocomplete.\n var autocomplete = $this.attr( 'autocomplete' );\n $this.attr( 'autocomplete', 'off' );\n $this.data( 'autocomplete', autocomplete );\n\n var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\n if( 0 != $overlayElement.find( '.note-editor' ).length ){\n $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\n } else {\n $overlayElement.addClass('merge-tag-focus-overlay');\n }\n\n $overlayElement.off( 'click' );\n $overlayElement.on( 'click', function( event ){\n var elementClasses = jQuery( event.target ).attr( 'class' ) || [];\n if( -1 !== elementClasses.indexOf( 'merge-tag-focus-overlay' ) ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n });\n\n var value = mergetags[0].replace( '{', '' );\n nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\n } else {\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n }\n\n } );\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're about to render a setting model that's a select and has 'fields' as the 'fill' setting, add all our field models to its options.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/itemSettingFill',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel ) {\n\t\t\tif ( 'fields' == settingModel.get( 'fill' ) ) {\n\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Modify the user's browser history when they click on a domain\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/confirmPublish',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:confirmPublish', this.confirmPublish );\n\t\t},\n\n\t\tconfirmPublish: function() {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t// Check to see if we need to add a submit button.\n\t\t\tif ( 1 == formModel.get( 'settings' ).get( 'add_submit' ) ) {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add', { type: 'submit', label: 'Submit', order: 9999 } );\n\t\t\t}\n\t\t\tformModel.set( 'show_publish_options', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to settings that utilise the Rich Text Editor\n *\n * @package Ninja Forms builder\n * @subpackage App - Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/rte',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\n\t\t\tnfRadio.channel( 'setting-type-rte' ).reply( 'renderOnChange', function(){ return false } );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'rte' ), 'init:settingModel', this.initSettingModel );\n\n\t\t\t// When an RTE setting is shown, re-render RTE.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'render:setting', this.renderSetting );\n\n\t\t\t// When an RTE setting view is destroyed, remove our RTE.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'destroy:setting', this.destroySetting );\n\n\t\t\t// When an element within the RTE is clicked, check to see if we should insert a link.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), '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\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 this.currentContext = {};\n\t\t},\n\n\t\tinitSettingModel: function( settingModel ) {\n\t\t\tsettingModel.set( 'hide_merge_tags', true );\n\t\t},\n\n\t\tinitRTE: function( settingModel, dataModel, settingView ) {\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\t\t\tvar mergeTags = this.mergeTags();\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 [ 'tools', [ 'mediaButton', 'mergeTags', 'codeview' ] ]\n\t\t\t];\n\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( {\n\t\t\t\ttoolbar: toolbar,\n\t\t\t\tbuttons: {\n\t\t\t\t\tlinkButton: linkButton,\n\t\t\t\t\tmergeTags: mergeTags,\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 callbacks: {\n\t\t\t\t \tonBlur: function( editor ) {\n\t\t\t\t \t\tvar value = editor.getValue();\n\t\t\t\t \t\tthat.updateDataModel( settingModel, dataModel, value );\n\t\t\t\t \t}\n\t\t\t\t }\n\t\t\t\t},\n\t\t\t\tprettifyHtml: true,\n\t\t\t\tcallbacks: {\n\t\t\t\t\tonBlur: function( e, context ) {\n\t\t\t\t\t\tvar value = jQuery( this ).summernote( 'code' );\n\t\t\t\t\t\tthat.updateDataModel( settingModel, dataModel, value );\n nfRadio.channel( 'summernote' ).trigger( 'blur', settingModel, dataModel, value );\n\t\t\t\t\t},\n onFocus: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'focus', e, this, context );\n },\n onKeydown: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'keydown', e, this, context );\n },\n onKeyup: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'keyup', e, this, context );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tupdateDataModel: function( settingModel, dataModel, value ) {\n\t\t\tvar name = settingModel.get( 'name' );\n\t\t\tvar before = dataModel.get( name );\n\t\t\tvar after = value;\n\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\n\n\t\t\tdataModel.set( settingModel.get( 'name' ), after );\n\t\t},\n\n\t\trenderSetting: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.initRTE( settingModel, dataModel,settingView );\n\t\t\tvar linkMenu = jQuery( settingView.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\tdestroySetting: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.removeRTE( settingModel, dataModel, settingView );\n\t\t},\n\n\t\tremoveRTE: function( settingModel, dataModel, settingView ) {\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( 'destroy' );\n\t\t},\n\n\t\tdrawerOpened: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.initRTE( settingModel, dataModel, settingView );\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: 'Insert Link',\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\tmergeTags: function( context ) {\n\t\t\tvar ui = jQuery.summernote.ui;\n\t\t\tvar mergeTagsButton = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-rte-merge-tags-button' );\n\t\t\treturn ui.button({\n\t\t\t\tclassName: 'dropdown-toggle merge-tags',\n\t\t\t\tcontents: mergeTagsButton({}),\n\t\t\t\ttooltip: 'Merge Tags'\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: 'Insert Media',\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.createRange' );\n\t\t\tcontext.invoke( 'editor.saveRange' );\n\t\t\tthis.currentContext = context;\n\t\t\t\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: 'Select a file',\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, settingModel, dataModel, settingView ) {\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\tthis.currentContext.invoke( 'editor.restoreRange' );\n\t\t\tif ( 'image' == media.type ) {\n\t\t\t\tthis.currentContext.invoke( 'editor.insertImage', media.url );\n\t\t\t} else {\n\t\t\t\tthis.currentContext.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\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingFieldSelect',[], function() {\n var controller = Marionette.Object.extend( {\n\n initialize: function() {\n\n // Bind field key listener to field-select setting type.\n this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', this.trackKeyChanges );\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-field-select' ), 'before:renderSetting', this.beforeRender );\n\n // Add setting change listener only in drawers with a field-select setting.\n this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', function() {\n this.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.maybeSwitchToFieldsDomain );\n });\n\n this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.autoOpenDrawer );\n\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.filterDrawerContents );\n this.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.SwitchToFieldsDomain );\n },\n\n trackKeyChanges: function( settingModel ) {\n settingModel.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', settingModel.updateKey );\n\n // Update selected field if the selected field's key changes.\n this.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.updateFieldMap );\n },\n\n updateFieldMap: function( dataModel, keyModel, settingModel ) {\n\n var oldKey = keyModel._previousAttributes[ 'key' ];\n var newKey = keyModel.get( 'key' );\n\n if( 'field-select' == settingModel.get( 'type' ) && dataModel.get( settingModel.get( 'name' ) ) == oldKey ) {\n\n dataModel.set( settingModel.get( 'name' ), newKey );\n }\n },\n\n beforeRender: function( settingModel, dataModel ) {\n\n var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n var fieldTypes = settingModel.get( 'field_types' );\n\n var options = [\n {\n label: '--',\n value: 0\n }\n ];\n _.each( fieldCollection.models, function( field ){\n\n if( dataModel.cid == field.cid ) return;\n\n if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length && ! _.contains( fieldTypes, field.get( 'type' ) ) ) return;\n\n var fieldFilter = settingModel.get( 'field_filter' );\n if( fieldFilter && 'undefined' != typeof fieldFilter[ field.get( 'type' ) ] ) {\n var bail = false;\n _.each( fieldFilter[ field.get( 'type' ) ], function( value, setting ){\n console.log( value + \":\" + field.get( setting ) );\n if( value != field.get( setting ) ) bail = true;\n } );\n if( bail ) return;\n }\n\n var value = field.get( 'key' );\n switch ( settingModel.get( 'field_value_format' ) ) {\n case 'key':\n value = field.get( 'key' );\n break;\n case 'merge_tag':\n default:\n value = '{field:' + field.get( 'key' ) + '}';\n }\n\n options.push({\n label: field.get( 'label' ),\n value: value\n });\n });\n\n if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length ) {\n _.each( fieldTypes, function( fieldType ){\n\n var fieldTypeModel = nfRadio.channel( 'fields' ).request( 'get:type', fieldType );\n\n options.push({\n label: '-- Add ' + fieldTypeModel.get( 'nicename' ) + ' Field',\n value: 'addField:' + fieldType,\n });\n } );\n }\n\n settingModel.set( 'options', options );\n },\n\n maybeSwitchToFieldsDomain: function( e, model, dataModel ) {\n\n if( 'field-select' != model.get( 'type' ) ) return;\n\n var name = model.get( 'name' );\n var value = dataModel.get( name );\n\n if( ! value ) return;\n\n var rubble = value.split( ':' );\n\n if( 'addField' != rubble[0] ) return;\n\n this.openDrawer = 'addField';\n this.filterDrawer = rubble[1];\n\n dataModel.set( name, '' );\n\n this.switchDomain = true;\n nfRadio.channel( 'app' ).request( 'close:drawer' );\n },\n\n SwitchToFieldsDomain: function() {\n if( this.switchDomain ) {\n var fieldDomainModel = nfRadio.channel( 'app' ).request( 'get:domainModel', 'fields' );\n nfRadio.channel('app').request('change:currentDomain', null, fieldDomainModel);\n this.switchDomain = null;\n }\n },\n\n autoOpenDrawer: function() {\n if( this.openDrawer ) {\n nfRadio.channel( 'app' ).request( 'open:drawer', this.openDrawer );\n this.openDrawer = null;\n }\n },\n\n filterDrawerContents: function() {\n if( this.filterDrawer ) {\n nfRadio.channel('drawer-addField').trigger('change:filter', this.filterDrawer);\n this.filterDrawer = null;\n }\n }\n });\n\n return controller;\n} );\n","/**\n * The Field List setting is a container of settings (like the Fieldset setting), in which its children are instantiated.\n * Unlike the Fieldset setting, Field List settings are dynamically created based on the list of form fields.\n *\n * Note: Field references in the dynamic setting names are based on field keys, which may change.\n * Unlike regular field key tracking, a new setting needs to be created with the same value as the previous.\n *\n * @package Ninja Forms builder\n * @subpackage Action Settings\n * @copyright (c) 2016 WP Ninjas\n * @author Kyle B. Johnson\n * @since 3.0\n */\ndefine( 'controllers/app/settingFieldList',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\n return Marionette.Object.extend( {\n\n /**\n * A reference list of Field List setting models.\n */\n fieldListSettings: [],\n\n initialize: function() {\n this.listenTo( nfRadio.channel( 'field-list' ), 'init:settingModel', this.registerFieldListSettings );\n this.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateFieldListSettingKeys );\n nfRadio.channel( 'field-list' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n },\n\n /**\n * Build a reference list of Field List setting models for later reference.\n *\n * @param settingModel\n */\n registerFieldListSettings: function( settingModel ){\n this.fieldListSettings.push( settingModel.get( 'name' ) );\n },\n\n /**\n * Field List settings contain field keys in the setting names.\n * When a field key changes, so too must the Field List setting name.\n *\n * @param fieldModel\n */\n updateFieldListSettingKeys: function( fieldModel ){\n\n // We are only interested in field key changes.\n if( 'undefined' == typeof fieldModel.changed.key ) return;\n\n var oldKey = fieldModel._previousAttributes.key;\n var newKey = fieldModel.changed.key;\n\n /*\n * This is an absolute (functional) mess of nesting. I apologize to my future self, or Kenny.\n *\n * Each setting of each action model must be checked against each registered Field List setting.\n */\n var that = this;\n _.each( Backbone.Radio.channel( 'actions' ).request( 'get:collection' ).models, function( actionModel ) {\n _.each( actionModel.attributes, function( value, setting ) {\n var lastChanged = ''; // Used to avoid resetting the change with a duplicate call.\n _.each( that.fieldListSettings, function( prefix ) {\n if( setting != prefix + '-' + oldKey || lastChanged == oldKey ) return;\n var oldValue = actionModel.get( prefix + '-' + oldKey );\n actionModel.set( prefix + '-' + newKey, oldValue );\n actionModel.set( prefix + '-' + oldKey, 0 );\n lastChanged = oldKey;\n });\n });\n });\n },\n\n /**\n * Set the view for Field List sub-settings, just like the Fieldset setting.\n *\n * @param settingModel\n * @returns {*}\n */\n getSettingChildView: function( settingModel ) {\n\n /**\n * Dynamically build field-list settings as needed for the view.\n */\n\n // Filter fields based on the field_types setting property.\n var fields = _.filter( nfRadio.channel( 'fields' ).request( 'get:collection' ).models, function( field ) {\n return _.contains( settingModel.get( 'field_types' ), field.get( 'type' ) );\n });\n\n // Map fields into setting definitions.\n var settings = _.map( fields, function( field ) {\n return {\n name: settingModel.get( 'name' ) + '-' + field.get( 'key' ),\n type: 'toggle',\n label: field.get( 'label' ),\n width: 'full'\n };\n });\n\n settingModel.set( 'settings', new settingCollection( settings ) );\n\n // return the child view.\n return fieldsetView;\n },\n\n });\n} );\n\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n *\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingHTML',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-html' ), 'before:renderSetting', this.init );\n },\n\n init: function( settingModel, dataModel ) {\n\n if( 'undefined' == settingModel.get( 'mirror' ) ) return;\n\n // Listen to a setting change inside of the dataModel.\n dataModel.on( 'change:' + settingModel.get( 'mirror' ), this.update, settingModel );\n },\n\n update: function( dataModel, changedSettingValue ) {\n\n // Mirror the default value setting value.\n dataModel.set( this.get( 'name' ), changedSettingValue );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingColor',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n // We don't want to re-render this setting type when the data changes.\n nfRadio.channel( 'setting-type-color' ).reply( 'renderOnChange', this.setRenderFalse );\n // We want to close any color pickers before we close our styling tab or drawer.\n this.listenTo( nfRadio.channel( 'setting-type-color' ), 'destroy:setting', this.closeColorPickers );\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-color' ), 'render:setting', this.initColorPicker );\n },\n\n initColorPicker: function( settingModel, dataModel, view ) {\n\n var name = settingModel.get( 'name' );\n var el = jQuery( view.el ).find( 'input' );\n\n jQuery( el ).wpColorPicker( {\n change: function( event, ui ){\n nfRadio.channel( 'app' ).request( 'change:setting', event, settingModel, dataModel, ui.color.toString() );\n }\n } );\n },\n\n setRenderFalse: function() {\n return false;\n },\n\n closeColorPickers: function( settingModel, dataModel, view ) {\n jQuery( view.el ).find( '.wp-color-picker' ).wpColorPicker( 'close' );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for the app to start.\n *\n * If the form is a new form, then highlight the Add New submenu item.\n * Otherwise, append an Edit Form submenu for context.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeMenu',[], function() {\n var controller = Marionette.Object.extend({\n\n editFormText: '',\n\n initialize: function () {\n this.editFormText = nfAdmin.editFormText || 'Edit Form';\n this.listenTo(nfRadio.channel('app'), 'after:appStart', this.changeMenu);\n this.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.formPublish );\n },\n\n changeMenu: function () {\n var form = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n if ( this.isNewForm( form.id ) ) {\n this.highlightAddNew();\n } else {\n this.appendEditForm();\n }\n },\n\n isNewForm: function( form_id ) {\n return isNaN( form_id );\n },\n\n highlightAddNew: function() {\n jQuery( '.wp-submenu li' ).removeClass( 'current' );\n jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().addClass( 'current' );\n },\n\n appendEditForm: function() {\n var html = '<li class=\"current\"><a href=\"#\">' + this.editFormText + '</a></li>';\n if ( jQuery( 'li a:contains(\"' + this.editFormText + '\")' ).length == 0 ) {\n jQuery( '.wp-submenu li' ).removeClass( 'current' );\n jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().after( html );\n }\n },\n\n formPublish: function( response ) {\n if ( 'publish' !== response.action ) return false;\n this.changeMenu();\n }\n });\n\n return controller;\n});\n","/**\n * When we click on a domain link, close the mobile menu.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for clicks on our app menu.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.closeMobileMenu );\n\t\t},\n\n\t\tcloseMobileMenu: function() {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).removeClass( 'nf-menu-expand' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Add a jBox notice to the screen.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'notices' ).reply( 'add', this.addNotice, this );\n\t\t\tnfRadio.channel( 'notices' ).reply( 'close', this.closeNotice, this );\n\t\t\tthis.notices = {};\n\t\t},\n\n\t\taddNotice: function( key, msg, options ) {\n\n\t\t\tvar appDefaults = {\n\t\t\t\tcontent: msg,\n\t\t\t\tcolor: 'green',\n\t\t\t\tzIndex:12000,\n\t\t\t\tconstructOnInit: true,\n\t\t\t\tstack: true,\n\t\t\t\tanimation: {\n\t\t\t\t\topen: 'flip',\n\t\t\t\t\tclose: 'flip'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar mobileDefaults = {\n\t\t\t\tposition: {\n\t\t\t\t\tx: 'center',\n\t\t\t\t\ty: 'top'\n\t\t\t\t},\n\t\t\t\tanimation: {\n\t\t\t\t\topen:'slide:top',\n\t\t\t\t\tclose:'slide:left'\n\t\t\t\t},\n\t\t\t\tautoClose: 2000,\n\t\t\t\toffset: {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 55\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar desktopDefaults = {\n\t\t\t\tattributes: {\n\t\t\t\t\tx: 'left',\n\t\t\t\t\ty: 'bottom'\n\t\t\t\t},\n\t\t\t\tautoClose: 4000\n\t\t\t};\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tvar defaults = mobileDefaults;\t\n\t\t\t} else {\n\t\t\t\tvar defaults = desktopDefaults;\n\t\t\t}\n\t\t\tdefaults = jQuery.extend( defaults, appDefaults );\n\n\t\t\tvar options = jQuery.extend( defaults, options );\n\t\t\t// console.log( options );\n\t\t\tthis.notices[ key ] = new jBox( 'Notice', options );\n\t\t},\n\n\t\tcloseNotice: function( key ) {\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\n\t\t\t\tthis.notices[ key ].close();\n\t\t\t}\n\t\t},\n\n\t\topenNotice: function( key ) {\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\n\t\t\t\tthis.notices[ key ].open();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Prompt the user to save if they attempt to leave the page with unsaved changes.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/unloadCheck',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tjQuery( window ).bind( 'beforeunload', this.maybePrompt );\n\t\t},\n\n\t\tmaybePrompt: function( model ) {\n\t\t\t// If our app is clean, don't show a warning.\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t\t\t\treturn 'You have unsaved changes.';\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Before we save data to the database (on preview update or publish), we check to see if we have anyone\n * that wants to update the 'formContent' form setting. This setting is used on the front-end to allow\n * for custom display of form fields. i.e. layout rows.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formContentFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our formContent view filter array.\n\t\t\t */\n\t\t\tthis.viewFilters = [];\n\t\t\tthis.saveFilters = [];\n\t\t\tthis.loadFilters = [];\n\n\t\t\t/*\n\t\t * Listen for requests to add formContent filters.\n\t\t\t */\n\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:saveFilter', this.addSaveFilter, 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:saveFilters', this.getSaveFilters, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:loadFilters', this.getLoadFilters, this );\n\t\t\t\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\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:saveFilter', this.addSaveFilter, 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 */\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:viewFilters', this.getViewFilters, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:saveFilters', this.getSaveFilters, 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\taddSaveFilter: function( callback, priority ) {\n\t\t\tthis.saveFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetSaveFilters: function() {\n\t\t\treturn this.saveFilters;\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","/**\n * Handles filters for our main content gutter views.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formContentGutterFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our gutter view filter array.\n\t\t\t */\n\t\t\tthis.leftFilters = [];\n\t\t\tthis.rightFilters = [];\n\t\t\t/*\n\t\t * Listen for requests to add gutter filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:leftFilter', this.addLeftFilter, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:rightFilter', this.addRightFilter, this );\n\n\t\t\t/*\n\t\t\t * Listen for requests to get our content gutter filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:leftFilters', this.getLeftFilters, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:rightFilters', this.getRightFilters, this );\n\t\t},\n\n\t\taddLeftFilter: function( callback, priority ) {\n\t\t\tthis.leftFilters[ priority ] = callback;\n\t\t},\n\n\t\taddRightFilter: function( callback, priority ) {\n\t\t\tthis.rightFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetLeftFilters: function() {\n\t\t\treturn this.leftFilters;\n\t\t},\n\n\t\tgetRightFilters: function() {\n\t\t\treturn this.rightFilters;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns a clone of a backbone collection with all the models' attributes looped through so that collections contained within are propely cloned.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cloneCollectionDeep',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:collectionDeep', this.cloneCollectionDeep, this );\n\t\t},\n\n\t\tcloneCollectionDeep: function( collection ) {\n\t\t\tvar models = [];\n\t\t\t// Loop through every model in our collection, clone it, and add it to our model array\n\t\t\t_.each( collection.models, function( model ) {\n\t\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\t\t\t\tmodels.push( newModel );\n\t\t\t} );\n\t\t\t// Create a new instance of our collection\n\t\t\treturn new collection.constructor( models, collection.options );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Tracks which keys have been pressed.\n * Currently only used by fields to see if they should duplicate or delete on click.\n * (Shift + D + click = delete) (Shift + C + click = duplicate)\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/trackKeyDown',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tkeys: [],\n\n\t\tinitialize: function() {\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * Track keydowns and store the keys pressed.\n\t\t\t */\n\t\t\t\n\t\t\tjQuery( document ).on( 'keydown', function( e ) {\n\t\t\t\tthat.keyDown( e, that );\n\t\t\t} );\n\n\t\t\tjQuery( document ).on( 'keyup', function( e ) {\n\t\t\t\tthat.keyUp( e, that );\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Get the keys currently being pressed, if any\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:keydown', this.getKeyDown, this );\n\t\t},\n\n\t\tkeyDown: function( e, context ) {\n\t\t\t/*\n\t\t\t * Add our keycode to our keys array.\n\t\t\t */\n\t\t\tcontext.keys[ e.keyCode ] = e.keyCode;\n\t\t},\n\n\t\tkeyUp: function( e, context ) {\n\t\t\t/*\n\t\t\t * Remove our keycode from our keys array.\n\t\t\t */\n\t\t\tif ( -1 != context.keys.indexOf( e.keyCode ) ) {\n\t\t\t\tdelete context.keys[ e.keyCode ];\n\t\t\t}\n\t\t},\n\n\t\tgetKeyDown: function() {\n\t\t\treturn this.keys;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Initialize the perfectscroll jQuery plugin\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/perfectScroll',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tmovedPos: false,\n\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When we init the main view, init our perfectscroll\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'show:main', this.initPerfectScroll );\n\n\t\t\t/*\n\t\t\t * When our drawer opens and closes, change the position of our scroll rail.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.moveRail );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:closeDrawer', this.resetRail );\n\t\t},\n\n\t\tinitPerfectScroll: function( view ) {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).parent().perfectScrollbar( {\n\t\t\t\t\tsuppressScrollX: true\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tjQuery( 'head' ).append( '<style id=\"ps-scrollbar-css\" type=\"text/css\"></style>' );\n\t\t},\n\n\t\tmoveRail: function() {\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tvar movedPos = jQuery( drawerEl ).outerWidth();\n\n\t\t\tjQuery( '#ps-scrollbar-css' ).text( '.ps-scrollbar-moved { right: ' + movedPos + 'px !important; } ' );\n\t\t\tjQuery( '#nf-main .ps-scrollbar-y-rail' ).addClass( 'ps-scrollbar-moved ' );\n\t\t\t\n\t\t},\n\n\t\tresetRail: function() {\n\t\t\tjQuery( '.ps-scrollbar-y-rail' ).removeClass( 'ps-scrollbar-moved ' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our type settings groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingGroupModel',[ 'models/app/settingCollection' ], function( SettingCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdisplay: false\n\t\t},\n\n\t\tinitialize: function( options ) {\n\t\t\tif ( false == this.get( 'settings' ) instanceof Backbone.Collection ) {\n\t\t\t\tthis.set( 'settings', new SettingCollection( this.get( 'settings' ) ) );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection of our type settings groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingGroupCollection',['models/app/settingGroupModel'], function( settingGroupModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: settingGroupModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Returns a new setting group collection.\n * Used to settings drawers for custom data models (i.e. not fields, actions, or advanced)\n * \n * @package Ninja Forms builder\n * @subpackage App - Edit Settings Drawer\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/getNewSettingGroupCollection',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for a new setting group collection\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingGroupCollectionDefinition', this.getNewSettingGroupCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a new instance of the setting group collection.\n\t\t *\n\t\t * @since 3.0\n\t\t * @return backbone.collection\n\t\t */\n\t\tgetNewSettingGroupCollection: function() {\n\t\t\treturn SettingGroupCollection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.0.30\n */\ndefine( 'controllers/app/settingMedia',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n // When the media button is clicked, open the media manager.\n this.listenTo( nfRadio.channel( 'setting-type-media' ), 'click:extra', this.clickExtra );\n },\n\n clickExtra: function( e, settingModel, dataModel, settingView ) {\n var textEl = jQuery( e.target ).parent().find( '.setting' );\n\n if ( jQuery( e.target ).hasClass( 'open-media-manager' ) ) {\n // If the frame already exists, re-open it.\n if ( this.meta_image_frame ) {\n this.meta_image_frame.open();\n return;\n }\n\n // Sets up the media library frame\n this.meta_image_frame = wp.media.frames.meta_image_frame = wp.media({\n title: 'Select a file',\n button: { text: 'insert' }\n });\n\n var that = this;\n\n // Runs when an image is selected.\n this.meta_image_frame.on('select', function(){\n // Grabs the attachment selection and creates a JSON representation of the model.\n var media_attachment = that.meta_image_frame.state().get('selection').first().toJSON();\n textEl.val( media_attachment.url ).change();\n });\n\n // Opens the media library frame.\n this.meta_image_frame.open();\n }\n },\n });\n\n return controller;\n} );\n","/**\n * Model for our field type\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/typeModel',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\tif ( false === this.get( 'settingGroups' ) instanceof Backbone.Collection ) {\n\t\t\t\tthis.set( 'settingGroups', new SettingGroupCollection( this.get( 'settingGroups' ) ) );\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'init:typeModel', this );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field type models. \n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/typeCollection',['models/app/typeModel'], function( typeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: typeModel,\n\t\ttype: false,\n\n\t\tinitialize: function( models, options ) {\n\t\t\t_.each( options, function( option, key ) {\n\t\t\t\tthis[ key ] = option;\n\t\t\t}, this );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Model that represents our field type section on the add new field drawer.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/typeSectionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tclasses: ''\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/typeSectionCollection',['models/fields/typeSectionModel'], function( typeSectionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: typeSectionModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Creates and stores a collection of field types. This includes all of the settings shown when editing a field.\n *\n * 1) Create our settings sections config\n * 2) Loops over our preloaded data and adds that to our field type collection\n *\n * Also responds to requests for data about field types\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/types',[\n\t\t'models/app/typeCollection',\n\t\t'models/fields/typeSectionCollection'\n\t],\n\tfunction(\n\t\tTypeCollection,\n\t\tSectionCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Config for our settings sections\n\t\t\tthis.sections = new SectionCollection( fieldTypeSections );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'init:typeModel', this.registerSection );\n\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( fieldTypeData, { type: 'fields' } );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:type', this.getFieldType, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeCollection', this.getTypeCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSections', this.getTypeSections, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:savedFields', this.getSavedFields, this );\n\n\t\t\t// Listen to clicks on field types\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:fieldType', this.addField );\n\t\t},\n\n\t\tregisterSection: function( typeModel ) {\n\t\t\tif ( 'fields' != typeModel.collection.type || ! typeModel.get( 'section' ) ) return;\n\n\t\t\tthis.sections.get( typeModel.get( 'section' ) ).get( 'fieldTypes' ).push( typeModel.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetFieldType: function( id ) {\n \treturn this.collection.get( id );\n },\n\n /**\n * Return the entire field type collection\n *\n * @since 3.0\n * @param string \t\t\t\tid \t[description]\n * @return backbone.collection \tfield type collection\n */\n\t\tgetTypeCollection: function( id ) {\n \treturn this.collection;\n },\n\n /**\n * Add a field type to our fields sortable when the field type button is clicked.\n *\n * @since 3.0\n * @param Object e event\n * @return void\n */\n addField: function( e ) {\n\t\t\tvar type = jQuery( e.target ).data( 'id' );\n\n\t\t\tif( e.shiftKey ){\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n\t\t\t\treturn;\n\t\t\t}\n\n \tvar fieldModel = nfRadio.channel( 'fields' ).request( 'add', {\n\t\t\t\ttype: type,\n\t\t\t\tlabel: nfRadio.channel( 'fields' ).request( 'get:type', type ).get( 'nicename' )\n\t\t\t});\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Field',\n\t\t\t\tlabel: fieldModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', fieldModel, null, label, data );\n\n\t\t\t// Re-Draw the Field Collection\n\t\t\tnfRadio.channel( 'fields' ).request( 'redraw:collection' );\n },\n\n /**\n * Return our field type settings sections\n *\n * @since 3.0\n * @return backbone.collection field type settings sections\n */\n getTypeSections: function() {\n return this.sections;\n },\n\n /**\n * Return our saved fields\n *\n * @since 3.0\n * @return backbone.collection\n */\n getSavedFields: function() {\n \tthis.sections.get( 'saved' );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Handles the logic for our field type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldTypeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our field type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addField' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the dragging of our field staging area\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/stagingDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start and stop of our field staging dragging\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.stopDrag );\n\t\t},\n\n\t\t/**\n\t\t * When the user starts dragging the staging area, we have to:\n\t\t * set the overflow property of the drawer to visible !important. If we don't, the button goes underneath the main section.\n\t\t * set the overflow proerty of the main to visible !important. If we don't, the dragged element goes underneath the drawer.\n\t\t * replace our helper with the stacked \"x fields\" template.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t context jQuery UI Draggable\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-staged-fields-drag' );\n\t\t\tjQuery( ui.helper ).html( html( { num: stagedFields.models.length } ) );\n\t\t\tjQuery( ui.helper ).prop( 'id', 'nf-staged-fields-drag' );\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.7' );\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging the staging area, we have to set the overflow property to hidden !important\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t context jQuery UI Draggable\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles most things related to our staging area:\n * 1) Creates a collection\n * 2) Listens for requests to CRUD items from the collection\n * 3) Adds our staged fields to the fields sortable when the drawer is closed\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/staging',['models/fields/stagingCollection'], function( stagingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our staged fields collection\n\t\t\tthis.collection = new stagingCollection();\n\t\t\t// Respond to requests related to our staging area.\n\t\t nfRadio.channel( 'fields' ).reply( 'add:stagedField', this.addStagedField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'remove:stagedField', this.removeStagedField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:staging', this.getStagingCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:staging', this.sortStagedFields, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:staging', this.clearStagedFields, this );\n\t\t\t// Listen to our remove staged field click event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'click:removeStagedField', this.removeStagedField );\n\t\t\t// Listen to our event that fires just before a drawer is closed.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'before:closeDrawer', this.beforeCloseDrawer );\n\t\t},\n\n\t\tgetStagingCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\t/**\n\t\t * Add a field to our staging area\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string type Type of field we're adding\n\t\t * @return tmpID\n\t\t */\n\t\taddStagedField: function( type, silent ) {\n\t\t\tvar silent = silent || false;\n\t\t\t// Get our type model from the string.\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t// Our tmp ID is a string with the time appended to make it unique.\n\t\t\tvar tmpID = 'nf-staged-field-' + jQuery.now();\n\t\t\t// Object that will be added to our staging collection.\n\t\t\tvar data = {\n\t\t\t\tid: tmpID,\n\t\t\t\t// i.e. firstname, textbox, etc.\n\t\t\t\tslug: fieldType.get( 'type' ),\n\t\t\t\t// i.e. First Name, Textbox, etc.\n\t\t\t\tnicename: fieldType.get( 'nicename' ),\n\t\t\t\t// i.e. calendar, envelope, etc.\n\t\t\t\ticon: fieldType.get( 'icon' )\n\t\t\t}\n\t\t\t// \n\t\t\tvar model = this.collection.add( data );\n\n\t\t\tif( ! silent ) nfRadio.channel( 'fields').trigger( 'add:stagedField', model );\n\n\t\t\treturn tmpID;\n\t\t},\n\n\t\t/**\n\t\t * Remove a field from staging\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te \tEvent\n\t\t * @param Backbone.model \tmodel \tstaged field model to remove\n\t\t * @return void\n\t\t */\n\t\tremoveStagedField: function( e, model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'remove:stagedField', model );\n\t\t},\n\n\t\t/**\n\t\t * Adds our staged fields to the main fields sortable before the drawer is closed.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tbeforeCloseDrawer: function() {\n\t\t\tif ( 0 != this.collection.models.length ) { // Make sure that we have models\n\t\t\t\t// Get our field collection.\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n\t\t\t\tvar fields = [];\n\t\t\t\t// Loop through our staging collection\n\t\t\t\t_.each( this.collection.models, function( model ) {\n\t\t\t\t\t// Get a tmp ID for our new field.\n\t\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\n\t\t\t\t\t// Create an object that can be added as a model.\n\t\t\t\t\tvar tmpField = { id: tmpID, label: model.get( 'nicename' ), type: model.get( 'slug' ) };\n\t\t\t\t\t// Add our new field.\n\t\t\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add', tmpField, false );\n\t\t\t\t\t// Add our field addition to our change log.\n\t\t\t\t\tvar label = {\n\t\t\t\t\t\tobject: 'Field',\n\t\t\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\t\t\tchange: 'Added',\n\t\t\t\t\t\tdashicon: 'plus-alt'\n\t\t\t\t\t};\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\tcollection: fieldCollection\n\t\t\t\t\t}\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\t\n\t\t\t\t} );\n\t\t\t\t// Trigger a reset on our field collection so that our view re-renders\n\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t// Empty the staging collection\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t\t// Sort our fields.\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', null, null, false );\n\t\t},\n\n\t\t/**\n\t\t * Sort our staging area by the 'order' attribute.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tsortStagedFields: function() {\n\t\t\t// Get our staged fields sortable.\n\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t// Get the current order using jQuery sortable. Will be an array of IDs: [tmp-blah, tmp-blah]\n\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t// Loop through our models\n\t\t\t_.each( this.collection.models, function( field ) {\n\t\t\t\t// Search our order array for this field.\n\t\t\t\tvar search = field.get( 'id' );\n\t\t\t\tvar pos = order.indexOf( search );\n\t\t\t\t// Update our staged field model with the new order.\n\t\t\t\tfield.set( 'order', pos );\n\t\t\t} );\n\t\t\t// Sort our staging collection.\n\t\t\tthis.collection.sort();\n\t\t},\n\n\t\tclearStagedFields: function() {\n\t\t\tthis.collection.reset();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to our staged fields sortable.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/stagingSortable',['models/fields/stagingCollection'], function( stagingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our field type draggables\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\n\t\t\t// Listen to our sortable events\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'receive:stagedFields', this.receiveStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'over:stagedFields', this.overStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'out:stagedFields', this.outStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'start:stagedFields', this.startStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stop:stagedFields', this.stopStagedFields );\n\t\t},\n\n\t\t/**\n\t\t * Change our dropped field type helper so that it matches the other items in our sortable.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI item\n\t\t * @return void\n\t\t */\n\t\treceiveStagedFields: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drop:fieldType', type );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add an active class to our sortable when a field type item is dragged\n\t\t * \n\t\t * @since 3.0\n\t\t */\n\t\taddActiveClass: function() {\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\tjQuery( stagedFieldsEl ).addClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * Remove the active class from our sortable when the field type item is dropped.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tremoveActiveClass: function() {\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\tjQuery( stagedFieldsEl ).removeClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * When the field type item is dragged over our sortable, we change the helper to match the sortable items.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @param Object \tui jQuery UI Element\n\t\t * @return void\n\t\t */\n\t\toverStagedFields: function( e, ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t\tvar nicename = fieldType.get( 'nicename' );\n\t\t\t\tthis.currentHelper = ui.helper \n\t\t\t\tjQuery( ui.helper ).html( nicename + '<span class=\"dashicons dashicons-dismiss\"></span>' );\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-item-dock' ).css( { 'opacity': '0.8', 'width': '', 'height': '' } );\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * When a field type item is moved away from our sortable, we change the helper to its previous appearance\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toutStagedFields: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\t\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-item-dock' ).addClass( 'nf-field-type-button' );\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t},\n\n\t\t/**\n\t\t * When a user starts to drag a sortable item, we need to set a few properties on the item and the helper.\n\t\t * These keep the original item in place while dragging and changes the opacity of the helper.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartStagedFields: function( ui ) {\n\t\t\tjQuery( ui.item ).show();\n\t\t\tjQuery( ui.item ).css( { 'display': 'inline', 'opacity': '0.7' } );\n\t\t\tjQuery( ui.helper ).css( 'opacity', '0.5' );\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging a sortable item, remove our opacity setting and remove the helper item.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopStagedFields: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Filters our field type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/filterTypes',['models/fields/typeSectionCollection'], function( fieldTypeSectionCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'change:filter', this.filterFieldTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our field types in the add new field drawer\n\t\t * \n\t\t * Takes a search string and finds any field types that match either the name or alias.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string\t search \tstring being searched for\n\t\t * @param object \t e \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterFieldTypes: function( search, e ) {\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != jQuery.trim( search ) ) {\n \t\tvar filtered = [];\n \t\t/**\n \t\t * Call the function that actually filters our collection,\n \t\t * and then loop through our collection, adding each model to our filtered array.\n \t\t */\n \t\t_.each( this.filterCollection( search ), function( model ) {\n \t\t\tfiltered.push( model.get( 'id' ) );\n \t\t} );\n\n \t\t// Create a new Field Type Section collection with the filtered array.\n \t\tvar filteredSectionCollection = new fieldTypeSectionCollection( [\n\t\t\t\t{ \n\t\t\t\t\tid: 'filtered',\n\t\t\t\t\tnicename: 'Filtered Fields',\n\t\t\t\t\tfieldTypes: filtered\n\t\t\t\t}\n\t\t\t\t] );\n\n \t\t// Request that our field types filter be applied, passing the collection we created above.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:fieldTypes', filteredSectionCollection );\n \t\t// If we've pressed the 'enter' key, add the field to staging and clear the filter.\n \t\tif ( 'undefined' != typeof e && e.addObject ) {\n \t\t\tif ( 0 < filtered.length ) {\n \t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', filtered[0] );\n \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n \t\t\t}\n \t\t}\n \t} else {\n \t\t// Clear our filter if the search text is empty.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n \t}\n },\n\n /**\n * Search our field type collection for the search string.\n * \n * @since 3.0\n * @param string\t search \tstring being searched for\n * @return backbone.collection\n */\n filterCollection: function( search ) {\n \tsearch = search.toLowerCase();\n \t// Get our list of field types\n \tvar collection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n \t/*\n \t * Backbone collections have a 'filter' method that loops through every model,\n \t * waiting for you to return true or false. If you return true, the model is kept.\n \t * If you return false, it's removed from the filtered result.\n \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'type' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles all the actions/functions related to our main field sortable.\n * All of the actual logic for our sortable is held here; the view just calls it using nfRadio.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/sortable',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When our field type buttons are dragged, we need to add or remove the active (blue) class.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\n\t\t\t// When our field staging is dragged, we need to add or remove the active (blue) class.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.addActiveClass );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.removeActiveClass );\n\t\t\t\n\t\t\t/*\n\t\t\t * Handles all the events fired by our sortable:\n\t\t\t * receive - dropped from type button or staging\n\t\t\t * over - dragging within or over the sortable\n\t\t\t * out - leaving the sortable\n\t\t\t * stop - stopped sorting/dragging\n\t\t\t * start - started sorting/dragging\n\t\t\t * update - stopped sorting/dragging and order has changed\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'receive:fieldsSortable', this.receiveFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'over:fieldsSortable', this.overfieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'out:fieldsSortable', this.outFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'stop:fieldsSortable', this.stopFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'start:fieldsSortable', this.startFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:fieldsSortable', this.updateFieldsSortable, this );\n\t\t},\n\n\t\t/**\n\t\t * Add the active class to our sortable so that its border is blue.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\taddActiveClass: function() {\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-active' );\t\n\t\t},\n\n\t\t/**\n\t\t * Remove the active class from our sortable\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tremoveActiveClass: function() {\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * Fires when we drop a field type button or staging onto our sortable\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\treceiveFieldsSortable: function( ui ) {\n\t\t\t/*\n\t\t\t * We have to do different things if we're dealing with a field type button or staging area.\n\t\t\t */ \n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type Button\n\t\t\t\t// Get our type string\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\t// Add a field (returns the tmp ID )\n\t\t\t\tvar tmpID = this.addField( type, false );\n\t\t\t\t/*\n\t\t\t\t * Update our helper id to the tmpID.\n\t\t\t\t * We do this so that when we sort, we have the proper ID.\n\t\t\t\t */ \n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\n\t\t\t\t// Remove the helper. Gets rid of a weird type artifact.\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t\t// Trigger a drop field type event.\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'drop:fieldType', type, tmpID );\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// Later, we want to reference 'this' context, so we define it here.\n\t\t\t\tvar that = this;\n\t\t\t\t// Make sure that our staged fields are sorted properly.\t\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\t// Grab our staged fields.\n\t\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\t\t// Get our current field order.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\t\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Sortable isn't empty\n\t\t\t\t\t// If we're dealing with a sortable that isn't empty, get the order.\n\t\t\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t\t} else { // Sortable is empty\n\t\t\t\t\t// Sortable is empty, all we care about is our staged field draggable.\n\t\t\t\t\tvar order = ['nf-staged-fields-drag'];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Get the index of our droped element.\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\n\t\t\t\t// Loop through each staged fields model and insert a field.\n\t\t\t\tvar tmpIDs = [];\n\t\t\t\t_.each( stagedFields.models, function( field, index ) {\n\t\t\t\t\t// Add our field.\n\t\t\t\t\tvar tmpID = that.addField( field.get( 'slug' ) );\n\t\t\t\t\t// Add this newly created field to our order array.\n\t\t\t\t\torder.splice( insertedAt + index, 0, tmpID );\n\t\t\t\t} );\n\n\t\t\t\t// Remove our dropped element from our order array.\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\t\t\t\torder.splice( insertedAt, 1 );\n\t\t\t\t// Sort our fields\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', order );\n\t\t\t\t// Clear our staging\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'clear:staging' );\n\t\t\t\t// Remove our helper. Fixes a weird artifact.\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a field.\n\t\t * Builds the object necessary to add a field to the field model collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \ttype field type\n\t\t * @param boolean \tsilent add silently\n\t\t * @return string \ttmpID\n\t\t */\n\t\taddField: function( type, silent ) {\n\t\t\t// Default to false\n\t\t\tsilent = silent || false;\n\t\t\t// Get our field type model\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type ); \n\t\t\t// Get our tmp ID\n\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\n\t\t\t// Add our field\n\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add', { id: tmpID, label: fieldType.get( 'nicename' ), type: type }, silent );\n\t\t\t// Add our field addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: 'Field',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\n\t\t\treturn tmpID;\n\t\t},\n\n\t\t/**\n\t\t * When the user drags a field type or staging over our sortable, we need to modify the helper.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toverfieldsSortable: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\n\t\t\t\t// String type\n\t\t\t\tvar type = jQuery( ui.helper ).data( 'id' );\n\t\t\t\t// Get our field type model.\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t\t// Get our field type nicename.\n\t\t\t\tvar label = fieldType.get( 'nicename' );\n\t\t\t\t// Get our sortable element.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\t// Get our fieldwidth.\n\t\t\t\tvar fieldWidth = jQuery( sortableEl ).width();\n\t\t\t\t// Set our currentHelper to an object var so that we can access it later.\n\t\t\t\tthis.currentHelper = ui.helper;\n\t\t\t\t// Update our helper label.\n\t\t\t\tjQuery( ui.helper ).html( label );\n\t\t\t\t// Remove the field type draggable classes and add sortable classes.\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-field-wrap' ).css( { 'width': fieldWidth, 'height': '50px' } );\t\t\t\t\t\t\n\t\t\t\t// Add our hover class if our sortable has been initialized.\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// Get our sortable, and if it's initialized add our hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When the user moves a draggable outside of the sortable, we need to change the helper.\n\t\t * This returns the item to its pre-over state.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toutFieldsSortable: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\n\t\t\t\t/*\n\t\t\t\t * Get our helper clone.\n\t\t\t\t * This will let us access the previous label and classes of our helper.\n\t\t\t\t */ \n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\n\t\t\t\t// Set our helper label, remove our sortable class, and add the type class back to the type draggable.\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-field-wrap' ).addClass( 'nf-field-type-button' ).css( { 'width': '', 'height': '' } );\n\t\t\t\t// Get our sortable and if it has been intialized, remove the droppable hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// If we've initialized our sortable, remove the droppable hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging in the sortable:\n\t\t * remove our opacity setting\n\t\t * remove our ui helper\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopFieldsSortable: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:stop', ui );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging in the sortable:\n\t\t * add an opacity setting of 0.5\n\t\t * show our item (jQuery hides the original item by default)\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartFieldsSortable: function( ui ) {\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \n\t\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\n\t\t\t}\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:start', ui );\n\t\t},\n\n\t\t/**\n\t\t * Sort our fields when we change the order.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tupdateFieldsSortable: function( ui, sortable ) {\n\t\t\t\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\n\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \n\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\tvar dragFieldID = jQuery( ui.item ).prop( 'id' ).replace( 'field-', '' );\n\t\t\t\tvar dragModel = fieldCollection.get( dragFieldID );\n\n\t\t\t\t// Add our change event to the change tracker.\n\t\t\t\tvar data = { fields: [] };\n\t\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\t\tvar oldPos = field._previousAttributes.order;\n\t\t\t\t\tvar newPos = field.get( 'order' );\n\t\t\t\t\t\n\t\t\t\t\tdata.fields.push( {\n\t\t\t\t\t\tmodel: field,\n\t\t\t\t\t\tattr: 'order',\n\t\t\t\t\t\tbefore: oldPos,\n\t\t\t\t\t\tafter: newPos\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t\tvar label = {\n\t\t\t\t\tobject: 'Field',\n\t\t\t\t\tlabel: dragModel.get( 'label' ),\n\t\t\t\t\tchange: 'Re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\n\t\t\t\t\tdashicon: 'sort'\n\t\t\t\t};\n\n\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortFields', dragModel, null, label, data );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles interactions with our field collection.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/data',['models/fields/fieldCollection', 'models/fields/fieldModel'], function( fieldCollection, fieldModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tadding: false,\n\t\tremoving: false,\n\t\t\n\t\tinitialize: function() {\n\t\t\t// Load our field collection from our localized form data\n\t\t\tthis.collection = new fieldCollection( preloadedFormData.fields );\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a field is removed so that we can add it to our 'deleted_fields' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about fields and to update/change/delete fields from our collection.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:collection', this.getFieldCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:field', this.getField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'redraw:collection', this.redrawFieldCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:tmpID', this.getTmpFieldID, this );\n\n\t\t\tnfRadio.channel( 'fields' ).reply( 'add', this.addField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'delete', this.deleteField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:fields', this.sortFields, this );\n\n\t\t\t/*\n\t\t\t * Respond to requests to set our 'adding' and 'removing' state. This state is used to track whether or not\n\t\t\t * we should run animations in our fields collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:adding', this.getAdding, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:adding', this.setAdding, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:removing', this.getRemoving, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:removing', this.setRemoving, this );\n\t\t},\n\n\t\tgetFieldCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tredrawFieldCollection: function() {\n\t\t\tthis.collection.trigger( 'reset', this.collection );\n\t\t},\n\n\t\tgetField: function( id ) {\n\t\t\tif ( this.collection.findWhere( { key: id } ) ) {\n\t\t\t\t/*\n\t\t\t\t * First we check to see if a key matches what we were sent.\n\t\t\t\t */\t\t\t\t\n\t\t\t\treturn this.collection.findWhere( { key: id } );\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * If it doesn't, we try to return an ID that matches.\n\t\t\t\t */\n\t\t\t\treturn this.collection.get( id );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a field to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \t\t\tfield data to insert\n\t\t * @param bool \t\tsilent \t\t\tprevent events from firing as a result of adding\n\t\t * @param bool \trenderTrigger\tshould this cause the view to re-render?\n\t\t * @param string \taction\t\t\taction context - are we performing a higher level action? i.e. duplicate\n\t\t */\n\t\taddField: function( data, silent, renderTrigger, action ) {\n\n\t\t\t/*\n\t\t\t * Set our fields 'adding' value to true. This enables our add field animation.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', true );\n\n\t\t\tsilent = silent || false;\n\t\t\taction = action || '';\n\t\t\trenderTrigger = ( 'undefined' == typeof renderTrigger ) ? true : renderTrigger;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tif ( 'undefined' == typeof ( data.id ) ) {\n\t\t\t\t\tdata.id = this.getTmpFieldID();\n\t\t\t\t}\n\t\t\t\tvar model = new fieldModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\t// console.log( model );\n\n\t\t\t/*\n\t\t\t * TODO: Add an nfRadio message filter for the model variable.\n\t\t\t * Currently, we manually replace for saved fields; this should be moved to a separate controller.\n\t\t\t * \n\t\t\t * If we're adding a saved field, make sure that we set the type to the parentType.\n\t\t\t */\n\n\t\t\tif ( jQuery.isNumeric( model.get( 'type' ) ) ) {\n\t\t\t\tvar savedType = nfRadio.channel( 'fields' ).request( 'get:type', model.get( 'type' ) );\n\t\t\t\tmodel.set( 'type', savedType.get( 'parentType' ) );\n\t\t\t}\n\n\t\t\tvar newModel = this.collection.add( model, { silent: silent } );\n\t\t\t\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'add:field', model );\n\t\t\tif ( renderTrigger ) {\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'render:newField', newModel, action );\n\t\t\t}\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'after:addField', model );\n\t\t\t\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Update a field setting by ID\n\t\t * \n\t\t * @since 3.0\n\t\t * @param int \t\tid field id\n\t\t * @param string \tname setting name\n\t\t * @param mixed \tvalue setting value\n\t\t * @return void\n\t\t */\n\t\tupdateFieldSetting: function( id, name, value ) {\n\t\t\tvar fieldModel = this.collection.get( id );\n\t\t\tfieldModel.set( name, value );\n\t\t},\n\n\t\t/**\n\t\t * Get our fields sortable EL\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Array \torder optional order array like: [field-1, field-4, field-2]\n\t\t * @return void\n\t\t */\n\t\tsortFields: function( order, ui, updateDB ) {\n\t\t\tif ( null == updateDB ) {\n\t\t\t\tupdateDB = true;\n\t\t\t}\n\t\t\t// Get our sortable element\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Make sure that sortable is enabled\n\t\t\t\t// JS ternerary for setting our order\n\t\t\t\tvar order = order || jQuery( sortableEl ).sortable( 'toArray' );\n\n\t\t\t\t// Loop through all of our fields and update their order value\n\t\t\t\t_.each( this.collection.models, function( field ) {\n\t\t\t\t\t// Get our current position.\n\t\t\t\t\tvar oldPos = field.get( 'order' );\n\t\t\t\t\tvar id = field.get( 'id' );\n\t\t\t\t\tif ( jQuery.isNumeric( id ) ) {\n\t\t\t\t\t\tvar search = 'field-' + id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar search = id;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Get the index of our field inside our order array\n\t\t\t\t\tvar newPos = order.indexOf( search ) + 1;\n\t\t\t\t\tfield.set( 'order', newPos );\n\t\t\t\t} );\n\t\t\t\tthis.collection.sort();\n\n\t\t\t\tif ( updateDB ) {\n\t\t\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\t\t\t// Update our preview\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Delete a field from our collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tfield model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteField: function( model ) {\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'delete:field', model );\n\t\t\tthis.removing = true;\n\t\t\tthis.collection.remove( model );\n\t\t\t\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\t\t/**\n\t\t * Return a new tmp id for our fields.\n\t\t * Gets the field collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpFieldID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t},\n\n\t\tgetAdding: function() {\n\t\t\treturn this.adding;\n\t\t},\n\n\t\tsetAdding: function( val ) {\n\t\t\tthis.adding = val;\n\t\t},\n\n\t\tgetRemoving: function() {\n\t\t\treturn this.removing;\n\t\t},\n\n\t\tsetRemoving: function( val ) {\n\t\t\tthis.removing = val;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our repeater option.\n * \n * @package Ninja App builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/optionRepeaterModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\terrors: {},\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// When we add errors to the option row, run a function.\n\t\t\tthis.on( 'change:errors', this.changeErrors, this );\n\t\t},\n\n\t\t/**\n\t\t * When we change the errors on our model, check to see if we should add or remove \n\t\t * the error from the setting that this option is a part of.\n\t\t *\n\t\t * Adding an error to the setting model simply disables the drawer and other\n\t\t * navigation. As long as we have one option with an error, it should be set to true.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeErrors: function( model ) {\n\t\t\t/*\n\t\t\t * The errors attribute will be an object, so if we don't have any keys, it's empty.\n\t\t\t * If we have an empty object, check to see if we can remove the error from our setting model.\n\t\t\t */\n\n\t\t\tif ( 0 == _.size( model.get( 'errors' ) ) ) {\n\t\t\t\t/*\n\t\t\t\t * Loop through our collection to see if we have any other errors.\n\t\t\t\t */\n\t\t\t\tvar errorsFound = false;\n\t\t\t\t_.each( model.collection.models, function( opt ) {\n\t\t\t\t\tif ( 0 != _.size( opt.get( 'errors' ) ) ) {\n\t\t\t\t\t\terrorsFound = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( ! errorsFound ) {\n\t\t\t\t\tmodel.collection.settingModel.set( 'error', false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * We have errors, so make sure that the setting model has an error set.\n\t\t\t\t */\n\t\t\t\tmodel.collection.settingModel.set( 'error', true );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Model that represents our list options.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/optionRepeaterCollection',['models/app/optionRepeaterModel'], function( listOptionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: listOptionModel,\n\t\tcomparator: 'order',\n\n\t\tinitialize: function( models, options ) {\n\t\t\t// Listen to the 'sort' event\n\t\t\tthis.on( 'sort', this.changeCollection, this );\n\t\t\t// Listen to the 'add' event\n\t\t\tthis.on( 'add', this.addOption, this );\n\t\t\tthis.settingModel = options.settingModel;\n\t\t},\n\n\t\tchangeCollection: function() {\n\t\t\t// Trigger a 'sort:options' event so that our field model can update\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:options', this );\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'sort:options', this );\n\t\t},\n\n\t\taddOption: function( model, collection ) {\n\t\t\tmodel.set( 'settingModel', this.settingModel );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","define( 'views/app/drawer/optionRepeaterError',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'nf-error',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-error',\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\trenderErrors: function() {\n\t\t\t\t if ( 'undefined' != typeof that.errors ) {\n \t\t\t\t\treturn that.errors[ Object.keys( errors )[0] ];\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/optionRepeaterOption',['views/app/drawer/optionRepeaterError'], function( ErrorView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'nf-table-row',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-default-row',\n\t\tid: function() {\n\t\t\treturn this.model.cid;\n\t\t},\n\n\t\tregions: {\n\t\t\terror: '.nf-option-error'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.settingModel = data.settingModel;\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tthis.collection = data.collection;\n\t\t\tthis.columns = data.columns;\n\t\t\tthis.parentView = data.parentView;\n\t\t\tthis.model.on( 'change:errors', this.renderErrors, this );\n\n\t\t\t// Removed because the re-render was breaking tag insertion for merge tags.\n\t\t\t// this.model.on( 'change', this.render, this );\n\n\t\t\tif ( 'undefined' != typeof this.settingModel.get( 'tmpl_row' ) ) {\n\t\t\t\tthis.template = '#' + this.settingModel.get( 'tmpl_row' );\n\t\t\t}\n\n\t\t\tthis.hasErrors = false;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\t\n\t\t\tthis.model.off( 'change', this.render );\n\t\t\tthis.model.off( 'change:errors', this.renderErrors );\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\t/*\n\t\t\t * We want to escape any HTML being output for our label.\n\t\t\t */\n\t\t\tif ( this.model.get( 'label' ) ) {\n\t\t\t\tvar label = this.model.get( 'label' );\n\t\t\t\tthis.model.set( 'label', _.escape( label ), { silent: true } );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.settingModel.get( 'name' ) + '-option' ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\t/*\n\t\t\t * We want to unescape any HTML being output for our label.\n\t\t\t */\n\t\t\tif ( this.model.get( 'label' ) ) {\n\t\t\t\tvar label = this.model.get( 'label' );\n\t\t\t\tthis.model.set( 'label', _.unescape( label ), { silent: true } );\n\t\t\t}\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( this.model.get( 'new' ) ) {\n\t\t\t\tjQuery( this.el ).find( 'input:first' ).focus();\n\t\t\t\tthis.model.set( 'new', false );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .setting': 'changeOption',\n\t\t\t'click .nf-delete': 'deleteOption',\n\t\t\t'keyup': 'keyupOption'\n\t\t},\n\n\t\tchangeOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'change:option', e, this.model, this.dataModel, this.settingModel, this );\n\t\t},\n\n\t\tdeleteOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:deleteOption', this.model, this.collection, this.dataModel, this );\n\t\t},\n\n\t\tkeyupOption: function( e ) {\n\t\t\tthis.maybeAddOption( e );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n\t\t},\n\n\t\tmaybeAddOption: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel, this );\n\t\t\t\tjQuery( this.parentView.children.findByIndex(this.parentView.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n\t\t\t}\n\t\t},\n\n\t\trenderErrors: function() {\n\t\t\t\n\t\t\t// if ( jQuery.isEmptyObject( this.model.get( 'errors' ) ) ) {\n\t\t\t// \treturn false;\n\t\t\t// }\n\n\t\t\t/*\n\t\t\t * We don't want to redraw the entire row, which would remove focus from the eq textarea,\n\t\t\t * so we add and remove error classes manually.\n\t\t\t */\n\t\t\tif ( 0 == Object.keys( this.model.get( 'errors' ) ) ) {\n if ( this.hasErrors ) {\n\t\t\t\t this.error.empty();\n\t\t\t\t jQuery( this.el ).removeClass( 'nf-error' );\n }\n\t\t\t} else {\n\t\t\t\tthis.hasErrors = true;\n\t\t\t\tthis.error.show( new ErrorView( { model: this.model } ) );\n\t\t\t\tjQuery( this.el ).addClass( 'nf-error' );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\tgetColumns: function() {\n\t\t\t\t\treturn that.columns;\n\t\t\t\t},\n\t\t\t\trenderFieldSelect: function( dataID, value ){\n\t\t\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tvar _return = '<label class=\"nf-select\"><select class=\"setting\" data-id=\"' + dataID + '\">';\n\t\t\t\t\tfields.each( function( field ){\n\t\t\t\t\t\tvar selected = ( value == field.get( 'key' ) ) ? ' selected' : '';\n\t\t\t\t\t\t_return += '<option value=\"' + field.get( 'key' ) + '\"' + selected + '>' + field.get( 'label' ) + '</option>';\n\t\t\t\t\t});\n\t\t\t\t\t_return += '</select><div></div></label>';\n\t\t\t\t\treturn _return;\n\t\t\t\t},\n\t\t\t\trenderOptions: function( column, value ) {\n\n\t\t\t\t\tif( 'undefined' == typeof that.options.columns[ column ] ) return;\n\n\t\t\t\t\tvar html = '';\n\t\t\t\t\t_.each( that.options.columns[ column ].options, function( option ){\n\t\t\t\t\t\tvar selected = ( value == option.value ) ? ' selected' : '';\n\t\t\t\t\t\thtml += '<option value=\"' + option.value + '\"' + selected + '>' + option.label + '</option>';\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\treturn html;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/app/drawer/optionRepeaterEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'tr',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-empty'\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/optionRepeaterComposite',['views/app/drawer/optionRepeaterOption', 'views/app/drawer/optionRepeaterEmpty', 'models/app/optionRepeaterCollection'], function( listOptionView, listEmptyView, listOptionCollection ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-wrap',\n\t\tchildView: listOptionView,\n\t\temptyView: listEmptyView,\n\t\treorderOnSort: false,\n\n\t\tinitialize: function( data ) {\n\n\t\t\t/*\n\t\t\t * Our options are stored in our database as objects, not collections.\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n\t\t\t */ \n\t\t\tvar optionCollection = data.dataModel.get( this.model.get( 'name' ) );\n\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: this.model } );\n\t\t\t\toptionCollection.add( data.dataModel.get( this.model.get( 'name' ) ) );\n\t\t\t\tdata.dataModel.set( this.model.get( 'name' ), optionCollection, { silent: true } );\n\t\t\t}\n\n\t\t\tthis.collection = optionCollection;\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tthis.childViewOptions = { parentView: this, settingModel: this.model, collection: this.collection, dataModel: data.dataModel, columns: this.model.get( 'columns' ) };\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\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\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\t\tvar that = this;\n\t\t\tjQuery( this.el ).find( '.nf-list-options-tbody' ).sortable( {\n\t\t\t\thandle: '.handle',\n\t\t\t\thelper: 'clone',\n\t\t\t\tplaceholder: 'nf-list-options-sortable-placeholder',\n\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\topacity: 0.95,\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'start:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'stop:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'update:optionSortable', ui, this, that );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\n\t\t},\n\n\t\tonAttach: function() {\n \n\t\t\tvar importLink = jQuery( this.el ).find( '.nf-open-import-tooltip' );\n\t\t\tvar jBox = jQuery( importLink ).jBox( 'Tooltip', {\n title: '<h3>Please enter your options below:</h3>',\n content: jQuery( this.el ).find( '.nf-import-options' ),\n trigger: 'click',\n closeOnClick: 'body',\n closeButton: 'box',\n offset: { x: 20, y: 0 },\n addClass: 'import-options',\n\n onOpen: function() {\n \tvar that = this;\n \tsetTimeout( function() { jQuery( that.content ).find( 'textarea' ).focus(); }, 200 );\n }\n } );\n\n\t\t\tjQuery( this.el ).find( '.nf-import' ).on( 'click', { view: this, jBox: jBox }, this.clickImport );\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderHeaders: function() {\n\t \t\t\tvar columns = '<div> </div>';\n\t \t\t\t_.each( this.columns, function( col ) {\n\t \t\t\t\tcolumns += '<div>' + col.header + '</div>';\n\t \t\t\t} );\n\t \t\t\tcolumns += '<div> </div>';\n\t\t\t\t\treturn columns;\n\t\t\t\t},\n\n\t \t\trenderSetting: function() {\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( this );\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\n\t\t\t\trenderError: function() {\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\treturn this.error;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\n\t\t\t\trenderFieldsetClasses: function() {\n\t\t\t\t\treturn that.model.get( 'name' );\n\t\t\t\t},\n\n\t\t\t\tcurrencySymbol: function() {\n\t\t\t\t\treturn nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' ) || nfi18n.currency_symbol;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.nf-list-options-tbody' ).append( childView.el );\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-add-new': 'clickAddOption',\n\t\t\t'click .extra': 'clickExtra'\n\t\t},\n\n\t\tclickAddOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel );\n\t\t\tjQuery( this.children.findByIndex(this.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:extra', e, this.collection, this.dataModel );\n\t\t\tnfRadio.channel( 'option-repeater-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.collection, this.dataModel );\n\t\t},\n\n\t\tclickImport: function( e ) {\n\t\t\tvar textarea = jQuery( e.data.jBox.content ).find( 'textarea' );\n\t\t\tvar value = textarea.val().trimLeft().trimRight();\n\t\t\t/*\n\t\t\t * Return early if we have no strings.\n\t\t\t */\n\t\t\tif ( 0 == value.length ) {\n\t\t\t\te.data.jBox.close();\n\t\t\t\treturn false;\n\t\t\t}\t\t\t\n\t\t\t/*\n\t\t\t * Split our value based on new lines.\n\t\t\t */\n\n\t\t\tvar lines = value.split(/\\n/);\n\t\t\tif ( _.isArray( lines ) ) {\n\t\t\t\t/*\n\t\t\t\t * Loop over \n\t\t\t\t */\n\t\t\t\t_.each( lines, function( line ) {\n\t\t\t\t\tvar row = line.split( ',' );\n\t\t\t\t\tvar label = row[0];\n\t\t\t\t\tvar value = row[1] || jQuery.slugify( label, { separator: '-' } );\n\t\t\t\t\tvar calc = row[2] || '';\n\n\t\t\t\t\tlabel = label.trimLeft().trimRight();\n\t\t\t\t\tvalue = value.trimLeft().trimRight();\n\t\t\t\t\tcalc = calc.trimLeft().trimRight();\n\t\t\t\t\t/*\n\t\t\t\t\t * Add our row to the collection\n\t\t\t\t\t */\n\t\t\t\t\tvar model = e.data.view.collection.add( { label: row[0], value: value, calc: calc } );\n\t\t\t\t\t// Add our field addition to our change log.\n\t\t\t\t\tvar label = {\n\t\t\t\t\t\tobject: 'field',\n\t\t\t\t\t\tlabel: row[0],\n\t\t\t\t\t\tchange: 'Option Added',\n\t\t\t\t\t\tdashicon: 'plus-alt'\n\t\t\t\t\t};\n\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\n\t\t\t\t\tnfRadio.channel( 'option-repeater-' + e.data.view.model.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\n\t\t\t\t}, this );\n\t\t\t\t/*\n\t\t\t\t * Set our state to unclean so that the user can publish.\n\t\t\t\t */\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * TODO: Error Handling Here\n\t\t\t\t */\n\t\t\t}\n\t\t\ttextarea.val( '' );\n\t\t\te.data.jBox.close();\n\t\t},\n\t} );\n\n\treturn view;\n} );\n","/**\n * Handles tasks associated with our option-repeater.\n * \n * Return our repeater child view.\n *\n * Also listens for changes to the options settings.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/optionRepeater',['models/app/optionRepeaterModel', 'models/app/optionRepeaterCollection', 'views/app/drawer/optionRepeaterComposite'], function( listOptionModel, listOptionCollection, listCompositeView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for the childView for list type fields.\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t\t\n\t\t\t// Listen for changes to our list options.\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'change:option', this.changeOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:addOption', this.addOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:deleteOption', this.deleteOption );\n\n\t\t\t// Respond to requests related to our list options sortable.\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'update:optionSortable', this.updateOptionSortable, this );\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'stop:optionSortable', this.stopOptionSortable, this );\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'start:optionSortable', this.startOptionSortable, this );\n\t\t\n\t\t\t/**\n\t\t\t * When we init our setting model, we need to convert our array/objects into collections/models\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'init:dataModel', this.convertSettings );\n\t\t},\n\n\t\t/**\n\t\t * Update an option value in our model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te event\n\t\t * @param backbone.model \tmodel option model\n\t\t * @param backbone.model \tdataModel\n\t\t * @return void\n\t\t */\n\t\tchangeOption: function( e, model, dataModel, settingModel, optionView ) {\n\t\t\tvar name = jQuery( e.target ).data( 'id' );\n\t\t\tif ( 'selected' == name ) {\n\t\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\n\t\t\t\t\tvar value = 1;\n\t\t\t\t} else {\n\t\t\t\t\tvar value = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t}\n\t\t\t\n\t\t\tvar before = model.get( name );\n\t\t\t\n\t\t\tmodel.set( name, value );\n\t\t\t// Trigger an update on our dataModel\n\t\t\tthis.triggerDataModel( model, dataModel );\n\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + model.get( 'label' ) + ' ' + name + ' changed from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', model, changes, label );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-option-' + name ).trigger( 'update:option', e, model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-' + settingModel.get( 'name' ) ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t},\n\n\t\t/**\n\t\t * Add an option to our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\taddOption: function( collection, dataModel ) {\n\t\t\tvar modelData = {\n\t\t\t\torder: collection.length,\n\t\t\t\tnew: true,\n\t\t\t\toptions: {}\n\t\t\t};\n\t\t\t_.each( collection.settingModel.get( 'columns' ), function( col, key ) {\n\t\t\t\tmodelData[ key ] = col.default;\n\n\t\t\t\tif( 'undefined' != typeof col.options ){\n\t\t\t\t\tmodelData.options[ key ] = col.options;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvar model = new listOptionModel( modelData );\n\t\t\tcollection.add( model );\n\n\t\t\t// Add our field addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\n\t\t\tthis.triggerDataModel( model, dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Delete an option from our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \t\tmodel list option model\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\tdeleteOption: function( model, collection, dataModel ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\n\t\t\t// Add our field deletion to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + newModel.get( 'label' ) + ' Removed',\n\t\t\t\tdashicon: 'dismiss'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: collection\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeListOption', newModel, null, label, data );\n\t\t\t\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\tif ( 'object' == typeof changeModel.get( 'data' ) ) {\n\t\t\t\t\t_.each( changeModel.get( 'data' ), function( dataModel ) {\n\t\t\t\t\t\tif ( dataModel.model == dataModel ) {\n\t\t\t\t\t\t\tdataModel.model = newModel;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tchangeModel.set( 'model', newModel );\n\t\t\t\tchangeModel.set( 'disabled', true );\n\t\t\t} );\n\n\t\t\tcollection.remove( model );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'remove:option', model );\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'remove:option', model );\n\t\t\tthis.triggerDataModel( model, dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Creates an arbitrary value on our collection, then clones and updates that collection.\n\t\t * This forces a change event to be fired on the dataModel where the list option collection data is stored.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\ttriggerDataModel: function( model, dataModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\t\n\t\t},\n\n\t\t/**\n\t\t * Return our list composite view to the setting collection view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tsettings model\n\t\t * @return void\n\t\t */\n\t\tgetSettingChildView: function( model ) {\n\t\t\treturn listCompositeView;\n\t\t},\n\n\t\t/**\n\t\t * When we sort our list options, change the order in our option model and trigger a change.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t \t\tsortable \tjQuery UI element\n\t\t * @param backbone.view \tsetting \tSetting view\n\t\t * @return void\n\t\t */\n\t\tupdateOptionSortable: function( ui, sortable, setting ) {\n\t\t\tvar newOrder = jQuery( sortable ).sortable( 'toArray' );\n\t\t\tvar dragModel = setting.collection.get( { cid: jQuery( ui.item ).prop( 'id' ) } );\n\t\t\tvar data = {\n\t\t\t\tcollection: setting.collection,\n\t\t\t\tobjModels: []\n\t\t\t};\n\n\t\t\t_.each( newOrder, function( cid, index ) {\n\t\t\t\tvar optionModel = setting.collection.get( { cid: cid } );\n\t\t\t\tvar oldPos = optionModel.get( 'order' );\n\t\t\t\toptionModel.set( 'order', index );\n\t\t\t\tvar newPos = index;\n\n\t\t\t\tdata.objModels.push( {\n\t\t\t\t\tmodel: optionModel,\n\t\t\t\t\tattr: 'order',\n\t\t\t\t\tbefore: oldPos,\n\t\t\t\t\tafter: newPos\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t\n\t\t\tsetting.collection.sort( { silent: true } );\n\t\t\t\n\t\t\tvar label = {\n\t\t\t\tobject: setting.dataModel.get( 'objectType' ),\n\t\t\t\tlabel: setting.dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + dragModel.get( 'label' ) + ' re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\n\t\t\t\tdashicon: 'sort'\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortListOptions', dragModel, null, label, data );\n\t\t\tthis.triggerDataModel( dragModel, setting.dataModel );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:option', dragModel, setting );\n\t\t\tnfRadio.channel( 'option-repeater-' + setting.model.get( 'name' ) ).trigger( 'sort:option', dragModel, setting );\n\t\t},\n\n\t\t/**\n\t\t * When we stop sorting our list options, reset our item opacity.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopOptionSortable: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t},\n\n\t\t/**\n\t\t * When we start sorting our list options, remove containing divs and set our item opacity to 0.5\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Objects ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartOptionSortable: function( ui ) {\n\t\t\tjQuery( ui.placeholder ).find( 'div' ).remove();\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\n\t\t},\n\n\t\t/**\n\t\t * Convert settings from an array/object to a collection/model\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Backbone.Model dataModel\n\t\t * @param Backbone.Model settingModel\n\t\t * @return void\n\t\t */\n\t\tconvertSettings: function( dataModel, settingModel ) {\n\t\t\t/*\n\t\t\t * Our options are stored in our database as objects, not collections.\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n\t\t\t */ \n\t\t\tvar optionCollection = dataModel.get( settingModel.get( 'name' ) );\n\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: settingModel } );\n\t\t\t\toptionCollection.add( dataModel.get( settingModel.get( 'name' ) ) );\n\t\t\t\tdataModel.set( settingModel.get( 'name' ), optionCollection, { silent: true } );\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a field currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n _.each( fieldCollection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( fieldSettings, { objectType: 'fields' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t\t\n\t\t\t// Responds to requests for our collection.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingCollection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldCreditCard',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.dropCreditCardField );\n },\n\n dropCreditCardField: function( fieldModel ) {\n\n if( 'creditcard' == fieldModel.get( 'type' ) ) {\n\n var order = fieldModel.get( 'order' );\n\n nfRadio.channel( 'fields' ).request( 'delete', fieldModel );\n\n _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\n\n var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n var newField = {\n id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n type: type,\n label: fieldType.get( 'nicename' ),\n order: order\n };\n\n nfRadio.channel( 'fields' ).request( 'add', newField );\n });\n }\n\n },\n\n stageCreditCardField: function( model ) {\n\n if( 'creditcard' == model.get( 'slug' ) ) {\n\n nfRadio.channel( 'fields' ).request( 'remove:stagedField', '', model );\n\n _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\n nfRadio.channel('fields').request('add:stagedField', type );\n });\n }\n }\n\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel to add the individual List Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldList',[ 'models/app/optionRepeaterCollection' ], function( ListOptionCollection ) {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'option-repeater-option-label' ), 'update:option', this.updateOptionLabel );\n this.listenTo( nfRadio.channel( 'option-repeater-option-value' ), 'update:option', this.updateOptionValue );\n \n /*\n * When we init our model, convert our options from an array of objects to a collection of models.\n */\n this.listenTo( nfRadio.channel( 'fields-list' ), 'init:fieldModel', this.convertOptions );\n },\n\n updateOptionLabel: function( e, model, dataModel, settingModel, optionView ) {\n\n if( 'list' != _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } ).parentType ) return;\n\n if( model.get( 'manual_value' ) ) return;\n\n value = jQuery.slugify( model.get( 'label' ), { separator: '-' } );\n\n model.set( 'value', value );\n model.trigger( 'change', model );\n\n // Set focus on value input\n jQuery( optionView.el ).find( '[data-id=\"value\"]' ).focus().select();\n },\n\n updateOptionValue: function( e, model, dataModel, settingModel, optionView ) {\n\n var findWhere = _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } );\n if( 'undefined' == typeof findWhere ) return;\n if( 'list' != findWhere.parentType ) return;\n\n model.set( 'manual_value', true );\n \n // Set focus on calc input\n jQuery( optionView.el ).find( '[data-id=\"calc\"]' ).focus().select();\n },\n\n convertOptions: function( fieldModel ) {\n /*\n * Our options are stored in our database as objects, not collections.\n * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n */ \n var options = fieldModel.get( 'options' );\n\n var settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'options' );\n\n if ( false == options instanceof Backbone.Collection ) {\n options = new ListOptionCollection( [], { settingModel: settingModel } );\n options.add( fieldModel.get( 'options' ) );\n fieldModel.set( 'options', options, { silent: true } );\n }\n }\n\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldPassword',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.addField );\n },\n\n addField: function( model ) {\n\n if( 'password' == model.get( 'type' ) ) {\n\n var order = model.get( 'order' );\n\n var confirm = this.insertField( 'passwordconfirm', order + 1 );\n\n confirm.set( 'confirm_field', model.get( 'key' ) );\n }\n },\n\n insertField: function( type, order ) {\n var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n var newField = {\n id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n type: type,\n label: fieldType.get( 'nicename' ),\n order: order\n };\n\n return nfRadio.channel('fields').request('add', newField );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldQuantity',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\tif ( 'product_assignment' == settingModel.get( 'name' ) ) {\n\t\t\t\tvar productFields = this.getProductFields( settingModel );\n\t\t\t\tsettingModel.set( 'options', productFields );\n\t\t\t}\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldShipping',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options' ), 'render:setting', this.addMask );\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options-option' ), 'render:setting', this.addMask );\n\t\t},\n\n\t\taddMask: function( settingModel, dataModel, view ) {\n\t\t\tjQuery( view.el ).find( '[data-id=\"value\"]' ).each( function() {\n\t\t\t\tjQuery( this ).autoNumeric({\n\t\t\t\t\taSign: '$', // TODO: Use form setting\n\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\taDec: decimalPoint\n\t\t\t\t});\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * When we add a new field, update its key.\n *\n * When we change the key, update any refs to the key.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/key',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we add a field, update its key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.newFieldKey );\n\n\t\t\t// When we edit a label, update our key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-label' ), 'update:setting', this.updateLabel );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// When we type inside the admin key field, we need to save our manual_key setting.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-key' ), 'keyup:setting', this.keyUp );\n\t\t},\n\n\t\t/**\n\t\t * Add a key to our new field model.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model new field model\n\t\t * @return void\n\t\t */\n\t\tnewFieldKey: function( model ) {\n\t\t\tvar d = new Date();\n\t\t\tvar n = d.valueOf();\n\t\t\tvar key = this.slugify( model.get( 'type' ) + '_' + n );\n\n\t\t\tmodel.set( 'key', key, { silent: true } );\n\n\t\t\tif( 'undefined' == model.get( 'manual_key' ) ) {\n\t\t\t\tmodel.set('manual_key', false, {silent: true});\n\t\t\t}\n\t\t},\n\n\t\tupdateLabel: function( model ) {\n\n\t\t\t/*\n\t\t\t * If we haven't entered a key manually, update our key when our label changes.\n\t\t\t */\n\t\t\tif ( ! model.get( 'manual_key' ) && 0 != jQuery.trim( model.get( 'label' ) ).length ) {\n\t\t\t\t/*\n\t\t\t\t * When we're editing settings, we expect the edits to fire one at a time.\n\t\t\t\t * Since we're calling this in the middle of our label update, anything that inquires about what has changed after we set our key will see both label and key.\n\t\t\t\t * We need to remove the label from our model.changed property so that all that has changed is the key.\n\t\t\t\t *\n\t\t\t\t */\n\t\t\t\tdelete model.changed.label;\n\t\t\t\tvar d = new Date();\n\t\t\t\tvar n = d.valueOf();\n\t\t\t\tvar key = this.slugify( model.get( 'label' ) + '_' + n );\n\t\t\t\tmodel.set( 'key', key );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, find any merge tags using the key and update them.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model field model\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( dataModel ) {\n\t\t\tvar key = dataModel.get( 'key' );\n\t\t\tthis.settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'key' );\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tkeyUp: function( e, settingModel, dataModel ) {\n\t\t\tdataModel.set( 'manual_key', true );\n\t\t\tthis.settingModel = settingModel;\n\t\t\tvar key = jQuery( e.target ).val();\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tsetError: function( key, dataModel ) {\n\t\t\tvar error = false;\n\t\t\tif ( '' == jQuery.trim( key ) ) {\n\t\t\t\terror = 'Field keys can\\'t be empty. Please enter a key.';\n\t\t\t} else if ( key != key.toLowerCase() ) {\n\t\t\t\terror = 'Field keys must be lowercase.';\n\t\t\t} else if ( key != key.replace( ' ', '_' ) ) {\n\t\t\t\terror = 'Field keys must cannot use spaces. Separate with \"_\" instead.';\n\t\t\t} else if ( '_' == key.slice( -1 ) ) {\n\t\t\t\terror = 'Field keys cannot end with a \"_\"';\n\t\t\t} else if ( key != this.slugify( key ) ) {\n\t\t\t\terror = 'Invalid Format.';\n\t\t\t} else if ( key != this.keyExists( key, dataModel ) ) {\n\t\t\t\terror = 'Field keys must be unique. Please enter another key.'\n\t\t\t}\n\n\t\t\tif ( error ) {\n\t\t\t\tthis.settingModel.set( 'error', error );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:fieldKey', dataModel );\n\t\t\t\tthis.settingModel.set( 'error', false );\n\t\t\t}\n\t\t},\n\n\t\tkeyExists: function( key, dataModel ) {\n\t\t\tvar newKey = this.slugify( key );\n\t\t\tif ( 0 != newKey.length ) {\n\t\t\t\tkey = newKey;\n\t\t\t}\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar x = 1;\n\t\t\tvar testKey = key;\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\tif ( dataModel != field && testKey == field.get( 'key' ) ) {\n\t\t\t\t\ttestKey = key + '_' + x;\n\t\t\t\t\tx++;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tkey = testKey;\n\n\t\t\treturn key;\n\t\t},\n\n\t\tslugify: function( string ){\n\t\t\treturn jQuery.slugify( string, { separator: '_' } )\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Creates notices for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:stagedField', this.addStagedField );\n\t\t},\n\n\t\taddStagedField: function( model ) {\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addStagedField', model.get( 'nicename' ) + ' added to staging' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles mobile-specific JS for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start of our sorting.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'render:fieldsSortable', this.initWiggle );\n\t\t\t// Listen for when we start sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:start', this.startWiggle );\n\t\t\t// Listen for when we stop sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:stop', this.stopWiggle );\n\t\t},\n\n\t\tinitWiggle: function( view ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).find( '.nf-field-wrap' ).on( 'taphold', function() {\n\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tstartWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper' ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.helper ).css( 'opacity', '0.75' ).ClassyWiggle( 'start', { degrees: ['.5', '1', '.5', '0', '-.5', '-1', '-.5', '0'] } );\n\t\t\t}\n\t\t},\n\n\t\tstopWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.helper ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * If we add a saved field to our form and then update it, set the \"saved\" flag to false.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/savedFields',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tignoreAttributes: [\n\t\t\t'editActive',\n\t\t\t'order',\n\t\t\t'saved',\n\t\t\t'jBox'\n\t\t],\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateField );\n\t\t\t// Listen to clicks on our add saved field button.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:addSavedField', this.clickAddSavedField, this );\n\t\t},\n\n\t\tupdateField: function( dataModel ) {\n\t\t\tif ( dataModel.get( 'saved' ) ) {\n\t\t\t\t\n\t\t\t\tvar modified = false;\n\t\t\t\tvar changedAttributes = _.keys( dataModel.changedAttributes() );\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( changedAttributes, function( changed ) {\n\t\t\t\t\tif ( -1 == that.ignoreAttributes.indexOf( changed ) ) {\n\t\t\t\t\t\tmodified = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t\n\t\t\t\tif ( modified ) {\n\t\t\t\t\tdataModel.set( 'saved', false );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tclickAddSavedField: function( e, dataModel ) {\n\t\t\tvar modelClone = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\tvar fieldData = modelClone.attributes;\n\t\t\tfieldData.saved = true;\n\n\t\t\tdelete fieldData.jBox;\n\t\t\tdelete fieldData.editActive;\n\t\t\tdelete fieldData.created_at;\n\t\t\tdelete fieldData.order;\n\t\t\tdelete fieldData.id;\n\t\t\tdelete fieldData.formID;\n\t\t\tdelete fieldData.parent_id;\n\t\t\t\n\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', fieldData.type );\n\t\t\tvar newType = _.clone( type.attributes );\n\n\t\t\tvar nicename = jQuery( e.target ).parent().parent().find( 'input' ).val();\n\t\t\tconsole.log( nicename );\n\t\t\tnewType.nicename = nicename;\n\t\t\tfieldData.label = nicename;\n\t\t\tfieldData.nicename = nicename;\n\t\t\tdataModel.set( 'addSavedLoading', true );\n\t\t\tvar newTypeDefaults = JSON.stringify( fieldData );\n\n\t\t\tjQuery.post( ajaxurl, { action: 'nf_create_saved_field', field: newTypeDefaults, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\tnewType.id = response.data.id;\n\t\t\t\tnewType.nicename = nicename;\n\t\t\t\tnewType.settingDefaults = fieldData;\n\n\t\t\t\tvar typeCollection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n\t\t\t\tvar newModel = typeCollection.add( newType );\n\n\t\t\t\tvar typeSections = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\t\ttypeSections.get( 'saved' ).get( 'fieldTypes' ).push( newType.id );\n\n\t\t\t\t// dataModel.set( 'type', response.data.id );\n\t\t\t\tdataModel.set( 'addSavedLoading', false );\n\t\t\t\tdataModel.unset( 'addSavedLoading', { silent: true } );\n\t\t\t\tdataModel.get( 'jBox' ).close();\n\t\t\t\t// dataModel.set( 'saved', true );\n\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addSaved', 'Saved Field Added' );\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a datepicker setting, add our datepicker.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDatepicker',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-datepicker' ), 'render:setting', this.addDatepicker );\n\t\t},\n\n\t\taddDatepicker: function( settingModel, dataModel, view ) {\n\t\t\tvar dateObject = pikadayResponsive( jQuery( view.el ).find( '.setting' )[0] );\t\t\t\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDisplayCalc',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-calc_var' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\t// console.log( 'render!' );\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Creates and stores a collection of action types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our action type collection\n *\n * Also responds to requests for data about action types\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/types',[ 'models/app/typeCollection' ], function( TypeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\t/*\n\t\t\t * Instantiate \"installed\" actions collection.\n\t\t\t */\n\t\t\tthis.installedActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'installed';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'installed',\n\t\t\t\t\tnicename: nfi18n.installed\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.availableActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'available';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'available',\n\t\t\t\t\tnicename: nfi18n.available\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:installedActions', this.getInstalledActions, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:availableActions', this.getAvailableActions, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\t// Search our installed actions first\n\t\t\tvar type = this.installedActions.get( id );\n\t\t\tif ( ! type ) {\n\t\t\t\ttype = this.availableActions.get( id );\n\t\t\t}\n \treturn type;\n },\n\n /**\n * Return the installed action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetInstalledActions: function() {\n \treturn this.installedActions;\n },\n\n /**\n * Return the available action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetAvailableActions: function() {\n \treturn this.availableActions;\n },\n\n /**\n * Add a field type to our staging area when the field type button is clicked.\n *\n * @since 3.0\n * @param Object e event\n * @return void\n */\n addStagedField: function( e ) {\n \tvar type = jQuery( e.target ).data( 'id' );\n \tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n },\n\n /**\n * Return our field type settings sections\n *\n * @since 3.0\n * @return backbone.collection field type settings sections\n */\n getTypeSections: function() {\n return this.fieldTypeSections;\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form action.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Action',\n\t\t\tobjectDomain: 'actions',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar actionType = nfRadio.channel( 'actions' ).request( 'get:type', this.get( 'type' ) );\n\n\t\t\tif( 'undefined' == typeof actionType ) return;\n\n\t\t\t// Loop through our action type \"settingDefaults\" and add any default settings.\n\t\t\tvar that = this;\n\t\t\t_.each( actionType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( ! that.get( key ) ) {\n\t\t\t\t\tthat.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * actions\n\t\t\t * action-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( 'actions' ).trigger( 'init:actionModel', this );\n\t\t\tnfRadio.channel( 'actions-' + this.get( 'type' ) ).trigger( 'init:actionModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n nfRadio.channel( 'actionSetting-' + _.keys( this.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'actions').trigger( 'update:setting', this, options.settingModel );\n nfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action models. \n * This is the actual action data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new action or removed action property.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionCollection',['models/actions/actionModel'], function( actionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionModel,\n\t\tcomparator: 'order',\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addAction, this );\n\t\t\tthis.on( 'remove', this.removeAction, this );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new action property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddAction: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed action property.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveAction: function( model ) {\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles interactions with our actions collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/data',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.collection = new actionCollection( preloadedFormData.actions );\n\t\t\tthis.collection.tmpNum = 1;\n\n\t\t\tif ( 0 != this.collection.models.length ) {\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( this.collection.models, function( action ) {\n\t\t\t\t\tif ( ! jQuery.isNumeric( action.get( 'id' ) ) ) {\n\t\t\t\t\t\tthat.collection.tmpNum++;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a action is removed so that we can add it to our 'deleted_actions' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about actions and to update/change/delete actions from our collection.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:action', this.getAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:tmpID', this.getTmpID, this );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add', this.addAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'delete', this.deleteAction, this );\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetAction: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\t/**\n\t\t * Add a action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( data, silent ) {\n\t\t\tsilent = silent || false;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tvar model = new actionModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\tthis.collection.add( model, { silent: silent } );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Delete a action from our collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \taction model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteAction: function( model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\n\t\t/**\n\t\t * Return a new tmp id for our actions.\n\t\t * Gets the action collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/actionSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( actionSettings, { objectType: 'actions' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a action currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - Edit Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our actions.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our actions collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n _.each( actionCollection.models, function( action ) {\n\t\t\t\taction.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Handles clicks and dragging for our action types.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/addActionTypes',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'actions' ), 'click:addAction', this.addAction );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add:actionType', this.addAction, this );\n\t\t},\n\n\t\t/**\n\t\t * Add an action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( type ) {\n\n\t\t\tvar data = {\n\t\t\t\tid: nfRadio.channel( 'actions' ).request( 'get:tmpID' ),\n\t\t\t\ttype: type.get( 'id' ),\n\t\t\t\tlabel: type.get( 'settingDefaults').label || type.get( 'nicename' )\n\t\t\t}\n\n\t\t\tvar newModel = nfRadio.channel( 'actions' ).request( 'add', data );\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Action',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'actions' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', {}, newModel );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/typeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our action type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addAction' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type droppable.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/droppable',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'app' ).reply( 'drop:actionType', this.dropActionType, this );\n\t\t},\n\n\t\tdropActionType: function( e, ui ) {\n\t\t\tvar type_slug = jQuery( ui.helper ).data( 'type' );\n\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', type_slug );\n\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', type );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our action type\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action type models. \n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeCollection',['models/actions/typeModel'], function( actionTypeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionTypeModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Filters our action type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/filterTypes',['models/actions/typeCollection'], function( typeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'change:filter', this.filterActionTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our action types in the add new action drawer\n\t\t * \n\t\t * Takes a search string and finds any action types that match either the name or alias.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string\t search \tstring being searched for\n\t\t * @param object \t e \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterActionTypes: function( search, e ) {\n\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != jQuery.trim( search ) ) {\n\n \t\tvar filteredInstalled = [];\n \t\t/**\n \t\t * Call the function that actually filters our collection,\n \t\t * and then loop through our collection, adding each model to our filteredInstalled array.\n \t\t */\n\t\t\t\tvar installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n \t\t_.each( this.filterCollection( search, installedActions ), function( model ) {\n \t\t\tfilteredInstalled.push( model );\n \t\t} );\n\n \t\tvar filteredAvailable = [];\n \t\tvar availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n \t\t_.each( this.filterCollection( search, availableActions ), function( model ) {\n \t\t\tfilteredAvailable.push( model );\n \t\t} );\n\n \t\t// Create a new Action Type Section collection with the filtered array.\n \t\tvar newInstalled = new typeCollection( filteredInstalled );\n \t\tnewInstalled.slug = 'installed';\n \t\tnewInstalled.nicename = 'Installed';\n\n \t\tvar newAvailable = new typeCollection( filteredAvailable );\n \t\tnewAvailable.slug = 'available';\n \t\tnewAvailable.nicename = 'Available';\n\n \t\t// Request that our action types filter be applied, passing the collection we created above.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:actionTypes', newInstalled, newAvailable );\n \t\t// If we've pressed the 'enter' key, add the action to staging and clear the filter.\n \t\tif ( e.addObject ) {\n \t\t\tif ( 0 < newInstalled.length ) {\n \t\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', newInstalled.models[0] );\n \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n \t\t\t}\n \t\t}\n \t} else {\n \t\t// Clear our filter if the search text is empty.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n \t}\n },\n\n /**\n * Search our action type collection for the search string.\n * \n * @since 3.0\n * @param string\t search \tstring being searched for\n * @return backbone.collection\n */\n filterCollection: function( search, collection ) {\n \tsearch = search.toLowerCase();\n \t/*\n \t * Backbone collections have a 'filter' method that loops through every model,\n \t * waiting for you to return true or false. If you return true, the model is kept.\n \t * If you return false, it's removed from the filtered result.\n \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'id' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/newsletterList',[], function( ) {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'setting-newsletter_list' ), 'show:setting', this.defaultFields );\n this.listenTo( nfRadio.channel( 'setting-type-newsletter_list' ), 'click:extra', this.clickListUpdate );\n this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ), 'update:setting', this.maybeRenderFields );\n this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ), 'update:setting', this.maybeRenderGroups );\n this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_fields' ), 'init:settingModel', this.registerFieldsListener );\n this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_groups' ), 'init:settingModel', this.registerGroupsListener );\n },\n\n defaultFields: function( settingModel, dataModel ) {\n this.maybeRenderFields( dataModel, settingModel );\n this.maybeRenderGroups( dataModel, settingModel );\n },\n\n registerFieldsListener: function ( model ) {\n model.listenTo( nfRadio.channel( 'newsletter_list_fields' ), 'update:fieldMapping', this.updateFieldMapping, model );\n },\n\n registerGroupsListener: function ( model ) {\n model.listenTo( nfRadio.channel( 'newsletter_list_groups' ), 'update:interestGroups', this.updateInterestGroups, model );\n },\n\n clickListUpdate: function( e, settingModel, dataModel, settingView ) {\n\n var data = {\n action: 'nf_' + dataModel.attributes.type + '_get_lists',\n security: nfAdmin.ajaxNonce\n };\n\n var that = this;\n jQuery( e.srcElement ).addClass( 'spin' );\n jQuery.post( ajaxurl, data, function( response ){\n var response = JSON.parse( response );\n that.updateLists( settingModel, response.lists, settingView, dataModel );\n dataModel.set( 'newsletter_list', response.lists[0].value, { settingModel: settingModel } );\n }).always( function() {\n jQuery( e.srcElement ).removeClass( 'spin' );\n });\n },\n\n updateLists: function( settingModel, lists, settingView, dataModel ) {\n settingModel.set( 'options', lists );\n settingView.render();\n },\n\n maybeRenderFields: function( dataModel, settingModel ) {\n\n if( 'undefined' == typeof settingModel ) return;\n\n var selectedList = dataModel.get( 'newsletter_list' );\n var lists = settingModel.get( 'options' );\n _.each( lists, function( list ) {\n if ( selectedList == list.value ) {\n nfRadio.channel( 'newsletter_list_fields').trigger( 'update:fieldMapping', list.fields );\n }\n } );\n\n dataModel.set( 'newsletter_list_fields', 0 );\n },\n\n maybeRenderGroups: function( dataModel, settingModel ) {\n if( 'undefined' == typeof settingModel ) return;\n\n var selectedList = dataModel.get( 'newsletter_list' );\n var lists = settingModel.get( 'options' );\n _.each( lists, function( list ) {\n if ( selectedList == list.value ) {\n nfRadio.channel( 'newsletter_list_groups').trigger( 'update:interestGroups', list.groups );\n }\n } );\n\n dataModel.set( 'newsletter_list_fields', 0 );\n },\n\n updateFieldMapping: function( fields ) {\n var settings = this.get( 'settings' );\n settings.reset();\n _.each( fields, function( field ){\n\n settings.add({\n name: field.value,\n type: 'textbox',\n label: field.label,\n width: 'full',\n use_merge_tags: { exclude: [ 'user', 'post', 'system', 'querystrings' ] }\n });\n });\n this.set( 'settings', settings );\n },\n\n updateInterestGroups: function( groups ) {\n var settings = this.get( 'settings' );\n settings.reset();\n _.each( groups, function( group ){\n\n settings.add({\n name: group.value,\n type: 'toggle',\n label: group.label,\n width: 'full',\n });\n });\n this.set( 'settings', settings );\n },\n\n });\n\n return controller;\n} );\n\n","/**\n * Creates and stores a collection of form setting types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our form setting type collection\n *\n * Also responds to requests for data about form setting types\n *\n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/types',[\n\t\t'models/app/typeCollection'\n\t],\n\tfunction(\n\t\tTypeCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( formSettingTypeData );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:typeCollection', this.getCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\treturn this.collection.get( id );\n },\n\n /**\n * Return the installed action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetCollection: function() {\n \treturn this.collection;\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form settings.\n * \n * @package Ninja Forms builder\n * @subpackage Form Settings\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/advanced/settingsModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Form Setting',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.bind( 'change', this.changeSetting, this );\n\t\t\t/*\n\t\t\t * Check to see if we have any setting defaults to set.\n\t\t\t */\n\t\t\tvar formSettings = nfRadio.channel( 'settings' ).request( 'get:collection' );\n\t\t\t_.each( formSettings.models, function( settingModel ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( settingModel.get( 'name' ) ) ) {\n\t\t\t\t\tthis.set( settingModel.get( 'name' ), settingModel.get( 'value' ), { silent: true } );\n\t\t\t\t}\n\t\t\t\tnfRadio.channel( settingModel.get( 'type' ) ).trigger( 'init:dataModel', this, settingModel );\n\t\t\t}, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Handles interactions with our form settings collection.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/data',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.model = new settingsModel( preloadedFormData.settings );\n\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settings', this.getSettings, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'update:setting', this.updateSetting, this );\n\t\t},\n\n\t\tgetSettings: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tupdateSetting: function( name, value, silent ) {\n\t\t\tsilent = silent || false;\n\t\t\tthis.model.set( name, value, { silent: silent } );\n\t\t},\n\n\t\tgetSetting: function( name ) {\n\t\t\treturn this.model.get( name );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/formSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( formSettings, { objectType: 'settings' } );\n\t\t\t\t\t\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settingModel', this.getSettingModel, this );\n\n\t\t\t// Responds to requests for our setting collection\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:collection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from form settings currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n _.each( collection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Listens for clicks on our form settings sections.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/clickEdit',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'settings' ), 'click:edit', this.clickEdit );\n\t\t},\n\n\t\tclickEdit: function( e, typeModel ) {\n\t\t\tvar model = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: typeModel.get( 'settingGroups' ), typeModel: typeModel } );\n\t\t\tvar preventClose = nfRadio.channel( 'drawer' ).request( 'get:preventClose' );\n\t\t\tif ( ! preventClose ) {\n\t\t\t\ttypeModel.set( 'editActive', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Makes sure that calculations don't reference calculations with a lower order.\n *\n * For example, our first caclulation can't reference the second, but the second can reference the first.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/calculations',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When someone types in the \"name\" or \"eq\" portion of our calculation, we need to make sure\n\t\t\t * that they haven't duplicated a name or made a bad EQ reference.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'keyup:option', this.keyUp );\n\t\t\t/*\n\t\t\t * Same thing for when our calculation option is updated\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalc );\n\t\t\t/*\n\t\t\t * When we sort our calcluations, we need to make sure that we don't get any bad EQ\n\t\t\t * references.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'sort:option', this.sortCalc );\n\t\t},\n\n\t\tkeyUp: function( e, optionModel ) {\n\t\t\t// Get our current value\n\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t// Check to see if we're editing a name or eq\n var id = jQuery( e.target ).data( 'id' );\n\t\t\tif( 'name' == id ) { // We are editing the name field\n\t\t\t\t// Check to see if our name already exists.\n\t\t\t\tthis.checkName( value, optionModel );\n\t\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\t} else if( 'eq' == id ) { // We're editing the eq\n\t\t\t\t// Check to see if there are any calcs referenced in our eq\n\t\t\t\tthis.checkEQ( value, optionModel );\n\t\t\t} else if( 'dec' == id ) { // We're editing the dec\n // Check to see that we have a non-negative integer\n this.checkDec( value, optionModel );\n }\n\t\t},\n\n\t\tupdateCalc: function( optionModel ) {\n\t\t\tthis.checkName( optionModel.get( 'name' ), optionModel, false );\n\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\tthis.checkDec( optionModel.get( 'dec' ), optionModel );\n\t\t},\n\n\t\tsortCalc: function( optionModel, setting ) {\n\t\t\tthis.checkAllCalcs( setting.collection );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if a calc name exists.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \t\t\tname calc name to check\n\t\t * @param backbone.model \toptionModel \n\t\t * @return void\n\t\t */\n\t\tcheckName: function( name, optionModel, silent ) {\n\t\t\tsilent = silent || true;\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t// Search our calc collection for our name\n\t\t\tvar found = optionModel.collection.where( { name: jQuery.trim( name ) } );\n\n\t\t\t// If the name that was passed is the same as our current name, return false.\n\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\tfound = [];\n\t\t\t}\n\n\t\t\t// If our name exists, add an errors to the option model\n\t\t\tif ( 0 != found.length ) {\n\t\t\t\terrors.nameExists = 'Calculation names must be unique. Please enter another name.';\n\t\t\t} else {\n\t\t\t\toptionModel.set( 'name', name, { silent: silent } );\n\t\t\t\tdelete errors.nameExists;\n\t\t\t}\n\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if an eq contains a reference to a calc at a lower priority.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\teq our equation\n\t\t * @param backbone.model \toptionModel\n\t\t * @return void\n\t\t */\n\t\tcheckEQ: function( eq, optionModel ) {\n\t\t\t// Get any current errors on our optionModel\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t/*\n\t\t\t * We're looking for two errors:\n\t\t\t * - Calculations that are below the current one can't be processed.\n\t\t\t * - Calculations can't refer to themselves.\n\t\t\t */ \n\t\t\tvar errorSelfRef = false;\n\t\t\tvar errorFutureCalc = false;\n\t\t\t// Regex that searches for {calc:key}\n\t\t\tvar calcs = eq.match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\t/*\n\t\t\t * Calcs will be an array like:\n\t\t\t * ['{calc:test}'], ['{calc:another}']\n\t\t\t * \n\t\t\t * If we have any calcs in the eq, loop through them and search for the errors.\n\t\t\t */\n\t\t\tif ( calcs ) {\n\t\t\t\tvar calculations = optionModel.collection;\n\t\t\t\t// Maps a function to each item in our calcs array.\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 optionModel from our calculations collection.\n\t\t\t\t\tvar targetCalc = calculations.findWhere( { name: name } );\n\t\t\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\t\t\t// If we already have a calc with this name, set an error.\n\t\t\t\t\t\terrors.selfRef = 'A calculation can\\'t reference itself!';\n\t\t\t\t\t\terrorSelfRef = true;\n\t\t\t\t\t} else if ( targetCalc && targetCalc.get( 'order' ) > optionModel.get( 'order' ) ) {\n\t\t\t\t\t\t// If the calc is after this one, set an error. \n\t\t\t\t\t\terrorFutureCalc = true;\n\t\t\t\t\t\terrors.futureCalc = 'Can\\'t reference a future calculation!';\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// If we didn't find any self ref errors, remove the key.\n\t\t\tif ( ! errorSelfRef ) {\n\t\t\t\tdelete errors.selfRef;\n\t\t\t}\n\n\t\t\t// If we didn't find any future calc errors, remove the key.\n\t\t\tif ( ! errorFutureCalc ) {\n\t\t\t\tdelete errors.futureCalc;\n\t\t\t}\n\n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\n\t\t},\n\n /**\n * Ceck to see if a dec is an integer value.\n * \n * @since 3.1\n * @param string dec our decimal value\n * @param backbone.model optionModel\n * @return void\n */\n checkDec: function( dec, optionModel ) {\n // If dec isn't defined, bail...\n if( 'undefined' === typeof(dec) ) return false;\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n /**\n * We're looking for one error:\n * - dec is not a non-negative integer.\n */\n var errorNonIntDec = false;\n \n // Get our target value and see if it matches what we got.\n var checked = Math.abs( parseInt( dec.trim() ) );\n if ( dec.trim() !== '' && checked.toString() !== dec.trim() ) {\n errorNonIntDec = true;\n errors.nonIntDec = 'Decimals must be a non-negative integer!';\n }\n \n // If our dec value is a non-negative integer.\n if ( ! errorNonIntDec ) {\n delete errors.nonIntDec;\n }\n \n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n \n },\n \n\t\tcheckAllCalcs: function( collection ) {\n\t\t\tvar that = this;\n\t\t\tcollection.models.map( function( opt ) {\n\t\t\t\tthat.checkName( opt.get( 'name' ), opt );\n\t\t\t\tthat.checkEQ( opt.get( 'eq' ), opt );\n that.checkDec( opt.get( 'dec' ), opt );\n\t\t\t} );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Loads all of our controllers using Require JS.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine(\n\t'controllers/loadControllers',[\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\t'controllers/app/remote',\n\t\t'controllers/app/drawer',\n\t\t'controllers/app/drawerConfig',\n\t\t'controllers/app/domainConfig',\n\t\t'controllers/app/data',\t\t\n\t\t'controllers/app/drawerToggleSettingGroup',\n\t\t'controllers/app/updateDB',\n\t\t'controllers/app/formData',\n\t\t'controllers/app/previewLink',\n\t\t'controllers/app/menuButtons',\n\t\t'controllers/app/trackChanges',\n\t\t'controllers/app/undoChanges',\n\t\t'controllers/app/publishResponse',\n\t\t'controllers/app/changeDomain',\n\t\t'controllers/app/pushstate',\n\t\t'controllers/app/hotkeys',\n\t\t'controllers/app/cleanState',\n\t\t'controllers/app/coreUndo',\n\t\t'controllers/app/cloneModelDeep',\n\t\t'controllers/app/getSettingChildView',\n\t\t'controllers/app/changeSettingDefault',\n\t\t'controllers/app/fieldset',\n\t\t'controllers/app/toggleSetting',\n\t\t'controllers/app/itemControls',\n\t\t'controllers/app/mergeTags',\n\t\t'controllers/app/mergeTagBox',\n\t\t'controllers/app/itemSettingFill',\n\t\t'controllers/app/confirmPublish',\n\t\t'controllers/app/rte',\n\t\t'controllers/app/settingFieldSelect',\n\t\t'controllers/app/settingFieldList',\n\t\t'controllers/app/settingHTML',\n\t\t'controllers/app/settingColor',\n\t\t'controllers/app/changeMenu',\n\t\t'controllers/app/mobile',\n\t\t'controllers/app/notices',\n\t\t'controllers/app/unloadCheck',\n\t\t'controllers/app/formContentFilters',\n\t\t'controllers/app/formContentGutterFilters',\n\t\t'controllers/app/cloneCollectionDeep',\n\t\t'controllers/app/trackKeyDown',\n\t\t'controllers/app/perfectScroll',\n\t\t'controllers/app/getNewSettingGroupCollection',\n\t\t'controllers/app/settingMedia',\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\t'controllers/fields/types',\n\t\t'controllers/fields/fieldTypeDrag',\n\t\t'controllers/fields/stagingDrag',\n\t\t'controllers/fields/staging',\n\t\t'controllers/fields/stagingSortable',\n\t\t'controllers/fields/filterTypes',\n\t\t'controllers/fields/sortable',\n\t\t'controllers/fields/data',\n\t\t'controllers/app/optionRepeater',\n\t\t'controllers/fields/editActive',\n\t\t'controllers/fields/fieldSettings',\n\t\t'controllers/fields/fieldCreditCard',\n\t\t'controllers/fields/fieldList',\n\t\t'controllers/fields/fieldPassword',\n\t\t'controllers/fields/fieldQuantity',\n\t\t'controllers/fields/fieldShipping',\n\t\t'controllers/fields/key',\n\t\t'controllers/fields/notices',\n\t\t'controllers/fields/mobile',\n\t\t'controllers/fields/savedFields',\n\t\t'controllers/fields/fieldDatepicker',\n\t\t'controllers/fields/fieldDisplayCalc',\n\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\t'controllers/actions/types',\n\t\t'controllers/actions/data',\n\t\t'controllers/actions/actionSettings',\n\t\t'controllers/actions/editActive',\n\t\t'controllers/actions/addActionTypes',\n\t\t'controllers/actions/typeDrag',\n\t\t'controllers/actions/droppable',\n\t\t'controllers/actions/filterTypes',\n\t\t'controllers/actions/newsletterList',\n\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\t'controllers/advanced/types',\n\t\t'controllers/advanced/data',\n\t\t'controllers/advanced/formSettings',\n\t\t'controllers/advanced/editActive',\n\t\t'controllers/advanced/clickEdit',\n\t\t'controllers/advanced/calculations'\n\t],\n\tfunction(\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\tRemote,\n\t\tDrawer,\n\t\tDrawerConfig,\n\t\tDomainConfig,\n\t\tAppData,\n\t\tDrawerToggleSettingGroup,\n\t\tUpdateDB,\n\t\tFormData,\n\t\tPreviewLink,\n\t\tAppMenuButtons,\n\t\tAppTrackChanges,\n\t\tAppUndoChanges,\n\t\tAppPublishResponse,\n\t\tAppChangeDomain,\n\t\tPushstate,\n\t\tHotkeys,\n\t\tCleanState,\n\t\tCoreUndo,\n\t\tCloneModelDeep,\n\t\tDrawerSettingChildView,\n\t\tChangeSettingDefault,\n\t\tFieldset,\n\t\tToggleSetting,\n\t\tItemControls,\n\t\tMergeTags,\n\t\tMergeTagsBox,\n\t\tItemSettingFill,\n\t\tConfirmPublish,\n\t\tRTE,\n\t\tSettingFieldSelect,\n\t\tSettingFieldList,\n\t\tSettingHTML,\n\t\tSettingColor,\n\t\tChangeMenu,\n\t\tAppMobile,\n\t\tAppNotices,\n\t\tAppUnloadCheck,\n\t\tFormContentFilters,\n\t\tFormContentGutterFilters,\n\t\tCloneCollectionDeep,\n\t\tTrackKeyDown,\n\t\tPerfectScroll,\n\t\tGetNewSettingGroupCollection,\n\t\tSettingMedia,\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\tFieldTypes,\n\t\tFieldTypeDrag,\n\t\tFieldStagingDrag,\n\t\tStagedFieldsData,\n\t\tStagedFieldsSortable,\n\t\tDrawerFilterFieldTypes,\n\t\tMainContentFieldsSortable,\n\t\tFieldData,\n\t\tOptionRepeater,\n\t\tFieldsEditActive,\n\t\tFieldSettings,\n\t\tFieldCreditCard,\n\t\tFieldList,\n\t\tFieldPassword,\n\t\tFieldQuantity,\n\t\tFieldShipping,\n\t\tFieldKey,\n\t\tNotices,\n\t\tFieldsMobile,\n\t\tSavedFields,\n\t\tFieldDatepicker,\n\t\tFieldDisplayCalc,\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\tActionTypes,\n\t\tActionData,\n\t\tActionSettings,\n\t\tActionEditActive,\n\t\tActionAddTypes,\n\t\tActionTypeDrag,\n\t\tActionDroppable,\n\t\tActionFilterTypes,\n\t\tActionNewsletterList,\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\tSettingTypes,\n\t\tSettingData,\n\t\tFormSettings,\n\t\tSettingsEditActive,\n\t\tSettingsClickEdit,\n\t\tAdvancedCalculations\n\t\t\n\t) {\n\t\tvar controller = Marionette.Object.extend( {\n\t\t\tinitialize: function() {\n\t\t\t\t/*\n\t\t\t\t * Application controllers\n\t\t\t\t */\n\t\t\t\tnew FormContentFilters();\n\t\t\t\tnew FormContentGutterFilters();\n\t\t\t\tnew Hotkeys();\n\t\t\t\tnew Remote();\n\t\t\t\tnew Drawer();\n\t\t\t\tnew DrawerConfig();\n\t\t\t\tnew DomainConfig();\n\t\t\t\tnew DrawerToggleSettingGroup();\n\t\t\t\tnew PreviewLink();\n\t\t\t\tnew AppMenuButtons();\n\t\t\t\tnew AppTrackChanges();\n\t\t\t\tnew AppUndoChanges();\n\t\t\t\tnew AppPublishResponse();\n\t\t\t\tnew AppChangeDomain();\n\t\t\t\tnew CleanState();\n\t\t\t\tnew CoreUndo();\n\t\t\t\tnew CloneModelDeep();\n\t\t\t\tnew ItemControls();\n\t\t\t\tnew ConfirmPublish();\n\t\t\t\tnew RTE();\n\t\t\t\tnew SettingFieldSelect();\n\t\t\t\tnew SettingFieldList();\n\t\t\t\tnew SettingHTML();\n\t\t\t\tnew SettingColor();\n\t\t\t\tnew SettingMedia();\n\t\t\t\tnew ChangeMenu();\n\t\t\t\tnew AppMobile();\n\t\t\t\tnew AppNotices();\n\t\t\t\tnew AppUnloadCheck();\n\t\t\t\tnew UpdateDB();\n\t\t\t\tnew CloneCollectionDeep();\n\t\t\t\tnew TrackKeyDown();\n\t\t\t\tnew PerfectScroll();\n\t\t\t\tnew GetNewSettingGroupCollection();\n\t\t\t\t// new Pushstate();\n\t\t\t\t/*\n\t\t\t\t * Fields domain controllers\n\t\t\t\t * \n\t\t\t\t * Field-specific controllers should be loaded before our field type controller.\n\t\t\t\t * This ensures that any 'init' hooks are properly registered.\n\t\t\t\t */\n\t\t\t\tnew Fieldset();\n\t\t\t\tnew OptionRepeater();\n\n\t\t\t\tnew FieldTypes();\n\t\t\t\tnew FieldTypeDrag();\n\t\t\t\tnew FieldStagingDrag();\n\t\t\t\tnew StagedFieldsData();\n\t\t\t\tnew StagedFieldsSortable();\n\t\t\t\tnew DrawerFilterFieldTypes();\n\t\t\t\tnew MainContentFieldsSortable();\n\t\t\t\tnew ChangeSettingDefault();\n\t\t\t\tnew ToggleSetting();\n\t\t\t\tnew DrawerSettingChildView();\n\t\t\t\tnew FieldsEditActive();\n\t\t\t\tnew FieldSettings();\n\t\t\t\tnew FieldCreditCard();\n\t\t\t\tnew FieldList();\n\t\t\t\tnew FieldPassword;\n\t\t\t\tnew FieldQuantity();\n\t\t\t\tnew FieldShipping();\n\t\t\t\tnew FieldKey();\n\t\t\t\tnew Notices();\n\t\t\t\tnew FieldsMobile();\n\t\t\t\tnew SavedFields();\n\t\t\t\tnew FieldDatepicker();\n\t\t\t\tnew FieldDisplayCalc();\n\t\t\t\t/*\n\t\t\t\t * TODO: Actions domain controllers\n\t\t\t\t */\n\t\t\t\tnew ActionNewsletterList();\n\t\t\t\tnew ActionTypes();\n\t\t\t\tnew ActionData();\n\t\t\t\tnew ActionSettings();\n\t\t\t\tnew ActionEditActive();\n\t\t\t\tnew ActionAddTypes();\n\t\t\t\tnew ActionTypeDrag();\n\t\t\t\tnew ActionDroppable();\n\t\t\t\tnew ActionFilterTypes();\n\t\t\t\t/*\n\t\t\t\t * TODO: Settings domain controllers\n\t\t\t\t */\n\t\t\t\tnew SettingTypes();\n\t\t\t\tnew FormSettings();\n\t\t\t\tnew AdvancedCalculations();\n\t\t\t\tnew SettingData();\n\t\t\t\tnew SettingsEditActive();\n\t\t\t\tnew SettingsClickEdit();\n\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Data controllers need to be set after every other controller has been setup, even if they aren't domain-specific.\n\t\t\t\t * AppData() was after FormData();\n\t\t\t\t */\n\t\t\t\tnew AppData();\n\t\t\t\tnew FieldData();\n\t\t\t\tnew FormData();\n\t\t\t\tnew MergeTags();\n\t\t\t\tnew MergeTagsBox();\n\t\t\t\tnew ItemSettingFill();\n\t\t\t}\n\t\t});\n\n\t\treturn controller;\n} );\n\n","define( 'views/fields/fieldItem',['views/app/itemControls'], function( itemControlsView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-field',\n\t\tdoingShortcut: false,\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:required', this.render, this );\n\t\t\tthis.model.on( 'change:id', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:required', this.render );\n\t\t\tthis.model.off( 'change:id', this.render );\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\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t\tjQuery( this.el ).disableSelection();\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).on( 'taphold', function( e, touch ) {\n\t\t\t\t\tif ( ! jQuery( e.target ).hasClass( 'nf-edit-settings' ) ) {\n\t\t\t\t\t\tjQuery( this ).addClass( 'ui-sortable-helper drag-selected' );\n\t\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderClasses: function() {\n\t \t\t\tvar classes = 'nf-field-wrap';\n\t \t\t\tif ( this.editActive ) {\n\t \t\t\t\tclasses += ' active';\n\t \t\t\t}\n\t \t\t\treturn classes;\n\t \t\t},\n\t \t\trenderRequired: function() {\n\t \t\t\tif ( 1 == this.required ) {\n\t \t\t\t\treturn '<span class=\"required\">*</span>';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\t \t\tgetFieldID: function() {\n\t\t\t\t\tif ( jQuery.isNumeric( this.id ) ) {\n\t\t\t\t\t\treturn 'field-' + this.id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn this.id;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trenderIcon: function() {\n\t\t\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', this.type );\n\t\t\t\t\treturn '<span class=\"fa fa-' + type.get( 'icon' ) + '\"></span>';\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'mousedown': 'maybeShortcut',\n\t\t\t'click': 'maybeClickEdit',\n\t\t\t'singletap': 'maybeTapEdit',\n\t\t\t'swipeleft': 'swipeLeft',\n\t\t\t'swiperight': 'swipeRight',\n\t\t\t'tapend': 'tapend'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( this.doingShortcut ) {\n\t\t\t\tthis.doingShortcut = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) || jQuery( e.target ).parent().hasClass( 'nf-field-wrap' ) || jQuery( e.target ).hasClass( 'nf-field-wrap' ) ) && ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ':focus' ).blur();\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tmaybeShortcut: function( e ) {\n\t\t\tvar keys = nfRadio.channel( 'app' ).request( 'get:keydown' );\n\t\t\t/*\n\t\t\t * If the shift key isn't held down, return.\n\t\t\t */\n\t\t\tif ( -1 == keys.indexOf( 16 ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we are pressing D, delete this field.\n\t\t\t */\n\t\t\tif ( -1 != keys.indexOf( 68 ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\treturn false;\n\t\t\t} else if ( -1 != keys.indexOf( 67 ) ) {\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tmaybeTapEdit: function( e ) {\n\t\t\tif ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tswipeLeft: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).show();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).show();\n\t\t},\n\n\t\tswipeRight: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).hide();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).hide();\n\t\t},\n\n\t\ttapend: function( e, touch ) {\n\t\t\tjQuery( this.el ).ClassyWiggle( 'stop' );\n\t\t\tjQuery( this.el ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t},\n\n\t\tremove: function(){\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:removing' ) ) {\n\t\t\t\tthis.$el.hide( 'clip', function(){\n\t\t\t\t\tjQuery( this ).remove();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.$el.remove();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:removing', false );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tjQuery( this.el ).find( '.nf-item-control' ).css( 'display', '' );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-fields-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\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\tif ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t\tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t}\n\t\t\tjQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\tjQuery( this.el ).parent().droppable( {\n\t\t\t\taccept: function( draggable ) {\n\t\t\t\t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t},\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our form title.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/formTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-header-form-title',\n\n\t\tinitialize: function() {\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change:title', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderTitle: function(){\n\t \t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t \t\t\treturn _.escape( formData.get( 'settings' ).get( 'title' ) );\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\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( 'views/loadViews',[ 'views/fields/fieldItem', 'views/fields/mainContentEmpty', 'views/app/formTitle' ], function( fieldItemView, mainContentEmptyView, FormTitleView ) {\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\t\t\n\t\t\t// Reply to requests for our empty content view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:mainContentEmpty', this.getMainContentEmpty );\n\t\t\n\t\t\t// Reply to requests for our form title view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:formTitle', this.getFormTitle );\n\t\t},\n\n\t\tgetFieldItem: function( model ) {\n\t\t\treturn fieldItemView;\n\t\t},\n\n\t\tgetMainContentEmpty: function() {\n\t\t\treturn mainContentEmptyView;\n\t\t},\n\n\t\tgetFormTitle: function() {\n\t\t\treturn FormTitleView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","var nfRadio = Backbone.Radio;\n\njQuery( document ).ready( function( $ ) {\n\trequire( ['views/app/builder', 'controllers/loadControllers', 'views/loadViews'], function( BuilderView, LoadControllers, LoadViews ) {\n\n\t\tvar NinjaForms = Marionette.Application.extend( {\n\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// Trigger an event before we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadControllers', this );\n\t\t\t\t// Load our controllers.\n\t\t\t\tvar loadControllers = new LoadControllers();\n\t\t\t\t// Trigger an event after we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadControllers', this );\n\n\t\t\t\t// Trigger an event before we load un-instantiated views\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadViews', this );\n\t\t\t\tvar loadViews = new LoadViews();\n\t\t\t\t// Trigger an event after we load un-instantiated views.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadViews', this );\n\n\t\t\t\tnfRadio.channel( 'app' ).reply( 'get:template', this.template );\n\t\t\t},\n\n\t\t\tonStart: function() {\n\t\t\t\tvar builderView = new BuilderView();\n\t\t\t\t// Trigger our after start event.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:appStart', this );\n\n\t\t\t\t/*\n\t\t\t\t * If we're on the new forms builder, open the add fields drawer.\n\t\t\t\t */\n\t\t\t\tif ( 0 == nfAdmin.formID ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\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();\n\t} );\n} );\ndefine(\"main\", function(){});\n\n"],"sourceRoot":"/source/"} -
ninja-forms/tags/3.1.1/deprecated/ninja-forms.php
r1649765 r1649963 266 266 // Plugin version 267 267 if ( ! defined( 'NF_PLUGIN_VERSION' ) ) 268 define( 'NF_PLUGIN_VERSION', '3.1 ' );268 define( 'NF_PLUGIN_VERSION', '3.1.1' ); 269 269 270 270 // Plugin Folder Path -
ninja-forms/tags/3.1.1/includes/Database/FormsController.php
r1649765 r1649963 10 10 global $wpdb; 11 11 $this->db = $wpdb; 12 $this->forms_data = $this->setFormsData();13 12 } 14 13 … … 30 29 public function getFormsData() 31 30 { 31 if( empty( $this->forms_data ) ) { 32 $this->forms_data = $this->setFormsData(); 33 } 32 34 return( array_values( $this->forms_data ) ); 33 35 } -
ninja-forms/tags/3.1.1/ninja-forms.php
r1649765 r1649963 4 4 Plugin URI: http://ninjaforms.com/ 5 5 Description: Ninja Forms is a webform builder with unparalleled ease of use and features. 6 Version: 3.1 6 Version: 3.1.1 7 7 Author: The WP Ninjas 8 8 Author URI: http://ninjaforms.com … … 53 53 * @since 3.0 54 54 */ 55 const VERSION = '3.1 ';55 const VERSION = '3.1.1'; 56 56 57 57 /** -
ninja-forms/tags/3.1.1/readme.txt
r1649765 r1649963 4 4 Requires at least: 4.5 5 5 Tested up to: 4.7 6 Stable tag: 3.1 6 Stable tag: 3.1.1 7 7 License: GPLv2 or later 8 8 … … 115 115 == Upgrade Notice == 116 116 117 = 3.1 (02 May 2017) = 118 119 *Changes:* 120 121 * Added a dashboard view for forms, removing the "All Forms" and "Add New" submenus. 122 * All new Merge Tag UI for inserting Merge Tags into forms and actions. 123 * Refactored calculations, as well as adding an option to set calculation rounding. 124 * Updated the WordPress.org readme file. 125 * Opening the "new form" page should automatically open the drawer to add new fields. 126 127 *Bugs:* 128 129 * Fixed several bugs with calculations and locales that use non-American thousands and decimal separators. 130 * Products with a price over 999 should now render and calculate properly. 131 * Editing a submission and using a single quote should not break the submission editor. 132 * Fixed several PHP notices. 133 * After successful submission, the page should only scroll to the success message if it is not fully visible. 134 * Inline email validation should work properly for longer email domains, i.e. @liverpool.ac.uk 117 = 3.1.1 (02 May 2017) = 118 119 *Bugs:* 120 121 * Fixed bugs in the new Merge Tag UI that prevented it from being opened properly via clicks. 135 122 136 123 == Changelog == 124 125 = 3.1.1 (02 May 2017) = 126 127 *Bugs:* 128 129 * Fixed bugs in the new Merge Tag UI that prevented it from being opened properly via clicks. 137 130 138 131 = 3.1 (02 May 2017) = -
ninja-forms/trunk/assets/js/min/builder.js
r1649765 r1649963 1 1 !function(){var e,t,n;!function(i){function r(e,t){return b.call(e,t)}function a(e,t){var n,i,r,a,s,o,l,c,d,h,u,g=t&&t.split("/"),p=y.map,f=p&&p["*"]||{};if(e&&"."===e.charAt(0))if(t){for(e=e.split("/"),s=e.length-1,y.nodeIdCompat&&j.test(e[s])&&(e[s]=e[s].replace(j,"")),e=g.slice(0,g.length-1).concat(e),d=0;d<e.length;d+=1)if(u=e[d],"."===u)e.splice(d,1),d-=1;else if(".."===u){if(1===d&&(".."===e[2]||".."===e[0]))break;d>0&&(e.splice(d-1,2),d-=2)}e=e.join("/")}else 0===e.indexOf("./")&&(e=e.substring(2));if((g||f)&&p){for(n=e.split("/"),d=n.length;d>0;d-=1){if(i=n.slice(0,d).join("/"),g)for(h=g.length;h>0;h-=1)if(r=p[g.slice(0,h).join("/")],r&&(r=r[i])){a=r,o=d;break}if(a)break;!l&&f&&f[i]&&(l=f[i],c=d)}!a&&l&&(a=l,o=c),a&&(n.splice(0,o,a),e=n.join("/"))}return e}function s(e,t){return function(){var n=C.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),g.apply(i,n.concat([e,t]))}}function o(e){return function(t){return a(t,e)}}function l(e){return function(t){m[e]=t}}function c(e){if(r(v,e)){var t=v[e];delete v[e],w[e]=!0,u.apply(i,t)}if(!r(m,e)&&!r(w,e))throw new Error("No "+e);return m[e]}function d(e){var t,n=e?e.indexOf("!"):-1;return n>-1&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function h(e){return function(){return y&&y.config&&y.config[e]||{}}}var u,g,p,f,m={},v={},y={},w={},b=Object.prototype.hasOwnProperty,C=[].slice,j=/\.js$/;p=function(e,t){var n,i=d(e),r=i[0];return e=i[1],r&&(r=a(r,t),n=c(r)),r?e=n&&n.normalize?n.normalize(e,o(t)):a(e,t):(e=a(e,t),i=d(e),r=i[0],e=i[1],r&&(n=c(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},f={require:function(e){return s(e)},exports:function(e){var t=m[e];return"undefined"!=typeof t?t:m[e]={}},module:function(e){return{id:e,uri:"",exports:m[e],config:h(e)}}},u=function(e,t,n,a){var o,d,h,u,g,y,b=[],C=typeof n;if(a=a||e,"undefined"===C||"function"===C){for(t=!t.length&&n.length?["require","exports","module"]:t,g=0;g<t.length;g+=1)if(u=p(t[g],a),d=u.f,"require"===d)b[g]=f.require(e);else if("exports"===d)b[g]=f.exports(e),y=!0;else if("module"===d)o=b[g]=f.module(e);else if(r(m,d)||r(v,d)||r(w,d))b[g]=c(d);else{if(!u.p)throw new Error(e+" missing "+d);u.p.load(u.n,s(a,!0),l(d),{}),b[g]=m[d]}h=n?n.apply(m[e],b):void 0,e&&(o&&o.exports!==i&&o.exports!==m[e]?m[e]=o.exports:h===i&&y||(m[e]=h))}else e&&(m[e]=n)},e=t=g=function(e,t,n,r,a){if("string"==typeof e)return f[e]?f[e](t):c(p(e,t).f);if(!e.splice){if(y=e,y.deps&&g(y.deps,y.callback),!t)return;t.splice?(e=t,t=n,n=null):e=i}return t=t||function(){},"function"==typeof n&&(n=r,r=a),r?u(i,e,t,n):setTimeout(function(){u(i,e,t,n)},4),g},g.config=function(e){return g(e)},e._defined=m,n=function(e,t,n){if("string"!=typeof e)throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),r(m,e)||r(v,e)||(v[e]=[e,t,n])},n.amd={jQuery:!0}}(),n("../lib/almond",function(){}),n("views/app/menuItem",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-app-menu-item",initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.render),this.model.on("change",this.render,this)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},events:{"click a":"clickAppMenu"},clickAppMenu:function(e){i.channel("app").trigger("click:menu",e,this.model)},templateHelpers:function(){return{renderDashicons:function(){return this.dashicons?'<span class="dashicons '+this.dashicons+'"></span>':""},renderClasses:function(){var e=this.classes,t=i.channel("app").request("get:currentDomain");return t.get("id")==this.id&&(e+=" active"),e},renderUrl:function(){if(""!=this.url){var e=i.channel("app").request("get:formModel");return this.url+e.get("id")}return"#"},renderTarget:function(){return""!=this.url?"_blank":"_self"},renderDisabled:function(){return this.disabled?"disabled":""}}}});return e}),n("views/app/menu",["views/app/menuItem"],function(e){var t=Marionette.CollectionView.extend({tagName:"div",childView:e,onShow:function(){jQuery(this.el).find("li:last").unwrap()}});return t}),n("views/app/menuButtons",[],function(){var e=Marionette.ItemView.extend({tagName:"span",template:"#tmpl-nf-app-header-action-button",initialize:function(){this.listenTo(i.channel("app"),"change:clean",this.render,this),this.listenTo(i.channel("app"),"change:loading",this.render,this),this.listenTo(i.channel("app"),"response:updateDB",this.bounceIcon,this)},templateHelpers:function(){var e=this;return{renderPublish:function(){if(e.publishWidth?this.publishWidth='style="width:'+e.publishWidth+'px !important"':this.publishWidth="",i.channel("app").request("get:setting","loading"))var t=i.channel("app").request("get:template","#tmpl-nf-add-header-publish-loading");else var t=i.channel("app").request("get:template","#tmpl-nf-app-header-publish-button");return t(this)},maybeDisabled:function(){return i.channel("app").request("get:setting","clean")?"disabled":""},maybeRenderCancel:function(){if(i.channel("app").request("get:setting","clean"))return"";var e=i.channel("app").request("get:template","#tmpl-nf-app-header-view-changes");return e(this)}}},onShow:function(){jQuery(this.el).find(".publish")},events:{"click .publish":"clickPublish","click .viewChanges":"clickViewChanges"},clickPublish:function(e){i.channel("app").trigger("click:publish",e)},clickViewChanges:function(e){i.channel("app").trigger("click:viewChanges",e)},bounceIcon:function(e){jQuery(this.el).find(".dashicons-backup").effect("bounce",{times:3},600)}});return e}),n("views/app/mobileMenuButton",[],function(){var e=Marionette.ItemView.extend({tagName:"span",template:"#tmpl-nf-mobile-menu-button",initialize:function(){this.listenTo(i.channel("app"),"change:clean",this.render,this)},templateHelpers:function(){return{maybeDisabled:function(){return i.channel("app").request("get:setting","clean")?"disabled":""}}},events:{"click .nf-mobile-menu":"clickMobileMenu"},clickMobileMenu:function(e){var t=i.channel("app").request("get:builderEl");jQuery(t).toggleClass("nf-menu-expand")}});return e}),n("views/app/header",["views/app/menu","views/app/menuButtons","views/app/mobileMenuButton"],function(e,t,n){var r=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-app-header",regions:{menu:".nf-app-menu",buttons:".nf-app-buttons",mobileMenuButton:".nf-mobile-menu-button"},onRender:function(){var r=i.channel("app").request("get:domainCollection");this.menu.show(new e({collection:r})),this.buttons.show(new t),this.mobileMenuButton.show(new n)},events:{"click #nf-logo":"clickLogo"},clickLogo:function(e){}});return r}),n("views/app/subHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-sub-header"});return e}),n("views/app/builderHeader",["views/app/header","views/app/subHeader"],function(e,t){var n=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-header",regions:{app:"#nf-app-header",formTitle:"#nf-app-form-title",appSub:"#nf-app-sub-header"},initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.changeSubHeader)},onShow:function(){this.app.show(new e);var t=i.channel("app").request("get:formModel"),n=t.get("settings"),r=i.channel("views").request("get:formTitle");this.formTitle.show(new r({model:n})),this.changeSubHeader()},changeSubHeader:function(){var e=i.channel("app").request("get:currentDomain"),t=e.get("getSubHeaderView").call(e);this.appSub.show(t)}});return n}),n("views/app/main",[],function(){var e=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-main",className:"nf-main-test",maybeDone:!1,offsetRight:!1,offsetLeft:!1,regions:{gutterLeft:"#nf-main-gutter-left",body:"#nf-main-body",gutterRight:"#nf-main-gutter-right"},initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.render),i.channel("app").reply("get:mainEl",this.getMainEl,this),jQuery(window).on("resize",{context:this},this.resizeBothGutters),this.listenTo(i.channel("drawer"),"before:open",this.setBothGuttersAbsolute),this.listenTo(i.channel("drawer"),"opened",this.setBothGuttersFixed),this.listenTo(i.channel("drawer"),"before:close",this.setBothGuttersAbsolute),this.listenTo(i.channel("drawer"),"closed",this.setBothGuttersFixed),i.channel("app").reply("update:gutters",this.updateGutters,this)},onShow:function(){i.channel("main").trigger("show:main",this)},onRender:function(){var e=i.channel("app").request("get:currentDomain"),t=e.get("getMainContentView").call(e);this.body.show(t);var n=e.get("getGutterLeftView").call(e);this.gutterLeft.show(n);var r=e.get("getGutterRightView").call(e);this.gutterRight.show(r),i.channel("main").trigger("render:main")},getMainEl:function(){return jQuery(this.el).parent()},onAttach:function(){this.initialGutterResize()},onBeforeDestroy:function(){jQuery(window).off("resize",this.resize)},initialGutterResize:function(){this.resizeGutter(this.gutterLeft.el),this.resizeGutter(this.gutterRight.el),this.setBothGuttersFixed(this)},resizeBothGutters:function(e){var t=e?e.data.context:this,n=t.gutterLeft.el,i=t.gutterRight.el;t.resizeGutter(n,t),t.resizeGutter(i,t),t.setBothGuttersAbsolute(t),clearTimeout(t.maybeDone),t.maybeDone=setTimeout(t.setBothGuttersFixed,100,t)},resizeGutter:function(e,t){var n=jQuery(e).offset().top,i=jQuery(window).height(),r=i-n;jQuery(e).height(r)},setBothGuttersFixed:function(e){e=e||this;var t=jQuery(e.gutterLeft.el).offset(),n=t.top,i=t.left;jQuery(e.gutterLeft.el).css({position:"fixed",left:i,top:n});var t=jQuery(e.gutterLeft.el).offset(),r=jQuery(e.gutterRight.el).offset(),a=r.top,s=r.left;jQuery(e.gutterRight.el).css({position:"fixed",left:s,top:a})},setBothGuttersAbsolute:function(e){e=e||this;var t=(jQuery(e.gutterLeft.el).offset(),jQuery(e.gutterRight.el).offset(),jQuery("#nf-main").scrollTop());jQuery(e.gutterLeft.el).css({position:"absolute",left:0,top:t}),jQuery(e.gutterRight.el).css({position:"absolute",top:t,right:0,left:"auto"})},updateGutters:function(){this.resizeBothGutters()}});return e}),n("views/app/mobileMenuItem",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-mobile-menu-item",onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},events:{"click a":"clickAppMenu"},clickAppMenu:function(e){i.channel("app").trigger("click:menu",e,this.model)},templateHelpers:function(){return{renderDashicons:function(){return this.mobileDashicon?'<span class="dashicons '+this.mobileDashicon+'"></span>':""},renderClasses:function(){var e=this.classes,t=i.channel("app").request("get:currentDomain");return t.get("id")==this.id&&(e+=" active"),e},renderUrl:function(){if(""!=this.url){var e=i.channel("app").request("get:formModel");return this.url+e.get("id")}return"#"},renderTarget:function(){return""!=this.url?"_blank":"_self"},renderDisabled:function(){return this.disabled?"disabled":""}}}});return e}),n("views/app/mobileMenu",["views/app/mobileMenuItem"],function(e){var t=Marionette.CompositeView.extend({tagName:"div",template:"#tmpl-nf-mobile-menu",childView:e,initialize:function(){this.listenTo(i.channel("app"),"change:clean",this.render,this)},attachHtml:function(e,t){jQuery(e.el).find(".secondary").append(t.el)},templateHelpers:function(){return{maybeDisabled:function(){return i.channel("app").request("get:setting","clean")?"disabled":""}}},events:{"click .nf-publish":"clickPublish"},clickPublish:function(e){i.channel("app").trigger("click:publish",e);var t=i.channel("app").request("get:builderEl");jQuery(t).toggleClass("nf-menu-expand")}});return t}),n("views/app/drawer/contentEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-empty"});return e}),n("views/app/drawer",["views/app/drawer/contentEmpty"],function(e){var t=Marionette.LayoutView.extend({template:"#tmpl-nf-drawer",regions:{header:"#nf-drawer-header",content:"#nf-drawer-content",footer:"#nf-drawer-footer"},initialize:function(){i.channel("app").reply("get:drawerEl",this.getEl,this),i.channel("drawer").reply("load:drawerContent",this.loadContent,this),i.channel("drawer").reply("empty:drawerContent",this.emptyContent,this)},onShow:function(){i.channel("app").request("is:mobile")||jQuery(this.el).parent().perfectScrollbar()},loadContent:function(e,t){var n=i.channel("app").request("get:drawer",e),r=n.get("getContentView").call(n,t),a=n.get("getHeaderView").call(n,t),s=n.get("getFooterView").call(n,t);this.header.show(a),this.content.show(r),this.footer.show(s)},emptyContent:function(){this.header.empty(),this.content.empty(),this.footer.empty()},getEl:function(){return jQuery(this.el).parent()},events:{"click .nf-toggle-drawer":"clickToggleDrawer"},clickToggleDrawer:function(){i.channel("app").trigger("click:toggleDrawerSize")}});return t}),n("views/app/drawer/mergeTagItem",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tags-item",onBeforeDestroy:function(){this.model.off("change:active",this.render)},initialize:function(){this.model.on("change:active",this.render,this)},events:{"click a":"clickTag"},clickTag:function(e){i.channel("mergeTags").trigger("click:mergeTag",e,this.model)},templateHelpers:function(){return{renderClasses:function(){if(this.active)return"active"}}}});return e}),n("views/app/drawer/mergeTagsSection",["views/app/drawer/mergeTagItem"],function(e){var t=Marionette.CompositeView.extend({tagName:"div",childView:e,template:"#tmpl-nf-merge-tags-section",initialize:function(){this.collection=this.model.get("tags"),this.model.on("change",this.render,this),"fields"==this.model.get("id")},onBeforeDestroy:function(){if(this.model.off("change",this.render),"fields"==this.model.get("id")){var e=i.channel("fields").request("get:collection");e.off("all",this.updateFields,this)}},attachHtml:function(e,t){jQuery(e.el).find(".merge-tags").append(t.el)},updateFields:function(){var e=i.channel("fields").request("get:collection");this.model.set("tags",e)}});return t}),n("models/app/mergeTagModel",[],function(){var e=Backbone.Model.extend({defaults:{active:!1,exclude:!1}});return e}),n("models/app/mergeTagCollection",["models/app/mergeTagModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/app/drawer/mergeTagsContent",["views/app/drawer/mergeTagsSection","models/app/mergeTagCollection"],function(e,t){var n=Marionette.CollectionView.extend({tagName:"div",template:"#tmpl-nf-merge-tags-content",childView:e,initialize:function(){i.channel("mergeTags").reply("get:view",this.getMergeTagsView,this)},reRender:function(e){var n=i.channel("mergeTags").request("get:collection"),r=n.where({default_group:!0}),a=i.channel("app").request("get:currentDomain");if("actions"==a.get("id")){var s=n.where({id:"calcs"});r=r.concat(s)}this.collection=new t(r);var o=this,l=e.get("use_merge_tags");"object"==typeof l&&("undefined"!=typeof l.exclude&&_.each(l.exclude,function(e){o.collection.remove(e)}),"undefined"!=typeof l.include&&_.each(n.models,function(e){-1!=l.include.indexOf(e.get("id"))&&o.collection.add(e)})),this.render()},getMergeTagsView:function(){return this}});return n}),n("views/app/builder",["views/app/builderHeader","views/app/main","views/app/mobileMenu","views/app/drawer","views/app/drawer/mergeTagsContent"],function(e,t,n,r,a){var s=Marionette.LayoutView.extend({template:"#tmpl-nf-builder",el:"#nf-builder",regions:{header:"#nf-header",main:"#nf-main",menuDrawer:"#nf-menu-drawer",drawer:"#nf-drawer",mergeTagsContent:".merge-tags-content"},initialize:function(){i.channel("app").reply("get:builderEl",this.getBuilderEl,this),i.channel("app").reply("get:builderView",this.getBuilderView,this),this.render();var s=i.channel("mergeTags").request("get:collection"),o=s.clone();this.mergeTagsContent.show(new a({collection:o})),this.header.show(new e),this.main.show(new t);var l=i.channel("app").request("get:domainCollection");this.menuDrawer.show(new n({collection:l})),this.drawer.show(new r)},onRender:function(){},getBuilderEl:function(){return this.el},getBuilderView:function(){return this},events:{"click .nf-open-drawer":"openDrawer","click .nf-change-domain":"changeDomain","click .nf-close-drawer":"closeDrawer"},openDrawer:function(e){i.channel("app").trigger("click:openDrawer",e)},closeDrawer:function(){i.channel("app").trigger("click:closeDrawer")},changeDomain:function(e){i.channel("app").trigger("click:menu",e)}});return s}),n("controllers/app/remote",[],function(){return Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting"),"remote",this.addListener)},addListener:function(e,t){var n=e.get("remote").listen;this.listenTo(i.channel("fieldSetting-"+n),"update:setting",this.updateSetting),this.listenTo(i.channel("actionSetting-"+n),"update:setting",this.updateSetting),this.listenTo(i.channel("setting-type-"+e.get("type")),"click:extra",this.clickExtra),e.listenTo(i.channel("setting-remote"),"get:remote",this.getRemote,e),i.channel("setting-remote").trigger("get:remote",t)},clickExtra:function(e,t,n,r){jQuery(e.srcElement).addClass("spin"),i.channel("setting-remote").trigger("get:remote",n)},updateSetting:function(e,t){i.channel("setting-remote").trigger("get:remote",e)},getRemote:function(e){var t=this.get("remote"),n={parentValue:e.get(t.listen),action:t.action,security:t.security?t.security:nfAdmin.ajaxNonce},i=this;jQuery.post(ajaxurl,n,function(t){var t=JSON.parse(t);"textbox"==i.get("type")&&e.set(i.get("name"),t.value),"select"==i.get("type")&&(i.set("options",t.options),i.trigger("rerender"))})}})}),n("controllers/app/drawer",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:openDrawer",this.clickOpenDrawer),this.listenTo(i.channel("app"),"click:closeDrawer",this.closeDrawer),this.listenTo(i.channel("app"),"click:toggleDrawerSize",this.toggleDrawerSize),i.channel("app").reply("open:drawer",this.openDrawer,this),i.channel("app").reply("close:drawer",this.closeDrawer,this),i.channel("drawer").reply("get:closedRightPos",this.getClosedDrawerPos,this),i.channel("drawer").reply("prevent:close",this.preventClose,this),i.channel("drawer").reply("enable:close",this.enableClose,this),i.channel("drawer").reply("get:preventClose",this.maybePreventClose,this),this.objPreventClose={},this.listenTo(i.channel("drawer"),"filter:focused",this.filterFocused)},closeDrawer:function(){var e=i.channel("app").request("get:currentDrawer");if(!e||this.maybePreventClose())return!1;i.channel("drawer-"+e.get("id")).trigger("before:closeDrawer"),i.channel("drawer").trigger("before:closeDrawer"),i.channel("drawer").trigger("before:close"),i.channel("drawer").request("empty:drawerContent");var t=i.channel("app").request("get:builderEl");jQuery(t).addClass("nf-drawer-closed").removeClass("nf-drawer-opened"),jQuery(t).removeClass("disable-main");var n=this.getClosedDrawerPos(),r=i.channel("app").request("get:drawerEl");jQuery(r).css({right:n});var a=this;this.checkCloseDrawerPos=setInterval(function(){n==jQuery(r).css("right")&&(clearInterval(a.checkCloseDrawerPos),i.channel("app").request("update:currentDrawer",!1),i.channel("drawer").trigger("closed"),jQuery(".nf-master-control").css("z-index",98))},150)},clickOpenDrawer:function(e){var t=jQuery(e.target).data("drawerid");this.openDrawer(t)},openDrawer:function(e,t){if(this.maybePreventClose())return!1;if(t=t||{},"undefined"!=typeof t.model){var n=i.channel("app").request("get:currentDomain"),r=n.get("id");i.channel(r).request("clear:editActive"),t.model.set("editActive",!0),this.dataModel=t.model}i.channel("drawer").request("load:drawerContent",e,t),i.channel("drawer").trigger("before:open");var a=i.channel("app").request("get:builderEl");jQuery(a).addClass("nf-drawer-opened").removeClass("nf-drawer-closed");var s=i.channel("app").request("get:drawerEl");jQuery(s).css({right:"0px"});var o=this;this.hasFocus=!1,jQuery(".nf-master-control").css("z-index",0),this.checkOpenDrawerPos=setInterval(function(){"0px"==jQuery(s).css("right")&&(clearInterval(o.checkOpenDrawerPos),o.hasFocus||(o.focusFilter(),o.hasFocus=!0,i.channel("app").request("update:currentDrawer",e),jQuery(s).scrollTop(0),i.channel("drawer").trigger("opened")))},150)},toggleDrawerSize:function(){var e=i.channel("app").request("get:drawerEl");jQuery(e).toggleClass("nf-drawer-expand")},focusFilter:function(){var e=i.channel("drawer").request("get:filterEl");jQuery(e).focus()},getClosedDrawerPos:function(){var e=i.channel("app").request("get:builderEl"),t=jQuery(e).width()+300;return"-"+t+"px"},maybePreventClose:function(){return 0!=Object.keys(this.objPreventClose).length},preventClose:function(e){this.objPreventClose[e]=!0,this.dataModel.set("drawerDisabled",!0)},enableClose:function(e){delete this.objPreventClose[e],this.maybePreventClose()||"undefined"==typeof this.dataModel||this.dataModel.set("drawerDisabled",!1)},filterFocused:function(){clearInterval(this.checkOpenDrawerPos)},getPreventClose:function(){return this.objPreventClose}});return e}),n("views/app/drawer/headerDefault",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-header-default",initialize:function(){this.model&&this.model.on("change:drawerDisabled",this.render,this)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),i.channel("drawer").reply("clear:filter",this.clearFilter,this),i.channel("drawer").reply("blur:filter",this.blurFilter,this),i.channel("drawer").reply("get:filterEl",this.getEl,this)},onBeforeDestroy:function(){this.model&&this.model.off("change:drawerDisabled",this.render)},events:{"keyup .nf-filter":"maybeChangeFilter","input .nf-filter":"changeFilter","focus input":"getFocus"},changeFilter:function(e){var t=i.channel("app").request("get:currentDrawer");i.channel("drawer-"+t.get("id")).trigger("change:filter",e.target.value,e)},maybeChangeFilter:function(e){13==e.keyCode&&(e.addObject=!0,this.changeFilter(e))},clearFilter:function(){var e=jQuery(this.el).find(".nf-filter");""!=jQuery.trim(e.val())&&(e.val(""),e.trigger("input"),e.focus())},blurFilter:function(){jQuery(this.el).find(".nf-filter").blur()},getEl:function(){return jQuery(this.el).find(".nf-filter")},getFocus:function(){i.channel("drawer").trigger("filter:focused")},templateHelpers:function(){return{renderDisabled:function(){return this.drawerDisabled?"disabled":""}}}});return e}),n("views/app/drawer/footerDefault",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-empty"});return e}),n("models/app/drawerModel",["views/app/drawer/headerDefault","views/app/drawer/footerDefault"],function(e,t){var n=Backbone.Model.extend({defaults:{getHeaderView:function(t){return new e(t)},getFooterView:function(e){return new t(e)}}});return n}),n("models/app/drawerCollection",["models/app/drawerModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/fields/drawer/stagedField",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-staged-field",onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},events:{"click .dashicons-dismiss":"removeStagedField"},removeStagedField:function(e){i.channel("drawer-addField").trigger("click:removeStagedField",e,this.model)}});return e}),n("views/fields/drawer/stagingEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-staged-fields-empty",onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)}});return e}),n("views/fields/drawer/stagingCollection",["views/fields/drawer/stagedField","views/fields/drawer/stagingEmpty"],function(e,t){var n=Marionette.CollectionView.extend({tagName:"div",childView:e,emptyView:t,activeClass:"nf-staged-fields-active",initialize:function(){i.channel("app").reply("get:stagedFieldsEl",this.getStagedFieldsEl,this)},onShow:function(){this.$el=jQuery(this.el).parent(),jQuery(this.$el).find("span:first").unwrap(),this.setElement(this.$el);jQuery(this.el).sortable({placeholder:"nf-staged-fields-sortable-placeholder",helper:"clone",tolerance:"pointer",over:function(e,t){i.channel("drawer-addField").trigger("over:stagedFields",e,t)},out:function(e,t){i.channel("drawer-addField").trigger("out:stagedFields",t)},receive:function(e,t){i.channel("drawer-addField").trigger("receive:stagedFields",t)},update:function(e,t){i.channel("fields").request("sort:staging")},start:function(e,t){i.channel("drawer-addField").trigger("start:stagedFields",t)},stop:function(e,t){i.channel("drawer-addField").trigger("stop:stagedFields",t)}}),jQuery(this.el).parent().draggable({opacity:.9,connectToSortable:".nf-field-type-droppable",appendTo:"#nf-main",refreshPositions:!0,grid:[3,3],tolerance:"pointer",helper:function(e){var t=jQuery(e.target).parent().width(),n=jQuery(e.target).parent().height(),i=jQuery(e.target).parent().clone(),r=t/4,a=n/2;return jQuery(this).draggable("option","cursorAt",{top:a,left:r}),jQuery(i).zIndex(1e3),i},start:function(e,t){i.channel("drawer-addField").trigger("startDrag:fieldStaging",this,t)},stop:function(e,t){i.channel("drawer-addField").trigger("stopDrag:fieldStaging",this,t)}})},getStagedFieldsEl:function(){return jQuery(this.el)},onAddChild:function(){jQuery(this.el).addClass(this.activeClass)},onRemoveChild:function(){this.hasStagedFields()||jQuery(this.el).removeClass(this.activeClass)},hasStagedFields:function(){return 0!=this.collection.length}});return n}),n("models/fields/stagingModel",[],function(){var e=Backbone.Model.extend({});return e}),n("models/fields/stagingCollection",["models/fields/stagingModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order"});return t}),n("views/fields/drawer/typeSection",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-field-type-section",initialize:function(){_.bindAll(this,"render"),i.channel("fields").reply("get:typeSection",this.getTypeSection,this)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),this.dragging=!1;var e=this;i.channel("app").request("is:mobile")||(jQuery(this.el).find("div.nf-field-type-draggable").draggable({opacity:.9,tolerance:"pointer",connectToSortable:".nf-field-type-droppable",refreshPositions:!0,grid:[5,5],appendTo:"#nf-builder",helper:function(e){var t=jQuery(e.target).parent().width(),n=jQuery(e.target).parent().height(),i=jQuery(e.target).parent().clone(),r=t/4,a=n/2;return jQuery(this).draggable("option","cursorAt",{top:a,left:r}),jQuery(i).zIndex(1e3),i},start:function(t,n){e.dragging=!0,i.channel("drawer-addField").trigger("startDrag:type",this,n)},stop:function(t,n){e.dragging=!1,i.channel("drawer-addField").trigger("stopDrag:type",this,n)},drag:function(e,t){i.channel("drawer-addField").trigger("drag:type",this,t,e)}}).disableSelection(),jQuery(this.el).find(".nf-item").focus(function(){jQuery(this).addClass("active")}).blur(function(){jQuery(this).removeClass("active")}))},events:{"click .nf-item":"clickFieldType","keydown .nf-item":"maybeClickFieldType","mousedown .nf-item":"mousedownFieldType"},clickFieldType:function(e){this.dragging||i.channel("drawer").trigger("click:fieldType",e)},mousedownFieldType:function(e){jQuery(e.target).addClass("clicked"),setTimeout(function(){jQuery(e.target).removeClass("clicked")},1500)},maybeClickFieldType:function(e){13==e.keyCode&&(this.clickFieldType(e),i.channel("drawer").request("clear:filter"))},templateHelpers:function(){return{renderFieldTypes:function(){var e="",t=this;return _.each(this.fieldTypes,function(n){var r=i.channel("fields").request("get:type",n),a=r.get("nicename"),s=r.get("icon"),o=i.channel("app").request("get:template","#tmpl-nf-drawer-field-type-button");e+=o({id:n,nicename:a,icon:s,type:r,savedField:t.savedField})}),e},savedField:function(){return this.type.get("savedField")?"nf-saved":""}}},getTypeSection:function(){return this.el}});return e}),n("views/fields/drawer/typeSectionCollection",["views/fields/drawer/typeSection"],function(e){var t=Marionette.CollectionView.extend({tagName:"div",childView:e,onShow:function(){jQuery(this.el).find(".nf-settings").unwrap(),i.channel("fields").request("clear:editActive")}});return t}),n("views/fields/drawer/addField",["views/fields/drawer/stagingCollection","models/fields/stagingCollection","views/fields/drawer/typeSectionCollection"],function(e,t,n){var r=Marionette.LayoutView.extend({template:"#tmpl-nf-drawer-content-add-field",regions:{staging:"#nf-drawer-staging .nf-reservoir",primary:"#nf-drawer-primary",secondary:"#nf-drawer-secondary"},initialize:function(){this.listenTo(i.channel("drawer"),"filter:fieldTypes",this.filterFieldTypes),this.listenTo(i.channel("drawer"),"clear:filter",this.removeFieldTypeFilter),this.savedCollection=i.channel("fields").request("get:savedFields"),this.primaryCollection=this.savedCollection,this.fieldTypeSectionCollection=i.channel("fields").request("get:typeSections"),this.secondaryCollection=this.fieldTypeSectionCollection},onShow:function(){var t=i.channel("fields").request("get:staging");this.staging.show(new e({collection:t})),this.primary.show(new n({collection:this.primaryCollection})),this.secondary.show(new n({collection:this.secondaryCollection}))},getEl:function(){return jQuery(this.el).parent()},filterFieldTypes:function(e){this.primary.reset(),this.secondary.reset(),this.filteredSectionCollection=e,this.primary.show(new n({collection:this.filteredSectionCollection}))},removeFieldTypeFilter:function(){this.primary.show(new n({collection:this.savedCollection})),this.secondary.show(new n({collection:this.fieldTypeSectionCollection}))}});return r}),n("views/app/drawer/itemSettingCollection",[],function(){var e=Marionette.CollectionView.extend({tagName:"div",initialize:function(e){this.childViewOptions={dataModel:e.dataModel}},getChildView:function(e){return i.channel("app").request("get:settingChildView",e)}});return e}),n("views/app/drawer/itemSettingGroup",["views/app/drawer/itemSettingCollection"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-edit-field-setting-group",regions:{settings:".nf-field-settings"},initialize:function(e){this.model.on("change",this.render,this),this.dataModel=e.dataModel},onBeforeDestroy:function(){this.model.off("change",this.render)},onRender:function(){this.model.get("display")?this.settings.show(new e({collection:this.model.get("settings"),dataModel:this.dataModel})):this.settings.empty(),i.channel("drawer").trigger("render:settingGroup",this)},events:{"click .toggle":"clickToggleGroup"},clickToggleGroup:function(e){i.channel("drawer").trigger("click:toggleSettingGroup",e,this.model)},templateHelpers:function(){return{renderLabel:function(){if(""!=this.label){var e=i.channel("app").request("get:template","#tmpl-nf-drawer-content-edit-setting-group-label");return e(this)}return""},renderArrowDir:function(){return this.display?"down":"right"}}}});return t}),n("views/app/drawer/itemSettingGroupCollection",["views/app/drawer/itemSettingGroup"],function(e){var t=Marionette.CollectionView.extend({tagName:"div",childView:e,initialize:function(e){this.childViewOptions={dataModel:e.dataModel}}});return t}),n("views/app/drawer/editSettings",["views/app/drawer/itemSettingGroupCollection"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-edit-settings",regions:{settingTitle:".nf-setting-title",settingGroups:".nf-setting-groups"},initialize:function(e){this.dataModel=e.model,this.groupCollection=e.groupCollection},onRender:function(){var t=i.channel("app").request("get:currentDomain"),n=t.get("getSettingsTitleView").call(t,{model:this.model});this.settingTitle.show(n),this.settingGroups.show(new e({collection:this.groupCollection,dataModel:this.dataModel}))},templateHelpers:function(){return{maybeRenderTitle:function(){if("undefined"!=typeof this.type){var e=i.channel("app").request("get:template","#tmpl-nf-drawer-content-edit-settings-title");return e(this)}return""},renderTypeNicename:function(){ 2 2 var e=i.channel("app").request("get:currentDomain"),t=e.get("id"),n=i.channel(t).request("get:type",this.type);return n.get("nicename")}}}});return t}),n("views/app/drawer/headerEditSettings",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-header-edit-settings",initialize:function(){this.model&&this.model.on("change:drawerDisabled",this.render,this)},onBeforeDestroy:function(){this.model&&this.model.off("change:drawerDisabled",this.render)},templateHelpers:function(){return{renderDisabled:function(){return this.drawerDisabled?"disabled":""}}}});return e}),n("views/actions/drawer/typeButton",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-action-type-button",onRender:function(){if(this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),jQuery(this.el).disableSelection(),"installed"==this.model.get("section")){var e=this;jQuery(this.el).draggable({opacity:.9,tolerance:"intersect",scroll:!1,helper:"clone",start:function(t,n){e.dragging=!0,i.channel("drawer-addAction").trigger("startDrag:type",this,n)},stop:function(t,n){e.dragging=!1,i.channel("drawer-addAction").trigger("stopDrag:type",this,n)}})}},events:{"click .nf-item":"clickAddAction"},clickAddAction:function(e){this.dragging||("installed"==this.model.get("section")?i.channel("actions").trigger("click:addAction",this.model):window.open(this.model.get("link"),"_blank"))},templateHelpers:function(){return{renderClasses:function(){var e="nf-item";return""!=jQuery.trim(this.image)&&(e+=" nf-has-img"),"installed"==this.section&&(e+=" nf-action-type"),e},renderStyle:function(){return""!=jQuery.trim(this.image)?'style="background-image: url('+this.image+');"':""}}}});return e}),n("views/actions/drawer/typeCollection",["views/actions/drawer/typeButton"],function(e){var t=Marionette.CompositeView.extend({template:"#tmpl-nf-drawer-action-type-section",childView:e,templateHelpers:function(){var e=this;return{renderNicename:function(){return e.collection.nicename},renderClasses:function(){return e.collection.slug}}},attachHtml:function(e,t){jQuery(e.el).find(".action-types").append(t.el)}});return t}),n("views/actions/drawer/addAction",["views/actions/drawer/typeCollection"],function(e){var t=Marionette.LayoutView.extend({template:"#tmpl-nf-drawer-content-add-action",regions:{primary:"#nf-drawer-primary",secondary:"#nf-drawer-secondary"},initialize:function(){this.listenTo(i.channel("drawer"),"filter:actionTypes",this.filteractionTypes),this.listenTo(i.channel("drawer"),"clear:filter",this.removeactionTypeFilter),this.installedActions=i.channel("actions").request("get:installedActions"),this.primaryCollection=this.installedActions,this.availableActions=i.channel("actions").request("get:availableActions"),this.secondaryCollection=this.availableActions},onShow:function(){this.primary.show(new e({collection:this.primaryCollection})),this.secondary.show(new e({collection:this.secondaryCollection}))},getEl:function(){return jQuery(this.el).parent()},filteractionTypes:function(t,n){this.primary.reset(),this.secondary.reset(),this.primary.show(new e({collection:t})),this.secondary.show(new e({collection:n}))},removeactionTypeFilter:function(){this.primary.show(new e({collection:this.installedActions})),this.secondary.show(new e({collection:this.availableActions}))}});return t}),n("views/app/drawer/contentViewChangesItem",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-view-changes-item",initialize:function(){this.model.on("change:disabled",this.render,this)},onBeforeDestroy:function(){this.model.off("change:disabled",this.render)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},events:{"click .undoSingle":"undoSingle"},undoSingle:function(e){i.channel("drawer").trigger("click:undoSingle",this.model)}});return e}),n("views/app/drawer/contentViewChanges",["views/app/drawer/contentViewChangesItem"],function(e){var t=Marionette.CollectionView.extend({tagName:"table",className:"nf-changes",childView:e});return t}),n("views/app/drawer/headerViewChanges",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-header-view-changes",events:{"click .undoChanges":"clickUndoChanges"},clickUndoChanges:function(e){i.channel("drawer").trigger("click:undoChanges")}});return e}),n("views/app/drawer/settingError",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-edit-setting-error"});return e}),n("views/app/drawer/itemSetting",["views/app/drawer/mergeTagsContent","views/app/drawer/settingError"],function(e,t){var n=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-edit-setting-wrap",regions:{error:".nf-setting-error"},initialize:function(e){this.dataModel=e.dataModel;var t="undefined"!=typeof i.channel("setting-type-"+this.model.get("type")).request("renderOnChange")&&i.channel("setting-type-"+this.model.get("type")).request("renderOnChange");t&&this.dataModel.on("change:"+this.model.get("name"),this.render,this),this.model.on("change:error",this.renderError,this);var n=this.model.get("deps");if(n)for(var r in n)n.hasOwnProperty(r)&&this.dataModel.on("change:"+r,this.render,this);var a=this.model.get("remote");if(a){if("undefined"!=typeof a.refresh||a.refresh){var s=this.model.get("label");this.model.set("label",s+' <a class="extra"><span class="dashicons dashicons-update"></span></a>')}i.channel("setting").trigger("remote",this.model,this.dataModel,this),this.model.on("rerender",this.render,this)}this.listenTo(i.channel("drawer"),"opened",this.drawerOpened),this.listenTo(i.channel("drawer"),"closed",this.drawerClosed)},onBeforeDestroy:function(){this.dataModel.off("change:"+this.model.get("name"),this.render),this.model.off("change:error",this.renderError);var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render);if(this.model.get("remote")&&this.model.off("rerender",this.render,this),i.channel("setting-"+this.model.get("name")).trigger("destroy:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("destroy:setting",this.model,this.dataModel,this),"textbox"==this.model.get("type")){var n=this.model.get("name"),r=this.dataModel.get(n);this.dataModel.set(n,_.unescape(r),{silent:!0})}},onBeforeRender:function(){if("textbox"==this.model.get("type")){var e=this.model.get("name"),t=this.dataModel.get(e);this.dataModel.set(e,_.escape(t),{silent:!0})}i.channel("app").trigger("before:renderSetting",this.model,this.dataModel),i.channel("setting-type-"+this.model.get("type")).trigger("before:renderSetting",this.model,this.dataModel,this),i.channel("setting-"+this.model.get("name")).trigger("before:renderSetting",this.model,this.dataModel,this)},onRender:function(){this.mergeTagsContentView=!1;i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("render:setting",this.model,this.dataModel,this),jQuery(this.el).find(".nf-help").each(function(){var e=jQuery(this).next(".nf-help-text");jQuery(this).jBox("Tooltip",{content:e,maxWidth:200,theme:"TooltipBorder",trigger:"click",closeOnClick:!0})}),this.model.get("use_merge_tags")&&i.channel("mergeTags").request("init",this);var e=this.model.get("mask");if("undefined"!=typeof e){var t=jQuery(this.$el).find("input");switch(e.type){case"numeric":t.autoNumeric({aSep:thousandsSeparator,aDec:decimalPoint});break;case"currency":var n=i.channel("settings").request("get:setting","currency"),r=nfAdmin.currencySymbols[n]||"";t.autoNumeric({aSign:jQuery("<div />").html(r).text(),aSep:thousandsSeparator,aDec:decimalPoint});break;case"custom":e.format&&t.mask(e.format);break;default:console.log('Notice: Mask type of "'+e.type+'" is not supported.')}}this.renderError()},onShow:function(){i.channel("setting-"+this.model.get("name")).trigger("show:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("show:setting",this.model,this.dataModel,this)},onAttach:function(){i.channel("setting-"+this.model.get("name")).trigger("attach:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("attach:setting",this.model,this.dataModel,this)},renderError:function(){this.model.get("error")?(jQuery(this.el).find(".nf-setting").addClass("nf-error"),this.error.show(new t({model:this.model}))):(jQuery(this.el).find(".nf-setting").removeClass("nf-error"),this.error.empty())},templateHelpers:function(){var e=this;return{renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!=this.deps[t])return'style="display:none;"';return""},renderSetting:function(){"undefined"!=typeof e.dataModel.get(this.name)?this.value=e.dataModel.get(this.name):"undefined"==typeof this.value&&(this.value="");var t=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return t(this)},renderLabelClasses:function(){var e="";return this.use_merge_tags&&(e+=" has-merge-tags"),"rte"==this.type&&(e+=" rte"),e},renderClasses:function(){var e="nf-setting ";return e+="undefined"!=typeof this.width?"nf-"+this.width:" nf-one-half",this.error&&(e+=" nf-error"),e},renderTooltip:function(){return this.help?'<a class="nf-help" href="#" tabindex="-1"><span class="dashicons dashicons-admin-comments"></span></a><div class="nf-help-text">'+this.help+"</div>":""},renderMergeTags:function(){return this.use_merge_tags&&!this.hide_merge_tags?'<span class="dashicons dashicons-list-view merge-tags"></span>':""},renderPlaceholder:function(){return this.placeholder?'placeholder="'+this.placeholder+'"':""}}},events:{"change .setting":"changeSetting","keyup .setting":"keyUpSetting","click .setting":"clickSetting","click .extra":"clickExtra"},changeSetting:function(e){i.channel("app").trigger("change:setting",e,this.model,this.dataModel)},keyUpSetting:function(e){i.channel("app").trigger("keyup:setting",e,this.model,this.dataModel),i.channel("setting-"+this.model.get("name")).trigger("keyup:setting",e,this.model,this.dataModel)},clickSetting:function(e){i.channel("app").trigger("click:setting",e,this.model,this.dataModel),i.channel("setting-type-"+this.model.get("type")).trigger("click:setting",e,this.model,this.dataModel,this)},clickExtra:function(e){i.channel("setting-type-"+this.model.get("type")).trigger("click:extra",e,this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("name")).trigger("click:extra",e,this.model,this.dataModel,this),i.channel("setting-name-"+this.model.get("name")).trigger("click:extra",e,this.model,this.dataModel,this)},drawerOpened:function(){i.channel("setting-type-"+this.model.get("type")).trigger("drawer:opened",this.model,this.dataModel,this)},drawerClosed:function(){i.channel("setting-type-"+this.model.get("type")).trigger("drawer:closed",this.model,this.dataModel,this)}});return n}),n("views/app/drawer/contentNewForm",["views/app/drawer/itemSetting"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-new-form",regions:{formName:".new-form-name",formSubmit:".new-form-submit"},onRender:function(){var t=i.channel("settings").request("get:settingModel","title"),n=i.channel("settings").request("get:settingModel","add_submit"),r=i.channel("settings").request("get:settings");this.formName.show(new e({model:t,dataModel:r}));var a=i.channel("fields").request("get:collection"),s=a.findWhere({type:"submit"});"undefined"==typeof s?this.formSubmit.show(new e({model:n,dataModel:r})):r.set("add_submit",0)},events:{"click .publish":"clickPublish"},clickPublish:function(e){i.channel("app").trigger("click:confirmPublish",e)}});return t}),n("views/app/drawer/headerNewForm",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-header-new-form"});return e}),n("controllers/app/drawerConfig",["models/app/drawerCollection","views/fields/drawer/addField","views/app/drawer/editSettings","views/app/drawer/headerEditSettings","views/actions/drawer/addAction","views/app/drawer/contentViewChanges","views/app/drawer/headerViewChanges","views/app/drawer/contentNewForm","views/app/drawer/headerNewForm"],function(e,t,n,r,a,s,o,l,c,d){var h=Marionette.Object.extend({initialize:function(){this.collection=new e([{id:"addField",getContentView:function(e){return new t(e)}},{id:"addAction",getContentView:function(e){return new a(e)}},{id:"editSettings",getHeaderView:function(e){if("undefined"!=typeof e.typeModel)var t=i.channel(e.typeModel.get("id")).request("get:drawerHeaderView")||r;else var t=r;return new t(e)},getContentView:function(e){return new n(e)}},{id:"viewChanges",getHeaderView:function(e){return new o(e)},getContentView:function(e){return new s(e)}},{id:"newForm",getHeaderView:function(e){return new c(e)},getContentView:function(e){return new l(e)}}]),i.channel("app").reply("get:drawerCollection",this.getDrawerCollection,this),i.channel("app").reply("get:drawer",this.getDrawer,this)},getDrawerCollection:function(){return this.collection},getDrawer:function(e){return this.collection.get(e)}});return h}),n("views/app/drawer/defaultSettingsTitle",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-edit-settings-title-default",templateHelpers:function(){return{renderTypeNicename:function(){var e=i.channel("app").request("get:currentDomain"),t=e.get("id"),n=i.channel(t).request("get:type",this.type);return"undefined"!=typeof n?n.get("nicename"):""}}}});return e}),n("views/app/empty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-empty"});return e}),n("models/app/domainModel",["views/app/drawer/defaultSettingsTitle","views/app/empty"],function(e,t){var n=Backbone.Model.extend({defaults:{dashicons:"",classes:"",active:!1,url:"",hotkeys:!1,disabled:!1,getSettingsTitleView:function(t){return new e(t)},getDefaultSettingsTitleView:function(t){return new e(t)},getGutterLeftView:function(e){return new t},getGutterRightView:function(e){return new t}}});return n}),n("models/app/domainCollection",["models/app/domainModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/fields/subHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-sub-header-fields"});return e}),n("views/fields/mainContentFieldCollection",[],function(){var e=Marionette.CollectionView.extend({tagName:"div",reorderOnSort:!0,getChildView:function(){return i.channel("views").request("get:fieldItem")},getEmptyView:function(){return i.channel("views").request("get:mainContentEmpty")},initialize:function(){i.channel("fields").reply("get:sortableEl",this.getSortableEl,this),i.channel("fields").reply("init:sortable",this.initSortable,this),i.channel("fields").reply("destroy:sortable",this.destroySortable,this)},onRender:function(){if(this.collection.models.length>0){jQuery(this.el).addClass("nf-field-type-droppable").addClass("nf-fields-sortable");this.initSortable()}i.channel("app").trigger("render:fieldsSortable",this)},getSortableEl:function(){return this.el},initSortable:function(){if(i.channel("app").request("is:mobile"));else;jQuery(this.el).sortable({helper:"clone",cancel:".nf-item-controls",placeholder:"nf-fields-sortable-placeholder",opacity:.95,grid:[5,5],appendTo:"#nf-main",scrollSensitivity:10,receive:function(e,t){t.item.dropping||i.channel("app").request("receive:fieldsSortable",t)},over:function(e,t){t.item.dropping||i.channel("app").request("over:fieldsSortable",t)},out:function(e,t){t.item.dropping||i.channel("app").request("out:fieldsSortable",t)},start:function(e,t){t.item.dropping||i.channel("app").request("start:fieldsSortable",t)},update:function(e,t){t.item.dropping||i.channel("app").request("update:fieldsSortable",t,this)},stop:function(e,t){t.item.dropping||i.channel("app").request("stop:fieldsSortable",t)}})},destroySortable:function(){jQuery(this.el).sortable("destroy")},onAddChild:function(e){i.channel("fields").request("get:adding")&&(e.$el.hide().show("clip"),i.channel("fields").request("set:adding",!1))}});return e}),n("views/fields/drawer/addSavedField",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-add-saved-field",initialize:function(){this.model.on("change:addSavedLoading",this.renderAddButton,this)},onRender:function(){this.renderAddButton()},renderAddButton:function(){if(this.model.get("addSavedLoading"))var e=i.channel("app").request("get:template","#tmpl-nf-add-saved-field-loading");else var e=i.channel("app").request("get:template","#tmpl-nf-add-saved-field-button");jQuery(this.el).find(".add-button").html(e(this))},onBeforeDestroy:function(){this.model.off("change:addSavedLoading",this.render)},events:{"click .nf-button":"clickAddSavedField"},clickAddSavedField:function(e){i.channel("drawer").trigger("click:addSavedField",e,this.model)}});return e}),n("views/fields/drawer/settingsTitle",["views/fields/drawer/addSavedField"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-drawer-content-edit-settings-title-fields",initialize:function(){this.model.on("change:saved",this.render,this),this.model.on("change:label",this.renderjBoxContent,this)},regions:{addSaved:".nf-add-saved-field"},onBeforeDestroy:function(){this.model.off("change:saved",this.render),this.addSavedjBox.destroy(),this.model.unset("jBox",{silent:!0})},onRender:function(){this.renderjBoxContent();var e=this;this.addSavedjBox=new jBox("Tooltip",{trigger:"click",title:"Add to Saved Fields",position:{x:"left",y:"center"},outside:"x",closeOnClick:"body",onCreated:function(){this.setContent(jQuery(e.el).find(".nf-add-saved-field"))}}),this.addSavedjBox.attach(jQuery(this.el).find(".dashicons")),this.model.set("jBox",this.addSavedjBox,{silent:!0})},renderjBoxContent:function(){this.addSaved&&this.addSaved.show(new e({model:this.model}))},templateHelpers:function(){return{renderTypeNicename:function(){var e=i.channel("app").request("get:currentDomain"),t=e.get("id"),n=i.channel(t).request("get:type",this.type),r=n.get("nicename");if(this.saved){var a=i.channel(t).request("get:type",n.get("type"));r+=" - "+a.get("nicename")}return r},renderSavedStar:function(){if(this.saved)var e="filled";else var e="empty";return'<span class="dashicons dashicons-star-'+e+'"></span>'}}}});return t}),n("views/actions/mainHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-header-actions",initialize:function(){var e=i.channel("actions").request("get:collection");this.listenTo(e,"add",this.render),this.listenTo(e,"remove",this.render)},onRender:function(){var e=i.channel("actions").request("get:collection");0==e.models.length?jQuery(this.el).hide():jQuery(this.el).show()}});return e}),n("views/actions/subHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-sub-header-actions"});return e}),n("views/app/itemControls",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-item-controls",initialize:function(){},onRender:function(){this.currentDomain=i.channel("app").request("get:currentDomain")},events:{"mouseover .nf-item-control":"mouseoverItemControl","click .nf-edit-settings":"clickEdit","singletap .nf-edit-settings":"singleTapEdit","click .nf-delete":"clickDelete","click .nf-duplicate":"clickDuplicateField"},clickEdit:function(e){i.channel("app").request("is:mobile")||i.channel("app").trigger("click:edit",e,this.model)},singleTapEdit:function(e){i.channel("app").trigger("click:edit",e,this.model)},clickDelete:function(e){i.channel("app").trigger("click:delete",e,this.model)},clickDuplicateField:function(e){i.channel("app").trigger("click:duplicate",e,this.model)},mouseoverItemControl:function(e){i.channel("app").trigger("mouseover:itemControl",e,this.model)}});return e}),n("views/actions/actionItem",["views/app/itemControls"],function(e){var t=Marionette.LayoutView.extend({tagName:"tr",template:"#tmpl-nf-action-item",regions:{itemControls:".nf-item-controls"},initialize:function(){this.template=i.channel("actions").request("get:actionItemTemplate")||this.template,this.model.on("change:label",this.render,this),this.model.on("change:editActive",this.render,this),this.model.on("change:active",this.maybeDeactivate,this)},onBeforeDestroy:function(){this.model.off("change:label",this.render),this.model.off("change:editActive",this.render),this.model.off("change:active",this.maybeDeactivate)},onRender:function(){this.model.get("editActive")?jQuery(this.el).addClass("active"):jQuery(this.el).removeClass("active"),this.maybeDeactivate(),this.itemControls.show(new e({model:this.model}))},maybeDeactivate:function(){0==this.model.get("active")?jQuery(this.el).addClass("deactivated"):jQuery(this.el).removeClass("deactivated")},events:{"change input":"changeToggle",click:"maybeClickEdit"},maybeClickEdit:function(e){"TR"==jQuery(e.target).parent().prop("tagName")&&i.channel("app").trigger("click:edit",e,this.model)},changeToggle:function(e){var t=jQuery(e.target).data("setting"),n=i.channel("actions").request("get:settingModel",t);console.log(n),console.log(this.model),i.channel("app").request("change:setting",e,n,this.model),i.channel("app").request("update:db")},templateHelpers:function(){return{renderToggle:function(e){this.settingName=e||"active";var t=this.label;this.label="",this.value=this[this.settingName],this.name=this.id+"-"+this.settingName;var n=i.channel("app").request("get:template","#tmpl-nf-edit-setting-toggle");return n=n(this),this.label=t,n},renderTypeNicename:function(){var e=i.channel("actions").request("get:type",this.type);if("undefined"!=typeof e)return e.get("nicename")},renderTooltip:function(){return this.help?'<a class="nf-help" href="#" tabindex="-1"><span class="dashicons dashicons-admin-comments"></span></a><div class="nf-help-text">'+this.help+"</div>":""},renderMergeTags:function(){return this.use_merge_tags?'<span class="dashicons dashicons-list-view merge-tags"></span>':""}}}});return t}),n("views/actions/mainContentEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-content-actions-empty",onBeforeDestroy:function(){jQuery(this.el).parent().parent().removeClass("nf-actions-empty")},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},onShow:function(){jQuery(this.el).parent().parent().addClass("nf-actions-empty")}});return e}),n("views/actions/mainContent",["views/actions/actionItem","views/actions/mainContentEmpty"],function(e,t){var n=Marionette.CompositeView.extend({template:"#tmpl-nf-action-table",childView:e,emptyView:t,initialize:function(){this.template=i.channel("actions").request("get:mainContentTemplate")||this.template},onRender:function(){jQuery(this.el).droppable({accept:".nf-action-type-draggable",activeClass:"nf-droppable-active",hoverClass:"nf-droppable-hover",drop:function(e,t){i.channel("app").request("drop:actionType",e,t)}})},attachHtml:function(e,t){"undefined"!=typeof i.channel("actions").request("get:type",t.model.get("type"))&&jQuery(e.el).find("tbody").append(t.el)}});return n}),n("views/advanced/mainHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-header-settings"});return e}),n("views/advanced/subHeader",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-sub-header-settings"});return e}),n("views/advanced/settingItem",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-form-setting-type",onBeforeDestroy:function(){this.model.off("change:editActive",this.updateActiveClass)},initialize:function(){this.model.on("change:editActive",this.updateActiveClass,this)},events:{click:"clickEdit"},clickEdit:function(e){i.channel("settings").trigger("click:edit",e,this.model)},templateHelpers:function(){return{renderClasses:function(){var e="nf-setting-wrap "+this.id;return this.editActive&&(e+=" active"),e}}},updateActiveClass:function(){this.model.get("editActive")?jQuery(this.el).find(".nf-setting-wrap").addClass("active"):jQuery(this.el).find(".nf-setting-wrap").removeClass("active")}});return e}),n("views/advanced/mainContent",["views/advanced/settingItem"],function(e){var t=Marionette.CollectionView.extend({childView:e});return t}),n("models/fields/fieldModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Field",objectDomain:"fields",editActive:!1,order:999},initialize:function(){if("undefined"!=typeof this.get("type")){this.on("change",this.changeSetting,this);var e=i.channel("fields").request("get:type",this.get("type")),t=e.get("parentType");_.each(e.get("settingDefaults"),function(e,t){"undefined"==typeof this.get(t)&&this.set(t,e,{silent:!0})},this),"saved"==e.get("section")&&this.set("type",e.get("type")),i.channel("fields").trigger("init:fieldModel",this),i.channel("fields-"+t).trigger("init:fieldModel",this),i.channel("fields-"+this.get("type")).trigger("init:fieldModel",this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)}},changeSetting:function(e,t){i.channel("fieldSetting-"+_.keys(e.changedAttributes())[0]).trigger("update:setting",this,t.settingModel),i.channel("fields").trigger("update:setting",this,t.settingModel),i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("models/fields/fieldCollection",["models/fields/fieldModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:function(e){return parseInt(e.get("order"))},tmpNum:1,initialize:function(){this.on("add",this.addField,this),this.on("remove",this.removeField,this),this.listenTo(this,"add:field",this.addNewField),this.listenTo(this,"append:field",this.appendNewField),this.listenTo(this,"remove:field",this.removeFieldResponse),this.newIDs=[]},addField:function(e){this.newIDs.push(e.get("id"))},removeField:function(e){this.removedIDs=this.removedIDs||{},this.removedIDs[e.get("id")]=e.get("id")},addNewField:function(e){this.add(e)},appendNewField:function(e){if(0==this.length)var t=0;else var t=this.at(this.length-1).get("order")+1;e.set("order",t,{silent:!0}),this.add(e)},removeFieldResponse:function(e){this.remove(e)},fieldExists:function(e){return-1!=this.indexOf(e)}});return t}),n("controllers/app/domainConfig",["models/app/domainCollection","views/fields/subHeader","views/fields/mainContentFieldCollection","views/fields/drawer/settingsTitle","views/actions/mainHeader","views/actions/subHeader","views/actions/mainContent","views/advanced/mainHeader","views/advanced/subHeader","views/advanced/mainContent","views/app/empty","models/fields/fieldCollection"],function(e,t,n,r,a,s,o,l,c,d,h,u){var g=Marionette.Object.extend({initialize:function(){i.channel("formContent").request("add:viewFilter",this.defaultFormContentView,10,this),i.channel("formContent").request("add:loadFilter",this.defaultFormContentLoad,10,this),i.channel("formContentGutters").request("add:leftFilter",this.defaultFormContentGutterView,10,this),i.channel("formContentGutters").request("add:rightFilter",this.defaultFormContentGutterView,10,this),this.collection=new e([{id:"fields",nicename:nfi18n.domainFormFields,hotkeys:{Esc:"close:drawer","Ctrl+Shift+n":"add:newField","Ctrl+Shift+a":"changeDomain:actions","Ctrl+Shift+s":"changeDomain:settings","Alt+Ctrl+t":"open:mergeTags",up:"up:mergeTags",down:"down:mergeTags","Shift+return":"return:mergeTags"},mobileDashicon:"dashicons-menu",getSubHeaderView:function(){return new t},getMainContentView:function(e){var t=i.channel("settings").request("get:setting","formContentData");t||(t=i.channel("settings").request("get:setting","fieldContentsData"));var n=i.channel("formContent").request("get:loadFilters"),r=_.without(n,void 0),a=_.first(r);t=a(t,i.channel("app").request("get:formModel"),!0);var s=i.channel("formContent").request("get:viewFilters"),r=_.without(s,void 0),a=_.first(r);return formContentView=a(),i.channel("settings").request("update:setting","formContentData",t,!0),new formContentView({collection:t})},getSettingsTitleView:function(e){return"fields"==e.model.get("objectDomain")?new r(e):this.get("getDefaultSettingsTitleView").call(this,e)},getGutterLeftView:function(e){var t=i.channel("formContentGutters").request("get:leftFilters"),n=_.without(t,void 0),r=_.first(n);return gutterView=r(),new gutterView},getGutterRightView:function(){var e=i.channel("formContentGutters").request("get:rightFilters"),t=_.without(e,void 0),n=_.first(t);return gutterView=n(),new gutterView}},{id:"actions",nicename:nfi18n.domainActions,hotkeys:{Esc:"close:drawer","Ctrl+Shift+n":"add:newAction","Ctrl+Shift+f":"changeDomain:fields","Ctrl+Shift+s":"changeDomain:settings","Alt+Ctrl+t":"open:mergeTags",up:"up:mergeTags",down:"down:mergeTags","Shift+return":"return:mergeTags"},mobileDashicon:"dashicons-external",getSubHeaderView:function(){return new s},getMainContentView:function(){var e=i.channel("actions").request("get:collection");return new o({collection:e})}},{id:"settings",nicename:nfi18n.domainAdvanced,hotkeys:{Esc:"close:drawer","Ctrl+Shift+f":"changeDomain:fields","Ctrl+Shift+a":"changeDomain:actions","Alt+Ctrl+t":"open:mergeTags",up:"up:mergeTags",down:"down:mergeTags","Shift+return":"return:mergeTags"},mobileDashicon:"dashicons-admin-generic",getSubHeaderView:function(){return new c},getMainContentView:function(){var e=i.channel("settings").request("get:typeCollection");return new d({collection:e})}},{id:"preview",nicename:"Preview Form",classes:"preview",dashicons:"dashicons-visibility",mobileDashicon:"dashicons-visibility",url:nfAdmin.previewurl}]),i.channel("app").trigger("init:domainCollection",this.collection),i.channel("app").reply("get:domainCollection",this.getDomainCollection,this),i.channel("app").reply("get:domainModel",this.getDomainModel,this)},getDomainCollection:function(){return this.collection},getDomainModel:function(e){return this.collection.get(e)},defaultFormContentView:function(e){return n},defaultFormContentLoad:function(e){var t=i.channel("fields").request("get:collection"),n=i.channel("formContent").request("get:loadFilters"),r=_.without(n,void 0);if(1==r.length||"undefined"==typeof e||!0==e instanceof Backbone.Collection)return t;var a=_.map(e,function(e){return t.findWhere({key:e})},this);return new u(a)},defaultFormContentGutterView:function(e){return h}});return g}),n("models/app/appModel",[],function(){var e=Backbone.Model.extend({defaults:{loading:!1},initialize:function(){this.on("change:clean",this.changeStatus,this)},changeStatus:function(){i.channel("app").trigger("change:clean",this.get("clean"))}});return e}),n("controllers/app/data",["models/app/appModel"],function(e){var t=Marionette.Object.extend({initialize:function(){var t=i.channel("app").request("get:domainCollection");this.model=new e({currentDrawer:!1,currentDomain:t.get("fields"),clean:!0});var n=1==nfAdmin.mobile;this.model.set("mobile",n),i.channel("app").reply("is:mobile",this.isMobile,this),i.channel("app").reply("get:data",this.getData,this),i.channel("app").reply("get:setting",this.getSetting,this),i.channel("app").reply("get:currentDomain",this.getCurrentDomain,this),i.channel("app").reply("get:currentDrawer",this.getCurrentDrawer,this),i.channel("drawer").reply("get:current",this.getCurrentDrawer,this),i.channel("app").reply("update:currentDomain",this.updateCurrentDomain,this),i.channel("app").reply("update:currentDrawer",this.updateCurrentDrawer,this),i.channel("app").reply("update:setting",this.updateSetting,this)},updateCurrentDomain:function(e){this.updateSetting("currentDomain",e)},updateSetting:function(e,t){return this.model.set(e,t),!0},getSetting:function(e){return this.model.get(e)},getData:function(){return this.model},getCurrentDomain:function(){return this.model.get("currentDomain")},updateCurrentDrawer:function(e){ 3 return this.updateSetting("currentDrawer",e),!0},getCurrentDrawer:function(){var e=this.model.get("currentDrawer");return i.channel("app").request("get:drawer",e)},isMobile:function(){return this.model.get("mobile")}});return t}),n("controllers/app/drawerToggleSettingGroup",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"click:toggleSettingGroup",this.toggleSettingGroup)},toggleSettingGroup:function(e,t){if(t.get("display")){var n=!1;_.each(t.get("settings").models,function(e){e.get("error")&&(n=!0)}),n||t.set("display",!1)}else t.set("display",!0)}});return e}),n("controllers/app/updateDB",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"closed",this.updateDB),i.channel("app").reply("update:db",this.updateDB,this),i.channel("formContent").request("add:saveFilter",this.defaultSaveFilter,10,this)},updateDB:function(e){if(i.channel("app").request("get:setting","clean"))return!1;if(e=e||"preview","preview"==e)var t="nf_preview_update";else if("publish"==e)var t="nf_save_form";var n=i.channel("app").request("get:formModel");_.each(n.get("fields").models,function(e,t){e.unset("jBox",{silent:!0})});var r=i.channel("settings").request("get:setting","formContentData");r||(r=i.channel("settings").request("get:setting","fieldContentsData"));var a=i.channel("formContent").request("get:saveFilters"),s=_.without(a,void 0),o=_.first(s);if(r=o(r),"publish"==e&&n.get("show_publish_options")){i.channel("app").request("open:drawer","newForm");var l=i.channel("app").request("get:builderEl");return jQuery(l).addClass("disable-main"),!1}var c=i.channel("app").request("get:formModel"),d=JSON.parse(JSON.stringify(c));d.settings.formContentData=r;var h=c.get("fields").removedIDs;_.each(d.fields,function(e){var t=e.id;delete e.id,delete e.parent_id;var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i],delete e[i]);for(var r in n)null===n[r]&&delete n[r];e.settings=n,e.id=t}),d.deleted_fields=h;var h=c.get("actions").removedIDs;_.each(d.actions,function(e){var t=e.id;delete e.id,delete e.parent_id;var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i],delete e[i]);e.settings=n,e.id=t}),d.deleted_actions=h,d=JSON.stringify(d),i.channel("app").trigger("before:updateDB",d),"publish"==e&&(i.channel("app").request("update:setting","loading",!0),i.channel("app").trigger("change:loading"),i.channel("app").request("is:mobile")&&i.channel("notices").request("add","publishing","Your Changes Are Being Published",{autoClose:!1})),jQuery.post(ajaxurl,{action:t,form:d,security:nfAdmin.ajaxNonce},function(t){try{t=JSON.parse(t),t.action=e,i.channel("app").trigger("response:updateDB",t),!i.channel("app").request("is:mobile")&&"preview"==e}catch(e){console.log("Something went wrong!"),console.log(e)}})},defaultSaveFilter:function(e){return e.pluck("key")}});return e}),n("models/app/formModel",[],function(){var e=Backbone.Model.extend({initialize:function(){jQuery.isNumeric(this.get("id"))?this.set("show_publish_options",!1,{silent:!0}):this.set("show_publish_options",!0,{silent:!0})}});return e}),n("controllers/app/formData",["models/app/formModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.model=new e({id:preloadedFormData.id}),this.model.set("fields",i.channel("fields").request("get:collection")),this.model.set("actions",i.channel("actions").request("get:collection")),this.model.set("settings",i.channel("settings").request("get:settings")),i.channel("app").reply("get:formModel",this.getFormModel,this)},getFormModel:function(){return this.model}});return t}),n("controllers/app/previewLink",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:sendChanges",this.disablePreview,this),this.listenTo(i.channel("app"),"response:sendChanges",this.enablePreview,this),this.listenTo(i.channel("app"),"change:clean",this.changePreviewNicename,this)},disablePreview:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("preview");t.set("disabled",!0)},changePreviewNicename:function(e){var t=i.channel("app").request("get:domainCollection"),n=t.get("preview");if(e)var r="Preview Form";else var r="Preview Changes";n.set("nicename",r)},enablePreview:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("preview");t.set("disabled",!1)}});return e}),n("controllers/app/menuButtons",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:publish",this.publish),this.listenTo(i.channel("app"),"click:viewChanges",this.viewChanges)},publish:function(){i.channel("app").request("update:db","publish")},viewChanges:function(){var e=i.channel("changes").request("get:collection");i.channel("app").request("open:drawer","viewChanges",{collection:e})}});return e}),n("models/app/changeModel",[],function(){var e=Backbone.Model.extend({defaults:{disabled:!1}});return e}),n("models/app/changeCollection",["models/app/changeModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:function(e){var t=parseInt(e.cid.replace("c",""));return-t}});return t}),n("controllers/app/trackChanges",["models/app/changeCollection","models/app/changeModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.collection=new e,i.channel("changes").reply("register:change",this.registerChange,this),i.channel("changes").reply("get:collection",this.getCollection,this),this.listenTo(i.channel("app"),"change:clean",this.maybeResetCollection)},registerChange:function(e,n,i,r,a){var a="undefined"!=typeof a?a:{};"undefined"==typeof r.dashicon&&(r.dashicon="admin-generic");var s=new t({action:e,model:n,changes:i,label:r,data:a});return this.collection.add(s),s},getCollection:function(){return this.collection},maybeResetCollection:function(e){e&&this.collection.reset()}});return n}),n("controllers/app/undoChanges",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"click:undoChanges",this.undoChanges,this),this.listenTo(i.channel("drawer"),"click:undoSingle",this.undoSingle,this)},undoChanges:function(){var e=i.channel("changes").request("get:collection");e.sort();var t=this;_.each(e.models,function(e){t.undoSingle(e,!0)}),e.reset(),i.channel("app").request("update:db"),i.channel("app").request("update:setting","clean",!0),i.channel("app").request("close:drawer")},undoSingle:function(e,t){i.channel("changes").request("undo:"+e.get("action"),e,t)}});return e}),n("controllers/app/publishResponse",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"response:updateDB",this.publishResponse)},publishResponse:function(e){return"publish"===e.action&&("undefined"!=typeof e.data.new_ids&&("undefined"!=typeof e.data.new_ids.fields&&_.each(e.data.new_ids.fields,function(e,t){var n=i.channel("fields").request("get:field",t);n&&n.set("id",e)}),"undefined"!=typeof e.data.new_ids.actions&&_.each(e.data.new_ids.actions,function(e,t){var n=i.channel("actions").request("get:action",t);n&&n.set("id",e)}),"undefined"!=typeof e.data.new_ids.forms&&_.each(e.data.new_ids.forms,function(e,t){var n=i.channel("app").request("get:formModel");n.set("id",e),history.replaceState("","","admin.php?page=ninja-forms&form_id="+e)})),i.channel("app").request("update:setting","loading",!1),i.channel("app").trigger("change:loading"),i.channel("app").request("is:mobile")&&i.channel("notices").request("close","publishing"),i.channel("notices").request("add","published","Changes Published"),i.channel("app").trigger("app:published",e),void i.channel("app").request("update:setting","clean",!0))}});return e}),n("controllers/app/changeDomain",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:menu",this.changeAppDomain),i.channel("app").reply("change:currentDomain",this.changeAppDomain,this),i.channel("app").reply("prevent:changeDomain",this.preventChange,this),i.channel("app").reply("enable:changeDomain",this.enableChange,this),this.objPreventChange={}},changeAppDomain:function(e,t){if(this.maybePreventChange())return!1;if("undefined"==typeof t)var n=jQuery(e.target).data("domain"),t=i.channel("app").request("get:domainModel",n);if(i.channel("app").request("get:currentDrawer")&&i.channel("app").request("close:drawer"),0==t.get("url").length){var r=i.channel("app").request("get:mainEl");i.channel("app").request("update:currentDomain",t),jQuery(r).scrollTop(0),i.channel("app").trigger("change:currentDomain",t)}},maybePreventChange:function(){return 0!=Object.keys(this.objPreventChange).length},preventChange:function(e){this.objPreventChange[e]=!0},enableChange:function(e){delete this.objPreventChange[e]}});return e}),n("controllers/app/pushstate",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.changePushState)},changePushState:function(){var e=i.channel("app").request("get:currentDomain");history.pushState(null,null,window.location.href+"&domain="+e.get("id"));var t=/domain=\\d+/,n=window.location.toString(),r=n.replace(t,"");console.log(r)}});return e}),n("controllers/app/hotkeys",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("main"),"render:main",this.changeHotkeys),this.listenTo(i.channel("drawer"),"opened",this.changeHotkeys),this.listenTo(i.channel("drawer"),"render:settingGroup",this.changeHotkeys),this.listenTo(i.channel("hotkeys"),"add:newField",this.addNewField),this.listenTo(i.channel("hotkeys"),"add:newAction",this.addNewAction),this.listenTo(i.channel("hotkeys"),"changeDomain:fields",this.changeDomainFields),this.listenTo(i.channel("hotkeys"),"changeDomain:actions",this.changeDomainActions),this.listenTo(i.channel("hotkeys"),"changeDomain:settings",this.changeDomainSettings),this.listenTo(i.channel("hotkeys"),"close:drawer",this.closeDrawer)},changeHotkeys:function(){var e=i.channel("app").request("get:currentDomain");jQuery(document).off(".nfDomainHotkeys"),jQuery("input").off(".nfDomainHotkeys"),e.get("hotkeys")&&jQuery.each(e.get("hotkeys"),function(e,t){jQuery(document).on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)}),jQuery("input").on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)}),jQuery("textarea").on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)})})},addNewField:function(){"addField"!=i.channel("app").request("get:currentDrawer")?i.channel("app").request("open:drawer","addField"):i.channel("app").request("close:drawer")},addNewAction:function(){"addAction"!=i.channel("app").request("get:currentDrawer")?i.channel("app").request("open:drawer","addAction"):i.channel("app").request("close:drawer")},changeDomainFields:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("fields");i.channel("app").request("change:currentDomain",{},t)},changeDomainActions:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("actions");i.channel("app").request("change:currentDomain",{},t)},changeDomainSettings:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("settings");i.channel("app").request("change:currentDomain",{},t)},closeDrawer:function(){i.channel("app").request("close:drawer")}});return e}),n("controllers/app/cleanState",[],function(){var e=Marionette.Object.extend({initialize:function(){this.ignoreAttributes=["editActive"],this.listenTo(i.channel("app"),"update:setting",this.setAppClean)},setAppClean:function(e){for(var t in e.changedAttributes())var n=t,r=e.changedAttributes()[t];i.channel("undo-"+e.get("type")).request("ignore:attributes",this.ignoreAttributes)||this.ignoreAttributes;return-1==this.ignoreAttributes.indexOf(t)&&void i.channel("app").request("update:setting","clean",!1)}});return e}),n("controllers/app/coreUndo",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("changes").reply("undo:changeSetting",this.undoChangeSetting,this),i.channel("changes").reply("undo:addObject",this.undoAddObject,this),i.channel("changes").reply("undo:removeObject",this.undoRemoveObject,this),i.channel("changes").reply("undo:duplicateObject",this.undoDuplicateObject,this),i.channel("changes").reply("undo:sortFields",this.undoSortFields,this),i.channel("changes").reply("undo:addListOption",this.undoAddListOption,this),i.channel("changes").reply("undo:removeListOption",this.undoRemoveListOption,this),i.channel("changes").reply("undo:sortListOptions",this.undoSortListOptions,this)},undoChangeSetting:function(e,t){var n=e.get("model"),i=e.get("changes"),r=i.attr,a=i.before;n.set(r,a),this.maybeRemoveChange(e,t)},undoAddObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if("undefined"!=typeof r.newIDs&&delete r.newIDs[n.get("id")],!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&a.remove(t)})}r.remove(n),this.maybeRemoveChange(e,t)},undoDuplicateObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&a.remove(t)})}r.remove(n),this.maybeRemoveChange(e,t)},undoRemoveObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(i.channel(n.get("objectDomain")).request("add",n),delete r.removedIDs[n.get("id")],!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&t.set("disabled",!1)})}r.trigger("reset",r),this.maybeRemoveChange(e,t)},undoSortFields:function(e,t){var n=e.get("data"),r=n.fields,a=i.channel("fields").request("get:collection");_.each(r,function(e){var t=e.before,n=e.model;n.set("order",t)}),a.sort(),this.maybeRemoveChange(e,t)},undoAddListOption:function(e,t){var n=e.get("model");if(!t){var r=i.channel("changes").request("get:collection"),a=r.where({model:n});_.each(a,function(t){t!==e&&r.remove(t)})}n.collection.remove(n),this.maybeRemoveChange(e,t)},undoRemoveListOption:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(r.add(n),!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&t.set("disabled",!1)})}this.maybeRemoveChange(e,t)},undoSortListOptions:function(e,t){var n=e.get("data"),i=n.collection,r=n.objModels;_.each(r,function(e){var t=e.before,n=e.model;n.set("order",t)}),i.sort(),this.maybeRemoveChange(e,t)},maybeRemoveChange:function(e,t){var t="undefined"!=typeof t&&t;if(!t){i.channel("app").request("update:db");var n=i.channel("changes").request("get:collection");n.remove(e),0==n.length&&(i.channel("app").request("update:setting","clean",!0),i.channel("app").request("close:drawer"))}}});return e}),n("controllers/app/cloneModelDeep",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("clone:modelDeep",this.cloneModelDeep,this)},cloneModelDeep:function(e){var t={};_.each(e.attributes,function(e,n){if(e instanceof Backbone.Collection){var r=i.channel("app").request("clone:collectionDeep",e);t[n]=r}else e instanceof Backbone.Model&&(t[n]=this.cloneModelDeep(e))},this);var n=e.clone();return _.each(t,function(e,t){n.set(t,e)}),n}});return e}),n("controllers/app/getSettingChildView",["views/app/drawer/itemSetting"],function(e){var t=Marionette.Object.extend({initialize:function(){i.channel("app").reply("get:settingChildView",this.getSettingChildView,this)},getSettingChildView:function(t){var n=t.get("type"),r=i.channel(n).request("get:settingChildView",t)||e;return r}});return t}),n("controllers/app/changeSettingDefault",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("change:setting",this.changeSetting,this),this.listenTo(i.channel("app"),"change:setting",this.changeSetting,this)},changeSetting:function(e,t,n,r){var a=t.get("name"),s=n.get(a),r=r||null;r||(r=i.channel(t.get("type")).request("before:updateSetting",e,n,a,t)),"undefined"==typeof r&&(r=jQuery(e.target).val()),n.set(a,r,{settingModel:t}),i.channel("setting-"+a).trigger("after:updateSetting",n,t);var o=r,l={attr:a,before:s,after:o},c=i.channel("app").request("get:currentDomain"),d=(c.get("id"),{object:n.get("objectType"),label:n.get("label"),change:"Changed "+t.get("label")+" from "+s+" to "+o});i.channel("changes").request("register:change","changeSetting",n,l,d)}});return e}),n("views/app/drawer/typeSettingFieldset",["views/app/drawer/itemSetting"],function(e){var t=Marionette.CompositeView.extend({template:"#tmpl-nf-edit-setting-wrap",childView:e,initialize:function(e){this.collection=this.model.get("settings"),this.childViewOptions={dataModel:e.dataModel},this.dataModel=e.dataModel;var t=this.model.get("deps");if(t)for(var n in t)t.hasOwnProperty(n)&&this.dataModel.on("change:"+n,this.render,this);this.model.on("rerender",this.render,this)},onBeforeDestroy:function(){var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render)},onBeforeRender:function(){i.channel("app").trigger("before:renderSetting",this.model,this.dataModel),i.channel("setting-type-"+this.model.get("type")).trigger("before:renderSetting",this.model,this.dataModel,this),i.channel("setting-"+this.model.get("name")).trigger("before:renderSetting",this.model,this.dataModel,this)},onRender:function(){i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("render:setting",this.model,this.dataModel,this)},templateHelpers:function(){var e=this;return{renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!==this.deps[t])return'style="display:none;"';return""},renderSetting:function(){var e=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return e(this)},renderClasses:function(){var e="";return e+="undefined"!=typeof this.width?this.width:" one-half",this.error&&(e+=" nf-error"),e},renderError:function(){return this.error?this.error:""}}},attachHtml:function(e,t){jQuery(e.el).find(".nf-field-sub-settings").append(t.el)}});return t}),n("models/app/settingModel",[],function(){var e=Backbone.Model.extend({defaults:{settings:!1,hide_merge_tags:!1,error:!1},initialize:function(){i.channel("app").trigger("init:settingModel",this),i.channel(this.get("type")).trigger("init:settingModel",this),i.channel("setting-name-"+this.get("name")).trigger("init:settingModel",this),this.on("change:error",this.maybePreventUI,this),"undefined"!=typeof this.collection&&this.get("use_merge_tags")&&"undefined"!=typeof this.collection.options.objectType&&this.listenTo(i.channel("app"),"update:fieldKey",this.updateKey)},updateKey:function(e){i.channel("app").trigger("fire:updateFieldKey",e,this)},maybePreventUI:function(){this.get("error")?(i.channel("drawer").request("prevent:close","setting-"+this.get("name")+"-error"),i.channel("app").request("prevent:changeDomain","setting-"+this.get("name")+"-error")):(i.channel("drawer").request("enable:close","setting-"+this.get("name")+"-error"),i.channel("app").request("enable:changeDomain","setting-"+this.get("name")+"-error"))}});return e}),n("models/app/settingCollection",["models/app/settingModel"],function(e){var t=Backbone.Collection.extend({model:e,initialize:function(e,t){this.options=t||{}}});return t}),n("controllers/app/fieldset",["views/app/drawer/typeSettingFieldset","models/app/settingCollection"],function(e,t){var n=Marionette.Object.extend({initialize:function(){i.channel("fieldset").reply("get:settingChildView",this.getSettingChildView,this),this.listenTo(i.channel("fieldset"),"init:settingModel",this.createSettingsCollection)},getSettingChildView:function(t){return e},createSettingsCollection:function(e){e.set("settings",new t(e.get("settings")))}});return n}),n("controllers/app/toggleSetting",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-toggle").reply("renderOnChange",function(){return!1}),i.channel("toggle").reply("before:updateSetting",this.updateSetting,this)},updateSetting:function(e,t,n,i){if(jQuery(e.target).attr("checked"))var r=1;else var r=0;return r}});return e}),n("controllers/app/itemControls",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:edit",this.clickEdit),this.listenTo(i.channel("app"),"click:delete",this.clickDelete),this.listenTo(i.channel("app"),"click:duplicate",this.clickDuplicate)},clickEdit:function(e,t){var n=i.channel("app").request("get:currentDomain"),r=n.get("id"),a=i.channel(r).request("get:type",t.get("type"));i.channel("app").request("open:drawer","editSettings",{model:t,groupCollection:a.get("settingGroups")})},clickDelete:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r={object:t.get("objectType"),label:t.get("label"),change:"Removed",dashicon:"dismiss"},a={collection:t.collection},s=i.channel("changes").request("get:collection"),o=s.where({model:t});_.each(o,function(e){var i=e.get("data");"undefined"!=typeof i.fields&&_.each(i.fields,function(e,r){e.model==t&&(i.fields[r].model=n)}),e.set("data",i),e.set("model",n),e.set("disabled",!0)}),i.channel("changes").request("register:change","removeObject",n,null,r,a);var l=i.channel("app").request("get:currentDomain"),c=l.get("id");i.channel(c).request("delete",t)},clickDuplicate:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r=i.channel("app").request("get:currentDomain"),a=r.get("id");n.set("label",n.get("label")+" Copy");var s=i.channel(a).request("get:tmpID");n.set("id",s),i.channel(a).request("add",n,!1,!1,"duplicate");var o={object:t.get("objectType"),label:t.get("label"),change:"Duplicated",dashicon:"admin-page"},l={collection:i.channel(a).request("get:collection")};i.channel("changes").request("register:change","duplicateObject",n,null,o,l),t.trigger("change:label",t),i.channel("app").request("update:db")}});return e}),n("controllers/app/mergeTags",["models/app/mergeTagCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.tagSectionCollection=new e;var t=this;_.each(mergeTags,function(n){if(n.tags)var i=new e(n.tags);else var i="";t.tagSectionCollection.add({id:n.id,label:n.label,tags:i,default_group:n.default_group})});var n=this.tagSectionCollection.get("fields").get("tags"),r=i.channel("fields").request("get:collection");_.each(r.models,function(e){"submit"!==e.get("type")&&n.add({id:e.get("id"),label:e.get("label"),tag:t.getFieldKeyFormat(e.get("key"))})});var a=new e,s=i.channel("app").request("get:formModel"),o=s.get("settings").get("calculations");_.each(o.models,function(e){a.add({label:e.get("name"),tag:"{calc:"+e.get("name")+"}"})}),this.tagSectionCollection.get("calcs").set("tags",a),this.currentElement={},this.settingModel={},this.open=!1,this.listenTo(i.channel("mergeTags"),"click:mergeTag",this.clickMergeTag),this.listenTo(i.channel("fields"),"add:field",this.addFieldTags),this.listenTo(i.channel("fields"),"delete:field",this.deleteFieldTags),this.listenTo(i.channel("option-repeater-calculations"),"update:option",this.updateCalcTags),this.listenTo(i.channel("option-repeater-calculations"),"remove:option",this.updateCalcTags),i.channel("mergeTags").reply("update:currentElement",this.updateCurrentElement,this),i.channel("mergeTags").reply("update:currentSetting",this.updateCurrentSetting,this),i.channel("mergeTags").reply("get:collection",this.getCollection,this),i.channel("mergeTags").reply("get:mergeTag",this.getSectionModel,this),this.listenTo(i.channel("fieldSetting-key"),"update:setting",this.updateKey),this.listenTo(i.channel("app"),"replace:fieldKey",this.replaceFieldKey),i.channel("app").reply("get:fieldKeyFormat",this.getFieldKeyFormat,this)},initMergeTags:function(e){var t=i.channel("mergeTags").request("get:view"),n=this;this.jBoxes={};var n=this;jQuery(e.el).find(".merge-tags").each(function(){if("undefined"==typeof jQuery(this).data("jBox-id")){var i=jQuery(this).jBox("Tooltip",{title:"Insert Merge Tag",trigger:"click",position:{x:"center",y:"bottom"},closeOnClick:"body",closeOnEsc:!0,theme:"TooltipBorder",maxHeight:200,onOpen:function(){t.reRender(e.model),this.setContent(jQuery(".merge-tags-content"));var i=jQuery(this.target).prev(".setting");0==i.length&&(i=jQuery(e.el).find(".setting")),n.updateCurrentSetting(e.model),n.updateCurrentElement(i)},onClose:function(){}});jQuery(this).data("jBox-id",i.id)}})},clickMergeTag:function(e,t){if("undefined"!=typeof this.settingModel.get("settingModel")&&"calculations"==this.settingModel.get("settingModel").get("name")){console.log(t);var n=jQuery(this.currentElement).val(),i=jQuery(this.currentElement).caret(),r=i+t.get("tag").length,a="undefined"!=typeof t.get("calcTag")?t.get("calcTag"):t.get("tag");n=n.substr(0,i)+a+n.substr(i),jQuery(this.currentElement).val(n).caret(r).trigger("change")}else if("rte"==this.settingModel.get("type"))jQuery(this.currentElement).summernote("insertText",t.get("tag"));else{var n=jQuery(this.currentElement).val(),i=jQuery(this.currentElement).caret(),r=i+t.get("tag").length;n=n.substr(0,i)+t.get("tag")+n.substr(i),jQuery(this.currentElement).val(n).caret(r).trigger("change")}},addFieldTags:function(e){"submit"!==e.get("type")&&this.tagSectionCollection.get("fields").get("tags").add({id:e.get("id"),label:e.get("label"),tag:this.getFieldKeyFormat(e.get("key")),calcTag:this.getFieldKeyFormatCalc(e.get("key"))})},deleteFieldTags:function(e){var t=e.get("id"),n=this.tagSectionCollection.get("fields").get("tags").get(t);this.tagSectionCollection.get("fields").get("tags").remove(n)},updateCalcTags:function(t){var n=new e,r=i.channel("app").request("get:formModel"),a=r.get("settings").get("calculations");_.each(a.models,function(e){n.add({label:e.get("name"),tag:"{calc:"+e.get("name")+"}"})}),this.tagSectionCollection.get("calcs").set("tags",n)},openMergeTags:function(e){"TEXTAREA"!=jQuery(e.target)[0].tagName&&"INPUT"!=jQuery(e.target)[0].tagName||jQuery(e.target).parent().find(".merge-tags").click()},returnMergeTags:function(e){if(this.open){e.preventDefault();var t=this.fields.where({active:!0})[0];t&&this.clickMergeTag(e,t)}},upMergeTags:function(e){this.open&&(e.preventDefault(),this.changeActiveTag("up"))},downMergeTags:function(e){this.open&&(e.preventDefault(),this.changeActiveTag("down"))},changeActiveTag:function(e){if("down"==e)var t=1;else var t=-1;if(0<this.fields.where({active:!0}).length){var n=this.fields.where({active:!0})[0],i=this.fields.indexOf(n);n.set("active",!1);var r=this.fields.models[i+t];r&&r.set("active",!0)}else 0<this.fields.where({active:!0})?console.log("system"):0<this.userInfo.where({active:!0})?console.log("userinfo"):0<this.fields.models.length?this.fields.models[0].set("active",!0):this.system.models[0].set("active",!0)},updateCurrentElement:function(e){this.currentElement=e},updateCurrentSetting:function(e){this.settingModel=e},getCollection:function(){return this.tagSectionCollection},getSectionModel:function(e){return this.tagSectionCollection.get(e)},updateOpen:function(e){this.open=e,_.each(this.tagSectionCollection.get("fields").models,function(e){e.set("active",!1)})},updateKey:function(e){var t=e.get("key"),n=this.tagSectionCollection.get("fields").get("tags").get(e.get("id"));"undefined"!=typeof n&&n.set("tag",this.getFieldKeyFormat(t))},getFieldKeyFormat:function(e){return"{field:"+e+"}"},getFieldKeyFormatCalc:function(e){return"{field:"+e+":calc}"},replaceFieldKey:function(e,t,n){var i=this.getFieldKeyFormat(t._previousAttributes.key),r=this.getFieldKeyFormat(t.get("key")),a=n.get("name"),s=e.get(a);if("calculations"==a&&"undefined"!=typeof e.get("calculations")){var o=e.get("calculations");return o.each(function(e){var t=i.slice(0,i.length-1)+":calc}",n=r.slice(0,r.length-1)+":calc}";if(s=e.get("eq"),"string"==typeof s){var a=new RegExp(t,"g"),o=s.replace(a,n);a=new RegExp(i,"g"),o=o.replace(a,r),e.set("eq",o)}}),!1}if("string"==typeof s){var l=new RegExp(i,"g");newVal=s.replace(l,r),e.set(a,newVal)}}});return t}),n("models/app/mergeTagLookupCollection",["models/app/mergeTagModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/app/drawer/mergeTag",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tag-box-tag",events:{click:"insertTag"},insertTag:function(){i.channel("mergeTags").request("insert:tag",this.model.get("tag"))}});return e}),n("views/app/drawer/mergeTagList",["views/app/drawer/mergeTag"],function(e){var t=Marionette.CollectionView.extend({tagName:"ul",childView:e,initialize:function(){i.channel("merge-tags").reply("update:taglist",this.sectionFilter,this),i.channel("merge-tags").reply("filtersearch",this.searchFilter,this)},filter:function(e,t,n){return"fields"==e.get("section")},sectionFilter:function(e){this.filter=function(t,n,i){return e==t.get("section")},this.render(),i.channel("merge-tags").trigger("after:filtersearch")},searchFilter:function(e){this.filter=function(t,n,i){var r=t.get("label").toLowerCase().indexOf(e.toLowerCase().replace(":",""))>=0,a=t.get("tag").toLowerCase().indexOf(e.toLowerCase())>=0;return r||a},this.render(),i.channel("merge-tags").trigger("after:filtersearch")}});return t}),n("views/app/drawer/mergeTagGroup",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tag-box-section",events:{click:"onClick"},initialize:function(){this.listenTo(i.channel("merge-tags"),"after:filtersearch",this.removeActive)},onClick:function(){this.updateTags(),this.setActive()},updateTags:function(){i.channel("merge-tags").request("update:taglist",this.model.get("id"))},setActive:function(){this.$el.addClass("active"),this.$el.siblings().removeClass("active")},removeActive:function(){this.$el.removeClass("active")}});return e}),n("views/app/drawer/mergeTagGroupList",["views/app/drawer/mergeTagGroup"],function(e){var t=Marionette.CollectionView.extend({tagName:"ul",childView:e,initialize:function(){this.listenTo(i.channel("merge-tags"),"open",this.render,this)},filter:function(e,t,n){return 0<e.get("tags").length}});return t}),n("views/app/drawer/mergeTagFilter",[],function(){var e=Marionette.ItemView.extend({template:"#tmpl-nf-merge-tag-box-filter",events:{"keyup input":"updateFilter"},updateFilter:function(e){if(13==e.keyCode){var t=jQuery("#merge-tags-box .merge-tag-list ul li span").first().data("tag");return i.channel("mergeTags").request("insert:tag",t),jQuery("#merge-tags-box").css("display","none"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}var n=this.$el.find("input").val();i.channel("merge-tags").request("filtersearch",n)}});return e}),n("views/app/drawer/mergeTagBox",[],function(){var e=Marionette.LayoutView.extend({el:"#merge-tags-box",template:"#tmpl-nf-merge-tag-box",regions:{filter:".merge-tag-filter",sections:".merge-tag-sections",tags:".merge-tag-list"}});return e}),n("controllers/app/mergeTagBox",["models/app/mergeTagModel","models/app/mergeTagLookupCollection","views/app/drawer/mergeTag","views/app/drawer/mergeTagList","views/app/drawer/mergeTagGroup","views/app/drawer/mergeTagGroupList","views/app/drawer/mergeTagFilter","views/app/drawer/mergeTagBox"],function(e,t,n,r,a,s,o,l){var c=Marionette.Object.extend({caret:0,old:"",initialize:function(){this.listenTo(i.channel(" app"),"after:appStart",this.afterAppStart),this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting),this.listenTo(i.channel("drawer"),"before:close",this.beforeDrawerClose),this.listenTo(i.channel("drawer"),"opened",function(){jQuery(".merge-tags").on("click",this.mergeTagsButtonClick)});var e=this;i.channel("mergeTags").reply("set:caret",function(t){e.caret=t}),i.channel("mergeTags").reply("get:caret",function(){4 return e.caret});var e=this;i.channel("mergeTags").reply("set:old",function(t){e.old=t}),i.channel("mergeTags").reply("get:old",function(){return e.old}),i.channel("mergeTags").reply("insert:tag",this.insertTag.bind(this)),this.listenTo(i.channel("option-repeater"),"add:option",function(t){var n="#"+t.cid+" .has-merge-tags input.setting";jQuery(n).on("focus",function(t){e.focusCallback(t,n,"option-repeater")}),jQuery(n).on("keyup",function(t){e.keyupCallback(t,n,"option-repeater")}),jQuery(n).siblings(".merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("setting-calculations-option"),"render:setting",this.renderSetting),this.listenTo(i.channel("setting-calculations-option"),"render:setting",function(e,t,n){n.$el.find(".merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("summernote"),"focus",function(t,n){e.focusCallback(!1,n,"rte")}),this.listenTo(i.channel("summernote"),"keydown",function(e,t){jQuery(t).closest(".nf-setting").find(".setting").summernote("saveRange")}),this.listenTo(i.channel("summernote"),"keyup",function(t,n){e.keyupCallback(t,n,"rte")}),jQuery(document).on("keyup",function(e){27==e.keyCode&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").blur(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))})},afterAppStart:function(){var e=i.channel("mergeTags").request("get:collection"),n=[];e.each(function(e){e.get("tags").each(function(t){n.push({label:t.get("label"),tag:t.get("tag"),section:e.get("id")})})});var a=new l;a.render();var c=new t(n),d=new r({collection:c}),h=new s({collection:e});a.getRegion("tags").show(d),a.getRegion("sections").show(h),a.getRegion("filter").show(new o);var u=this;this.listenTo(i.channel("mergeTags"),"open",function(){u.afterAppStart()})},beforeRenderSetting:function(e,t){if("undefined"!=typeof e.get("use_merge_tags")&&e.get("use_merge_tags")){var n=e.get("name");this.listenTo(i.channel("setting-"+n),"render:setting",this.renderSetting)}},renderSetting:function(e,t,n){n.$el.find(".merge-tags").on("click",this.mergeTagsButtonClick),0==jQuery("#merge-tags-box").length&&this.afterAppStart(),jQuery("#nf-drawer").on("scroll",function(){if(0!=jQuery(".merge-tag-focus").length){var e=jQuery(".merge-tag-focus").closest(".nf-setting").find(".note-editor");if(0!=e.length)var t=e.offset().top-jQuery(window).scrollTop(),n=e.outerHeight();else var t=jQuery(".merge-tag-focus").offset().top-jQuery(window).scrollTop(),n=jQuery(".merge-tag-focus").outerHeight();jQuery("#merge-tags-box").css("top",t+n);var i=jQuery("#merge-tags-box").outerHeight();jQuery("#nf-drawer").css("padding-bottom",i+"px");var r=jQuery(".merge-tag-focus").closest(".nf-list-options-tbody");if(0!=r.length){var a=r.offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",a)}else{var s=jQuery(".merge-tag-focus").closest(".nf-settings").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",s),jQuery("#merge-tags-box").css("width",jQuery(".merge-tag-focus").closest(".nf-settings").width())}}}),jQuery(n.el).find(".setting").on("focus",this.focusCallback),jQuery(n.el).find(".setting").on("keyup",this.keyupCallback)},beforeDrawerClose:function(){jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),i.channel("mergeTags").trigger("open")},insertTag:function(e){var t=jQuery(".merge-tag-focus");if(0!=t.closest(".nf-setting").first().find(".note-editable").length&&(t=t.closest(".nf-setting").first().find(".note-editable")),1<t.length&&(t=t.first()),t.hasClass("note-editable"))var n=t.closest(".nf-setting").find(".setting").summernote("code");else var n=t.val();for(var r=i.channel("mergeTags").request("get:old"),a=e,s=i.channel("mergeTags").request("get:caret"),o=/{([a-z0-9]|:|_|})*/g;match=o.exec(n);)if(r==match[0]){var l=n.slice(0,match.index)+a+n.slice(o.lastIndex);if(t.hasClass("note-editable")){t.closest(".nf-setting").find(".setting").summernote("code",l);var c=t,d=null;_.each(c[0].childNodes,function(e,t){if(!d&&(e.nodeValue||e.innerHTML)){if(e.nodeValue)var n=e.nodeValue.indexOf(a)+r.length;else if(e.innerHTML)var n=e.innerHTML.indexOf(a)+r.length;s==n&&(d=c[0].childNodes[t])}}),d||(d=c[0].childNodes[0]);var h=s-r.length+a.length,u=document.createRange(),g=window.getSelection();if(0!=d.childNodes.length)try{u.setStart(d.childNodes[0],h)}catch(e){console.log("error")}else try{u.setStart(d,h)}catch(e){console.log("error")}u.collapse(!0),g.removeAllRanges(),g.addRange(u)}else t.val(l),t.change(),t.caret(s-r.length+a.length)}jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),t.removeClass("merge-tag-focus"),t.closest(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")},mergeTagsButtonClick:function(e){var t=jQuery(this);if(t.siblings().hasClass("merge-tag-focus"))return i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay");var n=t.siblings(".setting").first();if(0!==t.closest(".nf-setting, .nf-table-row").find(".note-tools").length)t.closest(".nf-setting").find(".setting").summernote("insertText","{");else{var r=n.val()||"";n.val(r+"{").change(),i.channel("mergeTags").request("set:caret",r.length+1)}t.parent().hasClass("note-tools"),i.channel("mergeTags").request("set:old","{"),n.addClass("merge-tag-focus");var a=t.attr("autocomplete");t.attr("autocomplete","off"),t.data("autocomplete",a);var s=t.closest(".nf-setting, .nf-table-row");0!=s.find(".note-editor").length?s.find(".note-editor").addClass("merge-tag-focus-overlay"):s.addClass("merge-tag-focus-overlay"),jQuery("#merge-tags-box").css("display","block"),i.channel("drawer").request("prevent:close"),jQuery(".merge-tag-focus-overlay").on("click",function(e){jQuery(e.target).hasClass("note-editor")&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))}),setTimeout(function(){jQuery("#merge-tags-box").find(".merge-tag-filter").find("input").focus()},500)},focusCallback:function(e,t,n){var n=n||"setting",i="undefined"==typeof t?jQuery(this):jQuery(t);if(jQuery(".merge-tag-focus").each(function(e,t){this!=t&&t.removeClass("merge-tag-focus")}),"rte"==n)var r=i.closest(".nf-setting").find(".note-editor").offset().top-jQuery(window).scrollTop(),a=i.closest(".nf-setting").find(".note-editor").outerHeight();else var r=i.offset().top-jQuery(window).scrollTop(),a=i.outerHeight();jQuery("#merge-tags-box").css("top",r+a);var s=i.closest(".nf-list-options-tbody");if(0!=s.length){var o=s.offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",o)}else if("rte"==n){var l=i.closest(".nf-setting").find(".note-editor").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",l),jQuery("#merge-tags-box").css("width",i.closest(".nf-setting").find(".note-editor").width())}else{var l=jQuery(this).closest(".nf-settings").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",l),jQuery("#merge-tags-box").css("width",i.closest(".nf-settings").width())}var c=jQuery(this).data("id")},keyupCallback:function(e,t,n){var n=n||"setting";if(13==e.keyCode){var r=jQuery("#merge-tags-box .merge-tag-list ul li span").first().data("tag");return i.channel("mergeTags").request("insert:tag",r),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}if("undefined"!=typeof t)var a=jQuery(t);else var a=jQuery(this);var s=jQuery(this).data("id");if(!s||"eq"==s){if("rte"==n){var o=a.summernote("createRange");if(o)var l=o.so;else var l=0;a.closest(".nf-setting").find(".setting").summernote("saveRange")}else var l=a.caret();if(i.channel("mergeTags").request("set:caret",l),"rte"==n)var c=a.summernote("code").match(new RegExp(/{([a-z0-9]|:|_|})*/g));else var c=a.val().match(new RegExp(/{([a-z0-9]|:|_|})*/g));if(c=_.filter(c,function(e){return-1==e.indexOf("}")}),0!==c.length){i.channel("mergeTags").request("set:old",c[0]),jQuery("#merge-tags-box").css("display","block"),i.channel("drawer").request("prevent:close"),a.addClass("merge-tag-focus");var d=jQuery("#merge-tags-box").outerHeight();jQuery("#nf-drawer").css("padding-bottom",d+"px");var h=a.attr("autocomplete");a.attr("autocomplete","off"),a.data("autocomplete",h);var u=a.closest(".nf-setting, .nf-table-row");0!=u.find(".note-editor").length?u.find(".note-editor").addClass("merge-tag-focus-overlay"):u.addClass("merge-tag-focus-overlay"),u.on("click",function(e){var t=jQuery(e.target).attr("class")||[];-1!==t.indexOf("merge-tag-focus-overlay")&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))});var g=c[0].replace("{","");i.channel("merge-tags").request("filtersearch",g)}else jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}}});return c}),n("controllers/app/itemSettingFill",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t){"fields"==e.get("fill")}});return e}),n("controllers/app/confirmPublish",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:confirmPublish",this.confirmPublish)},confirmPublish:function(){var e=i.channel("app").request("get:formModel");1==e.get("settings").get("add_submit")&&i.channel("fields").request("add",{type:"submit",label:"Submit",order:9999}),e.set("show_publish_options",!1),i.channel("app").request("update:db","publish")}});return e}),n("controllers/app/rte",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-rte").reply("renderOnChange",function(){return!1}),this.listenTo(i.channel("rte"),"init:settingModel",this.initSettingModel),this.listenTo(i.channel("setting-type-rte"),"render:setting",this.renderSetting),this.listenTo(i.channel("setting-type-rte"),"destroy:setting",this.destroySetting),this.listenTo(i.channel("setting-type-rte"),"click:extra",this.clickExtra),this.meta_image_frame,jQuery.summernote.options.icons={align:"dashicons dashicons-editor-alignleft",alignCenter:"dashicons dashicons-editor-aligncenter",alignJustify:"dashicons dashicons-editor-justify",alignLeft:"dashicons dashicons-editor-alignleft",alignRight:"dashicons dashicons-editor-alignright",indent:"dashicons dashicons-editor-indent",outdent:"dashicons dashicons-editor-outdent",bold:"dashicons dashicons-editor-bold",caret:"dashicons dashicons-arrow-down",close:"dashicons dashicons-dismiss",code:"dashicons dashicons-editor-code",eraser:"dashicons dashicons-editor-removeformatting",italic:"dashicons dashicons-editor-italic",link:"dashicons dashicons-admin-links",unlink:"dashicons dashicons-editor-unlink",magic:"dashicons dashicons-editor-paragraph",minus:"dashicons dashicons-minus",orderedlist:"dashicons dashicons-editor-ol",redo:"dashicons dashicons-redo",square:"dashicons fa-square",table:"dashicons dashicons-editor-table",underline:"dashicons dashicons-editor-underline",undo:"dashicons dashicons-undo",unorderedlist:"dashicons dashicons-editor-ul"},this.currentContext={}},initSettingModel:function(e){e.set("hide_merge_tags",!0)},initRTE:function(e,t,n){var r=this,a=function(e){return r.linkButton(e)},s=function(e){return r.mediaButton(e)},o=this.mergeTags(),l=[["paragraphStyle",["style"]],["fontStyle",["bold","italic","underline","clear"]],["lists",["ul","ol"]],["paragraph",["paragraph"]],["customGroup",["linkButton","unlink"]],["table",["table"]],["actions",["undo","redo"]],["tools",["mediaButton","mergeTags","codeview"]]];jQuery(n.el).find("div.setting").summernote({toolbar:l,buttons:{linkButton:a,mergeTags:o,mediaButton:s},height:150,codemirror:{theme:"monokai",lineNumbers:!0,callbacks:{onBlur:function(n){var i=n.getValue();r.updateDataModel(e,t,i)}}},prettifyHtml:!0,callbacks:{onBlur:function(n,a){var s=jQuery(this).summernote("code");r.updateDataModel(e,t,s),i.channel("summernote").trigger("blur",e,t,s)},onFocus:function(e,t){i.channel("summernote").trigger("focus",e,this,t)},onKeydown:function(e,t){i.channel("summernote").trigger("keydown",e,this,t)},onKeyup:function(e,t){i.channel("summernote").trigger("keyup",e,this,t)}}})},updateDataModel:function(e,t,n){var r=e.get("name"),a=t.get(r),s=n,o={attr:r,before:a,after:s},l={object:t.get("objectType"),label:t.get("label"),change:"Changed "+e.get("label")+" from "+a+" to "+s};i.channel("changes").request("register:change","changeSetting",t,o,l),t.set(e.get("name"),s)},renderSetting:function(e,t,n){this.initRTE(e,t,n);var i=jQuery(n.el).find(".link-button").next(".dropdown-menu").find("button");i.replaceWith(function(){return jQuery("<div/>",{class:jQuery(i).attr("class"),html:this.innerHTML})})},destroySetting:function(e,t,n){this.removeRTE(e,t,n)},removeRTE:function(e,t,n){jQuery(n.el).find("div.setting").summernote("destroy")},drawerOpened:function(e,t,n){this.initRTE(e,t,n)},linkButton:function(e){var t=this,n=jQuery.summernote.ui,r=i.channel("app").request("get:template","#tmpl-nf-rte-link-button"),a=i.channel("app").request("get:template","#tmpl-nf-rte-link-dropdown");return n.buttonGroup([n.button({className:"dropdown-toggle link-button",contents:r({}),tooltip:"Insert Link",click:function(n){t.clickLinkButton(n,e)},data:{toggle:"dropdown"}}),n.dropdown([n.buttonGroup({children:[n.button({contents:a({}),tooltip:""})]})])]).render()},mergeTags:function(e){var t=jQuery.summernote.ui,n=i.channel("app").request("get:template","#tmpl-nf-rte-merge-tags-button");return t.button({className:"dropdown-toggle merge-tags",contents:n({}),tooltip:"Merge Tags"}).render()},mediaButton:function(e){var t=this,n=jQuery.summernote.ui,r=i.channel("app").request("get:template","#tmpl-nf-rte-media-button");return n.button({className:"dropdown-toggle",contents:r({}),tooltip:"Insert Media",click:function(n){t.openMediaManager(n,e)}}).render()},openMediaManager:function(e,t){if(t.invoke("editor.createRange"),t.invoke("editor.saveRange"),this.currentContext=t,this.meta_image_frame)return void this.meta_image_frame.open();this.meta_image_frame=wp.media.frames.meta_image_frame=wp.media({title:"Select a file",button:{text:"insert"}});var n=this;this.meta_image_frame.on("select",function(){var e=n.meta_image_frame.state().get("selection").first().toJSON();n.insertMedia(e,t)}),this.meta_image_frame.open()},clickLinkButton:function(e,t){var n=t.invoke("editor.createRange");t.invoke("editor.saveRange");var i=n.toString();this.currentContext=t,jQuery(e.target).closest(".note-customGroup > .note-btn-group").on("hide.bs.dropdown",function(e){return!1}),jQuery(e.target).closest(".note-customGroup > .note-btn-group").on("shown.bs.dropdown",function(e){jQuery(e.target).parent().parent().find(".link-text").val(i),jQuery(e.target).parent().parent().find(".link-url").focus()})},clickExtra:function(e,t,n,i){var r=jQuery(e.target).parent().find(".link-text"),a=jQuery(e.target).parent().find(".link-url"),s=jQuery(e.target).parent().find(".link-new-window");if(this.currentContext.invoke("editor.restoreRange"),jQuery(e.target).hasClass("insert-link")){var o=r.val(),l=a.val(),c=!!s.prop("checked");0!=o.length&&0!=l.length&&this.currentContext.invoke("editor.createLink",{text:o,url:l,isNewWindow:c})}r.val(""),a.val(""),s.prop("checked",!1),jQuery(e.target).closest("div.note-btn-group.open").removeClass("open")},insertMedia:function(e,t){this.currentContext.invoke("editor.restoreRange"),"image"==e.type?this.currentContext.invoke("editor.insertImage",e.url):this.currentContext.invoke("editor.createLink",{text:e.filename,url:e.url})}});return e}),n("controllers/app/settingFieldSelect",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("field-select"),"init:settingModel",this.trackKeyChanges),this.listenTo(i.channel("setting-type-field-select"),"before:renderSetting",this.beforeRender),this.listenTo(i.channel("field-select"),"init:settingModel",function(){this.listenTo(i.channel("app"),"change:setting",this.maybeSwitchToFieldsDomain)}),this.listenTo(i.channel("app"),"change:currentDomain",this.autoOpenDrawer),this.listenTo(i.channel("drawer"),"opened",this.filterDrawerContents),this.listenTo(i.channel("drawer"),"closed",this.SwitchToFieldsDomain)},trackKeyChanges:function(e){e.listenTo(i.channel("app"),"update:fieldKey",e.updateKey),this.listenTo(i.channel("app"),"replace:fieldKey",this.updateFieldMap)},updateFieldMap:function(e,t,n){var i=t._previousAttributes.key,r=t.get("key");"field-select"==n.get("type")&&e.get(n.get("name"))==i&&e.set(n.get("name"),r)},beforeRender:function(e,t){var n=i.channel("fields").request("get:collection"),r=e.get("field_types"),a=[{label:"--",value:0}];_.each(n.models,function(n){if(t.cid!=n.cid&&("undefined"==typeof r||0==r.length||_.contains(r,n.get("type")))){var i=e.get("field_filter");if(i&&"undefined"!=typeof i[n.get("type")]){var s=!1;if(_.each(i[n.get("type")],function(e,t){console.log(e+":"+n.get(t)),e!=n.get(t)&&(s=!0)}),s)return}var o=n.get("key");switch(e.get("field_value_format")){case"key":o=n.get("key");break;case"merge_tag":default:o="{field:"+n.get("key")+"}"}a.push({label:n.get("label"),value:o})}}),"undefined"!=typeof r&&0!=r.length&&_.each(r,function(e){var t=i.channel("fields").request("get:type",e);a.push({label:"-- Add "+t.get("nicename")+" Field",value:"addField:"+e})}),e.set("options",a)},maybeSwitchToFieldsDomain:function(e,t,n){if("field-select"==t.get("type")){var r=t.get("name"),a=n.get(r);if(a){var s=a.split(":");"addField"==s[0]&&(this.openDrawer="addField",this.filterDrawer=s[1],n.set(r,""),this.switchDomain=!0,i.channel("app").request("close:drawer"))}}},SwitchToFieldsDomain:function(){if(this.switchDomain){var e=i.channel("app").request("get:domainModel","fields");i.channel("app").request("change:currentDomain",null,e),this.switchDomain=null}},autoOpenDrawer:function(){this.openDrawer&&(i.channel("app").request("open:drawer",this.openDrawer),this.openDrawer=null)},filterDrawerContents:function(){this.filterDrawer&&(i.channel("drawer-addField").trigger("change:filter",this.filterDrawer),this.filterDrawer=null)}});return e}),n("controllers/app/settingFieldList",["views/app/drawer/typeSettingFieldset","models/app/settingCollection"],function(e,t){return Marionette.Object.extend({fieldListSettings:[],initialize:function(){this.listenTo(i.channel("field-list"),"init:settingModel",this.registerFieldListSettings),this.listenTo(i.channel("fields"),"update:setting",this.updateFieldListSettingKeys),i.channel("field-list").reply("get:settingChildView",this.getSettingChildView,this)},registerFieldListSettings:function(e){this.fieldListSettings.push(e.get("name"))},updateFieldListSettingKeys:function(e){if("undefined"!=typeof e.changed.key){var t=e._previousAttributes.key,n=e.changed.key,i=this;_.each(Backbone.Radio.channel("actions").request("get:collection").models,function(e){_.each(e.attributes,function(r,a){var s="";_.each(i.fieldListSettings,function(i){if(a==i+"-"+t&&s!=t){var r=e.get(i+"-"+t);e.set(i+"-"+n,r),e.set(i+"-"+t,0),s=t}})})})}},getSettingChildView:function(n){var r=_.filter(i.channel("fields").request("get:collection").models,function(e){return _.contains(n.get("field_types"),e.get("type"))}),a=_.map(r,function(e){return{name:n.get("name")+"-"+e.get("key"),type:"toggle",label:e.get("label"),width:"full"}});return n.set("settings",new t(a)),e}})}),n("controllers/app/settingHTML",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-html"),"before:renderSetting",this.init)},init:function(e,t){"undefined"!=e.get("mirror")&&t.on("change:"+e.get("mirror"),this.update,e)},update:function(e,t){e.set(this.get("name"),t)}});return e}),n("controllers/app/settingColor",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-color").reply("renderOnChange",this.setRenderFalse),this.listenTo(i.channel("setting-type-color"),"destroy:setting",this.closeColorPickers),this.listenTo(i.channel("setting-type-color"),"render:setting",this.initColorPicker)},initColorPicker:function(e,t,n){var r=(e.get("name"),jQuery(n.el).find("input"));jQuery(r).wpColorPicker({change:function(n,r){i.channel("app").request("change:setting",n,e,t,r.color.toString())}})},setRenderFalse:function(){return!1},closeColorPickers:function(e,t,n){jQuery(n.el).find(".wp-color-picker").wpColorPicker("close")}});return e}),n("controllers/app/changeMenu",[],function(){var e=Marionette.Object.extend({editFormText:"",initialize:function(){this.editFormText=nfAdmin.editFormText||"Edit Form",this.listenTo(i.channel("app"),"after:appStart",this.changeMenu),this.listenTo(i.channel("app"),"response:updateDB",this.formPublish)},changeMenu:function(){var e=i.channel("app").request("get:formModel");this.isNewForm(e.id)?this.highlightAddNew():this.appendEditForm()},isNewForm:function(e){return isNaN(e)},highlightAddNew:function(){jQuery(".wp-submenu li").removeClass("current"),jQuery('a[href="admin.php?page=ninja-forms&form_id=new"]').parent().addClass("current")},appendEditForm:function(){var e='<li class="current"><a href="#">'+this.editFormText+"</a></li>";0==jQuery('li a:contains("'+this.editFormText+'")').length&&(jQuery(".wp-submenu li").removeClass("current"),jQuery('a[href="admin.php?page=ninja-forms&form_id=new"]').parent().after(e))},formPublish:function(e){return"publish"===e.action&&void this.changeMenu()}});return e}),n("controllers/app/mobile",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:menu",this.closeMobileMenu)},closeMobileMenu:function(){var e=i.channel("app").request("get:builderEl");jQuery(e).removeClass("nf-menu-expand")}});return e}),n("controllers/app/notices",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("notices").reply("add",this.addNotice,this),i.channel("notices").reply("close",this.closeNotice,this),this.notices={}},addNotice:function(e,t,n){var r={content:t,color:"green",zIndex:12e3,constructOnInit:!0,stack:!0,animation:{open:"flip",close:"flip"}},a={position:{x:"center",y:"top"},animation:{open:"slide:top",close:"slide:left"},autoClose:2e3,offset:{x:0,y:55}},s={attributes:{x:"left",y:"bottom"},autoClose:4e3};if(i.channel("app").request("is:mobile"))var o=a;else var o=s;o=jQuery.extend(o,r);var n=jQuery.extend(o,n);this.notices[e]=new jBox("Notice",n)},closeNotice:function(e){"undefined"!=typeof this.notices[e]&&this.notices[e].close()},openNotice:function(e){"undefined"!=typeof this.notices[e]&&this.notices[e].open()}});return e}),n("controllers/app/unloadCheck",[],function(){var e=Marionette.Object.extend({initialize:function(){jQuery(window).bind("beforeunload",this.maybePrompt)},maybePrompt:function(e){if(!i.channel("app").request("get:setting","clean"))return"You have unsaved changes."}});return e}),n("controllers/app/formContentFilters",[],function(){var e=Marionette.Object.extend({initialize:function(){this.viewFilters=[],this.saveFilters=[],this.loadFilters=[],i.channel("formContent").reply("add:viewFilter",this.addViewFilter,this),i.channel("formContent").reply("add:saveFilter",this.addSaveFilter,this),i.channel("formContent").reply("add:loadFilter",this.addLoadFilter,this),i.channel("formContent").reply("get:viewFilters",this.getViewFilters,this),i.channel("formContent").reply("get:saveFilters",this.getSaveFilters,this),i.channel("formContent").reply("get:loadFilters",this.getLoadFilters,this),i.channel("fieldContents").reply("add:viewFilter",this.addViewFilter,this),i.channel("fieldContents").reply("add:saveFilter",this.addSaveFilter,this),i.channel("fieldContents").reply("add:loadFilter",this.addLoadFilter,this),i.channel("fieldContents").reply("get:viewFilters",this.getViewFilters,this),i.channel("fieldContents").reply("get:saveFilters",this.getSaveFilters,this),i.channel("fieldContents").reply("get:loadFilters",this.getLoadFilters,this)},addViewFilter:function(e,t){this.viewFilters[t]=e},getViewFilters:function(){return this.viewFilters},addSaveFilter:function(e,t){this.saveFilters[t]=e},getSaveFilters:function(){return this.saveFilters},addLoadFilter:function(e,t){this.loadFilters[t]=e},getLoadFilters:function(){return this.loadFilters}});return e}),n("controllers/app/formContentGutterFilters",[],function(){var e=Marionette.Object.extend({initialize:function(){this.leftFilters=[],this.rightFilters=[],i.channel("formContentGutters").reply("add:leftFilter",this.addLeftFilter,this),i.channel("formContentGutters").reply("add:rightFilter",this.addRightFilter,this),i.channel("formContentGutters").reply("get:leftFilters",this.getLeftFilters,this),i.channel("formContentGutters").reply("get:rightFilters",this.getRightFilters,this)},addLeftFilter:function(e,t){this.leftFilters[t]=e},addRightFilter:function(e,t){this.rightFilters[t]=e},getLeftFilters:function(){return this.leftFilters},getRightFilters:function(){return this.rightFilters}});return e}),n("controllers/app/cloneCollectionDeep",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("clone:collectionDeep",this.cloneCollectionDeep,this)},cloneCollectionDeep:function(e){var t=[];return _.each(e.models,function(e){var n=i.channel("app").request("clone:modelDeep",e);t.push(n)}),new e.constructor(t,e.options)}});return e}),n("controllers/app/trackKeyDown",[],function(){var e=Marionette.Object.extend({keys:[],initialize:function(){var e=this;jQuery(document).on("keydown",function(t){e.keyDown(t,e)}),jQuery(document).on("keyup",function(t){e.keyUp(t,e)}),i.channel("app").reply("get:keydown",this.getKeyDown,this)},keyDown:function(e,t){t.keys[e.keyCode]=e.keyCode},keyUp:function(e,t){-1!=t.keys.indexOf(e.keyCode)&&delete t.keys[e.keyCode]},getKeyDown:function(){return this.keys}});return e}),n("controllers/app/perfectScroll",[],function(){var e=Marionette.Object.extend({movedPos:!1,initialize:function(){this.listenTo(i.channel("main"),"show:main",this.initPerfectScroll),this.listenTo(i.channel("drawer"),"opened",this.moveRail),this.listenTo(i.channel("drawer"),"before:closeDrawer",this.resetRail)},initPerfectScroll:function(e){i.channel("app").request("is:mobile")||jQuery(e.el).parent().perfectScrollbar({suppressScrollX:!0}),jQuery("head").append('<style id="ps-scrollbar-css" type="text/css"></style>')},moveRail:function(){var e=i.channel("app").request("get:drawerEl"),t=jQuery(e).outerWidth();jQuery("#ps-scrollbar-css").text(".ps-scrollbar-moved { right: "+t+"px !important; } "),jQuery("#nf-main .ps-scrollbar-y-rail").addClass("ps-scrollbar-moved ")},resetRail:function(){jQuery(".ps-scrollbar-y-rail").removeClass("ps-scrollbar-moved ")}});return e}),n("models/app/settingGroupModel",["models/app/settingCollection"],function(e){var t=Backbone.Model.extend({defaults:{display:!1},initialize:function(t){0==this.get("settings")instanceof Backbone.Collection&&this.set("settings",new e(this.get("settings")))}});return t}),n("models/app/settingGroupCollection",["models/app/settingGroupModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/app/getNewSettingGroupCollection",["models/app/settingGroupCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){i.channel("app").reply("get:settingGroupCollectionDefinition",this.getNewSettingGroupCollection,this)},getNewSettingGroupCollection:function(){return e}});return t}),n("controllers/app/settingMedia",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-media"),"click:extra",this.clickExtra)},clickExtra:function(e,t,n,i){var r=jQuery(e.target).parent().find(".setting");if(jQuery(e.target).hasClass("open-media-manager")){if(this.meta_image_frame)return void this.meta_image_frame.open();this.meta_image_frame=wp.media.frames.meta_image_frame=wp.media({title:"Select a file",button:{text:"insert"}});var a=this;this.meta_image_frame.on("select",function(){var e=a.meta_image_frame.state().get("selection").first().toJSON();r.val(e.url).change()}),this.meta_image_frame.open()}}});return e}),n("models/app/typeModel",["models/app/settingGroupCollection"],function(e){var t=Backbone.Model.extend({initialize:function(){!1==this.get("settingGroups")instanceof Backbone.Collection&&this.set("settingGroups",new e(this.get("settingGroups"))),i.channel("fields").trigger("init:typeModel",this)}});return t}),n("models/app/typeCollection",["models/app/typeModel"],function(e){var t=Backbone.Collection.extend({model:e,type:!1,initialize:function(e,t){_.each(t,function(e,t){this[t]=e},this)}});return t}),n("models/fields/typeSectionModel",[],function(){var e=Backbone.Model.extend({defaults:{classes:""}});return e}),n("models/fields/typeSectionCollection",["models/fields/typeSectionModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/fields/types",["models/app/typeCollection","models/fields/typeSectionCollection"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.sections=new t(fieldTypeSections),this.listenTo(i.channel("fields"),"init:typeModel",this.registerSection),this.collection=new e(fieldTypeData,{type:"fields"}),i.channel("fields").reply("get:type",this.getFieldType,this),i.channel("fields").reply("get:typeCollection",this.getTypeCollection,this),i.channel("fields").reply("get:typeSections",this.getTypeSections,this),i.channel("fields").reply("get:savedFields",this.getSavedFields,this),this.listenTo(i.channel("drawer"),"click:fieldType",this.addField)},registerSection:function(e){"fields"==e.collection.type&&e.get("section")&&this.sections.get(e.get("section")).get("fieldTypes").push(e.get("id"))},getFieldType:function(e){return this.collection.get(e)},getTypeCollection:function(e){return this.collection},addField:function(e){var t=jQuery(e.target).data("id");if(e.shiftKey)return void i.channel("fields").request("add:stagedField",t);var n=i.channel("fields").request("add",{type:t,label:i.channel("fields").request("get:type",t).get("nicename")}),r={object:"Field",label:n.get("label"),change:"Added",dashicon:"plus-alt"},a={collection:i.channel("fields").request("get:collection")};i.channel("changes").request("register:change","addObject",n,null,r,a),i.channel("fields").request("redraw:collection")},getTypeSections:function(){return this.sections},getSavedFields:function(){this.sections.get("saved")}});return n}),n("controllers/fields/fieldTypeDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:type",this.startDrag),this.listenTo(i.channel("drawer-addField"),"stopDrag:type",this.stopDrag),i.channel("drawer-addField").reply("get:typeHelperClone",this.getCurrentDraggableHelperClone,this)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"), 5 this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important"),this.draggableHelperClone=jQuery(t.helper).clone()},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")},getCurrentDraggableHelperClone:function(){return this.draggableHelperClone}});return e}),n("controllers/fields/stagingDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:fieldStaging",this.startDrag),this.listenTo(i.channel("drawer-addField"),"stopDrag:fieldStaging",this.stopDrag)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important");var n=i.channel("fields").request("get:staging"),r=i.channel("app").request("get:template","#tmpl-nf-staged-fields-drag");jQuery(t.helper).html(r({num:n.models.length})),jQuery(t.helper).prop("id","nf-staged-fields-drag"),jQuery(t.item).css("opacity","0.7")},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")}});return e}),n("controllers/fields/staging",["models/fields/stagingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e,i.channel("fields").reply("add:stagedField",this.addStagedField,this),i.channel("fields").reply("remove:stagedField",this.removeStagedField,this),i.channel("fields").reply("get:staging",this.getStagingCollection,this),i.channel("fields").reply("sort:staging",this.sortStagedFields,this),i.channel("fields").reply("clear:staging",this.clearStagedFields,this),this.listenTo(i.channel("drawer-addField"),"click:removeStagedField",this.removeStagedField),this.listenTo(i.channel("drawer-addField"),"before:closeDrawer",this.beforeCloseDrawer)},getStagingCollection:function(){return this.collection},addStagedField:function(e,t){var t=t||!1,n=i.channel("fields").request("get:type",e),r="nf-staged-field-"+jQuery.now(),a={id:r,slug:n.get("type"),nicename:n.get("nicename"),icon:n.get("icon")},s=this.collection.add(a);return t||i.channel("fields").trigger("add:stagedField",s),r},removeStagedField:function(e,t){this.collection.remove(t),i.channel("fields").trigger("remove:stagedField",t)},beforeCloseDrawer:function(){if(0!=this.collection.models.length){var e=i.channel("fields").request("get:collection");_.each(this.collection.models,function(t){var n=i.channel("fields").request("get:tmpID"),r={id:n,label:t.get("nicename"),type:t.get("slug")},a=i.channel("fields").request("add",r,!1),s={object:"Field",label:a.get("label"),change:"Added",dashicon:"plus-alt"},o={collection:e};i.channel("changes").request("register:change","addObject",a,null,s,o)}),e.trigger("reset",e),this.collection.reset()}i.channel("fields").request("sort:fields",null,null,!1)},sortStagedFields:function(){var e=i.channel("app").request("get:stagedFieldsEl"),t=jQuery(e).sortable("toArray");_.each(this.collection.models,function(e){var n=e.get("id"),i=t.indexOf(n);e.set("order",i)}),this.collection.sort()},clearStagedFields:function(){this.collection.reset()}});return t}),n("controllers/fields/stagingSortable",["models/fields/stagingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"receive:stagedFields",this.receiveStagedFields),this.listenTo(i.channel("drawer-addField"),"over:stagedFields",this.overStagedFields),this.listenTo(i.channel("drawer-addField"),"out:stagedFields",this.outStagedFields),this.listenTo(i.channel("drawer-addField"),"start:stagedFields",this.startStagedFields),this.listenTo(i.channel("drawer-addField"),"stop:stagedFields",this.stopStagedFields)},receiveStagedFields:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.item).data("id"),n=i.channel("fields").request("add:stagedField",t);jQuery(e.helper).prop("id",n),i.channel("fields").request("sort:staging"),jQuery(e.helper).remove(),i.channel("drawer-addField").trigger("drop:fieldType",t)}},addActiveClass:function(){var e=i.channel("app").request("get:stagedFieldsEl");jQuery(e).addClass("nf-droppable-active")},removeActiveClass:function(){var e=i.channel("app").request("get:stagedFieldsEl");jQuery(e).removeClass("nf-droppable-active")},overStagedFields:function(e,t){if(jQuery(t.item).hasClass("nf-field-type-draggable")){var n=jQuery(t.item).data("id"),r=i.channel("fields").request("get:type",n),a=r.get("nicename");this.currentHelper=t.helper,jQuery(t.helper).html(a+'<span class="dashicons dashicons-dismiss"></span>'),jQuery(t.helper).removeClass("nf-field-type-button").addClass("nf-item-dock").css({opacity:"0.8",width:"",height:""});var s=i.channel("app").request("get:stagedFieldsEl");jQuery(s).hasClass("ui-sortable")&&jQuery(s).addClass("nf-droppable-hover")}},outStagedFields:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=i.channel("drawer-addField").request("get:typeHelperClone");jQuery(this.currentHelper).html(jQuery(t).html()),jQuery(this.currentHelper).removeClass("nf-item-dock").addClass("nf-field-type-button");var n=i.channel("app").request("get:stagedFieldsEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}},startStagedFields:function(e){jQuery(e.item).show(),jQuery(e.item).css({display:"inline",opacity:"0.7"}),jQuery(e.helper).css("opacity","0.5")},stopStagedFields:function(e){jQuery(e.item).css("opacity",""),jQuery(e.helper).remove()}});return t}),n("controllers/fields/filterTypes",["models/fields/typeSectionCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"change:filter",this.filterFieldTypes)},filterFieldTypes:function(t,n){if(""!=jQuery.trim(t)){var r=[];_.each(this.filterCollection(t),function(e){r.push(e.get("id"))});var a=new e([{id:"filtered",nicename:"Filtered Fields",fieldTypes:r}]);i.channel("drawer").trigger("filter:fieldTypes",a),"undefined"!=typeof n&&n.addObject&&0<r.length&&(i.channel("fields").request("add:stagedField",r[0]),i.channel("drawer").request("clear:filter"))}else i.channel("drawer").trigger("clear:filter")},filterCollection:function(e){e=e.toLowerCase();var t=i.channel("fields").request("get:typeCollection"),n=t.filter(function(t){var n=!1;return t.get("type").toLowerCase().indexOf(e)!=-1?n=!0:t.get("nicename").toLowerCase().indexOf(e)!=-1&&(n=!0),t.get("tags")&&0==e.indexOf("#")&&_.each(t.get("tags"),function(t){e.replace("#","").length>1&&t.toLowerCase().indexOf(e.replace("#",""))!=-1&&(n=!0)}),t.get("alias")&&_.each(t.get("alias"),function(t){t.toLowerCase().indexOf(e)!=-1&&(n=!0)}),n});return n}});return t}),n("controllers/fields/sortable",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:type",this.addActiveClass),this.listenTo(i.channel("drawer-addField"),"stopDrag:type",this.removeActiveClass),this.listenTo(i.channel("drawer-addField"),"startDrag:fieldStaging",this.addActiveClass),this.listenTo(i.channel("drawer-addField"),"stopDrag:fieldStaging",this.removeActiveClass),i.channel("app").reply("receive:fieldsSortable",this.receiveFieldsSortable,this),i.channel("app").reply("over:fieldsSortable",this.overfieldsSortable,this),i.channel("app").reply("out:fieldsSortable",this.outFieldsSortable,this),i.channel("app").reply("stop:fieldsSortable",this.stopFieldsSortable,this),i.channel("app").reply("start:fieldsSortable",this.startFieldsSortable,this),i.channel("app").reply("update:fieldsSortable",this.updateFieldsSortable,this)},addActiveClass:function(){var e=i.channel("fields").request("get:sortableEl");jQuery(e).addClass("nf-droppable-active")},removeActiveClass:function(){var e=i.channel("fields").request("get:sortableEl");jQuery(e).removeClass("nf-droppable-active")},receiveFieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.item).data("id"),n=this.addField(t,!1);jQuery(e.helper).prop("id",n),i.channel("fields").request("sort:fields"),jQuery(e.helper).remove(),i.channel("fields").trigger("drop:fieldType",t,n)}else if(jQuery(e.item).hasClass("nf-stage")){var r=this;i.channel("fields").request("sort:staging");var a=i.channel("fields").request("get:staging"),s=i.channel("fields").request("get:sortableEl");if(jQuery(s).hasClass("ui-sortable"))var o=jQuery(s).sortable("toArray");else var o=["nf-staged-fields-drag"];var l=o.indexOf("nf-staged-fields-drag");_.each(a.models,function(e,t){var n=r.addField(e.get("slug"));o.splice(l+t,0,n)});var l=o.indexOf("nf-staged-fields-drag");o.splice(l,1),i.channel("fields").request("sort:fields",o),i.channel("fields").request("clear:staging"),jQuery(e.helper).remove()}},addField:function(e,t){t=t||!1;var n=i.channel("fields").request("get:type",e),r=i.channel("fields").request("get:tmpID"),a=i.channel("fields").request("add",{id:r,label:n.get("nicename"),type:e},t),s={object:"Field",label:a.get("label"),change:"Added",dashicon:"plus-alt"},o={collection:i.channel("fields").request("get:collection")};return i.channel("changes").request("register:change","addObject",a,null,s,o),r},overfieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.helper).data("id"),n=i.channel("fields").request("get:type",t),r=n.get("nicename"),a=i.channel("fields").request("get:sortableEl"),s=jQuery(a).width();this.currentHelper=e.helper,jQuery(e.helper).html(r),jQuery(e.helper).removeClass("nf-field-type-button").addClass("nf-field-wrap").css({width:s,height:"50px"}),jQuery(a).hasClass("ui-sortable")&&jQuery(a).addClass("nf-droppable-hover")}else if(jQuery(e.item).hasClass("nf-stage")){var a=i.channel("fields").request("get:sortableEl");jQuery(a).hasClass("ui-sortable")&&jQuery(a).addClass("nf-droppable-hover")}},outFieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=i.channel("drawer-addField").request("get:typeHelperClone");jQuery(this.currentHelper).html(jQuery(t).html()),jQuery(this.currentHelper).removeClass("nf-field-wrap").addClass("nf-field-type-button").css({width:"",height:""});var n=i.channel("fields").request("get:sortableEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}else if(jQuery(e.item).hasClass("nf-stage")){var n=i.channel("fields").request("get:sortableEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}},stopFieldsSortable:function(e){jQuery(e.item).css("opacity",""),jQuery(e.helper).remove(),i.channel("fields").trigger("sortable:stop",e)},startFieldsSortable:function(e){jQuery(e.item).hasClass("nf-field-type-draggable")||jQuery(e.item).hasClass("nf-stage")||jQuery(e.item).css("opacity","0.5").show(),i.channel("fields").trigger("sortable:start",e)},updateFieldsSortable:function(e,t){if(i.channel("fields").request("sort:fields"),!jQuery(e.item).hasClass("nf-field-type-draggable")&&!jQuery(e.item).hasClass("nf-stage")){var n=i.channel("fields").request("get:collection"),r=jQuery(e.item).prop("id").replace("field-",""),a=n.get(r),s={fields:[]};_.each(n.models,function(e){var t=e._previousAttributes.order,n=e.get("order");s.fields.push({model:e,attr:"order",before:t,after:n})});var o={object:"Field",label:a.get("label"),change:"Re-ordered from "+a._previousAttributes.order+" to "+a.get("order"),dashicon:"sort"};i.channel("changes").request("register:change","sortFields",a,null,o,s)}}});return e}),n("controllers/fields/data",["models/fields/fieldCollection","models/fields/fieldModel"],function(e,t){var n=Marionette.Object.extend({adding:!1,removing:!1,initialize:function(){this.collection=new e(preloadedFormData.fields),this.collection.removedIDs={},i.channel("fields").reply("get:collection",this.getFieldCollection,this),i.channel("fields").reply("get:field",this.getField,this),i.channel("fields").reply("redraw:collection",this.redrawFieldCollection,this),i.channel("fields").reply("get:tmpID",this.getTmpFieldID,this),i.channel("fields").reply("add",this.addField,this),i.channel("fields").reply("delete",this.deleteField,this),i.channel("fields").reply("sort:fields",this.sortFields,this),i.channel("fields").reply("get:adding",this.getAdding,this),i.channel("fields").reply("set:adding",this.setAdding,this),i.channel("fields").reply("get:removing",this.getRemoving,this),i.channel("fields").reply("set:removing",this.setRemoving,this)},getFieldCollection:function(){return this.collection},redrawFieldCollection:function(){this.collection.trigger("reset",this.collection)},getField:function(e){return this.collection.findWhere({key:e})?this.collection.findWhere({key:e}):this.collection.get(e)},addField:function(e,n,r,a){if(i.channel("fields").request("set:adding",!0),n=n||!1,a=a||"",r="undefined"==typeof r||r,!1==e instanceof Backbone.Model){"undefined"==typeof e.id&&(e.id=this.getTmpFieldID());var s=new t(e)}else var s=e;if(jQuery.isNumeric(s.get("type"))){var o=i.channel("fields").request("get:type",s.get("type"));s.set("type",o.get("parentType"))}var l=this.collection.add(s,{silent:n});return i.channel("app").request("update:setting","clean",!1),i.channel("fields").trigger("add:field",s),r&&i.channel("fields").trigger("render:newField",l,a),i.channel("fields").trigger("after:addField",s),s},updateFieldSetting:function(e,t,n){var i=this.collection.get(e);i.set(t,n)},sortFields:function(e,t,n){null==n&&(n=!0);var r=i.channel("fields").request("get:sortableEl");if(jQuery(r).hasClass("ui-sortable")){var e=e||jQuery(r).sortable("toArray");_.each(this.collection.models,function(t){var n=(t.get("order"),t.get("id"));if(jQuery.isNumeric(n))var i="field-"+n;else var i=n;var r=e.indexOf(i)+1;t.set("order",r)}),this.collection.sort(),n&&(i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db"))}},deleteField:function(e){i.channel("fields").trigger("delete:field",e),this.removing=!0,this.collection.remove(e),i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db")},getTmpFieldID:function(){var e=this.collection.tmpNum;return this.collection.tmpNum++,"tmp-"+e},getAdding:function(){return this.adding},setAdding:function(e){this.adding=e},getRemoving:function(){return this.removing},setRemoving:function(e){this.removing=e}});return n}),n("models/app/optionRepeaterModel",[],function(){var e=Backbone.Model.extend({defaults:{errors:{}},initialize:function(){this.on("change:errors",this.changeErrors,this)},changeErrors:function(e){if(0==_.size(e.get("errors"))){var t=!1;_.each(e.collection.models,function(e){0!=_.size(e.get("errors"))&&(t=!0)}),t||e.collection.settingModel.set("error",!1)}else e.collection.settingModel.set("error",!0)}});return e}),n("models/app/optionRepeaterCollection",["models/app/optionRepeaterModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order",initialize:function(e,t){this.on("sort",this.changeCollection,this),this.on("add",this.addOption,this),this.settingModel=t.settingModel},changeCollection:function(){i.channel("option-repeater").trigger("sort:options",this),i.channel("option-repeater-"+this.settingModel.get("name")).trigger("sort:options",this)},addOption:function(e,t){e.set("settingModel",this.settingModel)}});return t}),n("views/app/drawer/optionRepeaterError",[],function(){var e=Marionette.ItemView.extend({tagName:"div",className:"nf-error",template:"#tmpl-nf-edit-setting-option-repeater-error",templateHelpers:function(){var e=this;return{renderErrors:function(){return"undefined"!=typeof e.errors?e.errors[Object.keys(errors)[0]]:""}}}});return e}),n("views/app/drawer/optionRepeaterOption",["views/app/drawer/optionRepeaterError"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",className:"nf-table-row",template:"#tmpl-nf-edit-setting-option-repeater-default-row",id:function(){return this.model.cid},regions:{error:".nf-option-error"},initialize:function(e){this.settingModel=e.settingModel,this.dataModel=e.dataModel,this.collection=e.collection,this.columns=e.columns,this.parentView=e.parentView,this.model.on("change:errors",this.renderErrors,this),"undefined"!=typeof this.settingModel.get("tmpl_row")&&(this.template="#"+this.settingModel.get("tmpl_row")),this.hasErrors=!1},onBeforeDestroy:function(){this.model.off("change",this.render),this.model.off("change:errors",this.renderErrors)},onBeforeRender:function(){if(this.model.get("label")){var e=this.model.get("label");this.model.set("label",_.escape(e),{silent:!0})}},onRender:function(){if(i.channel("mergeTags").request("init",this),i.channel("setting-"+this.settingModel.get("name")+"-option").trigger("render:setting",this.model,this.dataModel,this),this.model.get("label")){var e=this.model.get("label");this.model.set("label",_.unescape(e),{silent:!0})}},onShow:function(){this.model.get("new")&&(jQuery(this.el).find("input:first").focus(),this.model.set("new",!1))},events:{"change .setting":"changeOption","click .nf-delete":"deleteOption",keyup:"keyupOption"},changeOption:function(e){i.channel("option-repeater").trigger("change:option",e,this.model,this.dataModel,this.settingModel,this)},deleteOption:function(e){i.channel("option-repeater").trigger("click:deleteOption",this.model,this.collection,this.dataModel,this)},keyupOption:function(e){this.maybeAddOption(e),i.channel("option-repeater").trigger("keyup:option",e,this.model,this.dataModel,this.settingModel,this),i.channel("option-repeater-"+this.settingModel.get("name")).trigger("keyup:option",e,this.model,this.dataModel,this.settingModel,this)},maybeAddOption:function(e){13==e.keyCode&&(i.channel("option-repeater").trigger("click:addOption",this.collection,this.dataModel,this),jQuery(this.parentView.children.findByIndex(this.parentView.children.length-1).el).find('[data-id="label"]').focus())},renderErrors:function(){0==Object.keys(this.model.get("errors"))?this.hasErrors&&(this.error.empty(),jQuery(this.el).removeClass("nf-error")):(this.hasErrors=!0,this.error.show(new e({model:this.model})),jQuery(this.el).addClass("nf-error"))},templateHelpers:function(){var e=this;return{getColumns:function(){return e.columns},renderFieldSelect:function(e,t){var n=i.channel("fields").request("get:collection"),r='<label class="nf-select"><select class="setting" data-id="'+e+'">';return n.each(function(e){var n=t==e.get("key")?" selected":"";r+='<option value="'+e.get("key")+'"'+n+">"+e.get("label")+"</option>"}),r+="</select><div></div></label>"},renderOptions:function(t,n){if("undefined"!=typeof e.options.columns[t]){var i="";return _.each(e.options.columns[t].options,function(e){var t=n==e.value?" selected":"";i+='<option value="'+e.value+'"'+t+">"+e.label+"</option>"}),i}}}}});return t}),n("views/app/drawer/optionRepeaterEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"tr",template:"#tmpl-nf-edit-setting-option-repeater-empty"});return e}),n("views/app/drawer/optionRepeaterComposite",["views/app/drawer/optionRepeaterOption","views/app/drawer/optionRepeaterEmpty","models/app/optionRepeaterCollection"],function(e,t,n){var r=Marionette.CompositeView.extend({template:"#tmpl-nf-edit-setting-option-repeater-wrap",childView:e,emptyView:t,reorderOnSort:!1,initialize:function(e){var t=e.dataModel.get(this.model.get("name"));0==t instanceof Backbone.Collection&&(t=new n([],{settingModel:this.model}),t.add(e.dataModel.get(this.model.get("name"))),e.dataModel.set(this.model.get("name"),t,{silent:!0})),this.collection=t,this.dataModel=e.dataModel,this.childViewOptions={parentView:this,settingModel:this.model,collection:this.collection,dataModel:e.dataModel,columns:this.model.get("columns")};var i=this.model.get("deps");if(i)for(var r in i)i.hasOwnProperty(r)&&this.dataModel.on("change:"+r,this.render,this)},onBeforeDestroy:function(){var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render)},onRender:function(){var e=this;jQuery(this.el).find(".nf-list-options-tbody").sortable({handle:".handle",helper:"clone",placeholder:"nf-list-options-sortable-placeholder",forcePlaceholderSize:!0,opacity:.95,tolerance:"pointer",start:function(e,t){i.channel("option-repeater").request("start:optionSortable",t)},stop:function(e,t){i.channel("option-repeater").request("stop:optionSortable",t)},update:function(t,n){i.channel("option-repeater").request("update:optionSortable",n,this,e)}}),i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this)},onAttach:function(){var e=jQuery(this.el).find(".nf-open-import-tooltip"),t=jQuery(e).jBox("Tooltip",{title:"<h3>Please enter your options below:</h3>",content:jQuery(this.el).find(".nf-import-options"),trigger:"click",closeOnClick:"body",closeButton:"box",offset:{x:20,y:0},addClass:"import-options",onOpen:function(){var e=this;setTimeout(function(){jQuery(e.content).find("textarea").focus()},200)}});jQuery(this.el).find(".nf-import").on("click",{view:this,jBox:t},this.clickImport),i.channel("setting-"+this.model.get("name")).trigger("attach:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("attach:setting",this.model,this.dataModel,this)},templateHelpers:function(){var e=this;return{renderHeaders:function(){var e="<div> </div>";return _.each(this.columns,function(t){e+="<div>"+t.header+"</div>"}),e+="<div> </div>"},renderSetting:function(){var e=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return e(this)},renderClasses:function(){var e="";return e+="undefined"!=typeof this.width?this.width:" one-half",this.error&&(e+=" nf-error"),e},renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!==this.deps[t])return'style="display:none;"';return""},renderError:function(){return this.error?this.error:""},renderFieldsetClasses:function(){return e.model.get("name")},currencySymbol:function(){return i.channel("settings").request("get:setting","currency")||nfi18n.currency_symbol}}},attachHtml:function(e,t){jQuery(e.el).find(".nf-list-options-tbody").append(t.el),i.channel("mergeTags").request("init",this)},events:{"click .nf-add-new":"clickAddOption","click .extra":"clickExtra"},clickAddOption:function(e){i.channel("option-repeater").trigger("click:addOption",this.collection,this.dataModel),jQuery(this.children.findByIndex(this.children.length-1).el).find('[data-id="label"]').focus()},clickExtra:function(e){i.channel("option-repeater").trigger("click:extra",e,this.collection,this.dataModel),i.channel("option-repeater-"+this.model.get("name")).trigger("click:extra",e,this.model,this.collection,this.dataModel)},clickImport:function(e){var t=jQuery(e.data.jBox.content).find("textarea"),n=t.val().trimLeft().trimRight();if(0==n.length)return e.data.jBox.close(),!1;var r=n.split(/\n/);_.isArray(r)&&_.each(r,function(t){var n=t.split(","),r=n[0],a=n[1]||jQuery.slugify(r,{separator:"-"}),s=n[2]||"";r=r.trimLeft().trimRight(),a=a.trimLeft().trimRight(),s=s.trimLeft().trimRight();var o=e.data.view.collection.add({label:n[0],value:a,calc:s}),r={object:"field",label:n[0],change:"Option Added",dashicon:"plus-alt"};i.channel("changes").request("register:change","addListOption",o,null,r),i.channel("option-repeater-"+e.data.view.model.get("name")).trigger("add:option",o),i.channel("option-repeater").trigger("add:option",o),i.channel("app").trigger("update:setting",o)},this),t.val(""),e.data.jBox.close()}});return r}),n("controllers/app/optionRepeater",["models/app/optionRepeaterModel","models/app/optionRepeaterCollection","views/app/drawer/optionRepeaterComposite"],function(e,t,n){var r=Marionette.Object.extend({initialize:function(){i.channel("option-repeater").reply("get:settingChildView",this.getSettingChildView,this),this.listenTo(i.channel("option-repeater"),"change:option",this.changeOption),this.listenTo(i.channel("option-repeater"),"click:addOption",this.addOption),this.listenTo(i.channel("option-repeater"),"click:deleteOption",this.deleteOption),i.channel("option-repeater").reply("update:optionSortable",this.updateOptionSortable,this),i.channel("option-repeater").reply("stop:optionSortable",this.stopOptionSortable,this),i.channel("option-repeater").reply("start:optionSortable",this.startOptionSortable,this),this.listenTo(i.channel("option-repeater"),"init:dataModel",this.convertSettings)},changeOption:function(e,t,n,r,a){var s=jQuery(e.target).data("id");if("selected"==s)if(jQuery(e.target).attr("checked"))var o=1;else var o=0;else var o=jQuery(e.target).val();var l=t.get(s);t.set(s,o),this.triggerDataModel(t,n);var c=o,d={attr:s,before:l,after:c},h={object:n.get("objectType"),label:n.get("label"),change:"Option "+t.get("label")+" "+s+" changed from "+l+" to "+c};i.channel("changes").request("register:change","changeSetting",t,d,h),i.channel("option-repeater").trigger("update:option",t,n,r,a),i.channel("option-repeater-option-"+s).trigger("update:option",e,t,n,r,a),i.channel("option-repeater-"+r.get("name")).trigger("update:option",t,n,r,a)},addOption:function(t,n){var r={order:t.length,new:!0,options:{}};_.each(t.settingModel.get("columns"),function(e,t){r[t]=e.default,"undefined"!=typeof e.options&&(r.options[t]=e.options)});var a=new e(r);t.add(a);var s={object:n.get("objectType"),label:n.get("label"),change:"Option Added",dashicon:"plus-alt"};i.channel("changes").request("register:change","addListOption",a,null,s),i.channel("option-repeater-"+t.settingModel.get("name")).trigger("add:option",a),i.channel("option-repeater").trigger("add:option",a),this.triggerDataModel(a,n)},deleteOption:function(e,t,n){var r=i.channel("app").request("clone:modelDeep",e),a={object:n.get("objectType"),label:n.get("label"),change:"Option "+r.get("label")+" Removed",dashicon:"dismiss"},s={collection:t};i.channel("changes").request("register:change","removeListOption",r,null,a,s);var o=i.channel("changes").request("get:collection"),l=o.where({model:e});_.each(l,function(e){"object"==typeof e.get("data")&&_.each(e.get("data"),function(e){e.model==e&&(e.model=r)}),e.set("model",r),e.set("disabled",!0)}),t.remove(e),i.channel("option-repeater").trigger("remove:option",e),i.channel("option-repeater-"+t.settingModel.get("name")).trigger("remove:option",e),this.triggerDataModel(e,n)},triggerDataModel:function(e,t){i.channel("app").trigger("update:setting",e)},getSettingChildView:function(e){return n},updateOptionSortable:function(e,t,n){var r=jQuery(t).sortable("toArray"),a=n.collection.get({cid:jQuery(e.item).prop("id")}),s={collection:n.collection,objModels:[]};_.each(r,function(e,t){var i=n.collection.get({cid:e}),r=i.get("order");i.set("order",t);var a=t;s.objModels.push({model:i,attr:"order",before:r,after:a})}),n.collection.sort({silent:!0});var o={object:n.dataModel.get("objectType"),label:n.dataModel.get("label"),change:"Option "+a.get("label")+" re-ordered from "+a._previousAttributes.order+" to "+a.get("order"),dashicon:"sort"};i.channel("changes").request("register:change","sortListOptions",a,null,o,s),this.triggerDataModel(a,n.dataModel),i.channel("option-repeater").trigger("sort:option",a,n),i.channel("option-repeater-"+n.model.get("name")).trigger("sort:option",a,n)},stopOptionSortable:function(e){jQuery(e.item).css("opacity","")},startOptionSortable:function(e){jQuery(e.placeholder).find("div").remove(),jQuery(e.item).css("opacity","0.5").show()},convertSettings:function(e,n){var i=e.get(n.get("name"));0==i instanceof Backbone.Collection&&(i=new t([],{settingModel:n}),i.add(e.get(n.get("name"))),e.set(n.get("name"),i,{silent:!0}))}});return r}),n("controllers/fields/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("fields").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("fields").request("get:collection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/fields/fieldSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(fieldSettings,{objectType:"fields"}),i.channel("fields").reply("get:settingModel",this.getSettingModel,this),i.channel("fields").reply("get:settingCollection",this.getSettingCollection,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})},getSettingCollection:function(){return this.collection}});return t}),n("controllers/fields/fieldCreditCard",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"after:addField",this.dropCreditCardField)},dropCreditCardField:function(e){if("creditcard"==e.get("type")){var t=e.get("order");i.channel("fields").request("delete",e),_.each(["creditcardfullname","creditcardnumber","creditcardcvc","creditcardexpiration","creditcardzip"],function(e){var n=i.channel("fields").request("get:type",e),r={id:i.channel("fields").request("get:tmpID"),type:e,label:n.get("nicename"),order:t};i.channel("fields").request("add",r)})}},stageCreditCardField:function(e){"creditcard"==e.get("slug")&&(i.channel("fields").request("remove:stagedField","",e),_.each(["creditcardfullname","creditcardnumber","creditcardcvc","creditcardexpiration","creditcardzip"],function(e){i.channel("fields").request("add:stagedField",e)}))}});return e}),n("controllers/fields/fieldList",["models/app/optionRepeaterCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("option-repeater-option-label"),"update:option",this.updateOptionLabel),this.listenTo(i.channel("option-repeater-option-value"),"update:option",this.updateOptionValue),this.listenTo(i.channel("fields-list"),"init:fieldModel",this.convertOptions)},updateOptionLabel:function(e,t,n,i,r){"list"==_.findWhere(fieldTypeData,{id:n.get("type")}).parentType&&(t.get("manual_value")||(value=jQuery.slugify(t.get("label"),{separator:"-"}),t.set("value",value),t.trigger("change",t),jQuery(r.el).find('[data-id="value"]').focus().select()))},updateOptionValue:function(e,t,n,i,r){var a=_.findWhere(fieldTypeData,{id:n.get("type")});"undefined"!=typeof a&&"list"==a.parentType&&(t.set("manual_value",!0),jQuery(r.el).find('[data-id="calc"]').focus().select())},convertOptions:function(t){var n=t.get("options"),r=i.channel("fields").request("get:settingModel","options");0==n instanceof Backbone.Collection&&(n=new e([],{settingModel:r}),n.add(t.get("options")),t.set("options",n,{silent:!0}))}});return t}),n("controllers/fields/fieldPassword",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"after:addField",this.addField)},addField:function(e){if("password"==e.get("type")){var t=e.get("order"),n=this.insertField("passwordconfirm",t+1);n.set("confirm_field",e.get("key"))}},insertField:function(e,t){var n=i.channel("fields").request("get:type",e),r={id:i.channel("fields").request("get:tmpID"),type:e,label:n.get("nicename"),order:t};return i.channel("fields").request("add",r)}});return e}),n("controllers/fields/fieldQuantity",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t,n){if("product_assignment"==e.get("name")){var i=this.getProductFields(e);e.set("options",i)}},getProductFields:function(e){var t=[e.get("select_product")],n=i.channel("fields").request("get:collection");return _.each(n.models,function(e){"product"==e.get("type")&&t.push({label:e.get("label"),value:e.get("id")})}),t}});return e}),n("controllers/fields/fieldShipping",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-shipping_options"),"render:setting",this.addMask),this.listenTo(i.channel("setting-shipping_options-option"),"render:setting",this.addMask)},addMask:function(e,t,n){ 6 jQuery(n.el).find('[data-id="value"]').each(function(){jQuery(this).autoNumeric({aSign:"$",aSep:thousandsSeparator,aDec:decimalPoint})})}});return e}),n("controllers/fields/key",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"add:field",this.newFieldKey),this.listenTo(i.channel("fieldSetting-label"),"update:setting",this.updateLabel),this.listenTo(i.channel("fieldSetting-key"),"update:setting",this.updateKey),this.listenTo(i.channel("setting-key"),"keyup:setting",this.keyUp)},newFieldKey:function(e){var t=new Date,n=t.valueOf(),i=this.slugify(e.get("type")+"_"+n);e.set("key",i,{silent:!0}),"undefined"==e.get("manual_key")&&e.set("manual_key",!1,{silent:!0})},updateLabel:function(e){if(!e.get("manual_key")&&0!=jQuery.trim(e.get("label")).length){delete e.changed.label;var t=new Date,n=t.valueOf(),i=this.slugify(e.get("label")+"_"+n);e.set("key",i)}},updateKey:function(e){var t=e.get("key");this.settingModel=i.channel("fields").request("get:settingModel","key"),this.setError(t,e)},keyUp:function(e,t,n){n.set("manual_key",!0),this.settingModel=t;var i=jQuery(e.target).val();this.setError(i,n)},setError:function(e,t){var n=!1;""==jQuery.trim(e)?n="Field keys can't be empty. Please enter a key.":e!=e.toLowerCase()?n="Field keys must be lowercase.":e!=e.replace(" ","_")?n='Field keys must cannot use spaces. Separate with "_" instead.':"_"==e.slice(-1)?n='Field keys cannot end with a "_"':e!=this.slugify(e)?n="Invalid Format.":e!=this.keyExists(e,t)&&(n="Field keys must be unique. Please enter another key."),n?this.settingModel.set("error",n):(i.channel("app").trigger("update:fieldKey",t),this.settingModel.set("error",!1))},keyExists:function(e,t){var n=this.slugify(e);0!=n.length&&(e=n);var r=i.channel("fields").request("get:collection"),a=1,s=e;return _.each(r.models,function(n){t!=n&&s==n.get("key")&&(s=e+"_"+a,a++)}),e=s},slugify:function(e){return jQuery.slugify(e,{separator:"_"})}});return e}),n("controllers/fields/notices",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"add:stagedField",this.addStagedField)},addStagedField:function(e){i.channel("notices").request("add","addStagedField",e.get("nicename")+" added to staging")}});return e}),n("controllers/fields/mobile",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"sortable:start",this.startWiggle),this.listenTo(i.channel("fields"),"sortable:stop",this.stopWiggle)},initWiggle:function(e){i.channel("app").request("is:mobile")&&jQuery(e.el).find(".nf-field-wrap").on("taphold",function(){jQuery(this).ClassyWiggle("start",{degrees:[".65","1",".65","0","-.65","-1","-.65","0"],delay:50})})},startWiggle:function(e){i.channel("app").request("is:mobile")&&(jQuery(e.item).removeClass("ui-sortable-helper").ClassyWiggle("stop"),jQuery(e.helper).css("opacity","0.75").ClassyWiggle("start",{degrees:[".5","1",".5","0","-.5","-1","-.5","0"]}))},stopWiggle:function(e){i.channel("app").request("is:mobile")&&(jQuery(e.helper).ClassyWiggle("stop"),jQuery(e.item).removeClass("ui-sortable-helper drag-selected"))}});return e}),n("controllers/fields/savedFields",[],function(){var e=Marionette.Object.extend({ignoreAttributes:["editActive","order","saved","jBox"],initialize:function(){this.listenTo(i.channel("fields"),"update:setting",this.updateField),this.listenTo(i.channel("drawer"),"click:addSavedField",this.clickAddSavedField,this)},updateField:function(e){if(e.get("saved")){var t=!1,n=_.keys(e.changedAttributes()),i=this;_.each(n,function(e){-1==i.ignoreAttributes.indexOf(e)&&(t=!0)}),t&&e.set("saved",!1)}},clickAddSavedField:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r=n.attributes;r.saved=!0,delete r.jBox,delete r.editActive,delete r.created_at,delete r.order,delete r.id,delete r.formID,delete r.parent_id;var a=i.channel("fields").request("get:type",r.type),s=_.clone(a.attributes),o=jQuery(e.target).parent().parent().find("input").val();console.log(o),s.nicename=o,r.label=o,r.nicename=o,t.set("addSavedLoading",!0);var l=JSON.stringify(r);jQuery.post(ajaxurl,{action:"nf_create_saved_field",field:l,security:nfAdmin.ajaxNonce},function(e){e=JSON.parse(e),s.id=e.data.id,s.nicename=o,s.settingDefaults=r;var n=i.channel("fields").request("get:typeCollection"),a=(n.add(s),i.channel("fields").request("get:typeSections"));a.get("saved").get("fieldTypes").push(s.id),t.set("addSavedLoading",!1),t.unset("addSavedLoading",{silent:!0}),t.get("jBox").close(),i.channel("notices").request("add","addSaved","Saved Field Added")})}});return e}),n("controllers/fields/fieldDatepicker",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-datepicker"),"render:setting",this.addDatepicker)},addDatepicker:function(e,t,n){pikadayResponsive(jQuery(n.el).find(".setting")[0])}});return e}),n("controllers/fields/fieldDisplayCalc",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-calc_var"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t,n){},getProductFields:function(e){var t=[e.get("select_product")],n=i.channel("fields").request("get:collection");return _.each(n.models,function(e){"product"==e.get("type")&&t.push({label:e.get("label"),value:e.get("id")})}),t}});return e}),n("controllers/actions/types",["models/app/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.installedActions=new e(_.filter(actionTypeData,function(e){return"installed"==e.section}),{slug:"installed",nicename:nfi18n.installed}),this.availableActions=new e(_.filter(actionTypeData,function(e){return"available"==e.section}),{slug:"available",nicename:nfi18n.available}),i.channel("actions").reply("get:type",this.getType,this),i.channel("actions").reply("get:installedActions",this.getInstalledActions,this),i.channel("actions").reply("get:availableActions",this.getAvailableActions,this)},getType:function(e){var t=this.installedActions.get(e);return t||(t=this.availableActions.get(e)),t},getInstalledActions:function(){return this.installedActions},getAvailableActions:function(){return this.availableActions},addStagedField:function(e){var t=jQuery(e.target).data("id");i.channel("fields").request("add:stagedField",t)},getTypeSections:function(){return this.fieldTypeSections}});return t}),n("models/actions/actionModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Action",objectDomain:"actions",editActive:!1},initialize:function(){this.on("change",this.changeSetting,this);var e=i.channel("actions").request("get:type",this.get("type"));if("undefined"!=typeof e){var t=this;_.each(e.get("settingDefaults"),function(e,n){t.get(n)||t.set(n,e,{silent:!0})}),i.channel("actions").trigger("init:actionModel",this),i.channel("actions-"+this.get("type")).trigger("init:actionModel",this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)}},changeSetting:function(e,t){i.channel("actionSetting-"+_.keys(this.changedAttributes())[0]).trigger("update:setting",this,t.settingModel),i.channel("actions").trigger("update:setting",this,t.settingModel),i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("models/actions/actionCollection",["models/actions/actionModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order",tmpNum:1,initialize:function(){this.on("add",this.addAction,this),this.on("remove",this.removeAction,this),this.newIDs=[]},addAction:function(e){this.newIDs.push(e.get("id"))},removeAction:function(e){this.removedIDs[e.get("id")]=e.get("id")}});return t}),n("controllers/actions/data",["models/actions/actionCollection","models/actions/actionModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){if(this.collection=new e(preloadedFormData.actions),this.collection.tmpNum=1,0!=this.collection.models.length){var t=this;_.each(this.collection.models,function(e){jQuery.isNumeric(e.get("id"))||t.collection.tmpNum++})}this.collection.removedIDs={},i.channel("actions").reply("get:collection",this.getCollection,this),i.channel("actions").reply("get:action",this.getAction,this),i.channel("actions").reply("get:tmpID",this.getTmpID,this),i.channel("actions").reply("add",this.addAction,this),i.channel("actions").reply("delete",this.deleteAction,this)},getCollection:function(){return this.collection},getAction:function(e){return this.collection.get(e)},addAction:function(e,n){if(n=n||!1,!1==e instanceof Backbone.Model)var r=new t(e);else var r=e;return this.collection.add(r,{silent:n}),i.channel("app").request("update:setting","clean",!1),r},deleteAction:function(e){this.collection.remove(e),i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db")},getTmpID:function(){var e=this.collection.tmpNum;return this.collection.tmpNum++,"tmp-"+e}});return n}),n("controllers/actions/actionSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(actionSettings,{objectType:"actions"}),i.channel("actions").reply("get:settingModel",this.getSettingModel,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})}});return t}),n("controllers/actions/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("actions").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("actions").request("get:collection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/actions/addActionTypes",["models/actions/actionCollection","models/actions/actionModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("actions"),"click:addAction",this.addAction),i.channel("actions").reply("add:actionType",this.addAction,this)},addAction:function(e){var t={id:i.channel("actions").request("get:tmpID"),type:e.get("id"),label:e.get("settingDefaults").label||e.get("nicename")},n=i.channel("actions").request("add",t),r={object:"Action",label:n.get("label"),change:"Added",dashicon:"plus-alt"},t={collection:i.channel("actions").request("get:collection")};i.channel("changes").request("register:change","addObject",n,null,r,t),i.channel("app").trigger("click:edit",{},n)}});return n}),n("controllers/actions/typeDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addAction"),"startDrag:type",this.startDrag),this.listenTo(i.channel("drawer-addAction"),"stopDrag:type",this.stopDrag),i.channel("drawer-addAction").reply("get:typeHelperClone",this.getCurrentDraggableHelperClone,this)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important"),this.draggableHelperClone=jQuery(t.helper).clone()},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")},getCurrentDraggableHelperClone:function(){return this.draggableHelperClone}});return e}),n("controllers/actions/droppable",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("drop:actionType",this.dropActionType,this)},dropActionType:function(e,t){var n=jQuery(t.helper).data("type"),r=i.channel("actions").request("get:type",n);i.channel("actions").request("add:actionType",r)}});return e}),n("models/actions/typeModel",[],function(){var e=Backbone.Model.extend({});return e}),n("models/actions/typeCollection",["models/actions/typeModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/actions/filterTypes",["models/actions/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addAction"),"change:filter",this.filterActionTypes)},filterActionTypes:function(t,n){if(""!=jQuery.trim(t)){var r=[],a=i.channel("actions").request("get:installedActions");_.each(this.filterCollection(t,a),function(e){r.push(e)});var s=[],o=i.channel("actions").request("get:availableActions");_.each(this.filterCollection(t,o),function(e){s.push(e)});var l=new e(r);l.slug="installed",l.nicename="Installed";var c=new e(s);c.slug="available",c.nicename="Available",i.channel("drawer").trigger("filter:actionTypes",l,c),n.addObject&&0<l.length&&(i.channel("actions").request("add:actionType",l.models[0]),i.channel("drawer").request("clear:filter"))}else i.channel("drawer").trigger("clear:filter")},filterCollection:function(e,t){e=e.toLowerCase();var n=t.filter(function(t){var n=!1;return t.get("id").toLowerCase().indexOf(e)!=-1?n=!0:t.get("nicename").toLowerCase().indexOf(e)!=-1&&(n=!0),t.get("tags")&&0==e.indexOf("#")&&_.each(t.get("tags"),function(t){e.replace("#","").length>1&&t.toLowerCase().indexOf(e.replace("#",""))!=-1&&(n=!0)}),t.get("alias")&&_.each(t.get("alias"),function(t){t.toLowerCase().indexOf(e)!=-1&&(n=!0)}),n});return n}});return t}),n("controllers/actions/newsletterList",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-newsletter_list"),"show:setting",this.defaultFields),this.listenTo(i.channel("setting-type-newsletter_list"),"click:extra",this.clickListUpdate),this.listenTo(i.channel("actionSetting-newsletter_list"),"update:setting",this.maybeRenderFields),this.listenTo(i.channel("actionSetting-newsletter_list"),"update:setting",this.maybeRenderGroups),this.listenTo(i.channel("setting-name-newsletter_list_fields"),"init:settingModel",this.registerFieldsListener),this.listenTo(i.channel("setting-name-newsletter_list_groups"),"init:settingModel",this.registerGroupsListener)},defaultFields:function(e,t){this.maybeRenderFields(t,e),this.maybeRenderGroups(t,e)},registerFieldsListener:function(e){e.listenTo(i.channel("newsletter_list_fields"),"update:fieldMapping",this.updateFieldMapping,e)},registerGroupsListener:function(e){e.listenTo(i.channel("newsletter_list_groups"),"update:interestGroups",this.updateInterestGroups,e)},clickListUpdate:function(e,t,n,i){var r={action:"nf_"+n.attributes.type+"_get_lists",security:nfAdmin.ajaxNonce},a=this;jQuery(e.srcElement).addClass("spin"),jQuery.post(ajaxurl,r,function(e){var e=JSON.parse(e);a.updateLists(t,e.lists,i,n),n.set("newsletter_list",e.lists[0].value,{settingModel:t})}).always(function(){jQuery(e.srcElement).removeClass("spin")})},updateLists:function(e,t,n,i){e.set("options",t),n.render()},maybeRenderFields:function(e,t){if("undefined"!=typeof t){var n=e.get("newsletter_list"),r=t.get("options");_.each(r,function(e){n==e.value&&i.channel("newsletter_list_fields").trigger("update:fieldMapping",e.fields)}),e.set("newsletter_list_fields",0)}},maybeRenderGroups:function(e,t){if("undefined"!=typeof t){var n=e.get("newsletter_list"),r=t.get("options");_.each(r,function(e){n==e.value&&i.channel("newsletter_list_groups").trigger("update:interestGroups",e.groups)}),e.set("newsletter_list_fields",0)}},updateFieldMapping:function(e){var t=this.get("settings");t.reset(),_.each(e,function(e){t.add({name:e.value,type:"textbox",label:e.label,width:"full",use_merge_tags:{exclude:["user","post","system","querystrings"]}})}),this.set("settings",t)},updateInterestGroups:function(e){var t=this.get("settings");t.reset(),_.each(e,function(e){t.add({name:e.value,type:"toggle",label:e.label,width:"full"})}),this.set("settings",t)}});return e}),n("controllers/advanced/types",["models/app/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(formSettingTypeData),i.channel("settings").reply("get:type",this.getType,this),i.channel("settings").reply("get:typeCollection",this.getCollection,this)},getType:function(e){return this.collection.get(e)},getCollection:function(){return this.collection}});return t}),n("models/advanced/settingsModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Form Setting",editActive:!1},initialize:function(){this.bind("change",this.changeSetting,this);var e=i.channel("settings").request("get:collection");_.each(e.models,function(e){"undefined"==typeof this.get(e.get("name"))&&this.set(e.get("name"),e.get("value"),{silent:!0}),i.channel(e.get("type")).trigger("init:dataModel",this,e)},this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)},changeSetting:function(e,t){i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("controllers/advanced/data",["models/advanced/settingsModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.model=new e(preloadedFormData.settings),i.channel("settings").reply("get:settings",this.getSettings,this),i.channel("settings").reply("get:setting",this.getSetting,this),i.channel("settings").reply("update:setting",this.updateSetting,this)},getSettings:function(){return this.model},updateSetting:function(e,t,n){n=n||!1,this.model.set(e,t,{silent:n})},getSetting:function(e){return this.model.get(e)}});return t}),n("controllers/advanced/formSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(formSettings,{objectType:"settings"}),i.channel("settings").reply("get:settingModel",this.getSettingModel,this),i.channel("settings").reply("get:collection",this.getSettingCollection,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})},getSettingCollection:function(){return this.collection}});return t}),n("controllers/advanced/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("settings").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("settings").request("get:typeCollection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/advanced/clickEdit",["models/advanced/settingsModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("settings"),"click:edit",this.clickEdit)},clickEdit:function(e,t){var n=i.channel("settings").request("get:settings");i.channel("app").request("open:drawer","editSettings",{model:n,groupCollection:t.get("settingGroups"),typeModel:t});var r=i.channel("drawer").request("get:preventClose");r||t.set("editActive",!0)}});return t}),n("controllers/advanced/calculations",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("option-repeater-calculations"),"keyup:option",this.keyUp),this.listenTo(i.channel("option-repeater-calculations"),"update:option",this.updateCalc),this.listenTo(i.channel("option-repeater-calculations"),"sort:option",this.sortCalc)},keyUp:function(e,t){var n=jQuery(e.target).val(),i=jQuery(e.target).data("id");"name"==i?(this.checkName(n,t),this.checkEQ(t.get("eq"),t)):"eq"==i?this.checkEQ(n,t):"dec"==i&&this.checkDec(n,t)},updateCalc:function(e){this.checkName(e.get("name"),e,!1),this.checkEQ(e.get("eq"),e),this.checkDec(e.get("dec"),e)},sortCalc:function(e,t){this.checkAllCalcs(t.collection)},checkName:function(e,t,n){n=n||!0;var i=t.get("errors"),r=t.collection.where({name:jQuery.trim(e)});e==t.get("name")&&(r=[]),0!=r.length?i.nameExists="Calculation names must be unique. Please enter another name.":(t.set("name",e,{silent:n}),delete i.nameExists),t.set("errors",i),t.trigger("change:errors",t)},checkEQ:function(e,t){var n=t.get("errors"),i=!1,r=!1,a=e.match(new RegExp(/{calc:(.*?)}/g));if(a){var s=t.collection;a=a.map(function(e){var a=e.replace("}","").replace("{calc:",""),o=s.findWhere({name:a});a==t.get("name")?(n.selfRef="A calculation can't reference itself!",i=!0):o&&o.get("order")>t.get("order")&&(r=!0,n.futureCalc="Can't reference a future calculation!")})}i||delete n.selfRef,r||delete n.futureCalc,t.set("errors",n),t.trigger("change:errors",t)},checkDec:function(e,t){var n=t.get("errors"),i=!1,r=Math.abs(parseInt(e.trim()));""!==e.trim()&&r.toString()!==e.trim()&&(i=!0,n.nonIntDec="Decimals must be a non-negative integer!"),i||delete n.nonIntDec,t.set("errors",n),t.trigger("change:errors",t)},checkAllCalcs:function(e){var t=this;e.models.map(function(e){t.checkName(e.get("name"),e),t.checkEQ(e.get("eq"),e),t.checkDec(e.get("dec"),e)})}});return e}),n("controllers/loadControllers",["controllers/app/remote","controllers/app/drawer","controllers/app/drawerConfig","controllers/app/domainConfig","controllers/app/data","controllers/app/drawerToggleSettingGroup","controllers/app/updateDB","controllers/app/formData","controllers/app/previewLink","controllers/app/menuButtons","controllers/app/trackChanges","controllers/app/undoChanges","controllers/app/publishResponse","controllers/app/changeDomain","controllers/app/pushstate","controllers/app/hotkeys","controllers/app/cleanState","controllers/app/coreUndo","controllers/app/cloneModelDeep","controllers/app/getSettingChildView","controllers/app/changeSettingDefault","controllers/app/fieldset","controllers/app/toggleSetting","controllers/app/itemControls","controllers/app/mergeTags","controllers/app/mergeTagBox","controllers/app/itemSettingFill","controllers/app/confirmPublish","controllers/app/rte","controllers/app/settingFieldSelect","controllers/app/settingFieldList","controllers/app/settingHTML","controllers/app/settingColor","controllers/app/changeMenu","controllers/app/mobile","controllers/app/notices","controllers/app/unloadCheck","controllers/app/formContentFilters","controllers/app/formContentGutterFilters","controllers/app/cloneCollectionDeep","controllers/app/trackKeyDown","controllers/app/perfectScroll","controllers/app/getNewSettingGroupCollection","controllers/app/settingMedia","controllers/fields/types","controllers/fields/fieldTypeDrag","controllers/fields/stagingDrag","controllers/fields/staging","controllers/fields/stagingSortable","controllers/fields/filterTypes","controllers/fields/sortable","controllers/fields/data","controllers/app/optionRepeater","controllers/fields/editActive","controllers/fields/fieldSettings","controllers/fields/fieldCreditCard","controllers/fields/fieldList","controllers/fields/fieldPassword","controllers/fields/fieldQuantity","controllers/fields/fieldShipping","controllers/fields/key","controllers/fields/notices","controllers/fields/mobile","controllers/fields/savedFields","controllers/fields/fieldDatepicker","controllers/fields/fieldDisplayCalc","controllers/actions/types","controllers/actions/data","controllers/actions/actionSettings","controllers/actions/editActive","controllers/actions/addActionTypes","controllers/actions/typeDrag","controllers/actions/droppable","controllers/actions/filterTypes","controllers/actions/newsletterList","controllers/advanced/types","controllers/advanced/data","controllers/advanced/formSettings","controllers/advanced/editActive","controllers/advanced/clickEdit","controllers/advanced/calculations"],function(e,t,n,i,r,a,s,o,l,c,d,h,u,g,p,f,m,v,y,w,b,C,j,k,M,T,S,F,Q,q,x,D,_,O,A,E,V,z,R,B,N,L,I,P,H,G,$,K,W,U,J,X,Y,Z,ee,te,ne,ie,re,ae,se,oe,le,ce,de,he,ue,ge,pe,fe,me,ve,ye,we,be,Ce,je,ke,Me,Te,Se){var Fe=Marionette.Object.extend({initialize:function(){new z,new R,new f,new e,new t,new n,new i,new a,new l,new c,new d,new h,new u,new g,new m,new v,new y,new k,new F,new Q,new q,new x,new D,new _,new P,new O,new A,new E,new V,new s,new B,new N,new L,new I,new C,new Y,new H,new G,new $,new K,new W,new U,new J,new b,new j,new w,new Z,new ee,new te,new ne,new ie,new re,new ae,new se,new oe,new le,new ce,new de,new he,new be,new ue,new ge,new pe,new fe,new me,new ve,new ye,new we,new Ce,new ke,new Se,new je,new Me,new Te,new r,new X,new o,new M,new T,new S}});return Fe}),n("views/fields/fieldItem",["views/app/itemControls"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-main-content-field",doingShortcut:!1,regions:{itemControls:".nf-item-controls"},initialize:function(){this.model.on("change:editActive",this.render,this),this.model.on("change:label",this.render,this),this.model.on("change:required",this.render,this),this.model.on("change:id",this.render,this)},onBeforeDestroy:function(){this.model.off("change:editActive",this.render),this.model.off("change:label",this.render),this.model.off("change:required",this.render),this.model.off("change:id",this.render)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),this.itemControls.show(new e({model:this.model})),jQuery(this.el).disableSelection(),i.channel("app").request("is:mobile")&&jQuery(this.el).on("taphold",function(e,t){jQuery(e.target).hasClass("nf-edit-settings")||(jQuery(this).addClass("ui-sortable-helper drag-selected"),jQuery(this).ClassyWiggle("start",{degrees:[".65","1",".65","0","-.65","-1","-.65","0"],delay:50}))})},templateHelpers:function(){return{renderClasses:function(){var e="nf-field-wrap";return this.editActive&&(e+=" active"),e},renderRequired:function(){return 1==this.required?'<span class="required">*</span>':""},getFieldID:function(){return jQuery.isNumeric(this.id)?"field-"+this.id:this.id},renderIcon:function(){var e=i.channel("fields").request("get:type",this.type);return'<span class="fa fa-'+e.get("icon")+'"></span>'}}},events:{"mouseover .nf-item-control":"mouseoverItemControl",mousedown:"maybeShortcut",click:"maybeClickEdit",singletap:"maybeTapEdit",swipeleft:"swipeLeft",swiperight:"swipeRight",tapend:"tapend"},maybeClickEdit:function(e){return this.doingShortcut?(this.doingShortcut=!1,!1):void((jQuery(e.target).parent().hasClass("nf-fields-sortable")||jQuery(e.target).parent().hasClass("nf-field-wrap")||jQuery(e.target).hasClass("nf-field-wrap"))&&!i.channel("app").request("is:mobile")&&(jQuery(":focus").blur(),i.channel("app").trigger("click:edit",e,this.model)))},maybeShortcut:function(e){var t=i.channel("app").request("get:keydown");return-1==t.indexOf(16)||(-1!=t.indexOf(68)?(i.channel("app").trigger("click:delete",e,this.model),this.doingShortcut=!0,!1):-1!=t.indexOf(67)?(this.doingShortcut=!0,i.channel("app").trigger("click:duplicate",e,this.model),!1):void 0)},maybeTapEdit:function(e){jQuery(e.target).parent().hasClass("nf-fields-sortable")&&i.channel("app").trigger("click:edit",e,this.model)},swipeLeft:function(e,t){jQuery(t.startEvnt.target).closest("div").find(".nf-item-duplicate").show(),jQuery(t.startEvnt.target).closest("div").find(".nf-item-delete").show()},swipeRight:function(e,t){jQuery(t.startEvnt.target).closest("div").find(".nf-item-duplicate").hide(),jQuery(t.startEvnt.target).closest("div").find(".nf-item-delete").hide()},tapend:function(e,t){jQuery(this.el).ClassyWiggle("stop"),jQuery(this.el).removeClass("ui-sortable-helper drag-selected")},remove:function(){i.channel("fields").request("get:removing")?this.$el.hide("clip",function(){jQuery(this).remove()}):this.$el.remove(),i.channel("fields").request("set:removing",!1)},mouseoverItemControl:function(e){jQuery(this.el).find(".nf-item-control").css("display","")}});return t}),n("views/fields/mainContentEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-content-fields-empty",onBeforeDestroy:function(){jQuery(this.el).parent().removeClass("nf-fields-empty-droppable").droppable("destroy")},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},onShow:function(){jQuery(this.el).parent().hasClass("ui-sortable")&&jQuery(this.el).parent().sortable("destroy"),jQuery(this.el).parent().addClass("nf-fields-empty-droppable"),jQuery(this.el).parent().droppable({accept:function(e){if(jQuery(e).hasClass("nf-stage")||jQuery(e).hasClass("nf-field-type-button"))return!0},activeClass:"nf-droppable-active",hoverClass:"nf-droppable-hover",tolerance:"pointer",over:function(e,t){t.item=t.draggable,i.channel("app").request("over:fieldsSortable",t)},out:function(e,t){t.item=t.draggable,i.channel("app").request("out:fieldsSortable",t)},drop:function(e,t){t.item=t.draggable,i.channel("app").request("receive:fieldsSortable",t);var n=i.channel("fields").request("get:collection");n.trigger("reset",n)}})}});return e}),n("views/app/formTitle",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-header-form-title",initialize:function(){this.model.on("change:title",this.render,this)},templateHelpers:function(){return{renderTitle:function(){var e=i.channel("app").request("get:formModel");return _.escape(e.get("settings").get("title"))}}}});return e}),n("views/loadViews",["views/fields/fieldItem","views/fields/mainContentEmpty","views/app/formTitle"],function(e,t,n){var r=Marionette.Object.extend({initialize:function(){i.channel("views").reply("get:fieldItem",this.getFieldItem),i.channel("views").reply("get:mainContentEmpty",this.getMainContentEmpty),i.channel("views").reply("get:formTitle",this.getFormTitle)},getFieldItem:function(t){return e},getMainContentEmpty:function(){return t},getFormTitle:function(){return n}});return r});var i=Backbone.Radio;jQuery(document).ready(function(e){t(["views/app/builder","controllers/loadControllers","views/loadViews"],function(t,n,r){var a=Marionette.Application.extend({initialize:function(e){var t=this;Marionette.Renderer.render=function(e,n){var e=t.template(e);return e(n)},i.channel("app").trigger("before:loadControllers",this);new n;i.channel("app").trigger("after:loadControllers",this),i.channel("app").trigger("before:loadViews",this);new r;i.channel("app").trigger("after:loadViews",this),i.channel("app").reply("get:template",this.template)},onStart:function(){new t;i.channel("app").trigger("after:appStart",this),0==nfAdmin.formID&&i.channel("app").request("open:drawer","addField")},template:function(t){return _.template(e(t).html(),{evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^\}]+?)\}\}(?!\})/g,variable:"data"})}}),s=new a;s.start()})}),n("main",function(){})}();3 return this.updateSetting("currentDrawer",e),!0},getCurrentDrawer:function(){var e=this.model.get("currentDrawer");return i.channel("app").request("get:drawer",e)},isMobile:function(){return this.model.get("mobile")}});return t}),n("controllers/app/drawerToggleSettingGroup",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"click:toggleSettingGroup",this.toggleSettingGroup)},toggleSettingGroup:function(e,t){if(t.get("display")){var n=!1;_.each(t.get("settings").models,function(e){e.get("error")&&(n=!0)}),n||t.set("display",!1)}else t.set("display",!0)}});return e}),n("controllers/app/updateDB",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"closed",this.updateDB),i.channel("app").reply("update:db",this.updateDB,this),i.channel("formContent").request("add:saveFilter",this.defaultSaveFilter,10,this)},updateDB:function(e){if(i.channel("app").request("get:setting","clean"))return!1;if(e=e||"preview","preview"==e)var t="nf_preview_update";else if("publish"==e)var t="nf_save_form";var n=i.channel("app").request("get:formModel");_.each(n.get("fields").models,function(e,t){e.unset("jBox",{silent:!0})});var r=i.channel("settings").request("get:setting","formContentData");r||(r=i.channel("settings").request("get:setting","fieldContentsData"));var a=i.channel("formContent").request("get:saveFilters"),s=_.without(a,void 0),o=_.first(s);if(r=o(r),"publish"==e&&n.get("show_publish_options")){i.channel("app").request("open:drawer","newForm");var l=i.channel("app").request("get:builderEl");return jQuery(l).addClass("disable-main"),!1}var c=i.channel("app").request("get:formModel"),d=JSON.parse(JSON.stringify(c));d.settings.formContentData=r;var h=c.get("fields").removedIDs;_.each(d.fields,function(e){var t=e.id;delete e.id,delete e.parent_id;var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i],delete e[i]);for(var r in n)null===n[r]&&delete n[r];e.settings=n,e.id=t}),d.deleted_fields=h;var h=c.get("actions").removedIDs;_.each(d.actions,function(e){var t=e.id;delete e.id,delete e.parent_id;var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i],delete e[i]);e.settings=n,e.id=t}),d.deleted_actions=h,d=JSON.stringify(d),i.channel("app").trigger("before:updateDB",d),"publish"==e&&(i.channel("app").request("update:setting","loading",!0),i.channel("app").trigger("change:loading"),i.channel("app").request("is:mobile")&&i.channel("notices").request("add","publishing","Your Changes Are Being Published",{autoClose:!1})),jQuery.post(ajaxurl,{action:t,form:d,security:nfAdmin.ajaxNonce},function(t){try{t=JSON.parse(t),t.action=e,i.channel("app").trigger("response:updateDB",t),!i.channel("app").request("is:mobile")&&"preview"==e}catch(e){console.log("Something went wrong!"),console.log(e)}})},defaultSaveFilter:function(e){return e.pluck("key")}});return e}),n("models/app/formModel",[],function(){var e=Backbone.Model.extend({initialize:function(){jQuery.isNumeric(this.get("id"))?this.set("show_publish_options",!1,{silent:!0}):this.set("show_publish_options",!0,{silent:!0})}});return e}),n("controllers/app/formData",["models/app/formModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.model=new e({id:preloadedFormData.id}),this.model.set("fields",i.channel("fields").request("get:collection")),this.model.set("actions",i.channel("actions").request("get:collection")),this.model.set("settings",i.channel("settings").request("get:settings")),i.channel("app").reply("get:formModel",this.getFormModel,this)},getFormModel:function(){return this.model}});return t}),n("controllers/app/previewLink",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:sendChanges",this.disablePreview,this),this.listenTo(i.channel("app"),"response:sendChanges",this.enablePreview,this),this.listenTo(i.channel("app"),"change:clean",this.changePreviewNicename,this)},disablePreview:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("preview");t.set("disabled",!0)},changePreviewNicename:function(e){var t=i.channel("app").request("get:domainCollection"),n=t.get("preview");if(e)var r="Preview Form";else var r="Preview Changes";n.set("nicename",r)},enablePreview:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("preview");t.set("disabled",!1)}});return e}),n("controllers/app/menuButtons",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:publish",this.publish),this.listenTo(i.channel("app"),"click:viewChanges",this.viewChanges)},publish:function(){i.channel("app").request("update:db","publish")},viewChanges:function(){var e=i.channel("changes").request("get:collection");i.channel("app").request("open:drawer","viewChanges",{collection:e})}});return e}),n("models/app/changeModel",[],function(){var e=Backbone.Model.extend({defaults:{disabled:!1}});return e}),n("models/app/changeCollection",["models/app/changeModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:function(e){var t=parseInt(e.cid.replace("c",""));return-t}});return t}),n("controllers/app/trackChanges",["models/app/changeCollection","models/app/changeModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.collection=new e,i.channel("changes").reply("register:change",this.registerChange,this),i.channel("changes").reply("get:collection",this.getCollection,this),this.listenTo(i.channel("app"),"change:clean",this.maybeResetCollection)},registerChange:function(e,n,i,r,a){var a="undefined"!=typeof a?a:{};"undefined"==typeof r.dashicon&&(r.dashicon="admin-generic");var s=new t({action:e,model:n,changes:i,label:r,data:a});return this.collection.add(s),s},getCollection:function(){return this.collection},maybeResetCollection:function(e){e&&this.collection.reset()}});return n}),n("controllers/app/undoChanges",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer"),"click:undoChanges",this.undoChanges,this),this.listenTo(i.channel("drawer"),"click:undoSingle",this.undoSingle,this)},undoChanges:function(){var e=i.channel("changes").request("get:collection");e.sort();var t=this;_.each(e.models,function(e){t.undoSingle(e,!0)}),e.reset(),i.channel("app").request("update:db"),i.channel("app").request("update:setting","clean",!0),i.channel("app").request("close:drawer")},undoSingle:function(e,t){i.channel("changes").request("undo:"+e.get("action"),e,t)}});return e}),n("controllers/app/publishResponse",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"response:updateDB",this.publishResponse)},publishResponse:function(e){return"publish"===e.action&&("undefined"!=typeof e.data.new_ids&&("undefined"!=typeof e.data.new_ids.fields&&_.each(e.data.new_ids.fields,function(e,t){var n=i.channel("fields").request("get:field",t);n&&n.set("id",e)}),"undefined"!=typeof e.data.new_ids.actions&&_.each(e.data.new_ids.actions,function(e,t){var n=i.channel("actions").request("get:action",t);n&&n.set("id",e)}),"undefined"!=typeof e.data.new_ids.forms&&_.each(e.data.new_ids.forms,function(e,t){var n=i.channel("app").request("get:formModel");n.set("id",e),history.replaceState("","","admin.php?page=ninja-forms&form_id="+e)})),i.channel("app").request("update:setting","loading",!1),i.channel("app").trigger("change:loading"),i.channel("app").request("is:mobile")&&i.channel("notices").request("close","publishing"),i.channel("notices").request("add","published","Changes Published"),i.channel("app").trigger("app:published",e),void i.channel("app").request("update:setting","clean",!0))}});return e}),n("controllers/app/changeDomain",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:menu",this.changeAppDomain),i.channel("app").reply("change:currentDomain",this.changeAppDomain,this),i.channel("app").reply("prevent:changeDomain",this.preventChange,this),i.channel("app").reply("enable:changeDomain",this.enableChange,this),this.objPreventChange={}},changeAppDomain:function(e,t){if(this.maybePreventChange())return!1;if("undefined"==typeof t)var n=jQuery(e.target).data("domain"),t=i.channel("app").request("get:domainModel",n);if(i.channel("app").request("get:currentDrawer")&&i.channel("app").request("close:drawer"),0==t.get("url").length){var r=i.channel("app").request("get:mainEl");i.channel("app").request("update:currentDomain",t),jQuery(r).scrollTop(0),i.channel("app").trigger("change:currentDomain",t)}},maybePreventChange:function(){return 0!=Object.keys(this.objPreventChange).length},preventChange:function(e){this.objPreventChange[e]=!0},enableChange:function(e){delete this.objPreventChange[e]}});return e}),n("controllers/app/pushstate",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"change:currentDomain",this.changePushState)},changePushState:function(){var e=i.channel("app").request("get:currentDomain");history.pushState(null,null,window.location.href+"&domain="+e.get("id"));var t=/domain=\\d+/,n=window.location.toString(),r=n.replace(t,"");console.log(r)}});return e}),n("controllers/app/hotkeys",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("main"),"render:main",this.changeHotkeys),this.listenTo(i.channel("drawer"),"opened",this.changeHotkeys),this.listenTo(i.channel("drawer"),"render:settingGroup",this.changeHotkeys),this.listenTo(i.channel("hotkeys"),"add:newField",this.addNewField),this.listenTo(i.channel("hotkeys"),"add:newAction",this.addNewAction),this.listenTo(i.channel("hotkeys"),"changeDomain:fields",this.changeDomainFields),this.listenTo(i.channel("hotkeys"),"changeDomain:actions",this.changeDomainActions),this.listenTo(i.channel("hotkeys"),"changeDomain:settings",this.changeDomainSettings),this.listenTo(i.channel("hotkeys"),"close:drawer",this.closeDrawer)},changeHotkeys:function(){var e=i.channel("app").request("get:currentDomain");jQuery(document).off(".nfDomainHotkeys"),jQuery("input").off(".nfDomainHotkeys"),e.get("hotkeys")&&jQuery.each(e.get("hotkeys"),function(e,t){jQuery(document).on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)}),jQuery("input").on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)}),jQuery("textarea").on("keydown.nfDomainHotkeys",null,e,function(e){i.channel("hotkeys").trigger(t,e)})})},addNewField:function(){"addField"!=i.channel("app").request("get:currentDrawer")?i.channel("app").request("open:drawer","addField"):i.channel("app").request("close:drawer")},addNewAction:function(){"addAction"!=i.channel("app").request("get:currentDrawer")?i.channel("app").request("open:drawer","addAction"):i.channel("app").request("close:drawer")},changeDomainFields:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("fields");i.channel("app").request("change:currentDomain",{},t)},changeDomainActions:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("actions");i.channel("app").request("change:currentDomain",{},t)},changeDomainSettings:function(){var e=i.channel("app").request("get:domainCollection"),t=e.get("settings");i.channel("app").request("change:currentDomain",{},t)},closeDrawer:function(){i.channel("app").request("close:drawer")}});return e}),n("controllers/app/cleanState",[],function(){var e=Marionette.Object.extend({initialize:function(){this.ignoreAttributes=["editActive"],this.listenTo(i.channel("app"),"update:setting",this.setAppClean)},setAppClean:function(e){for(var t in e.changedAttributes())var n=t,r=e.changedAttributes()[t];i.channel("undo-"+e.get("type")).request("ignore:attributes",this.ignoreAttributes)||this.ignoreAttributes;return-1==this.ignoreAttributes.indexOf(t)&&void i.channel("app").request("update:setting","clean",!1)}});return e}),n("controllers/app/coreUndo",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("changes").reply("undo:changeSetting",this.undoChangeSetting,this),i.channel("changes").reply("undo:addObject",this.undoAddObject,this),i.channel("changes").reply("undo:removeObject",this.undoRemoveObject,this),i.channel("changes").reply("undo:duplicateObject",this.undoDuplicateObject,this),i.channel("changes").reply("undo:sortFields",this.undoSortFields,this),i.channel("changes").reply("undo:addListOption",this.undoAddListOption,this),i.channel("changes").reply("undo:removeListOption",this.undoRemoveListOption,this),i.channel("changes").reply("undo:sortListOptions",this.undoSortListOptions,this)},undoChangeSetting:function(e,t){var n=e.get("model"),i=e.get("changes"),r=i.attr,a=i.before;n.set(r,a),this.maybeRemoveChange(e,t)},undoAddObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if("undefined"!=typeof r.newIDs&&delete r.newIDs[n.get("id")],!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&a.remove(t)})}r.remove(n),this.maybeRemoveChange(e,t)},undoDuplicateObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&a.remove(t)})}r.remove(n),this.maybeRemoveChange(e,t)},undoRemoveObject:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(i.channel(n.get("objectDomain")).request("add",n),delete r.removedIDs[n.get("id")],!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&t.set("disabled",!1)})}r.trigger("reset",r),this.maybeRemoveChange(e,t)},undoSortFields:function(e,t){var n=e.get("data"),r=n.fields,a=i.channel("fields").request("get:collection");_.each(r,function(e){var t=e.before,n=e.model;n.set("order",t)}),a.sort(),this.maybeRemoveChange(e,t)},undoAddListOption:function(e,t){var n=e.get("model");if(!t){var r=i.channel("changes").request("get:collection"),a=r.where({model:n});_.each(a,function(t){t!==e&&r.remove(t)})}n.collection.remove(n),this.maybeRemoveChange(e,t)},undoRemoveListOption:function(e,t){var n=e.get("model"),r=e.get("data").collection;if(r.add(n),!t){var a=i.channel("changes").request("get:collection"),s=a.where({model:n});_.each(s,function(t){t!==e&&t.set("disabled",!1)})}this.maybeRemoveChange(e,t)},undoSortListOptions:function(e,t){var n=e.get("data"),i=n.collection,r=n.objModels;_.each(r,function(e){var t=e.before,n=e.model;n.set("order",t)}),i.sort(),this.maybeRemoveChange(e,t)},maybeRemoveChange:function(e,t){var t="undefined"!=typeof t&&t;if(!t){i.channel("app").request("update:db");var n=i.channel("changes").request("get:collection");n.remove(e),0==n.length&&(i.channel("app").request("update:setting","clean",!0),i.channel("app").request("close:drawer"))}}});return e}),n("controllers/app/cloneModelDeep",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("clone:modelDeep",this.cloneModelDeep,this)},cloneModelDeep:function(e){var t={};_.each(e.attributes,function(e,n){if(e instanceof Backbone.Collection){var r=i.channel("app").request("clone:collectionDeep",e);t[n]=r}else e instanceof Backbone.Model&&(t[n]=this.cloneModelDeep(e))},this);var n=e.clone();return _.each(t,function(e,t){n.set(t,e)}),n}});return e}),n("controllers/app/getSettingChildView",["views/app/drawer/itemSetting"],function(e){var t=Marionette.Object.extend({initialize:function(){i.channel("app").reply("get:settingChildView",this.getSettingChildView,this)},getSettingChildView:function(t){var n=t.get("type"),r=i.channel(n).request("get:settingChildView",t)||e;return r}});return t}),n("controllers/app/changeSettingDefault",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("change:setting",this.changeSetting,this),this.listenTo(i.channel("app"),"change:setting",this.changeSetting,this)},changeSetting:function(e,t,n,r){var a=t.get("name"),s=n.get(a),r=r||null;r||(r=i.channel(t.get("type")).request("before:updateSetting",e,n,a,t)),"undefined"==typeof r&&(r=jQuery(e.target).val()),n.set(a,r,{settingModel:t}),i.channel("setting-"+a).trigger("after:updateSetting",n,t);var o=r,l={attr:a,before:s,after:o},c=i.channel("app").request("get:currentDomain"),d=(c.get("id"),{object:n.get("objectType"),label:n.get("label"),change:"Changed "+t.get("label")+" from "+s+" to "+o});i.channel("changes").request("register:change","changeSetting",n,l,d)}});return e}),n("views/app/drawer/typeSettingFieldset",["views/app/drawer/itemSetting"],function(e){var t=Marionette.CompositeView.extend({template:"#tmpl-nf-edit-setting-wrap",childView:e,initialize:function(e){this.collection=this.model.get("settings"),this.childViewOptions={dataModel:e.dataModel},this.dataModel=e.dataModel;var t=this.model.get("deps");if(t)for(var n in t)t.hasOwnProperty(n)&&this.dataModel.on("change:"+n,this.render,this);this.model.on("rerender",this.render,this)},onBeforeDestroy:function(){var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render)},onBeforeRender:function(){i.channel("app").trigger("before:renderSetting",this.model,this.dataModel),i.channel("setting-type-"+this.model.get("type")).trigger("before:renderSetting",this.model,this.dataModel,this),i.channel("setting-"+this.model.get("name")).trigger("before:renderSetting",this.model,this.dataModel,this)},onRender:function(){i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("render:setting",this.model,this.dataModel,this)},templateHelpers:function(){var e=this;return{renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!==this.deps[t])return'style="display:none;"';return""},renderSetting:function(){var e=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return e(this)},renderClasses:function(){var e="";return e+="undefined"!=typeof this.width?this.width:" one-half",this.error&&(e+=" nf-error"),e},renderError:function(){return this.error?this.error:""}}},attachHtml:function(e,t){jQuery(e.el).find(".nf-field-sub-settings").append(t.el)}});return t}),n("models/app/settingModel",[],function(){var e=Backbone.Model.extend({defaults:{settings:!1,hide_merge_tags:!1,error:!1},initialize:function(){i.channel("app").trigger("init:settingModel",this),i.channel(this.get("type")).trigger("init:settingModel",this),i.channel("setting-name-"+this.get("name")).trigger("init:settingModel",this),this.on("change:error",this.maybePreventUI,this),"undefined"!=typeof this.collection&&this.get("use_merge_tags")&&"undefined"!=typeof this.collection.options.objectType&&this.listenTo(i.channel("app"),"update:fieldKey",this.updateKey)},updateKey:function(e){i.channel("app").trigger("fire:updateFieldKey",e,this)},maybePreventUI:function(){this.get("error")?(i.channel("drawer").request("prevent:close","setting-"+this.get("name")+"-error"),i.channel("app").request("prevent:changeDomain","setting-"+this.get("name")+"-error")):(i.channel("drawer").request("enable:close","setting-"+this.get("name")+"-error"),i.channel("app").request("enable:changeDomain","setting-"+this.get("name")+"-error"))}});return e}),n("models/app/settingCollection",["models/app/settingModel"],function(e){var t=Backbone.Collection.extend({model:e,initialize:function(e,t){this.options=t||{}}});return t}),n("controllers/app/fieldset",["views/app/drawer/typeSettingFieldset","models/app/settingCollection"],function(e,t){var n=Marionette.Object.extend({initialize:function(){i.channel("fieldset").reply("get:settingChildView",this.getSettingChildView,this),this.listenTo(i.channel("fieldset"),"init:settingModel",this.createSettingsCollection)},getSettingChildView:function(t){return e},createSettingsCollection:function(e){e.set("settings",new t(e.get("settings")))}});return n}),n("controllers/app/toggleSetting",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-toggle").reply("renderOnChange",function(){return!1}),i.channel("toggle").reply("before:updateSetting",this.updateSetting,this)},updateSetting:function(e,t,n,i){if(jQuery(e.target).attr("checked"))var r=1;else var r=0;return r}});return e}),n("controllers/app/itemControls",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:edit",this.clickEdit),this.listenTo(i.channel("app"),"click:delete",this.clickDelete),this.listenTo(i.channel("app"),"click:duplicate",this.clickDuplicate)},clickEdit:function(e,t){var n=i.channel("app").request("get:currentDomain"),r=n.get("id"),a=i.channel(r).request("get:type",t.get("type"));i.channel("app").request("open:drawer","editSettings",{model:t,groupCollection:a.get("settingGroups")})},clickDelete:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r={object:t.get("objectType"),label:t.get("label"),change:"Removed",dashicon:"dismiss"},a={collection:t.collection},s=i.channel("changes").request("get:collection"),o=s.where({model:t});_.each(o,function(e){var i=e.get("data");"undefined"!=typeof i.fields&&_.each(i.fields,function(e,r){e.model==t&&(i.fields[r].model=n)}),e.set("data",i),e.set("model",n),e.set("disabled",!0)}),i.channel("changes").request("register:change","removeObject",n,null,r,a);var l=i.channel("app").request("get:currentDomain"),c=l.get("id");i.channel(c).request("delete",t)},clickDuplicate:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r=i.channel("app").request("get:currentDomain"),a=r.get("id");n.set("label",n.get("label")+" Copy");var s=i.channel(a).request("get:tmpID");n.set("id",s),i.channel(a).request("add",n,!1,!1,"duplicate");var o={object:t.get("objectType"),label:t.get("label"),change:"Duplicated",dashicon:"admin-page"},l={collection:i.channel(a).request("get:collection")};i.channel("changes").request("register:change","duplicateObject",n,null,o,l),t.trigger("change:label",t),i.channel("app").request("update:db")}});return e}),n("controllers/app/mergeTags",["models/app/mergeTagCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.tagSectionCollection=new e;var t=this;_.each(mergeTags,function(n){if(n.tags)var i=new e(n.tags);else var i="";t.tagSectionCollection.add({id:n.id,label:n.label,tags:i,default_group:n.default_group})});var n=this.tagSectionCollection.get("fields").get("tags"),r=i.channel("fields").request("get:collection");_.each(r.models,function(e){"submit"!==e.get("type")&&n.add({id:e.get("id"),label:e.get("label"),tag:t.getFieldKeyFormat(e.get("key"))})});var a=new e,s=i.channel("app").request("get:formModel"),o=s.get("settings").get("calculations");_.each(o.models,function(e){a.add({label:e.get("name"),tag:"{calc:"+e.get("name")+"}"})}),this.tagSectionCollection.get("calcs").set("tags",a),this.currentElement={},this.settingModel={},this.open=!1,this.listenTo(i.channel("mergeTags"),"click:mergeTag",this.clickMergeTag),this.listenTo(i.channel("fields"),"add:field",this.addFieldTags),this.listenTo(i.channel("fields"),"delete:field",this.deleteFieldTags),this.listenTo(i.channel("option-repeater-calculations"),"update:option",this.updateCalcTags),this.listenTo(i.channel("option-repeater-calculations"),"remove:option",this.updateCalcTags),i.channel("mergeTags").reply("update:currentElement",this.updateCurrentElement,this),i.channel("mergeTags").reply("update:currentSetting",this.updateCurrentSetting,this),i.channel("mergeTags").reply("get:collection",this.getCollection,this),i.channel("mergeTags").reply("get:mergeTag",this.getSectionModel,this),this.listenTo(i.channel("fieldSetting-key"),"update:setting",this.updateKey),this.listenTo(i.channel("app"),"replace:fieldKey",this.replaceFieldKey),i.channel("app").reply("get:fieldKeyFormat",this.getFieldKeyFormat,this)},initMergeTags:function(e){var t=i.channel("mergeTags").request("get:view"),n=this;this.jBoxes={};var n=this;jQuery(e.el).find(".merge-tags").each(function(){if("undefined"==typeof jQuery(this).data("jBox-id")){var i=jQuery(this).jBox("Tooltip",{title:"Insert Merge Tag",trigger:"click",position:{x:"center",y:"bottom"},closeOnClick:"body",closeOnEsc:!0,theme:"TooltipBorder",maxHeight:200,onOpen:function(){t.reRender(e.model),this.setContent(jQuery(".merge-tags-content"));var i=jQuery(this.target).prev(".setting");0==i.length&&(i=jQuery(e.el).find(".setting")),n.updateCurrentSetting(e.model),n.updateCurrentElement(i)},onClose:function(){}});jQuery(this).data("jBox-id",i.id)}})},clickMergeTag:function(e,t){if("undefined"!=typeof this.settingModel.get("settingModel")&&"calculations"==this.settingModel.get("settingModel").get("name")){console.log(t);var n=jQuery(this.currentElement).val(),i=jQuery(this.currentElement).caret(),r=i+t.get("tag").length,a="undefined"!=typeof t.get("calcTag")?t.get("calcTag"):t.get("tag");n=n.substr(0,i)+a+n.substr(i),jQuery(this.currentElement).val(n).caret(r).trigger("change")}else if("rte"==this.settingModel.get("type"))jQuery(this.currentElement).summernote("insertText",t.get("tag"));else{var n=jQuery(this.currentElement).val(),i=jQuery(this.currentElement).caret(),r=i+t.get("tag").length;n=n.substr(0,i)+t.get("tag")+n.substr(i),jQuery(this.currentElement).val(n).caret(r).trigger("change")}},addFieldTags:function(e){"submit"!==e.get("type")&&this.tagSectionCollection.get("fields").get("tags").add({id:e.get("id"),label:e.get("label"),tag:this.getFieldKeyFormat(e.get("key")),calcTag:this.getFieldKeyFormatCalc(e.get("key"))})},deleteFieldTags:function(e){var t=e.get("id"),n=this.tagSectionCollection.get("fields").get("tags").get(t);this.tagSectionCollection.get("fields").get("tags").remove(n)},updateCalcTags:function(t){var n=new e,r=i.channel("app").request("get:formModel"),a=r.get("settings").get("calculations");_.each(a.models,function(e){n.add({label:e.get("name"),tag:"{calc:"+e.get("name")+"}"})}),this.tagSectionCollection.get("calcs").set("tags",n)},openMergeTags:function(e){"TEXTAREA"!=jQuery(e.target)[0].tagName&&"INPUT"!=jQuery(e.target)[0].tagName||jQuery(e.target).parent().find(".merge-tags").click()},returnMergeTags:function(e){if(this.open){e.preventDefault();var t=this.fields.where({active:!0})[0];t&&this.clickMergeTag(e,t)}},upMergeTags:function(e){this.open&&(e.preventDefault(),this.changeActiveTag("up"))},downMergeTags:function(e){this.open&&(e.preventDefault(),this.changeActiveTag("down"))},changeActiveTag:function(e){if("down"==e)var t=1;else var t=-1;if(0<this.fields.where({active:!0}).length){var n=this.fields.where({active:!0})[0],i=this.fields.indexOf(n);n.set("active",!1);var r=this.fields.models[i+t];r&&r.set("active",!0)}else 0<this.fields.where({active:!0})?console.log("system"):0<this.userInfo.where({active:!0})?console.log("userinfo"):0<this.fields.models.length?this.fields.models[0].set("active",!0):this.system.models[0].set("active",!0)},updateCurrentElement:function(e){this.currentElement=e},updateCurrentSetting:function(e){this.settingModel=e},getCollection:function(){return this.tagSectionCollection},getSectionModel:function(e){return this.tagSectionCollection.get(e)},updateOpen:function(e){this.open=e,_.each(this.tagSectionCollection.get("fields").models,function(e){e.set("active",!1)})},updateKey:function(e){var t=e.get("key"),n=this.tagSectionCollection.get("fields").get("tags").get(e.get("id"));"undefined"!=typeof n&&n.set("tag",this.getFieldKeyFormat(t))},getFieldKeyFormat:function(e){return"{field:"+e+"}"},getFieldKeyFormatCalc:function(e){return"{field:"+e+":calc}"},replaceFieldKey:function(e,t,n){var i=this.getFieldKeyFormat(t._previousAttributes.key),r=this.getFieldKeyFormat(t.get("key")),a=n.get("name"),s=e.get(a);if("calculations"==a&&"undefined"!=typeof e.get("calculations")){var o=e.get("calculations");return o.each(function(e){var t=i.slice(0,i.length-1)+":calc}",n=r.slice(0,r.length-1)+":calc}";if(s=e.get("eq"),"string"==typeof s){var a=new RegExp(t,"g"),o=s.replace(a,n);a=new RegExp(i,"g"),o=o.replace(a,r),e.set("eq",o)}}),!1}if("string"==typeof s){var l=new RegExp(i,"g");newVal=s.replace(l,r),e.set(a,newVal)}}});return t}),n("models/app/mergeTagLookupCollection",["models/app/mergeTagModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("views/app/drawer/mergeTag",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tag-box-tag",events:{click:"insertTag"},insertTag:function(){i.channel("mergeTags").request("insert:tag",this.model.get("tag"))}});return e}),n("views/app/drawer/mergeTagList",["views/app/drawer/mergeTag"],function(e){var t=Marionette.CollectionView.extend({tagName:"ul",childView:e,initialize:function(){i.channel("merge-tags").reply("update:taglist",this.sectionFilter,this),i.channel("merge-tags").reply("filtersearch",this.searchFilter,this)},filter:function(e,t,n){return"fields"==e.get("section")},sectionFilter:function(e){this.filter=function(t,n,i){return e==t.get("section")},this.render(),i.channel("merge-tags").trigger("after:filtersearch")},searchFilter:function(e){this.filter=function(t,n,i){var r=t.get("label").toLowerCase().indexOf(e.toLowerCase().replace(":",""))>=0,a=t.get("tag").toLowerCase().indexOf(e.toLowerCase())>=0;return r||a},this.render(),i.channel("merge-tags").trigger("after:filtersearch")}});return t}),n("views/app/drawer/mergeTagGroup",[],function(){var e=Marionette.ItemView.extend({tagName:"li",template:"#tmpl-nf-merge-tag-box-section",events:{click:"onClick"},initialize:function(){this.listenTo(i.channel("merge-tags"),"after:filtersearch",this.removeActive)},onClick:function(){this.updateTags(),this.setActive()},updateTags:function(){i.channel("merge-tags").request("update:taglist",this.model.get("id"))},setActive:function(){this.$el.addClass("active"),this.$el.siblings().removeClass("active")},removeActive:function(){this.$el.removeClass("active")}});return e}),n("views/app/drawer/mergeTagGroupList",["views/app/drawer/mergeTagGroup"],function(e){var t=Marionette.CollectionView.extend({tagName:"ul",childView:e,initialize:function(){this.listenTo(i.channel("merge-tags"),"open",this.render,this)},filter:function(e,t,n){return 0<e.get("tags").length}});return t}),n("views/app/drawer/mergeTagFilter",[],function(){var e=Marionette.ItemView.extend({template:"#tmpl-nf-merge-tag-box-filter",events:{"keyup input":"updateFilter"},updateFilter:function(e){if(13==e.keyCode){var t=jQuery("#merge-tags-box .merge-tag-list ul li span").first().data("tag");return i.channel("mergeTags").request("insert:tag",t),jQuery("#merge-tags-box").css("display","none"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}var n=this.$el.find("input").val();i.channel("merge-tags").request("filtersearch",n)}});return e}),n("views/app/drawer/mergeTagBox",[],function(){var e=Marionette.LayoutView.extend({el:"#merge-tags-box",template:"#tmpl-nf-merge-tag-box",regions:{filter:".merge-tag-filter",sections:".merge-tag-sections",tags:".merge-tag-list"}});return e}),n("controllers/app/mergeTagBox",["models/app/mergeTagModel","models/app/mergeTagLookupCollection","views/app/drawer/mergeTag","views/app/drawer/mergeTagList","views/app/drawer/mergeTagGroup","views/app/drawer/mergeTagGroupList","views/app/drawer/mergeTagFilter","views/app/drawer/mergeTagBox"],function(e,t,n,r,a,s,o,l){var c=Marionette.Object.extend({caret:0,old:"",initialize:function(){this.listenTo(i.channel("drawer"),"render:settingGroup",function(){jQuery(".merge-tags").off("click"),jQuery(".merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("app"),"after:appStart",this.afterAppStart),this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting),this.listenTo(i.channel("drawer"),"before:close",this.beforeDrawerClose);var e=this;i.channel("mergeTags").reply("set:caret",function(t){e.caret=t; 4 }),i.channel("mergeTags").reply("get:caret",function(){return e.caret});var e=this;i.channel("mergeTags").reply("set:old",function(t){e.old=t}),i.channel("mergeTags").reply("get:old",function(){return e.old}),i.channel("mergeTags").reply("insert:tag",this.insertTag.bind(this)),this.listenTo(i.channel("option-repeater"),"add:option",function(t){var n="#"+t.cid+" .has-merge-tags input.setting";jQuery(n).on("focus",function(t){e.focusCallback(t,n,"option-repeater")}),jQuery(n).on("keyup",function(t){e.keyupCallback(t,n,"option-repeater")}),jQuery(n).siblings(".nf-list-options .merge-tags").off("click"),jQuery(n).siblings(".nf-list-options .merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("drawer"),"opened",function(){jQuery(".nf-list-options .merge-tags").off("click"),jQuery(".nf-list-options .merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("setting-calculations-option"),"render:setting",this.renderSetting),this.listenTo(i.channel("drawer"),"opened",function(){jQuery(".nf-list-options.calculations .merge-tags").off("click"),jQuery(".nf-list-options.calculations .merge-tags").on("click",this.mergeTagsButtonClick)}),this.listenTo(i.channel("summernote"),"focus",function(t,n){e.focusCallback(!1,n,"rte")}),this.listenTo(i.channel("summernote"),"keydown",function(e,t){jQuery(t).closest(".nf-setting").find(".setting").summernote("saveRange")}),this.listenTo(i.channel("summernote"),"keyup",function(t,n){e.keyupCallback(t,n,"rte")}),this.listenTo(i.channel("drawer"),"opened",function(){jQuery(".note-editor .merge-tags").off("click"),jQuery(".note-editor .merge-tags").on("click",this.mergeTagsButtonClick)}),jQuery(document).on("keyup",function(e){27==e.keyCode&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").blur(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))})},afterAppStart:function(){var e=i.channel("mergeTags").request("get:collection"),n=[];e.each(function(e){e.get("tags").each(function(t){n.push({label:t.get("label"),tag:t.get("tag"),section:e.get("id")})})});var a=new l;a.render();var c=new t(n),d=new r({collection:c}),h=new s({collection:e});a.getRegion("tags").show(d),a.getRegion("sections").show(h),a.getRegion("filter").show(new o);var u=this;this.listenTo(i.channel("mergeTags"),"open",function(){u.afterAppStart()})},beforeRenderSetting:function(e,t){if("undefined"!=typeof e.get("use_merge_tags")&&e.get("use_merge_tags")){var n=e.get("name");this.listenTo(i.channel("setting-"+n),"render:setting",this.renderSetting)}},renderSetting:function(e,t,n){n.$el.find(".merge-tags").off("click"),n.$el.find(".merge-tags").on("click",this.mergeTagsButtonClick),0==jQuery("#merge-tags-box").length&&this.afterAppStart(),jQuery("#nf-drawer").on("scroll",function(){if(0!=jQuery(".merge-tag-focus").length){var e=jQuery(".merge-tag-focus").closest(".nf-setting").find(".note-editor");if(0!=e.length)var t=e.offset().top-jQuery(window).scrollTop(),n=e.outerHeight();else var t=jQuery(".merge-tag-focus").offset().top-jQuery(window).scrollTop(),n=jQuery(".merge-tag-focus").outerHeight();jQuery("#merge-tags-box").css("top",t+n);var i=jQuery("#merge-tags-box").outerHeight();jQuery("#nf-drawer").css("padding-bottom",i+"px");var r=jQuery(".merge-tag-focus").closest(".nf-list-options-tbody");if(0!=r.length){var a=r.offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",a)}else{var s=jQuery(".merge-tag-focus").closest(".nf-settings").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",s),jQuery("#merge-tags-box").css("width",jQuery(".merge-tag-focus").closest(".nf-settings").width())}}}),jQuery(n.el).find(".setting").on("focus",this.focusCallback),jQuery(n.el).find(".setting").on("keyup",this.keyupCallback)},beforeDrawerClose:function(){jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),i.channel("mergeTags").trigger("open")},insertTag:function(e){var t=jQuery(".merge-tag-focus");if(0!=t.closest(".nf-setting").first().find(".note-editable").length&&(t=t.closest(".nf-setting").first().find(".note-editable")),1<t.length&&(t=t.first()),t.hasClass("note-editable"))var n=t.closest(".nf-setting").find(".setting").summernote("code");else var n=t.val();for(var r=i.channel("mergeTags").request("get:old"),a=e,s=i.channel("mergeTags").request("get:caret"),o=/{([a-z0-9]|:|_||-})*/g;match=o.exec(n);)if(r==match[0]){var l=n.slice(0,match.index)+a+n.slice(o.lastIndex);if(t.hasClass("note-editable")){t.closest(".nf-setting").find(".setting").summernote("code",l);var c=t,d=null;_.each(c[0].childNodes,function(e,t){if(!d&&(e.nodeValue||e.innerHTML)){if(e.nodeValue)var n=e.nodeValue.indexOf(a)+r.length;else if(e.innerHTML)var n=e.innerHTML.indexOf(a)+r.length;s==n&&(d=c[0].childNodes[t])}}),d||(d=c[0].childNodes[0]);var h=s-r.length+a.length,u=document.createRange(),g=window.getSelection();if(0!=d.childNodes.length)try{u.setStart(d.childNodes[0],h)}catch(e){console.log("error")}else try{u.setStart(d,h)}catch(e){console.log("error")}u.collapse(!0),g.removeAllRanges(),g.addRange(u)}else t.val(l),t.change(),t.caret(s-r.length+a.length)}jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),t.removeClass("merge-tag-focus"),t.closest(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")},mergeTagsButtonClick:function(e){var t=jQuery(this);if(t.siblings().hasClass("merge-tag-focus"))return i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay");if(0!==t.closest(".nf-setting, .nf-table-row").find(".note-tools").length){var n=t.closest(".note-editor").siblings(".setting").first();t.closest(".nf-setting").find(".setting").summernote("insertText","{")}else{var n=t.siblings(".setting").first(),r=n.val()||"";n.val(r+"{").change(),i.channel("mergeTags").request("set:caret",r.length+1)}t.parent().hasClass("note-tools"),i.channel("mergeTags").request("set:old","{"),n.addClass("merge-tag-focus");var a=t.attr("autocomplete");t.attr("autocomplete","off"),t.data("autocomplete",a);var s=t.closest(".nf-setting, .nf-table-row");0!=s.find(".note-editor").length?s.find(".note-editor").addClass("merge-tag-focus-overlay"):s.addClass("merge-tag-focus-overlay"),jQuery("#merge-tags-box").css("display","block"),i.channel("drawer").request("prevent:close"),jQuery(".merge-tag-focus-overlay").off("click"),jQuery(".merge-tag-focus-overlay").on("click",function(e){jQuery(e.target).hasClass("note-editor")&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))}),setTimeout(function(){jQuery("#merge-tags-box").find(".merge-tag-filter").find("input").focus()},500)},focusCallback:function(e,t,n){var n=n||"setting",i="undefined"==typeof t?jQuery(this):jQuery(t);if(jQuery(".merge-tag-focus").each(function(e,t){this!=t&&t.removeClass("merge-tag-focus")}),"rte"==n)var r=i.closest(".nf-setting").find(".note-editor").offset().top-jQuery(window).scrollTop(),a=i.closest(".nf-setting").find(".note-editor").outerHeight();else var r=i.offset().top-jQuery(window).scrollTop(),a=i.outerHeight();jQuery("#merge-tags-box").css("top",r+a);var s=i.closest(".nf-list-options-tbody");if(0!=s.length){var o=s.offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",o)}else if("rte"==n){var l=i.closest(".nf-setting").find(".note-editor").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",l),jQuery("#merge-tags-box").css("width",i.closest(".nf-setting").find(".note-editor").width())}else{var l=jQuery(this).closest(".nf-settings").offset().left-jQuery(window).scrollLeft();jQuery("#merge-tags-box").css("left",l),jQuery("#merge-tags-box").css("width",i.closest(".nf-settings").width())}var c=jQuery(this).data("id")},keyupCallback:function(e,t,n){var n=n||"setting";if(13==e.keyCode){var r=jQuery("#merge-tags-box .merge-tag-list ul li span").first().data("tag");return i.channel("mergeTags").request("insert:tag",r),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),void jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}if("undefined"!=typeof t)var a=jQuery(t);else var a=jQuery(this);var s=jQuery(this).data("id");if(!s||"eq"==s){if("rte"==n){var o=a.summernote("createRange");if(o)var l=o.so;else var l=0;a.closest(".nf-setting").find(".setting").summernote("saveRange")}else var l=a.caret();if(i.channel("mergeTags").request("set:caret",l),"rte"==n)var c=a.summernote("code").match(new RegExp(/{([a-z0-9]|:|_|-|})*/g));else var c=a.val().match(new RegExp(/{([a-z0-9]|:|_|-|})*/g));if(c=_.filter(c,function(e){return-1==e.indexOf("}")}),0!==c.length){i.channel("mergeTags").request("set:old",c[0]),jQuery("#merge-tags-box").css("display","block"),i.channel("drawer").request("prevent:close"),a.addClass("merge-tag-focus");var d=jQuery("#merge-tags-box").outerHeight();jQuery("#nf-drawer").css("padding-bottom",d+"px");var h=a.attr("autocomplete");a.attr("autocomplete","off"),a.data("autocomplete",h);var u=a.closest(".nf-setting, .nf-table-row");0!=u.find(".note-editor").length?u.find(".note-editor").addClass("merge-tag-focus-overlay"):u.addClass("merge-tag-focus-overlay"),u.off("click"),u.on("click",function(e){var t=jQuery(e.target).attr("class")||[];-1!==t.indexOf("merge-tag-focus-overlay")&&(i.channel("mergeTags").request("insert:tag",""),jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay"))});var g=c[0].replace("{","");i.channel("merge-tags").request("filtersearch",g)}else jQuery("#merge-tags-box").css("display","none"),i.channel("drawer").request("enable:close"),jQuery("#merge-tags-box").removeClass(),jQuery(".merge-tag-focus").removeClass("merge-tag-focus"),jQuery(".merge-tag-focus-overlay").removeClass("merge-tag-focus-overlay")}}});return c}),n("controllers/app/itemSettingFill",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t){"fields"==e.get("fill")}});return e}),n("controllers/app/confirmPublish",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:confirmPublish",this.confirmPublish)},confirmPublish:function(){var e=i.channel("app").request("get:formModel");1==e.get("settings").get("add_submit")&&i.channel("fields").request("add",{type:"submit",label:"Submit",order:9999}),e.set("show_publish_options",!1),i.channel("app").request("update:db","publish")}});return e}),n("controllers/app/rte",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-rte").reply("renderOnChange",function(){return!1}),this.listenTo(i.channel("rte"),"init:settingModel",this.initSettingModel),this.listenTo(i.channel("setting-type-rte"),"render:setting",this.renderSetting),this.listenTo(i.channel("setting-type-rte"),"destroy:setting",this.destroySetting),this.listenTo(i.channel("setting-type-rte"),"click:extra",this.clickExtra),this.meta_image_frame,jQuery.summernote.options.icons={align:"dashicons dashicons-editor-alignleft",alignCenter:"dashicons dashicons-editor-aligncenter",alignJustify:"dashicons dashicons-editor-justify",alignLeft:"dashicons dashicons-editor-alignleft",alignRight:"dashicons dashicons-editor-alignright",indent:"dashicons dashicons-editor-indent",outdent:"dashicons dashicons-editor-outdent",bold:"dashicons dashicons-editor-bold",caret:"dashicons dashicons-arrow-down",close:"dashicons dashicons-dismiss",code:"dashicons dashicons-editor-code",eraser:"dashicons dashicons-editor-removeformatting",italic:"dashicons dashicons-editor-italic",link:"dashicons dashicons-admin-links",unlink:"dashicons dashicons-editor-unlink",magic:"dashicons dashicons-editor-paragraph",minus:"dashicons dashicons-minus",orderedlist:"dashicons dashicons-editor-ol",redo:"dashicons dashicons-redo",square:"dashicons fa-square",table:"dashicons dashicons-editor-table",underline:"dashicons dashicons-editor-underline",undo:"dashicons dashicons-undo",unorderedlist:"dashicons dashicons-editor-ul"},this.currentContext={}},initSettingModel:function(e){e.set("hide_merge_tags",!0)},initRTE:function(e,t,n){var r=this,a=function(e){return r.linkButton(e)},s=function(e){return r.mediaButton(e)},o=this.mergeTags(),l=[["paragraphStyle",["style"]],["fontStyle",["bold","italic","underline","clear"]],["lists",["ul","ol"]],["paragraph",["paragraph"]],["customGroup",["linkButton","unlink"]],["table",["table"]],["actions",["undo","redo"]],["tools",["mediaButton","mergeTags","codeview"]]];jQuery(n.el).find("div.setting").summernote({toolbar:l,buttons:{linkButton:a,mergeTags:o,mediaButton:s},height:150,codemirror:{theme:"monokai",lineNumbers:!0,callbacks:{onBlur:function(n){var i=n.getValue();r.updateDataModel(e,t,i)}}},prettifyHtml:!0,callbacks:{onBlur:function(n,a){var s=jQuery(this).summernote("code");r.updateDataModel(e,t,s),i.channel("summernote").trigger("blur",e,t,s)},onFocus:function(e,t){i.channel("summernote").trigger("focus",e,this,t)},onKeydown:function(e,t){i.channel("summernote").trigger("keydown",e,this,t)},onKeyup:function(e,t){i.channel("summernote").trigger("keyup",e,this,t)}}})},updateDataModel:function(e,t,n){var r=e.get("name"),a=t.get(r),s=n,o={attr:r,before:a,after:s},l={object:t.get("objectType"),label:t.get("label"),change:"Changed "+e.get("label")+" from "+a+" to "+s};i.channel("changes").request("register:change","changeSetting",t,o,l),t.set(e.get("name"),s)},renderSetting:function(e,t,n){this.initRTE(e,t,n);var i=jQuery(n.el).find(".link-button").next(".dropdown-menu").find("button");i.replaceWith(function(){return jQuery("<div/>",{class:jQuery(i).attr("class"),html:this.innerHTML})})},destroySetting:function(e,t,n){this.removeRTE(e,t,n)},removeRTE:function(e,t,n){jQuery(n.el).find("div.setting").summernote("destroy")},drawerOpened:function(e,t,n){this.initRTE(e,t,n)},linkButton:function(e){var t=this,n=jQuery.summernote.ui,r=i.channel("app").request("get:template","#tmpl-nf-rte-link-button"),a=i.channel("app").request("get:template","#tmpl-nf-rte-link-dropdown");return n.buttonGroup([n.button({className:"dropdown-toggle link-button",contents:r({}),tooltip:"Insert Link",click:function(n){t.clickLinkButton(n,e)},data:{toggle:"dropdown"}}),n.dropdown([n.buttonGroup({children:[n.button({contents:a({}),tooltip:""})]})])]).render()},mergeTags:function(e){var t=jQuery.summernote.ui,n=i.channel("app").request("get:template","#tmpl-nf-rte-merge-tags-button");return t.button({className:"dropdown-toggle merge-tags",contents:n({}),tooltip:"Merge Tags"}).render()},mediaButton:function(e){var t=this,n=jQuery.summernote.ui,r=i.channel("app").request("get:template","#tmpl-nf-rte-media-button");return n.button({className:"dropdown-toggle",contents:r({}),tooltip:"Insert Media",click:function(n){t.openMediaManager(n,e)}}).render()},openMediaManager:function(e,t){if(t.invoke("editor.createRange"),t.invoke("editor.saveRange"),this.currentContext=t,this.meta_image_frame)return void this.meta_image_frame.open();this.meta_image_frame=wp.media.frames.meta_image_frame=wp.media({title:"Select a file",button:{text:"insert"}});var n=this;this.meta_image_frame.on("select",function(){var e=n.meta_image_frame.state().get("selection").first().toJSON();n.insertMedia(e,t)}),this.meta_image_frame.open()},clickLinkButton:function(e,t){var n=t.invoke("editor.createRange");t.invoke("editor.saveRange");var i=n.toString();this.currentContext=t,jQuery(e.target).closest(".note-customGroup > .note-btn-group").on("hide.bs.dropdown",function(e){return!1}),jQuery(e.target).closest(".note-customGroup > .note-btn-group").on("shown.bs.dropdown",function(e){jQuery(e.target).parent().parent().find(".link-text").val(i),jQuery(e.target).parent().parent().find(".link-url").focus()})},clickExtra:function(e,t,n,i){var r=jQuery(e.target).parent().find(".link-text"),a=jQuery(e.target).parent().find(".link-url"),s=jQuery(e.target).parent().find(".link-new-window");if(this.currentContext.invoke("editor.restoreRange"),jQuery(e.target).hasClass("insert-link")){var o=r.val(),l=a.val(),c=!!s.prop("checked");0!=o.length&&0!=l.length&&this.currentContext.invoke("editor.createLink",{text:o,url:l,isNewWindow:c})}r.val(""),a.val(""),s.prop("checked",!1),jQuery(e.target).closest("div.note-btn-group.open").removeClass("open")},insertMedia:function(e,t){this.currentContext.invoke("editor.restoreRange"),"image"==e.type?this.currentContext.invoke("editor.insertImage",e.url):this.currentContext.invoke("editor.createLink",{text:e.filename,url:e.url})}});return e}),n("controllers/app/settingFieldSelect",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("field-select"),"init:settingModel",this.trackKeyChanges),this.listenTo(i.channel("setting-type-field-select"),"before:renderSetting",this.beforeRender),this.listenTo(i.channel("field-select"),"init:settingModel",function(){this.listenTo(i.channel("app"),"change:setting",this.maybeSwitchToFieldsDomain)}),this.listenTo(i.channel("app"),"change:currentDomain",this.autoOpenDrawer),this.listenTo(i.channel("drawer"),"opened",this.filterDrawerContents),this.listenTo(i.channel("drawer"),"closed",this.SwitchToFieldsDomain)},trackKeyChanges:function(e){e.listenTo(i.channel("app"),"update:fieldKey",e.updateKey),this.listenTo(i.channel("app"),"replace:fieldKey",this.updateFieldMap)},updateFieldMap:function(e,t,n){var i=t._previousAttributes.key,r=t.get("key");"field-select"==n.get("type")&&e.get(n.get("name"))==i&&e.set(n.get("name"),r)},beforeRender:function(e,t){var n=i.channel("fields").request("get:collection"),r=e.get("field_types"),a=[{label:"--",value:0}];_.each(n.models,function(n){if(t.cid!=n.cid&&("undefined"==typeof r||0==r.length||_.contains(r,n.get("type")))){var i=e.get("field_filter");if(i&&"undefined"!=typeof i[n.get("type")]){var s=!1;if(_.each(i[n.get("type")],function(e,t){console.log(e+":"+n.get(t)),e!=n.get(t)&&(s=!0)}),s)return}var o=n.get("key");switch(e.get("field_value_format")){case"key":o=n.get("key");break;case"merge_tag":default:o="{field:"+n.get("key")+"}"}a.push({label:n.get("label"),value:o})}}),"undefined"!=typeof r&&0!=r.length&&_.each(r,function(e){var t=i.channel("fields").request("get:type",e);a.push({label:"-- Add "+t.get("nicename")+" Field",value:"addField:"+e})}),e.set("options",a)},maybeSwitchToFieldsDomain:function(e,t,n){if("field-select"==t.get("type")){var r=t.get("name"),a=n.get(r);if(a){var s=a.split(":");"addField"==s[0]&&(this.openDrawer="addField",this.filterDrawer=s[1],n.set(r,""),this.switchDomain=!0,i.channel("app").request("close:drawer"))}}},SwitchToFieldsDomain:function(){if(this.switchDomain){var e=i.channel("app").request("get:domainModel","fields");i.channel("app").request("change:currentDomain",null,e),this.switchDomain=null}},autoOpenDrawer:function(){this.openDrawer&&(i.channel("app").request("open:drawer",this.openDrawer),this.openDrawer=null)},filterDrawerContents:function(){this.filterDrawer&&(i.channel("drawer-addField").trigger("change:filter",this.filterDrawer),this.filterDrawer=null)}});return e}),n("controllers/app/settingFieldList",["views/app/drawer/typeSettingFieldset","models/app/settingCollection"],function(e,t){return Marionette.Object.extend({fieldListSettings:[],initialize:function(){this.listenTo(i.channel("field-list"),"init:settingModel",this.registerFieldListSettings),this.listenTo(i.channel("fields"),"update:setting",this.updateFieldListSettingKeys),i.channel("field-list").reply("get:settingChildView",this.getSettingChildView,this)},registerFieldListSettings:function(e){this.fieldListSettings.push(e.get("name"))},updateFieldListSettingKeys:function(e){if("undefined"!=typeof e.changed.key){var t=e._previousAttributes.key,n=e.changed.key,i=this;_.each(Backbone.Radio.channel("actions").request("get:collection").models,function(e){_.each(e.attributes,function(r,a){var s="";_.each(i.fieldListSettings,function(i){if(a==i+"-"+t&&s!=t){var r=e.get(i+"-"+t);e.set(i+"-"+n,r),e.set(i+"-"+t,0),s=t}})})})}},getSettingChildView:function(n){var r=_.filter(i.channel("fields").request("get:collection").models,function(e){return _.contains(n.get("field_types"),e.get("type"))}),a=_.map(r,function(e){return{name:n.get("name")+"-"+e.get("key"),type:"toggle",label:e.get("label"),width:"full"}});return n.set("settings",new t(a)),e}})}),n("controllers/app/settingHTML",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-html"),"before:renderSetting",this.init)},init:function(e,t){"undefined"!=e.get("mirror")&&t.on("change:"+e.get("mirror"),this.update,e)},update:function(e,t){e.set(this.get("name"),t)}});return e}),n("controllers/app/settingColor",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("setting-type-color").reply("renderOnChange",this.setRenderFalse),this.listenTo(i.channel("setting-type-color"),"destroy:setting",this.closeColorPickers),this.listenTo(i.channel("setting-type-color"),"render:setting",this.initColorPicker)},initColorPicker:function(e,t,n){var r=(e.get("name"),jQuery(n.el).find("input"));jQuery(r).wpColorPicker({change:function(n,r){i.channel("app").request("change:setting",n,e,t,r.color.toString())}})},setRenderFalse:function(){return!1},closeColorPickers:function(e,t,n){jQuery(n.el).find(".wp-color-picker").wpColorPicker("close")}});return e}),n("controllers/app/changeMenu",[],function(){var e=Marionette.Object.extend({editFormText:"",initialize:function(){this.editFormText=nfAdmin.editFormText||"Edit Form",this.listenTo(i.channel("app"),"after:appStart",this.changeMenu),this.listenTo(i.channel("app"),"response:updateDB",this.formPublish)},changeMenu:function(){var e=i.channel("app").request("get:formModel");this.isNewForm(e.id)?this.highlightAddNew():this.appendEditForm()},isNewForm:function(e){return isNaN(e)},highlightAddNew:function(){jQuery(".wp-submenu li").removeClass("current"),jQuery('a[href="admin.php?page=ninja-forms&form_id=new"]').parent().addClass("current")},appendEditForm:function(){var e='<li class="current"><a href="#">'+this.editFormText+"</a></li>";0==jQuery('li a:contains("'+this.editFormText+'")').length&&(jQuery(".wp-submenu li").removeClass("current"),jQuery('a[href="admin.php?page=ninja-forms&form_id=new"]').parent().after(e))},formPublish:function(e){return"publish"===e.action&&void this.changeMenu()}});return e}),n("controllers/app/mobile",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"click:menu",this.closeMobileMenu)},closeMobileMenu:function(){var e=i.channel("app").request("get:builderEl");jQuery(e).removeClass("nf-menu-expand")}});return e}),n("controllers/app/notices",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("notices").reply("add",this.addNotice,this),i.channel("notices").reply("close",this.closeNotice,this),this.notices={}},addNotice:function(e,t,n){var r={content:t,color:"green",zIndex:12e3,constructOnInit:!0,stack:!0,animation:{open:"flip",close:"flip"}},a={position:{x:"center",y:"top"},animation:{open:"slide:top",close:"slide:left"},autoClose:2e3,offset:{x:0,y:55}},s={attributes:{x:"left",y:"bottom"},autoClose:4e3};if(i.channel("app").request("is:mobile"))var o=a;else var o=s;o=jQuery.extend(o,r);var n=jQuery.extend(o,n);this.notices[e]=new jBox("Notice",n)},closeNotice:function(e){"undefined"!=typeof this.notices[e]&&this.notices[e].close()},openNotice:function(e){"undefined"!=typeof this.notices[e]&&this.notices[e].open()}});return e}),n("controllers/app/unloadCheck",[],function(){var e=Marionette.Object.extend({initialize:function(){jQuery(window).bind("beforeunload",this.maybePrompt)},maybePrompt:function(e){if(!i.channel("app").request("get:setting","clean"))return"You have unsaved changes."}});return e}),n("controllers/app/formContentFilters",[],function(){var e=Marionette.Object.extend({initialize:function(){this.viewFilters=[],this.saveFilters=[],this.loadFilters=[],i.channel("formContent").reply("add:viewFilter",this.addViewFilter,this),i.channel("formContent").reply("add:saveFilter",this.addSaveFilter,this),i.channel("formContent").reply("add:loadFilter",this.addLoadFilter,this),i.channel("formContent").reply("get:viewFilters",this.getViewFilters,this),i.channel("formContent").reply("get:saveFilters",this.getSaveFilters,this),i.channel("formContent").reply("get:loadFilters",this.getLoadFilters,this),i.channel("fieldContents").reply("add:viewFilter",this.addViewFilter,this),i.channel("fieldContents").reply("add:saveFilter",this.addSaveFilter,this),i.channel("fieldContents").reply("add:loadFilter",this.addLoadFilter,this),i.channel("fieldContents").reply("get:viewFilters",this.getViewFilters,this),i.channel("fieldContents").reply("get:saveFilters",this.getSaveFilters,this),i.channel("fieldContents").reply("get:loadFilters",this.getLoadFilters,this)},addViewFilter:function(e,t){this.viewFilters[t]=e},getViewFilters:function(){return this.viewFilters},addSaveFilter:function(e,t){this.saveFilters[t]=e},getSaveFilters:function(){return this.saveFilters},addLoadFilter:function(e,t){this.loadFilters[t]=e},getLoadFilters:function(){return this.loadFilters}});return e}),n("controllers/app/formContentGutterFilters",[],function(){var e=Marionette.Object.extend({initialize:function(){this.leftFilters=[],this.rightFilters=[],i.channel("formContentGutters").reply("add:leftFilter",this.addLeftFilter,this),i.channel("formContentGutters").reply("add:rightFilter",this.addRightFilter,this),i.channel("formContentGutters").reply("get:leftFilters",this.getLeftFilters,this),i.channel("formContentGutters").reply("get:rightFilters",this.getRightFilters,this)},addLeftFilter:function(e,t){this.leftFilters[t]=e},addRightFilter:function(e,t){this.rightFilters[t]=e},getLeftFilters:function(){return this.leftFilters},getRightFilters:function(){return this.rightFilters}});return e}),n("controllers/app/cloneCollectionDeep",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("clone:collectionDeep",this.cloneCollectionDeep,this)},cloneCollectionDeep:function(e){var t=[];return _.each(e.models,function(e){var n=i.channel("app").request("clone:modelDeep",e);t.push(n)}),new e.constructor(t,e.options)}});return e}),n("controllers/app/trackKeyDown",[],function(){var e=Marionette.Object.extend({keys:[],initialize:function(){var e=this;jQuery(document).on("keydown",function(t){e.keyDown(t,e)}),jQuery(document).on("keyup",function(t){e.keyUp(t,e)}),i.channel("app").reply("get:keydown",this.getKeyDown,this)},keyDown:function(e,t){t.keys[e.keyCode]=e.keyCode},keyUp:function(e,t){-1!=t.keys.indexOf(e.keyCode)&&delete t.keys[e.keyCode]},getKeyDown:function(){return this.keys}});return e}),n("controllers/app/perfectScroll",[],function(){var e=Marionette.Object.extend({movedPos:!1,initialize:function(){this.listenTo(i.channel("main"),"show:main",this.initPerfectScroll),this.listenTo(i.channel("drawer"),"opened",this.moveRail),this.listenTo(i.channel("drawer"),"before:closeDrawer",this.resetRail)},initPerfectScroll:function(e){i.channel("app").request("is:mobile")||jQuery(e.el).parent().perfectScrollbar({suppressScrollX:!0}),jQuery("head").append('<style id="ps-scrollbar-css" type="text/css"></style>')},moveRail:function(){var e=i.channel("app").request("get:drawerEl"),t=jQuery(e).outerWidth();jQuery("#ps-scrollbar-css").text(".ps-scrollbar-moved { right: "+t+"px !important; } "),jQuery("#nf-main .ps-scrollbar-y-rail").addClass("ps-scrollbar-moved ")},resetRail:function(){jQuery(".ps-scrollbar-y-rail").removeClass("ps-scrollbar-moved ")}});return e}),n("models/app/settingGroupModel",["models/app/settingCollection"],function(e){var t=Backbone.Model.extend({defaults:{display:!1},initialize:function(t){0==this.get("settings")instanceof Backbone.Collection&&this.set("settings",new e(this.get("settings")))}});return t}),n("models/app/settingGroupCollection",["models/app/settingGroupModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/app/getNewSettingGroupCollection",["models/app/settingGroupCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){i.channel("app").reply("get:settingGroupCollectionDefinition",this.getNewSettingGroupCollection,this)},getNewSettingGroupCollection:function(){return e}});return t}),n("controllers/app/settingMedia",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-media"),"click:extra",this.clickExtra)},clickExtra:function(e,t,n,i){var r=jQuery(e.target).parent().find(".setting");if(jQuery(e.target).hasClass("open-media-manager")){if(this.meta_image_frame)return void this.meta_image_frame.open();this.meta_image_frame=wp.media.frames.meta_image_frame=wp.media({title:"Select a file",button:{text:"insert"}});var a=this;this.meta_image_frame.on("select",function(){var e=a.meta_image_frame.state().get("selection").first().toJSON();r.val(e.url).change()}),this.meta_image_frame.open()}}});return e}),n("models/app/typeModel",["models/app/settingGroupCollection"],function(e){var t=Backbone.Model.extend({initialize:function(){!1==this.get("settingGroups")instanceof Backbone.Collection&&this.set("settingGroups",new e(this.get("settingGroups"))),i.channel("fields").trigger("init:typeModel",this)}});return t}),n("models/app/typeCollection",["models/app/typeModel"],function(e){var t=Backbone.Collection.extend({model:e,type:!1,initialize:function(e,t){_.each(t,function(e,t){this[t]=e},this)}});return t}),n("models/fields/typeSectionModel",[],function(){var e=Backbone.Model.extend({defaults:{classes:""}});return e}),n("models/fields/typeSectionCollection",["models/fields/typeSectionModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/fields/types",["models/app/typeCollection","models/fields/typeSectionCollection"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.sections=new t(fieldTypeSections),this.listenTo(i.channel("fields"),"init:typeModel",this.registerSection),this.collection=new e(fieldTypeData,{type:"fields"}),i.channel("fields").reply("get:type",this.getFieldType,this),i.channel("fields").reply("get:typeCollection",this.getTypeCollection,this),i.channel("fields").reply("get:typeSections",this.getTypeSections,this),i.channel("fields").reply("get:savedFields",this.getSavedFields,this),this.listenTo(i.channel("drawer"),"click:fieldType",this.addField)},registerSection:function(e){"fields"==e.collection.type&&e.get("section")&&this.sections.get(e.get("section")).get("fieldTypes").push(e.get("id"))},getFieldType:function(e){return this.collection.get(e)},getTypeCollection:function(e){return this.collection},addField:function(e){var t=jQuery(e.target).data("id");if(e.shiftKey)return void i.channel("fields").request("add:stagedField",t);var n=i.channel("fields").request("add",{type:t,label:i.channel("fields").request("get:type",t).get("nicename")}),r={object:"Field",label:n.get("label"),change:"Added",dashicon:"plus-alt"},a={ 5 collection:i.channel("fields").request("get:collection")};i.channel("changes").request("register:change","addObject",n,null,r,a),i.channel("fields").request("redraw:collection")},getTypeSections:function(){return this.sections},getSavedFields:function(){this.sections.get("saved")}});return n}),n("controllers/fields/fieldTypeDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:type",this.startDrag),this.listenTo(i.channel("drawer-addField"),"stopDrag:type",this.stopDrag),i.channel("drawer-addField").reply("get:typeHelperClone",this.getCurrentDraggableHelperClone,this)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important"),this.draggableHelperClone=jQuery(t.helper).clone()},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")},getCurrentDraggableHelperClone:function(){return this.draggableHelperClone}});return e}),n("controllers/fields/stagingDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:fieldStaging",this.startDrag),this.listenTo(i.channel("drawer-addField"),"stopDrag:fieldStaging",this.stopDrag)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important");var n=i.channel("fields").request("get:staging"),r=i.channel("app").request("get:template","#tmpl-nf-staged-fields-drag");jQuery(t.helper).html(r({num:n.models.length})),jQuery(t.helper).prop("id","nf-staged-fields-drag"),jQuery(t.item).css("opacity","0.7")},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")}});return e}),n("controllers/fields/staging",["models/fields/stagingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e,i.channel("fields").reply("add:stagedField",this.addStagedField,this),i.channel("fields").reply("remove:stagedField",this.removeStagedField,this),i.channel("fields").reply("get:staging",this.getStagingCollection,this),i.channel("fields").reply("sort:staging",this.sortStagedFields,this),i.channel("fields").reply("clear:staging",this.clearStagedFields,this),this.listenTo(i.channel("drawer-addField"),"click:removeStagedField",this.removeStagedField),this.listenTo(i.channel("drawer-addField"),"before:closeDrawer",this.beforeCloseDrawer)},getStagingCollection:function(){return this.collection},addStagedField:function(e,t){var t=t||!1,n=i.channel("fields").request("get:type",e),r="nf-staged-field-"+jQuery.now(),a={id:r,slug:n.get("type"),nicename:n.get("nicename"),icon:n.get("icon")},s=this.collection.add(a);return t||i.channel("fields").trigger("add:stagedField",s),r},removeStagedField:function(e,t){this.collection.remove(t),i.channel("fields").trigger("remove:stagedField",t)},beforeCloseDrawer:function(){if(0!=this.collection.models.length){var e=i.channel("fields").request("get:collection");_.each(this.collection.models,function(t){var n=i.channel("fields").request("get:tmpID"),r={id:n,label:t.get("nicename"),type:t.get("slug")},a=i.channel("fields").request("add",r,!1),s={object:"Field",label:a.get("label"),change:"Added",dashicon:"plus-alt"},o={collection:e};i.channel("changes").request("register:change","addObject",a,null,s,o)}),e.trigger("reset",e),this.collection.reset()}i.channel("fields").request("sort:fields",null,null,!1)},sortStagedFields:function(){var e=i.channel("app").request("get:stagedFieldsEl"),t=jQuery(e).sortable("toArray");_.each(this.collection.models,function(e){var n=e.get("id"),i=t.indexOf(n);e.set("order",i)}),this.collection.sort()},clearStagedFields:function(){this.collection.reset()}});return t}),n("controllers/fields/stagingSortable",["models/fields/stagingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"receive:stagedFields",this.receiveStagedFields),this.listenTo(i.channel("drawer-addField"),"over:stagedFields",this.overStagedFields),this.listenTo(i.channel("drawer-addField"),"out:stagedFields",this.outStagedFields),this.listenTo(i.channel("drawer-addField"),"start:stagedFields",this.startStagedFields),this.listenTo(i.channel("drawer-addField"),"stop:stagedFields",this.stopStagedFields)},receiveStagedFields:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.item).data("id"),n=i.channel("fields").request("add:stagedField",t);jQuery(e.helper).prop("id",n),i.channel("fields").request("sort:staging"),jQuery(e.helper).remove(),i.channel("drawer-addField").trigger("drop:fieldType",t)}},addActiveClass:function(){var e=i.channel("app").request("get:stagedFieldsEl");jQuery(e).addClass("nf-droppable-active")},removeActiveClass:function(){var e=i.channel("app").request("get:stagedFieldsEl");jQuery(e).removeClass("nf-droppable-active")},overStagedFields:function(e,t){if(jQuery(t.item).hasClass("nf-field-type-draggable")){var n=jQuery(t.item).data("id"),r=i.channel("fields").request("get:type",n),a=r.get("nicename");this.currentHelper=t.helper,jQuery(t.helper).html(a+'<span class="dashicons dashicons-dismiss"></span>'),jQuery(t.helper).removeClass("nf-field-type-button").addClass("nf-item-dock").css({opacity:"0.8",width:"",height:""});var s=i.channel("app").request("get:stagedFieldsEl");jQuery(s).hasClass("ui-sortable")&&jQuery(s).addClass("nf-droppable-hover")}},outStagedFields:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=i.channel("drawer-addField").request("get:typeHelperClone");jQuery(this.currentHelper).html(jQuery(t).html()),jQuery(this.currentHelper).removeClass("nf-item-dock").addClass("nf-field-type-button");var n=i.channel("app").request("get:stagedFieldsEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}},startStagedFields:function(e){jQuery(e.item).show(),jQuery(e.item).css({display:"inline",opacity:"0.7"}),jQuery(e.helper).css("opacity","0.5")},stopStagedFields:function(e){jQuery(e.item).css("opacity",""),jQuery(e.helper).remove()}});return t}),n("controllers/fields/filterTypes",["models/fields/typeSectionCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"change:filter",this.filterFieldTypes)},filterFieldTypes:function(t,n){if(""!=jQuery.trim(t)){var r=[];_.each(this.filterCollection(t),function(e){r.push(e.get("id"))});var a=new e([{id:"filtered",nicename:"Filtered Fields",fieldTypes:r}]);i.channel("drawer").trigger("filter:fieldTypes",a),"undefined"!=typeof n&&n.addObject&&0<r.length&&(i.channel("fields").request("add:stagedField",r[0]),i.channel("drawer").request("clear:filter"))}else i.channel("drawer").trigger("clear:filter")},filterCollection:function(e){e=e.toLowerCase();var t=i.channel("fields").request("get:typeCollection"),n=t.filter(function(t){var n=!1;return t.get("type").toLowerCase().indexOf(e)!=-1?n=!0:t.get("nicename").toLowerCase().indexOf(e)!=-1&&(n=!0),t.get("tags")&&0==e.indexOf("#")&&_.each(t.get("tags"),function(t){e.replace("#","").length>1&&t.toLowerCase().indexOf(e.replace("#",""))!=-1&&(n=!0)}),t.get("alias")&&_.each(t.get("alias"),function(t){t.toLowerCase().indexOf(e)!=-1&&(n=!0)}),n});return n}});return t}),n("controllers/fields/sortable",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addField"),"startDrag:type",this.addActiveClass),this.listenTo(i.channel("drawer-addField"),"stopDrag:type",this.removeActiveClass),this.listenTo(i.channel("drawer-addField"),"startDrag:fieldStaging",this.addActiveClass),this.listenTo(i.channel("drawer-addField"),"stopDrag:fieldStaging",this.removeActiveClass),i.channel("app").reply("receive:fieldsSortable",this.receiveFieldsSortable,this),i.channel("app").reply("over:fieldsSortable",this.overfieldsSortable,this),i.channel("app").reply("out:fieldsSortable",this.outFieldsSortable,this),i.channel("app").reply("stop:fieldsSortable",this.stopFieldsSortable,this),i.channel("app").reply("start:fieldsSortable",this.startFieldsSortable,this),i.channel("app").reply("update:fieldsSortable",this.updateFieldsSortable,this)},addActiveClass:function(){var e=i.channel("fields").request("get:sortableEl");jQuery(e).addClass("nf-droppable-active")},removeActiveClass:function(){var e=i.channel("fields").request("get:sortableEl");jQuery(e).removeClass("nf-droppable-active")},receiveFieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.item).data("id"),n=this.addField(t,!1);jQuery(e.helper).prop("id",n),i.channel("fields").request("sort:fields"),jQuery(e.helper).remove(),i.channel("fields").trigger("drop:fieldType",t,n)}else if(jQuery(e.item).hasClass("nf-stage")){var r=this;i.channel("fields").request("sort:staging");var a=i.channel("fields").request("get:staging"),s=i.channel("fields").request("get:sortableEl");if(jQuery(s).hasClass("ui-sortable"))var o=jQuery(s).sortable("toArray");else var o=["nf-staged-fields-drag"];var l=o.indexOf("nf-staged-fields-drag");_.each(a.models,function(e,t){var n=r.addField(e.get("slug"));o.splice(l+t,0,n)});var l=o.indexOf("nf-staged-fields-drag");o.splice(l,1),i.channel("fields").request("sort:fields",o),i.channel("fields").request("clear:staging"),jQuery(e.helper).remove()}},addField:function(e,t){t=t||!1;var n=i.channel("fields").request("get:type",e),r=i.channel("fields").request("get:tmpID"),a=i.channel("fields").request("add",{id:r,label:n.get("nicename"),type:e},t),s={object:"Field",label:a.get("label"),change:"Added",dashicon:"plus-alt"},o={collection:i.channel("fields").request("get:collection")};return i.channel("changes").request("register:change","addObject",a,null,s,o),r},overfieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=jQuery(e.helper).data("id"),n=i.channel("fields").request("get:type",t),r=n.get("nicename"),a=i.channel("fields").request("get:sortableEl"),s=jQuery(a).width();this.currentHelper=e.helper,jQuery(e.helper).html(r),jQuery(e.helper).removeClass("nf-field-type-button").addClass("nf-field-wrap").css({width:s,height:"50px"}),jQuery(a).hasClass("ui-sortable")&&jQuery(a).addClass("nf-droppable-hover")}else if(jQuery(e.item).hasClass("nf-stage")){var a=i.channel("fields").request("get:sortableEl");jQuery(a).hasClass("ui-sortable")&&jQuery(a).addClass("nf-droppable-hover")}},outFieldsSortable:function(e){if(jQuery(e.item).hasClass("nf-field-type-draggable")){var t=i.channel("drawer-addField").request("get:typeHelperClone");jQuery(this.currentHelper).html(jQuery(t).html()),jQuery(this.currentHelper).removeClass("nf-field-wrap").addClass("nf-field-type-button").css({width:"",height:""});var n=i.channel("fields").request("get:sortableEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}else if(jQuery(e.item).hasClass("nf-stage")){var n=i.channel("fields").request("get:sortableEl");jQuery(n).hasClass("ui-sortable")&&jQuery(n).removeClass("nf-droppable-hover")}},stopFieldsSortable:function(e){jQuery(e.item).css("opacity",""),jQuery(e.helper).remove(),i.channel("fields").trigger("sortable:stop",e)},startFieldsSortable:function(e){jQuery(e.item).hasClass("nf-field-type-draggable")||jQuery(e.item).hasClass("nf-stage")||jQuery(e.item).css("opacity","0.5").show(),i.channel("fields").trigger("sortable:start",e)},updateFieldsSortable:function(e,t){if(i.channel("fields").request("sort:fields"),!jQuery(e.item).hasClass("nf-field-type-draggable")&&!jQuery(e.item).hasClass("nf-stage")){var n=i.channel("fields").request("get:collection"),r=jQuery(e.item).prop("id").replace("field-",""),a=n.get(r),s={fields:[]};_.each(n.models,function(e){var t=e._previousAttributes.order,n=e.get("order");s.fields.push({model:e,attr:"order",before:t,after:n})});var o={object:"Field",label:a.get("label"),change:"Re-ordered from "+a._previousAttributes.order+" to "+a.get("order"),dashicon:"sort"};i.channel("changes").request("register:change","sortFields",a,null,o,s)}}});return e}),n("controllers/fields/data",["models/fields/fieldCollection","models/fields/fieldModel"],function(e,t){var n=Marionette.Object.extend({adding:!1,removing:!1,initialize:function(){this.collection=new e(preloadedFormData.fields),this.collection.removedIDs={},i.channel("fields").reply("get:collection",this.getFieldCollection,this),i.channel("fields").reply("get:field",this.getField,this),i.channel("fields").reply("redraw:collection",this.redrawFieldCollection,this),i.channel("fields").reply("get:tmpID",this.getTmpFieldID,this),i.channel("fields").reply("add",this.addField,this),i.channel("fields").reply("delete",this.deleteField,this),i.channel("fields").reply("sort:fields",this.sortFields,this),i.channel("fields").reply("get:adding",this.getAdding,this),i.channel("fields").reply("set:adding",this.setAdding,this),i.channel("fields").reply("get:removing",this.getRemoving,this),i.channel("fields").reply("set:removing",this.setRemoving,this)},getFieldCollection:function(){return this.collection},redrawFieldCollection:function(){this.collection.trigger("reset",this.collection)},getField:function(e){return this.collection.findWhere({key:e})?this.collection.findWhere({key:e}):this.collection.get(e)},addField:function(e,n,r,a){if(i.channel("fields").request("set:adding",!0),n=n||!1,a=a||"",r="undefined"==typeof r||r,!1==e instanceof Backbone.Model){"undefined"==typeof e.id&&(e.id=this.getTmpFieldID());var s=new t(e)}else var s=e;if(jQuery.isNumeric(s.get("type"))){var o=i.channel("fields").request("get:type",s.get("type"));s.set("type",o.get("parentType"))}var l=this.collection.add(s,{silent:n});return i.channel("app").request("update:setting","clean",!1),i.channel("fields").trigger("add:field",s),r&&i.channel("fields").trigger("render:newField",l,a),i.channel("fields").trigger("after:addField",s),s},updateFieldSetting:function(e,t,n){var i=this.collection.get(e);i.set(t,n)},sortFields:function(e,t,n){null==n&&(n=!0);var r=i.channel("fields").request("get:sortableEl");if(jQuery(r).hasClass("ui-sortable")){var e=e||jQuery(r).sortable("toArray");_.each(this.collection.models,function(t){var n=(t.get("order"),t.get("id"));if(jQuery.isNumeric(n))var i="field-"+n;else var i=n;var r=e.indexOf(i)+1;t.set("order",r)}),this.collection.sort(),n&&(i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db"))}},deleteField:function(e){i.channel("fields").trigger("delete:field",e),this.removing=!0,this.collection.remove(e),i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db")},getTmpFieldID:function(){var e=this.collection.tmpNum;return this.collection.tmpNum++,"tmp-"+e},getAdding:function(){return this.adding},setAdding:function(e){this.adding=e},getRemoving:function(){return this.removing},setRemoving:function(e){this.removing=e}});return n}),n("models/app/optionRepeaterModel",[],function(){var e=Backbone.Model.extend({defaults:{errors:{}},initialize:function(){this.on("change:errors",this.changeErrors,this)},changeErrors:function(e){if(0==_.size(e.get("errors"))){var t=!1;_.each(e.collection.models,function(e){0!=_.size(e.get("errors"))&&(t=!0)}),t||e.collection.settingModel.set("error",!1)}else e.collection.settingModel.set("error",!0)}});return e}),n("models/app/optionRepeaterCollection",["models/app/optionRepeaterModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order",initialize:function(e,t){this.on("sort",this.changeCollection,this),this.on("add",this.addOption,this),this.settingModel=t.settingModel},changeCollection:function(){i.channel("option-repeater").trigger("sort:options",this),i.channel("option-repeater-"+this.settingModel.get("name")).trigger("sort:options",this)},addOption:function(e,t){e.set("settingModel",this.settingModel)}});return t}),n("views/app/drawer/optionRepeaterError",[],function(){var e=Marionette.ItemView.extend({tagName:"div",className:"nf-error",template:"#tmpl-nf-edit-setting-option-repeater-error",templateHelpers:function(){var e=this;return{renderErrors:function(){return"undefined"!=typeof e.errors?e.errors[Object.keys(errors)[0]]:""}}}});return e}),n("views/app/drawer/optionRepeaterOption",["views/app/drawer/optionRepeaterError"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",className:"nf-table-row",template:"#tmpl-nf-edit-setting-option-repeater-default-row",id:function(){return this.model.cid},regions:{error:".nf-option-error"},initialize:function(e){this.settingModel=e.settingModel,this.dataModel=e.dataModel,this.collection=e.collection,this.columns=e.columns,this.parentView=e.parentView,this.model.on("change:errors",this.renderErrors,this),"undefined"!=typeof this.settingModel.get("tmpl_row")&&(this.template="#"+this.settingModel.get("tmpl_row")),this.hasErrors=!1},onBeforeDestroy:function(){this.model.off("change",this.render),this.model.off("change:errors",this.renderErrors)},onBeforeRender:function(){if(this.model.get("label")){var e=this.model.get("label");this.model.set("label",_.escape(e),{silent:!0})}},onRender:function(){if(i.channel("mergeTags").request("init",this),i.channel("setting-"+this.settingModel.get("name")+"-option").trigger("render:setting",this.model,this.dataModel,this),this.model.get("label")){var e=this.model.get("label");this.model.set("label",_.unescape(e),{silent:!0})}},onShow:function(){this.model.get("new")&&(jQuery(this.el).find("input:first").focus(),this.model.set("new",!1))},events:{"change .setting":"changeOption","click .nf-delete":"deleteOption",keyup:"keyupOption"},changeOption:function(e){i.channel("option-repeater").trigger("change:option",e,this.model,this.dataModel,this.settingModel,this)},deleteOption:function(e){i.channel("option-repeater").trigger("click:deleteOption",this.model,this.collection,this.dataModel,this)},keyupOption:function(e){this.maybeAddOption(e),i.channel("option-repeater").trigger("keyup:option",e,this.model,this.dataModel,this.settingModel,this),i.channel("option-repeater-"+this.settingModel.get("name")).trigger("keyup:option",e,this.model,this.dataModel,this.settingModel,this)},maybeAddOption:function(e){13==e.keyCode&&(i.channel("option-repeater").trigger("click:addOption",this.collection,this.dataModel,this),jQuery(this.parentView.children.findByIndex(this.parentView.children.length-1).el).find('[data-id="label"]').focus())},renderErrors:function(){0==Object.keys(this.model.get("errors"))?this.hasErrors&&(this.error.empty(),jQuery(this.el).removeClass("nf-error")):(this.hasErrors=!0,this.error.show(new e({model:this.model})),jQuery(this.el).addClass("nf-error"))},templateHelpers:function(){var e=this;return{getColumns:function(){return e.columns},renderFieldSelect:function(e,t){var n=i.channel("fields").request("get:collection"),r='<label class="nf-select"><select class="setting" data-id="'+e+'">';return n.each(function(e){var n=t==e.get("key")?" selected":"";r+='<option value="'+e.get("key")+'"'+n+">"+e.get("label")+"</option>"}),r+="</select><div></div></label>"},renderOptions:function(t,n){if("undefined"!=typeof e.options.columns[t]){var i="";return _.each(e.options.columns[t].options,function(e){var t=n==e.value?" selected":"";i+='<option value="'+e.value+'"'+t+">"+e.label+"</option>"}),i}}}}});return t}),n("views/app/drawer/optionRepeaterEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"tr",template:"#tmpl-nf-edit-setting-option-repeater-empty"});return e}),n("views/app/drawer/optionRepeaterComposite",["views/app/drawer/optionRepeaterOption","views/app/drawer/optionRepeaterEmpty","models/app/optionRepeaterCollection"],function(e,t,n){var r=Marionette.CompositeView.extend({template:"#tmpl-nf-edit-setting-option-repeater-wrap",childView:e,emptyView:t,reorderOnSort:!1,initialize:function(e){var t=e.dataModel.get(this.model.get("name"));0==t instanceof Backbone.Collection&&(t=new n([],{settingModel:this.model}),t.add(e.dataModel.get(this.model.get("name"))),e.dataModel.set(this.model.get("name"),t,{silent:!0})),this.collection=t,this.dataModel=e.dataModel,this.childViewOptions={parentView:this,settingModel:this.model,collection:this.collection,dataModel:e.dataModel,columns:this.model.get("columns")};var i=this.model.get("deps");if(i)for(var r in i)i.hasOwnProperty(r)&&this.dataModel.on("change:"+r,this.render,this)},onBeforeDestroy:function(){var e=this.model.get("deps");if(e)for(var t in e)e.hasOwnProperty(t)&&this.dataModel.off("change:"+t,this.render)},onRender:function(){var e=this;jQuery(this.el).find(".nf-list-options-tbody").sortable({handle:".handle",helper:"clone",placeholder:"nf-list-options-sortable-placeholder",forcePlaceholderSize:!0,opacity:.95,tolerance:"pointer",start:function(e,t){i.channel("option-repeater").request("start:optionSortable",t)},stop:function(e,t){i.channel("option-repeater").request("stop:optionSortable",t)},update:function(t,n){i.channel("option-repeater").request("update:optionSortable",n,this,e)}}),i.channel("setting-"+this.model.get("name")).trigger("render:setting",this.model,this.dataModel,this)},onAttach:function(){var e=jQuery(this.el).find(".nf-open-import-tooltip"),t=jQuery(e).jBox("Tooltip",{title:"<h3>Please enter your options below:</h3>",content:jQuery(this.el).find(".nf-import-options"),trigger:"click",closeOnClick:"body",closeButton:"box",offset:{x:20,y:0},addClass:"import-options",onOpen:function(){var e=this;setTimeout(function(){jQuery(e.content).find("textarea").focus()},200)}});jQuery(this.el).find(".nf-import").on("click",{view:this,jBox:t},this.clickImport),i.channel("setting-"+this.model.get("name")).trigger("attach:setting",this.model,this.dataModel,this),i.channel("setting-type-"+this.model.get("type")).trigger("attach:setting",this.model,this.dataModel,this)},templateHelpers:function(){var e=this;return{renderHeaders:function(){var e="<div> </div>";return _.each(this.columns,function(t){e+="<div>"+t.header+"</div>"}),e+="<div> </div>"},renderSetting:function(){var e=i.channel("app").request("get:template","#tmpl-nf-edit-setting-"+this.type);return e(this)},renderClasses:function(){var e="";return e+="undefined"!=typeof this.width?this.width:" one-half",this.error&&(e+=" nf-error"),e},renderVisible:function(){if(this.deps)for(var t in this.deps)if(this.deps.hasOwnProperty(t)&&e.dataModel.get(t)!==this.deps[t])return'style="display:none;"';return""},renderError:function(){return this.error?this.error:""},renderFieldsetClasses:function(){return e.model.get("name")},currencySymbol:function(){return i.channel("settings").request("get:setting","currency")||nfi18n.currency_symbol}}},attachHtml:function(e,t){jQuery(e.el).find(".nf-list-options-tbody").append(t.el),i.channel("mergeTags").request("init",this)},events:{"click .nf-add-new":"clickAddOption","click .extra":"clickExtra"},clickAddOption:function(e){i.channel("option-repeater").trigger("click:addOption",this.collection,this.dataModel),jQuery(this.children.findByIndex(this.children.length-1).el).find('[data-id="label"]').focus()},clickExtra:function(e){i.channel("option-repeater").trigger("click:extra",e,this.collection,this.dataModel),i.channel("option-repeater-"+this.model.get("name")).trigger("click:extra",e,this.model,this.collection,this.dataModel)},clickImport:function(e){var t=jQuery(e.data.jBox.content).find("textarea"),n=t.val().trimLeft().trimRight();if(0==n.length)return e.data.jBox.close(),!1;var r=n.split(/\n/);_.isArray(r)&&_.each(r,function(t){var n=t.split(","),r=n[0],a=n[1]||jQuery.slugify(r,{separator:"-"}),s=n[2]||"";r=r.trimLeft().trimRight(),a=a.trimLeft().trimRight(),s=s.trimLeft().trimRight();var o=e.data.view.collection.add({label:n[0],value:a,calc:s}),r={object:"field",label:n[0],change:"Option Added",dashicon:"plus-alt"};i.channel("changes").request("register:change","addListOption",o,null,r),i.channel("option-repeater-"+e.data.view.model.get("name")).trigger("add:option",o),i.channel("option-repeater").trigger("add:option",o),i.channel("app").trigger("update:setting",o)},this),t.val(""),e.data.jBox.close()}});return r}),n("controllers/app/optionRepeater",["models/app/optionRepeaterModel","models/app/optionRepeaterCollection","views/app/drawer/optionRepeaterComposite"],function(e,t,n){var r=Marionette.Object.extend({initialize:function(){i.channel("option-repeater").reply("get:settingChildView",this.getSettingChildView,this),this.listenTo(i.channel("option-repeater"),"change:option",this.changeOption),this.listenTo(i.channel("option-repeater"),"click:addOption",this.addOption),this.listenTo(i.channel("option-repeater"),"click:deleteOption",this.deleteOption),i.channel("option-repeater").reply("update:optionSortable",this.updateOptionSortable,this),i.channel("option-repeater").reply("stop:optionSortable",this.stopOptionSortable,this),i.channel("option-repeater").reply("start:optionSortable",this.startOptionSortable,this),this.listenTo(i.channel("option-repeater"),"init:dataModel",this.convertSettings)},changeOption:function(e,t,n,r,a){var s=jQuery(e.target).data("id");if("selected"==s)if(jQuery(e.target).attr("checked"))var o=1;else var o=0;else var o=jQuery(e.target).val();var l=t.get(s);t.set(s,o),this.triggerDataModel(t,n);var c=o,d={attr:s,before:l,after:c},h={object:n.get("objectType"),label:n.get("label"),change:"Option "+t.get("label")+" "+s+" changed from "+l+" to "+c};i.channel("changes").request("register:change","changeSetting",t,d,h),i.channel("option-repeater").trigger("update:option",t,n,r,a),i.channel("option-repeater-option-"+s).trigger("update:option",e,t,n,r,a),i.channel("option-repeater-"+r.get("name")).trigger("update:option",t,n,r,a)},addOption:function(t,n){var r={order:t.length,new:!0,options:{}};_.each(t.settingModel.get("columns"),function(e,t){r[t]=e.default,"undefined"!=typeof e.options&&(r.options[t]=e.options)});var a=new e(r);t.add(a);var s={object:n.get("objectType"),label:n.get("label"),change:"Option Added",dashicon:"plus-alt"};i.channel("changes").request("register:change","addListOption",a,null,s),i.channel("option-repeater-"+t.settingModel.get("name")).trigger("add:option",a),i.channel("option-repeater").trigger("add:option",a),this.triggerDataModel(a,n)},deleteOption:function(e,t,n){var r=i.channel("app").request("clone:modelDeep",e),a={object:n.get("objectType"),label:n.get("label"),change:"Option "+r.get("label")+" Removed",dashicon:"dismiss"},s={collection:t};i.channel("changes").request("register:change","removeListOption",r,null,a,s);var o=i.channel("changes").request("get:collection"),l=o.where({model:e});_.each(l,function(e){"object"==typeof e.get("data")&&_.each(e.get("data"),function(e){e.model==e&&(e.model=r)}),e.set("model",r),e.set("disabled",!0)}),t.remove(e),i.channel("option-repeater").trigger("remove:option",e),i.channel("option-repeater-"+t.settingModel.get("name")).trigger("remove:option",e),this.triggerDataModel(e,n)},triggerDataModel:function(e,t){i.channel("app").trigger("update:setting",e)},getSettingChildView:function(e){return n},updateOptionSortable:function(e,t,n){var r=jQuery(t).sortable("toArray"),a=n.collection.get({cid:jQuery(e.item).prop("id")}),s={collection:n.collection,objModels:[]};_.each(r,function(e,t){var i=n.collection.get({cid:e}),r=i.get("order");i.set("order",t);var a=t;s.objModels.push({model:i,attr:"order",before:r,after:a})}),n.collection.sort({silent:!0});var o={object:n.dataModel.get("objectType"),label:n.dataModel.get("label"),change:"Option "+a.get("label")+" re-ordered from "+a._previousAttributes.order+" to "+a.get("order"),dashicon:"sort"};i.channel("changes").request("register:change","sortListOptions",a,null,o,s),this.triggerDataModel(a,n.dataModel),i.channel("option-repeater").trigger("sort:option",a,n),i.channel("option-repeater-"+n.model.get("name")).trigger("sort:option",a,n)},stopOptionSortable:function(e){jQuery(e.item).css("opacity","")},startOptionSortable:function(e){jQuery(e.placeholder).find("div").remove(),jQuery(e.item).css("opacity","0.5").show()},convertSettings:function(e,n){var i=e.get(n.get("name"));0==i instanceof Backbone.Collection&&(i=new t([],{settingModel:n}),i.add(e.get(n.get("name"))),e.set(n.get("name"),i,{silent:!0}))}});return r}),n("controllers/fields/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("fields").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("fields").request("get:collection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/fields/fieldSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(fieldSettings,{objectType:"fields"}),i.channel("fields").reply("get:settingModel",this.getSettingModel,this),i.channel("fields").reply("get:settingCollection",this.getSettingCollection,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})},getSettingCollection:function(){return this.collection}});return t}),n("controllers/fields/fieldCreditCard",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"after:addField",this.dropCreditCardField)},dropCreditCardField:function(e){if("creditcard"==e.get("type")){var t=e.get("order");i.channel("fields").request("delete",e),_.each(["creditcardfullname","creditcardnumber","creditcardcvc","creditcardexpiration","creditcardzip"],function(e){var n=i.channel("fields").request("get:type",e),r={id:i.channel("fields").request("get:tmpID"),type:e,label:n.get("nicename"),order:t};i.channel("fields").request("add",r)})}},stageCreditCardField:function(e){"creditcard"==e.get("slug")&&(i.channel("fields").request("remove:stagedField","",e),_.each(["creditcardfullname","creditcardnumber","creditcardcvc","creditcardexpiration","creditcardzip"],function(e){i.channel("fields").request("add:stagedField",e)}))}});return e}),n("controllers/fields/fieldList",["models/app/optionRepeaterCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("option-repeater-option-label"),"update:option",this.updateOptionLabel),this.listenTo(i.channel("option-repeater-option-value"),"update:option",this.updateOptionValue),this.listenTo(i.channel("fields-list"),"init:fieldModel",this.convertOptions)},updateOptionLabel:function(e,t,n,i,r){"list"==_.findWhere(fieldTypeData,{id:n.get("type")}).parentType&&(t.get("manual_value")||(value=jQuery.slugify(t.get("label"),{separator:"-"}),t.set("value",value),t.trigger("change",t),jQuery(r.el).find('[data-id="value"]').focus().select()))},updateOptionValue:function(e,t,n,i,r){var a=_.findWhere(fieldTypeData,{id:n.get("type")});"undefined"!=typeof a&&"list"==a.parentType&&(t.set("manual_value",!0),jQuery(r.el).find('[data-id="calc"]').focus().select())},convertOptions:function(t){var n=t.get("options"),r=i.channel("fields").request("get:settingModel","options");0==n instanceof Backbone.Collection&&(n=new e([],{settingModel:r}),n.add(t.get("options")),t.set("options",n,{silent:!0}))}});return t}),n("controllers/fields/fieldPassword",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"after:addField",this.addField)},addField:function(e){if("password"==e.get("type")){var t=e.get("order"),n=this.insertField("passwordconfirm",t+1);n.set("confirm_field",e.get("key"))}},insertField:function(e,t){var n=i.channel("fields").request("get:type",e),r={id:i.channel("fields").request("get:tmpID"),type:e,label:n.get("nicename"),order:t};return i.channel("fields").request("add",r)}});return e}),n("controllers/fields/fieldQuantity",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("app"),"before:renderSetting",this.beforeRenderSetting); 6 },beforeRenderSetting:function(e,t,n){if("product_assignment"==e.get("name")){var i=this.getProductFields(e);e.set("options",i)}},getProductFields:function(e){var t=[e.get("select_product")],n=i.channel("fields").request("get:collection");return _.each(n.models,function(e){"product"==e.get("type")&&t.push({label:e.get("label"),value:e.get("id")})}),t}});return e}),n("controllers/fields/fieldShipping",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-shipping_options"),"render:setting",this.addMask),this.listenTo(i.channel("setting-shipping_options-option"),"render:setting",this.addMask)},addMask:function(e,t,n){jQuery(n.el).find('[data-id="value"]').each(function(){jQuery(this).autoNumeric({aSign:"$",aSep:thousandsSeparator,aDec:decimalPoint})})}});return e}),n("controllers/fields/key",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"add:field",this.newFieldKey),this.listenTo(i.channel("fieldSetting-label"),"update:setting",this.updateLabel),this.listenTo(i.channel("fieldSetting-key"),"update:setting",this.updateKey),this.listenTo(i.channel("setting-key"),"keyup:setting",this.keyUp)},newFieldKey:function(e){var t=new Date,n=t.valueOf(),i=this.slugify(e.get("type")+"_"+n);e.set("key",i,{silent:!0}),"undefined"==e.get("manual_key")&&e.set("manual_key",!1,{silent:!0})},updateLabel:function(e){if(!e.get("manual_key")&&0!=jQuery.trim(e.get("label")).length){delete e.changed.label;var t=new Date,n=t.valueOf(),i=this.slugify(e.get("label")+"_"+n);e.set("key",i)}},updateKey:function(e){var t=e.get("key");this.settingModel=i.channel("fields").request("get:settingModel","key"),this.setError(t,e)},keyUp:function(e,t,n){n.set("manual_key",!0),this.settingModel=t;var i=jQuery(e.target).val();this.setError(i,n)},setError:function(e,t){var n=!1;""==jQuery.trim(e)?n="Field keys can't be empty. Please enter a key.":e!=e.toLowerCase()?n="Field keys must be lowercase.":e!=e.replace(" ","_")?n='Field keys must cannot use spaces. Separate with "_" instead.':"_"==e.slice(-1)?n='Field keys cannot end with a "_"':e!=this.slugify(e)?n="Invalid Format.":e!=this.keyExists(e,t)&&(n="Field keys must be unique. Please enter another key."),n?this.settingModel.set("error",n):(i.channel("app").trigger("update:fieldKey",t),this.settingModel.set("error",!1))},keyExists:function(e,t){var n=this.slugify(e);0!=n.length&&(e=n);var r=i.channel("fields").request("get:collection"),a=1,s=e;return _.each(r.models,function(n){t!=n&&s==n.get("key")&&(s=e+"_"+a,a++)}),e=s},slugify:function(e){return jQuery.slugify(e,{separator:"_"})}});return e}),n("controllers/fields/notices",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"add:stagedField",this.addStagedField)},addStagedField:function(e){i.channel("notices").request("add","addStagedField",e.get("nicename")+" added to staging")}});return e}),n("controllers/fields/mobile",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("fields"),"sortable:start",this.startWiggle),this.listenTo(i.channel("fields"),"sortable:stop",this.stopWiggle)},initWiggle:function(e){i.channel("app").request("is:mobile")&&jQuery(e.el).find(".nf-field-wrap").on("taphold",function(){jQuery(this).ClassyWiggle("start",{degrees:[".65","1",".65","0","-.65","-1","-.65","0"],delay:50})})},startWiggle:function(e){i.channel("app").request("is:mobile")&&(jQuery(e.item).removeClass("ui-sortable-helper").ClassyWiggle("stop"),jQuery(e.helper).css("opacity","0.75").ClassyWiggle("start",{degrees:[".5","1",".5","0","-.5","-1","-.5","0"]}))},stopWiggle:function(e){i.channel("app").request("is:mobile")&&(jQuery(e.helper).ClassyWiggle("stop"),jQuery(e.item).removeClass("ui-sortable-helper drag-selected"))}});return e}),n("controllers/fields/savedFields",[],function(){var e=Marionette.Object.extend({ignoreAttributes:["editActive","order","saved","jBox"],initialize:function(){this.listenTo(i.channel("fields"),"update:setting",this.updateField),this.listenTo(i.channel("drawer"),"click:addSavedField",this.clickAddSavedField,this)},updateField:function(e){if(e.get("saved")){var t=!1,n=_.keys(e.changedAttributes()),i=this;_.each(n,function(e){-1==i.ignoreAttributes.indexOf(e)&&(t=!0)}),t&&e.set("saved",!1)}},clickAddSavedField:function(e,t){var n=i.channel("app").request("clone:modelDeep",t),r=n.attributes;r.saved=!0,delete r.jBox,delete r.editActive,delete r.created_at,delete r.order,delete r.id,delete r.formID,delete r.parent_id;var a=i.channel("fields").request("get:type",r.type),s=_.clone(a.attributes),o=jQuery(e.target).parent().parent().find("input").val();console.log(o),s.nicename=o,r.label=o,r.nicename=o,t.set("addSavedLoading",!0);var l=JSON.stringify(r);jQuery.post(ajaxurl,{action:"nf_create_saved_field",field:l,security:nfAdmin.ajaxNonce},function(e){e=JSON.parse(e),s.id=e.data.id,s.nicename=o,s.settingDefaults=r;var n=i.channel("fields").request("get:typeCollection"),a=(n.add(s),i.channel("fields").request("get:typeSections"));a.get("saved").get("fieldTypes").push(s.id),t.set("addSavedLoading",!1),t.unset("addSavedLoading",{silent:!0}),t.get("jBox").close(),i.channel("notices").request("add","addSaved","Saved Field Added")})}});return e}),n("controllers/fields/fieldDatepicker",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-type-datepicker"),"render:setting",this.addDatepicker)},addDatepicker:function(e,t,n){pikadayResponsive(jQuery(n.el).find(".setting")[0])}});return e}),n("controllers/fields/fieldDisplayCalc",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-calc_var"),"before:renderSetting",this.beforeRenderSetting)},beforeRenderSetting:function(e,t,n){},getProductFields:function(e){var t=[e.get("select_product")],n=i.channel("fields").request("get:collection");return _.each(n.models,function(e){"product"==e.get("type")&&t.push({label:e.get("label"),value:e.get("id")})}),t}});return e}),n("controllers/actions/types",["models/app/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.installedActions=new e(_.filter(actionTypeData,function(e){return"installed"==e.section}),{slug:"installed",nicename:nfi18n.installed}),this.availableActions=new e(_.filter(actionTypeData,function(e){return"available"==e.section}),{slug:"available",nicename:nfi18n.available}),i.channel("actions").reply("get:type",this.getType,this),i.channel("actions").reply("get:installedActions",this.getInstalledActions,this),i.channel("actions").reply("get:availableActions",this.getAvailableActions,this)},getType:function(e){var t=this.installedActions.get(e);return t||(t=this.availableActions.get(e)),t},getInstalledActions:function(){return this.installedActions},getAvailableActions:function(){return this.availableActions},addStagedField:function(e){var t=jQuery(e.target).data("id");i.channel("fields").request("add:stagedField",t)},getTypeSections:function(){return this.fieldTypeSections}});return t}),n("models/actions/actionModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Action",objectDomain:"actions",editActive:!1},initialize:function(){this.on("change",this.changeSetting,this);var e=i.channel("actions").request("get:type",this.get("type"));if("undefined"!=typeof e){var t=this;_.each(e.get("settingDefaults"),function(e,n){t.get(n)||t.set(n,e,{silent:!0})}),i.channel("actions").trigger("init:actionModel",this),i.channel("actions-"+this.get("type")).trigger("init:actionModel",this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)}},changeSetting:function(e,t){i.channel("actionSetting-"+_.keys(this.changedAttributes())[0]).trigger("update:setting",this,t.settingModel),i.channel("actions").trigger("update:setting",this,t.settingModel),i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("models/actions/actionCollection",["models/actions/actionModel"],function(e){var t=Backbone.Collection.extend({model:e,comparator:"order",tmpNum:1,initialize:function(){this.on("add",this.addAction,this),this.on("remove",this.removeAction,this),this.newIDs=[]},addAction:function(e){this.newIDs.push(e.get("id"))},removeAction:function(e){this.removedIDs[e.get("id")]=e.get("id")}});return t}),n("controllers/actions/data",["models/actions/actionCollection","models/actions/actionModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){if(this.collection=new e(preloadedFormData.actions),this.collection.tmpNum=1,0!=this.collection.models.length){var t=this;_.each(this.collection.models,function(e){jQuery.isNumeric(e.get("id"))||t.collection.tmpNum++})}this.collection.removedIDs={},i.channel("actions").reply("get:collection",this.getCollection,this),i.channel("actions").reply("get:action",this.getAction,this),i.channel("actions").reply("get:tmpID",this.getTmpID,this),i.channel("actions").reply("add",this.addAction,this),i.channel("actions").reply("delete",this.deleteAction,this)},getCollection:function(){return this.collection},getAction:function(e){return this.collection.get(e)},addAction:function(e,n){if(n=n||!1,!1==e instanceof Backbone.Model)var r=new t(e);else var r=e;return this.collection.add(r,{silent:n}),i.channel("app").request("update:setting","clean",!1),r},deleteAction:function(e){this.collection.remove(e),i.channel("app").request("update:setting","clean",!1),i.channel("app").request("update:db")},getTmpID:function(){var e=this.collection.tmpNum;return this.collection.tmpNum++,"tmp-"+e}});return n}),n("controllers/actions/actionSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(actionSettings,{objectType:"actions"}),i.channel("actions").reply("get:settingModel",this.getSettingModel,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})}});return t}),n("controllers/actions/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("actions").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("actions").request("get:collection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/actions/addActionTypes",["models/actions/actionCollection","models/actions/actionModel"],function(e,t){var n=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("actions"),"click:addAction",this.addAction),i.channel("actions").reply("add:actionType",this.addAction,this)},addAction:function(e){var t={id:i.channel("actions").request("get:tmpID"),type:e.get("id"),label:e.get("settingDefaults").label||e.get("nicename")},n=i.channel("actions").request("add",t),r={object:"Action",label:n.get("label"),change:"Added",dashicon:"plus-alt"},t={collection:i.channel("actions").request("get:collection")};i.channel("changes").request("register:change","addObject",n,null,r,t),i.channel("app").trigger("click:edit",{},n)}});return n}),n("controllers/actions/typeDrag",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addAction"),"startDrag:type",this.startDrag),this.listenTo(i.channel("drawer-addAction"),"stopDrag:type",this.stopDrag),i.channel("drawer-addAction").reply("get:typeHelperClone",this.getCurrentDraggableHelperClone,this)},startDrag:function(e,t){this.drawerEl=i.channel("app").request("get:drawerEl"),this.mainEl=i.channel("app").request("get:mainEl"),jQuery(this.drawerEl)[0].style.setProperty("overflow","visible","important"),this.draggableHelperClone=jQuery(t.helper).clone()},stopDrag:function(e,t){jQuery(this.drawerEl)[0].style.setProperty("overflow","hidden","important")},getCurrentDraggableHelperClone:function(){return this.draggableHelperClone}});return e}),n("controllers/actions/droppable",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("app").reply("drop:actionType",this.dropActionType,this)},dropActionType:function(e,t){var n=jQuery(t.helper).data("type"),r=i.channel("actions").request("get:type",n);i.channel("actions").request("add:actionType",r)}});return e}),n("models/actions/typeModel",[],function(){var e=Backbone.Model.extend({});return e}),n("models/actions/typeCollection",["models/actions/typeModel"],function(e){var t=Backbone.Collection.extend({model:e});return t}),n("controllers/actions/filterTypes",["models/actions/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("drawer-addAction"),"change:filter",this.filterActionTypes)},filterActionTypes:function(t,n){if(""!=jQuery.trim(t)){var r=[],a=i.channel("actions").request("get:installedActions");_.each(this.filterCollection(t,a),function(e){r.push(e)});var s=[],o=i.channel("actions").request("get:availableActions");_.each(this.filterCollection(t,o),function(e){s.push(e)});var l=new e(r);l.slug="installed",l.nicename="Installed";var c=new e(s);c.slug="available",c.nicename="Available",i.channel("drawer").trigger("filter:actionTypes",l,c),n.addObject&&0<l.length&&(i.channel("actions").request("add:actionType",l.models[0]),i.channel("drawer").request("clear:filter"))}else i.channel("drawer").trigger("clear:filter")},filterCollection:function(e,t){e=e.toLowerCase();var n=t.filter(function(t){var n=!1;return t.get("id").toLowerCase().indexOf(e)!=-1?n=!0:t.get("nicename").toLowerCase().indexOf(e)!=-1&&(n=!0),t.get("tags")&&0==e.indexOf("#")&&_.each(t.get("tags"),function(t){e.replace("#","").length>1&&t.toLowerCase().indexOf(e.replace("#",""))!=-1&&(n=!0)}),t.get("alias")&&_.each(t.get("alias"),function(t){t.toLowerCase().indexOf(e)!=-1&&(n=!0)}),n});return n}});return t}),n("controllers/actions/newsletterList",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("setting-newsletter_list"),"show:setting",this.defaultFields),this.listenTo(i.channel("setting-type-newsletter_list"),"click:extra",this.clickListUpdate),this.listenTo(i.channel("actionSetting-newsletter_list"),"update:setting",this.maybeRenderFields),this.listenTo(i.channel("actionSetting-newsletter_list"),"update:setting",this.maybeRenderGroups),this.listenTo(i.channel("setting-name-newsletter_list_fields"),"init:settingModel",this.registerFieldsListener),this.listenTo(i.channel("setting-name-newsletter_list_groups"),"init:settingModel",this.registerGroupsListener)},defaultFields:function(e,t){this.maybeRenderFields(t,e),this.maybeRenderGroups(t,e)},registerFieldsListener:function(e){e.listenTo(i.channel("newsletter_list_fields"),"update:fieldMapping",this.updateFieldMapping,e)},registerGroupsListener:function(e){e.listenTo(i.channel("newsletter_list_groups"),"update:interestGroups",this.updateInterestGroups,e)},clickListUpdate:function(e,t,n,i){var r={action:"nf_"+n.attributes.type+"_get_lists",security:nfAdmin.ajaxNonce},a=this;jQuery(e.srcElement).addClass("spin"),jQuery.post(ajaxurl,r,function(e){var e=JSON.parse(e);a.updateLists(t,e.lists,i,n),n.set("newsletter_list",e.lists[0].value,{settingModel:t})}).always(function(){jQuery(e.srcElement).removeClass("spin")})},updateLists:function(e,t,n,i){e.set("options",t),n.render()},maybeRenderFields:function(e,t){if("undefined"!=typeof t){var n=e.get("newsletter_list"),r=t.get("options");_.each(r,function(e){n==e.value&&i.channel("newsletter_list_fields").trigger("update:fieldMapping",e.fields)}),e.set("newsletter_list_fields",0)}},maybeRenderGroups:function(e,t){if("undefined"!=typeof t){var n=e.get("newsletter_list"),r=t.get("options");_.each(r,function(e){n==e.value&&i.channel("newsletter_list_groups").trigger("update:interestGroups",e.groups)}),e.set("newsletter_list_fields",0)}},updateFieldMapping:function(e){var t=this.get("settings");t.reset(),_.each(e,function(e){t.add({name:e.value,type:"textbox",label:e.label,width:"full",use_merge_tags:{exclude:["user","post","system","querystrings"]}})}),this.set("settings",t)},updateInterestGroups:function(e){var t=this.get("settings");t.reset(),_.each(e,function(e){t.add({name:e.value,type:"toggle",label:e.label,width:"full"})}),this.set("settings",t)}});return e}),n("controllers/advanced/types",["models/app/typeCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(formSettingTypeData),i.channel("settings").reply("get:type",this.getType,this),i.channel("settings").reply("get:typeCollection",this.getCollection,this)},getType:function(e){return this.collection.get(e)},getCollection:function(){return this.collection}});return t}),n("models/advanced/settingsModel",[],function(){var e=Backbone.Model.extend({defaults:{objectType:"Form Setting",editActive:!1},initialize:function(){this.bind("change",this.changeSetting,this);var e=i.channel("settings").request("get:collection");_.each(e.models,function(e){"undefined"==typeof this.get(e.get("name"))&&this.set(e.get("name"),e.get("value"),{silent:!0}),i.channel(e.get("type")).trigger("init:dataModel",this,e)},this),this.listenTo(i.channel("app"),"fire:updateFieldKey",this.updateFieldKey)},changeSetting:function(e,t){i.channel("app").trigger("update:setting",this,t.settingModel)},updateFieldKey:function(e,t){i.channel("app").trigger("replace:fieldKey",this,e,t)}});return e}),n("controllers/advanced/data",["models/advanced/settingsModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.model=new e(preloadedFormData.settings),i.channel("settings").reply("get:settings",this.getSettings,this),i.channel("settings").reply("get:setting",this.getSetting,this),i.channel("settings").reply("update:setting",this.updateSetting,this)},getSettings:function(){return this.model},updateSetting:function(e,t,n){n=n||!1,this.model.set(e,t,{silent:n})},getSetting:function(e){return this.model.get(e)}});return t}),n("controllers/advanced/formSettings",["models/app/settingCollection"],function(e){var t=Marionette.Object.extend({initialize:function(){this.collection=new e(formSettings,{objectType:"settings"}),i.channel("settings").reply("get:settingModel",this.getSettingModel,this),i.channel("settings").reply("get:collection",this.getSettingCollection,this)},getSettingModel:function(e){return this.collection.findWhere({name:e})},getSettingCollection:function(){return this.collection}});return t}),n("controllers/advanced/editActive",[],function(){var e=Marionette.Object.extend({initialize:function(){i.channel("settings").reply("clear:editActive",this.clearEditActive,this),this.listenTo(i.channel("drawer-editSettings"),"before:closeDrawer",this.clearEditActive)},clearEditActive:function(){var e=i.channel("settings").request("get:typeCollection");_.each(e.models,function(e){e.set("editActive",!1)})}});return e}),n("controllers/advanced/clickEdit",["models/advanced/settingsModel"],function(e){var t=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("settings"),"click:edit",this.clickEdit)},clickEdit:function(e,t){var n=i.channel("settings").request("get:settings");i.channel("app").request("open:drawer","editSettings",{model:n,groupCollection:t.get("settingGroups"),typeModel:t});var r=i.channel("drawer").request("get:preventClose");r||t.set("editActive",!0)}});return t}),n("controllers/advanced/calculations",[],function(){var e=Marionette.Object.extend({initialize:function(){this.listenTo(i.channel("option-repeater-calculations"),"keyup:option",this.keyUp),this.listenTo(i.channel("option-repeater-calculations"),"update:option",this.updateCalc),this.listenTo(i.channel("option-repeater-calculations"),"sort:option",this.sortCalc)},keyUp:function(e,t){var n=jQuery(e.target).val(),i=jQuery(e.target).data("id");"name"==i?(this.checkName(n,t),this.checkEQ(t.get("eq"),t)):"eq"==i?this.checkEQ(n,t):"dec"==i&&this.checkDec(n,t)},updateCalc:function(e){this.checkName(e.get("name"),e,!1),this.checkEQ(e.get("eq"),e),this.checkDec(e.get("dec"),e)},sortCalc:function(e,t){this.checkAllCalcs(t.collection)},checkName:function(e,t,n){n=n||!0;var i=t.get("errors"),r=t.collection.where({name:jQuery.trim(e)});e==t.get("name")&&(r=[]),0!=r.length?i.nameExists="Calculation names must be unique. Please enter another name.":(t.set("name",e,{silent:n}),delete i.nameExists),t.set("errors",i),t.trigger("change:errors",t)},checkEQ:function(e,t){var n=t.get("errors"),i=!1,r=!1,a=e.match(new RegExp(/{calc:(.*?)}/g));if(a){var s=t.collection;a=a.map(function(e){var a=e.replace("}","").replace("{calc:",""),o=s.findWhere({name:a});a==t.get("name")?(n.selfRef="A calculation can't reference itself!",i=!0):o&&o.get("order")>t.get("order")&&(r=!0,n.futureCalc="Can't reference a future calculation!")})}i||delete n.selfRef,r||delete n.futureCalc,t.set("errors",n),t.trigger("change:errors",t)},checkDec:function(e,t){if("undefined"==typeof e)return!1;var n=t.get("errors"),i=!1,r=Math.abs(parseInt(e.trim()));""!==e.trim()&&r.toString()!==e.trim()&&(i=!0,n.nonIntDec="Decimals must be a non-negative integer!"),i||delete n.nonIntDec,t.set("errors",n),t.trigger("change:errors",t)},checkAllCalcs:function(e){var t=this;e.models.map(function(e){t.checkName(e.get("name"),e),t.checkEQ(e.get("eq"),e),t.checkDec(e.get("dec"),e)})}});return e}),n("controllers/loadControllers",["controllers/app/remote","controllers/app/drawer","controllers/app/drawerConfig","controllers/app/domainConfig","controllers/app/data","controllers/app/drawerToggleSettingGroup","controllers/app/updateDB","controllers/app/formData","controllers/app/previewLink","controllers/app/menuButtons","controllers/app/trackChanges","controllers/app/undoChanges","controllers/app/publishResponse","controllers/app/changeDomain","controllers/app/pushstate","controllers/app/hotkeys","controllers/app/cleanState","controllers/app/coreUndo","controllers/app/cloneModelDeep","controllers/app/getSettingChildView","controllers/app/changeSettingDefault","controllers/app/fieldset","controllers/app/toggleSetting","controllers/app/itemControls","controllers/app/mergeTags","controllers/app/mergeTagBox","controllers/app/itemSettingFill","controllers/app/confirmPublish","controllers/app/rte","controllers/app/settingFieldSelect","controllers/app/settingFieldList","controllers/app/settingHTML","controllers/app/settingColor","controllers/app/changeMenu","controllers/app/mobile","controllers/app/notices","controllers/app/unloadCheck","controllers/app/formContentFilters","controllers/app/formContentGutterFilters","controllers/app/cloneCollectionDeep","controllers/app/trackKeyDown","controllers/app/perfectScroll","controllers/app/getNewSettingGroupCollection","controllers/app/settingMedia","controllers/fields/types","controllers/fields/fieldTypeDrag","controllers/fields/stagingDrag","controllers/fields/staging","controllers/fields/stagingSortable","controllers/fields/filterTypes","controllers/fields/sortable","controllers/fields/data","controllers/app/optionRepeater","controllers/fields/editActive","controllers/fields/fieldSettings","controllers/fields/fieldCreditCard","controllers/fields/fieldList","controllers/fields/fieldPassword","controllers/fields/fieldQuantity","controllers/fields/fieldShipping","controllers/fields/key","controllers/fields/notices","controllers/fields/mobile","controllers/fields/savedFields","controllers/fields/fieldDatepicker","controllers/fields/fieldDisplayCalc","controllers/actions/types","controllers/actions/data","controllers/actions/actionSettings","controllers/actions/editActive","controllers/actions/addActionTypes","controllers/actions/typeDrag","controllers/actions/droppable","controllers/actions/filterTypes","controllers/actions/newsletterList","controllers/advanced/types","controllers/advanced/data","controllers/advanced/formSettings","controllers/advanced/editActive","controllers/advanced/clickEdit","controllers/advanced/calculations"],function(e,t,n,i,r,a,s,o,l,c,d,h,u,g,p,f,m,v,y,w,b,C,j,k,M,T,S,F,Q,q,x,D,_,O,A,E,V,z,R,B,N,L,I,P,H,G,$,K,W,U,J,X,Y,Z,ee,te,ne,ie,re,ae,se,oe,le,ce,de,he,ue,ge,pe,fe,me,ve,ye,we,be,Ce,je,ke,Me,Te,Se){var Fe=Marionette.Object.extend({initialize:function(){new z,new R,new f,new e,new t,new n,new i,new a,new l,new c,new d,new h,new u,new g,new m,new v,new y,new k,new F,new Q,new q,new x,new D,new _,new P,new O,new A,new E,new V,new s,new B,new N,new L,new I,new C,new Y,new H,new G,new $,new K,new W,new U,new J,new b,new j,new w,new Z,new ee,new te,new ne,new ie,new re,new ae,new se,new oe,new le,new ce,new de,new he,new be,new ue,new ge,new pe,new fe,new me,new ve,new ye,new we,new Ce,new ke,new Se,new je,new Me,new Te,new r,new X,new o,new M,new T,new S}});return Fe}),n("views/fields/fieldItem",["views/app/itemControls"],function(e){var t=Marionette.LayoutView.extend({tagName:"div",template:"#tmpl-nf-main-content-field",doingShortcut:!1,regions:{itemControls:".nf-item-controls"},initialize:function(){this.model.on("change:editActive",this.render,this),this.model.on("change:label",this.render,this),this.model.on("change:required",this.render,this),this.model.on("change:id",this.render,this)},onBeforeDestroy:function(){this.model.off("change:editActive",this.render),this.model.off("change:label",this.render),this.model.off("change:required",this.render),this.model.off("change:id",this.render)},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el),this.itemControls.show(new e({model:this.model})),jQuery(this.el).disableSelection(),i.channel("app").request("is:mobile")&&jQuery(this.el).on("taphold",function(e,t){jQuery(e.target).hasClass("nf-edit-settings")||(jQuery(this).addClass("ui-sortable-helper drag-selected"),jQuery(this).ClassyWiggle("start",{degrees:[".65","1",".65","0","-.65","-1","-.65","0"],delay:50}))})},templateHelpers:function(){return{renderClasses:function(){var e="nf-field-wrap";return this.editActive&&(e+=" active"),e},renderRequired:function(){return 1==this.required?'<span class="required">*</span>':""},getFieldID:function(){return jQuery.isNumeric(this.id)?"field-"+this.id:this.id},renderIcon:function(){var e=i.channel("fields").request("get:type",this.type);return'<span class="fa fa-'+e.get("icon")+'"></span>'}}},events:{"mouseover .nf-item-control":"mouseoverItemControl",mousedown:"maybeShortcut",click:"maybeClickEdit",singletap:"maybeTapEdit",swipeleft:"swipeLeft",swiperight:"swipeRight",tapend:"tapend"},maybeClickEdit:function(e){return this.doingShortcut?(this.doingShortcut=!1,!1):void((jQuery(e.target).parent().hasClass("nf-fields-sortable")||jQuery(e.target).parent().hasClass("nf-field-wrap")||jQuery(e.target).hasClass("nf-field-wrap"))&&!i.channel("app").request("is:mobile")&&(jQuery(":focus").blur(),i.channel("app").trigger("click:edit",e,this.model)))},maybeShortcut:function(e){var t=i.channel("app").request("get:keydown");return-1==t.indexOf(16)||(-1!=t.indexOf(68)?(i.channel("app").trigger("click:delete",e,this.model),this.doingShortcut=!0,!1):-1!=t.indexOf(67)?(this.doingShortcut=!0,i.channel("app").trigger("click:duplicate",e,this.model),!1):void 0)},maybeTapEdit:function(e){jQuery(e.target).parent().hasClass("nf-fields-sortable")&&i.channel("app").trigger("click:edit",e,this.model)},swipeLeft:function(e,t){jQuery(t.startEvnt.target).closest("div").find(".nf-item-duplicate").show(),jQuery(t.startEvnt.target).closest("div").find(".nf-item-delete").show()},swipeRight:function(e,t){jQuery(t.startEvnt.target).closest("div").find(".nf-item-duplicate").hide(),jQuery(t.startEvnt.target).closest("div").find(".nf-item-delete").hide()},tapend:function(e,t){jQuery(this.el).ClassyWiggle("stop"),jQuery(this.el).removeClass("ui-sortable-helper drag-selected")},remove:function(){i.channel("fields").request("get:removing")?this.$el.hide("clip",function(){jQuery(this).remove()}):this.$el.remove(),i.channel("fields").request("set:removing",!1)},mouseoverItemControl:function(e){jQuery(this.el).find(".nf-item-control").css("display","")}});return t}),n("views/fields/mainContentEmpty",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-main-content-fields-empty",onBeforeDestroy:function(){jQuery(this.el).parent().removeClass("nf-fields-empty-droppable").droppable("destroy")},onRender:function(){this.$el=this.$el.children(),this.$el.unwrap(),this.setElement(this.$el)},onShow:function(){jQuery(this.el).parent().hasClass("ui-sortable")&&jQuery(this.el).parent().sortable("destroy"),jQuery(this.el).parent().addClass("nf-fields-empty-droppable"),jQuery(this.el).parent().droppable({accept:function(e){if(jQuery(e).hasClass("nf-stage")||jQuery(e).hasClass("nf-field-type-button"))return!0},activeClass:"nf-droppable-active",hoverClass:"nf-droppable-hover",tolerance:"pointer",over:function(e,t){t.item=t.draggable,i.channel("app").request("over:fieldsSortable",t)},out:function(e,t){t.item=t.draggable,i.channel("app").request("out:fieldsSortable",t)},drop:function(e,t){t.item=t.draggable,i.channel("app").request("receive:fieldsSortable",t);var n=i.channel("fields").request("get:collection");n.trigger("reset",n)}})}});return e}),n("views/app/formTitle",[],function(){var e=Marionette.ItemView.extend({tagName:"div",template:"#tmpl-nf-header-form-title",initialize:function(){this.model.on("change:title",this.render,this)},templateHelpers:function(){return{renderTitle:function(){var e=i.channel("app").request("get:formModel");return _.escape(e.get("settings").get("title"))}}}});return e}),n("views/loadViews",["views/fields/fieldItem","views/fields/mainContentEmpty","views/app/formTitle"],function(e,t,n){var r=Marionette.Object.extend({initialize:function(){i.channel("views").reply("get:fieldItem",this.getFieldItem),i.channel("views").reply("get:mainContentEmpty",this.getMainContentEmpty),i.channel("views").reply("get:formTitle",this.getFormTitle)},getFieldItem:function(t){return e},getMainContentEmpty:function(){return t},getFormTitle:function(){return n}});return r});var i=Backbone.Radio;jQuery(document).ready(function(e){t(["views/app/builder","controllers/loadControllers","views/loadViews"],function(t,n,r){var a=Marionette.Application.extend({initialize:function(e){var t=this;Marionette.Renderer.render=function(e,n){var e=t.template(e);return e(n)},i.channel("app").trigger("before:loadControllers",this);new n;i.channel("app").trigger("after:loadControllers",this),i.channel("app").trigger("before:loadViews",this);new r;i.channel("app").trigger("after:loadViews",this),i.channel("app").reply("get:template",this.template)},onStart:function(){new t;i.channel("app").trigger("after:appStart",this),0==nfAdmin.formID&&i.channel("app").request("open:drawer","addField")},template:function(t){return _.template(e(t).html(),{evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^\}]+?)\}\}(?!\})/g,variable:"data"})}}),s=new a;s.start()})}),n("main",function(){})}(); 7 7 //# sourceMappingURL=almond.build.js.map 8 8 //# sourceMappingURL=builder.js.map -
ninja-forms/trunk/assets/js/min/builder.js.map
r1649765 r1649963 1 {"version":3,"sources":["../../../config-wrap-start-default.js","../lib/almond.js","views/app/menuItem.js","views/app/menu.js","views/app/menuButtons.js","views/app/mobileMenuButton.js","views/app/header.js","views/app/subHeader.js","views/app/builderHeader.js","views/app/main.js","views/app/mobileMenuItem.js","views/app/mobileMenu.js","views/app/drawer/contentEmpty.js","views/app/drawer.js","views/app/drawer/mergeTagItem.js","views/app/drawer/mergeTagsSection.js","models/app/mergeTagModel.js","models/app/mergeTagCollection.js","views/app/drawer/mergeTagsContent.js","views/app/builder.js","controllers/app/remote.js","controllers/app/drawer.js","views/app/drawer/headerDefault.js","views/app/drawer/footerDefault.js","models/app/drawerModel.js","models/app/drawerCollection.js","views/fields/drawer/stagedField.js","views/fields/drawer/stagingEmpty.js","views/fields/drawer/stagingCollection.js","models/fields/stagingModel.js","models/fields/stagingCollection.js","views/fields/drawer/typeSection.js","views/fields/drawer/typeSectionCollection.js","views/fields/drawer/addField.js","views/app/drawer/itemSettingCollection.js","views/app/drawer/itemSettingGroup.js","views/app/drawer/itemSettingGroupCollection.js","views/app/drawer/editSettings.js","views/app/drawer/headerEditSettings.js","views/actions/drawer/typeButton.js","views/actions/drawer/typeCollection.js","views/actions/drawer/addAction.js","views/app/drawer/contentViewChangesItem.js","views/app/drawer/contentViewChanges.js","views/app/drawer/headerViewChanges.js","views/app/drawer/settingError.js","views/app/drawer/itemSetting.js","views/app/drawer/contentNewForm.js","views/app/drawer/headerNewForm.js","controllers/app/drawerConfig.js","views/app/drawer/defaultSettingsTitle.js","views/app/empty.js","models/app/domainModel.js","models/app/domainCollection.js","views/fields/subHeader.js","views/fields/mainContentFieldCollection.js","views/fields/drawer/addSavedField.js","views/fields/drawer/settingsTitle.js","views/actions/mainHeader.js","views/actions/subHeader.js","views/app/itemControls.js","views/actions/actionItem.js","views/actions/mainContentEmpty.js","views/actions/mainContent.js","views/advanced/mainHeader.js","views/advanced/subHeader.js","views/advanced/settingItem.js","views/advanced/mainContent.js","models/fields/fieldModel.js","models/fields/fieldCollection.js","controllers/app/domainConfig.js","models/app/appModel.js","controllers/app/data.js","controllers/app/drawerToggleSettingGroup.js","controllers/app/updateDB.js","models/app/formModel.js","controllers/app/formData.js","controllers/app/previewLink.js","controllers/app/menuButtons.js","models/app/changeModel.js","models/app/changeCollection.js","controllers/app/trackChanges.js","controllers/app/undoChanges.js","controllers/app/publishResponse.js","controllers/app/changeDomain.js","controllers/app/pushstate.js","controllers/app/hotkeys.js","controllers/app/cleanState.js","controllers/app/coreUndo.js","controllers/app/cloneModelDeep.js","controllers/app/getSettingChildView.js","controllers/app/changeSettingDefault.js","views/app/drawer/typeSettingFieldset.js","models/app/settingModel.js","models/app/settingCollection.js","controllers/app/fieldset.js","controllers/app/toggleSetting.js","controllers/app/itemControls.js","controllers/app/mergeTags.js","models/app/mergeTagLookupCollection.js","views/app/drawer/mergeTag.js","views/app/drawer/mergeTagList.js","views/app/drawer/mergeTagGroup.js","views/app/drawer/mergeTagGroupList.js","views/app/drawer/mergeTagFilter.js","views/app/drawer/mergeTagBox.js","controllers/app/mergeTagBox.js","controllers/app/itemSettingFill.js","controllers/app/confirmPublish.js","controllers/app/rte.js","controllers/app/settingFieldSelect.js","controllers/app/settingFieldList.js","controllers/app/settingHTML.js","controllers/app/settingColor.js","controllers/app/changeMenu.js","controllers/app/mobile.js","controllers/app/notices.js","controllers/app/unloadCheck.js","controllers/app/formContentFilters.js","controllers/app/formContentGutterFilters.js","controllers/app/cloneCollectionDeep.js","controllers/app/trackKeyDown.js","controllers/app/perfectScroll.js","models/app/settingGroupModel.js","models/app/settingGroupCollection.js","controllers/app/getNewSettingGroupCollection.js","controllers/app/settingMedia.js","models/app/typeModel.js","models/app/typeCollection.js","models/fields/typeSectionModel.js","models/fields/typeSectionCollection.js","controllers/fields/types.js","controllers/fields/fieldTypeDrag.js","controllers/fields/stagingDrag.js","controllers/fields/staging.js","controllers/fields/stagingSortable.js","controllers/fields/filterTypes.js","controllers/fields/sortable.js","controllers/fields/data.js","models/app/optionRepeaterModel.js","models/app/optionRepeaterCollection.js","views/app/drawer/optionRepeaterError.js","views/app/drawer/optionRepeaterOption.js","views/app/drawer/optionRepeaterEmpty.js","views/app/drawer/optionRepeaterComposite.js","controllers/app/optionRepeater.js","controllers/fields/editActive.js","controllers/fields/fieldSettings.js","controllers/fields/fieldCreditCard.js","controllers/fields/fieldList.js","controllers/fields/fieldPassword.js","controllers/fields/fieldQuantity.js","controllers/fields/fieldShipping.js","controllers/fields/key.js","controllers/fields/notices.js","controllers/fields/mobile.js","controllers/fields/savedFields.js","controllers/fields/fieldDatepicker.js","controllers/fields/fieldDisplayCalc.js","controllers/actions/types.js","models/actions/actionModel.js","models/actions/actionCollection.js","controllers/actions/data.js","controllers/actions/actionSettings.js","controllers/actions/editActive.js","controllers/actions/addActionTypes.js","controllers/actions/typeDrag.js","controllers/actions/droppable.js","models/actions/typeModel.js","models/actions/typeCollection.js","controllers/actions/filterTypes.js","controllers/actions/newsletterList.js","controllers/advanced/types.js","models/advanced/settingsModel.js","controllers/advanced/data.js","controllers/advanced/formSettings.js","controllers/advanced/editActive.js","controllers/advanced/clickEdit.js","controllers/advanced/calculations.js","controllers/loadControllers.js","views/fields/fieldItem.js","views/fields/mainContentEmpty.js","views/app/formTitle.js","views/loadViews.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","view","Marionette","ItemView","extend","tagName","template","initialize","this","listenTo","nfRadio","channel","render","model","on","onRender","$el","children","unwrap","setElement","events","click a","clickAppMenu","trigger","templateHelpers","renderDashicons","dashicons","renderClasses","classes","currentDomain","request","get","renderUrl","url","formModel","renderTarget","renderDisabled","disabled","appMenuItemView","CollectionView","childView","onShow","el","find","bounceIcon","that","renderPublish","publishWidth","maybeDisabled","maybeRenderCancel","viewChanges","click .publish","click .viewChanges","clickPublish","clickViewChanges","changeModel","effect","times","click .nf-mobile-menu","clickMobileMenu","builderEl","toggleClass","appMenuCollectionView","appMenuButtonsView","mobileMenuButtonView","LayoutView","regions","menu","buttons","mobileMenuButton","appDomainCollection","show","collection","click #nf-logo","clickLogo","appHeaderView","appSubHeaderView","app","formTitle","appSub","changeSubHeader","formData","formSettings","formTitleView","subHeaderView","className","maybeDone","offsetRight","offsetLeft","gutterLeft","body","gutterRight","reply","getMainEl","window","context","resizeBothGutters","setBothGuttersAbsolute","setBothGuttersFixed","updateGutters","bodyView","gutterLeftView","gutterRightView","parent","onAttach","initialGutterResize","onBeforeDestroy","off","resize","resizeGutter","data","leftEl","rightEl","clearTimeout","top","offset","viewHeight","height","topLeft","leftLeft","left","css","position","topRight","leftRight","scrollTop","right","mobileDashicon","mobileMenuItemView","CompositeView","attachHtml","collectionView","append","click .nf-publish","drawerEmptyView","header","content","footer","getEl","loadContent","emptyContent","perfectScrollbar","drawerID","drawer","contentView","headerView","footerView","empty","click .nf-toggle-drawer","clickToggleDrawer","clickTag","active","mergeTagItemView","fieldCollection","updateFields","set","Backbone","Model","defaults","exclude","mergeTagModel","Collection","mergeTagsSectionView","MergeTagCollection","getMergeTagsView","reRender","settingModel","mergeTagCollection","defaultGroups","where","default_group","calcMergeTagGroup","useMergeTags","_","each","remove","include","models","sectionModel","add","mainView","mobileMenuView","drawerView","mergeTagsContentView","menuDrawer","mergeTagsContent","getBuilderEl","getBuilderView","mergeTags","mergeTagsClone","clone","click .nf-open-drawer","click .nf-change-domain","click .nf-close-drawer","openDrawer","closeDrawer","changeDomain","addListener","dataModel","listen","updateSetting","clickExtra","getRemote","settingView","srcElement","addClass","remote","parentValue","action","security","nfAdmin","ajaxNonce","post","ajaxurl","response","JSON","parse","options","controller","clickOpenDrawer","toggleDrawerSize","getClosedDrawerPos","preventClose","enableClose","maybePreventClose","objPreventClose","filterFocused","currentDrawer","removeClass","rightClosed","drawerEl","checkCloseDrawerPos","setInterval","clearInterval","target","currentDomainID","hasFocus","checkOpenDrawerPos","focusFilter","filterEl","focus","closedPos","width","keys","key","getPreventClose","clearFilter","blurFilter","keyup .nf-filter","input .nf-filter","focus input","changeFilter","maybeChangeFilter","keyCode","addObject","trim","val","blur","getFocus","drawerDisabled","defaultHeaderView","defaultFooterView","getHeaderView","getFooterView","drawerModel","click .dashicons-dismiss","removeStagedField","stagedFieldView","stagedFieldsEmptyView","emptyView","activeClass","getStagedFieldsEl","sortable","placeholder","helper","tolerance","over","ui","out","receive","update","start","stop","draggable","opacity","connectToSortable","appendTo","refreshPositions","grid","element","zIndex","onAddChild","onRemoveChild","hasStagedFields","stagingModel","comparator","bindAll","getTypeSection","dragging","drag","disableSelection","click .nf-item","keydown .nf-item","mousedown .nf-item","clickFieldType","mousedownFieldType","maybeClickFieldType","renderFieldTypes","html","fieldTypes","type","nicename","icon","renderType","savedField","fieldTypeSectionView","drawerStagingView","StagingCollection","fieldTypeSectionCollectionView","staging","primary","secondary","filterFieldTypes","removeFieldTypeFilter","savedCollection","primaryCollection","fieldTypeSectionCollection","secondaryCollection","stagingCollection","filteredSectionCollection","reset","childViewOptions","getChildView","itemSettingCollectionView","settings","click .toggle","clickToggleGroup","renderLabel","label","groupLabel","renderArrowDir","display","itemSettingGroupView","itemSettingGroupCollectionView","settingTitle","settingGroups","groupCollection","titleView","maybeRenderTitle","title","renderTypeNicename","domainID","scroll","clickAddAction","open","image","section","renderStyle","actionTypeButtonView","renderNicename","slug","actionTypeCollectionView","filteractionTypes","removeactionTypeFilter","installedActions","availableActions","filteredInstalled","filteredAvailable","click .undoSingle","undoSingle","viewChangesItem","click .undoChanges","clickUndoChanges","settingErrorView","error","renderOnChange","renderError","refresh","drawerOpened","drawerClosed","setting","unescape","silent","onBeforeRender","escape","next","jBox","maxWidth","theme","closeOnClick","mask","input","autoNumeric","aSep","thousandsSeparator","aDec","decimalPoint","currency","currencySymbol","currencySymbols","aSign","text","format","console","log","renderVisible","renderSetting","renderLabelClasses","use_merge_tags","renderTooltip","help","renderMergeTags","hide_merge_tags","renderPlaceholder","change .setting","keyup .setting","click .setting","click .extra","changeSetting","keyUpSetting","clickSetting","itemSettingView","formName","formSubmit","titleSettingModel","addSubmitSettingModel","submitButtons","findWhere","drawerCollection","addFieldView","editSettingsView","editSettingsHeaderView","addActionView","viewChangesView","viewChangesHeaderView","newFormView","newFormHeaderView","mobileItemControlsView","getContentView","typeModel","getDrawerCollection","getDrawer","DefaultSettingsTitleView","EmptyView","hotkeys","getSettingsTitleView","getDefaultSettingsTitleView","getGutterLeftView","getGutterRightView","domainModel","reorderOnSort","getEmptyView","getSortableEl","initSortable","destroySortable","cancel","scrollSensitivity","item","dropping","hide","renderAddButton","button","click .nf-button","clickAddSavedField","addSavedFieldView","renderjBoxContent","addSaved","addSavedjBox","destroy","unset","x","y","outside","onCreated","setContent","attach","displayName","saved","realType","renderSavedStar","star","actionCollection","mouseover .nf-item-control","click .nf-edit-settings","singletap .nf-edit-settings","click .nf-delete","click .nf-duplicate","clickEdit","singleTapEdit","clickDelete","clickDuplicateField","mouseoverItemControl","itemControlsView","itemControls","maybeDeactivate","change input","click","maybeClickEdit","changeToggle","renderToggle","settingName","actionLabel","actionView","droppable","accept","hoverClass","drop","updateActiveClass","editActive","settingItem","objectType","objectDomain","order","fieldType","parentType","updateFieldKey","changedAttributes","keyModel","fieldModel","parseInt","tmpNum","addField","removeField","addNewField","appendNewField","removeFieldResponse","newIDs","removedIDs","at","fieldExists","fieldsSubHeaderView","FieldsMainContentFieldCollectionView","fieldsSettingsTitleView","actionsMainHeaderView","actionsSubHeaderView","actionsMainContentView","settingsMainHeaderView","settingsSubHeaderView","settingsMainContentView","FieldCollection","defaultFormContentView","defaultFormContentLoad","defaultFormContentGutterView","nfi18n","domainFormFields","Esc","Ctrl+Shift+n","Ctrl+Shift+a","Ctrl+Shift+s","Alt+Ctrl+t","up","down","Shift+return","getSubHeaderView","getMainContentView","formContentData","formContentLoadFilters","sortedArray","without","first","formContentViewFilters","formContentView","gutterFilters","gutterView","domainActions","Ctrl+Shift+f","domainAdvanced","previewurl","getDomainCollection","getDomainModel","fieldModels","loading","changeStatus","appModel","clean","mobile","isMobile","getData","getSetting","getCurrentDomain","getCurrentDrawer","updateCurrentDomain","updateCurrentDrawer","currentDrawerID","toggleSettingGroup","errors","updateDB","defaultSaveFilter","jsAction","formContentSaveDataFilters","stringify","fields","field","parent_id","deleted_fields","actions","deleted_actions","autoClose","form","exception","pluck","isNumeric","preloadedFormData","getFormModel","disablePreview","enablePreview","changePreviewNicename","appDomains","preview","publish","changeCollection","cid","ChangeModel","registerChange","getCollection","maybeResetCollection","changes","dashicon","undoChanges","sort","change","undoAll","publishResponse","new_ids","newID","oldID","forms","history","replaceState","changeAppDomain","preventChange","enableChange","objPreventChange","maybePreventChange","mainEl","changePushState","pushState","location","href","reExp","toString","newUrl","changeHotkeys","addNewAction","changeDomainFields","changeDomainActions","changeDomainSettings","document","hotkey","msg","fieldsDomain","actionsDomain","settingsDomain","ignoreAttributes","setAppClean","attr","changedAttr","after","undoChangeSetting","undoAddObject","undoRemoveObject","undoDuplicateObject","undoSortFields","undoAddListOption","undoRemoveListOption","undoSortListOptions","before","maybeRemoveChange","objectModel","results","objectCollection","objModels","optionModel","cloneModelDeep","attributes","clonedCollection","newModel","getSettingChildView","settingChildView","object","maybePreventUI","updateKey","fieldsetView","settingCollection","createSettingsCollection","settingTypeModel","clickDuplicate","tmpID","tagSectionCollection","tagSection","tags","fieldTags","tag","getFieldKeyFormat","calcTags","calcCollection","calcModel","currentElement","clickMergeTag","addFieldTags","deleteFieldTags","updateCalcTags","updateCurrentElement","updateCurrentSetting","getSectionModel","replaceFieldKey","initMergeTags","mergeTagsView","jBoxes","closeOnEsc","maxHeight","onOpen","prev","onClose","tagModel","currentValue","currentPos","caret","newPos","substr","summernote","calcTag","getFieldKeyFormatCalc","fieldID","calc","openMergeTags","returnMergeTags","preventDefault","currentModel","upMergeTags","changeActiveTag","downMergeTags","dir","inc","currentIndex","nextModel","userInfo","system","updateOpen","newKey","oldTag","oldKey","_previousAttributes","oldVal","oldCalcKey","newCalcKey","re","RegExp","newVal","insertTag","mergeTagView","sectionFilter","searchFilter","filter","child","term","toLowerCase","removeActive","onClick","updateTags","setActive","siblings","mergeTagGroupView","keyup input","updateFilter","event","firstFilteredTag","sections","MergeTagModel","MergeTagLookupCollection","MergeTagView","MergeTagListView","MergeTagGroupView","MergeTagGroupListView","MergeTagFilterView","MergeTagBoxLayout","old"," afterAppStart","beforeRenderSetting","beforeDrawerClose","mergeTagsButtonClick","bind","selector","focusCallback","keyupCallback","closest","layout","tagCollection","mergeTagListView","mergeTagGroupListView","getRegion","rteEditor","posY","outerHeight","boxHeight","repeaterRow","scrollLeft","posX","$input","hasClass","str","caretPos","patt","match","exec","string","childNode","childNodes","node","nodeValue","innerHTML","range","createRange","sel","getSelection","setStart","err","collapse","removeAllRanges","addRange","$this","$inputSetting","autocomplete","$overlayElement","dataID","so","mergetags","mergetag","elementClasses","confirmPublish","initSettingModel","destroySetting","meta_image_frame","icons","align","alignCenter","alignJustify","alignLeft","alignRight","indent","outdent","bold","close","code","eraser","italic","link","unlink","magic","minus","orderedlist","redo","square","table","underline","undo","unorderedlist","currentContext","initRTE","linkButton","mediaButton","toolbar","codemirror","lineNumbers","callbacks","onBlur","editor","getValue","updateDataModel","prettifyHtml","onFocus","onKeydown","onKeyup","linkMenu","replaceWith","class","removeRTE","linkDropdown","buttonGroup","contents","tooltip","clickLinkButton","toggle","dropdown","mergeTagsButton","openMediaManager","invoke","wp","media","frames","media_attachment","state","toJSON","insertMedia","textEl","urlEl","isNewWindowEl","isNewWindow","filename","trackKeyChanges","beforeRender","maybeSwitchToFieldsDomain","autoOpenDrawer","filterDrawerContents","SwitchToFieldsDomain","updateFieldMap","contains","fieldFilter","bail","fieldTypeModel","rubble","filterDrawer","switchDomain","fieldDomainModel","fieldListSettings","registerFieldListSettings","updateFieldListSettingKeys","changed","Radio","actionModel","lastChanged","oldValue","init","changedSettingValue","setRenderFalse","closeColorPickers","initColorPicker","wpColorPicker","color","editFormText","changeMenu","formPublish","isNewForm","highlightAddNew","appendEditForm","form_id","isNaN","closeMobileMenu","addNotice","closeNotice","notices","appDefaults","constructOnInit","stack","animation","mobileDefaults","desktopDefaults","openNotice","maybePrompt","viewFilters","saveFilters","loadFilters","addViewFilter","addSaveFilter","addLoadFilter","getViewFilters","getSaveFilters","getLoadFilters","priority","leftFilters","rightFilters","addLeftFilter","addRightFilter","getLeftFilters","getRightFilters","cloneCollectionDeep","constructor","keyDown","keyUp","getKeyDown","movedPos","initPerfectScroll","moveRail","resetRail","suppressScrollX","outerWidth","SettingCollection","settingGroupModel","SettingGroupCollection","getNewSettingGroupCollection","option","typeSectionModel","TypeCollection","SectionCollection","fieldTypeSections","registerSection","fieldTypeData","getFieldType","getTypeCollection","getTypeSections","getSavedFields","shiftKey","startDrag","stopDrag","getCurrentDraggableHelperClone","style","setProperty","draggableHelperClone","stagedFields","num","addStagedField","getStagingCollection","sortStagedFields","clearStagedFields","beforeCloseDrawer","now","tmpField","sortableEl","search","pos","receiveStagedFields","overStagedFields","outStagedFields","startStagedFields","stopStagedFields","addActiveClass","stagedFieldsEl","removeActiveClass","currentHelper","helperClone","filtered","filterCollection","found","alias","receiveFieldsSortable","overfieldsSortable","outFieldsSortable","stopFieldsSortable","startFieldsSortable","updateFieldsSortable","insertedAt","fieldWidth","dragFieldID","dragModel","oldPos","adding","removing","getFieldCollection","getField","redrawFieldCollection","getTmpFieldID","deleteField","sortFields","getAdding","setAdding","getRemoving","setRemoving","renderTrigger","savedType","updateFieldSetting","changeErrors","size","errorsFound","opt","listOptionModel","addOption","renderErrors","ErrorView","columns","parentView","hasErrors","keyup","changeOption","deleteOption","keyupOption","maybeAddOption","findByIndex","getColumns","renderFieldSelect","_return","selected","renderOptions","column","listOptionView","listEmptyView","listOptionCollection","optionCollection","handle","forcePlaceholderSize","importLink","closeButton","clickImport","renderHeaders","col","renderFieldsetClasses","currency_symbol","click .nf-add-new","clickAddOption","textarea","trimLeft","trimRight","lines","isArray","line","row","slugify","separator","listCompositeView","updateOptionSortable","stopOptionSortable","startOptionSortable","convertSettings","optionView","triggerDataModel","modelData","new","default","newOrder","clearEditActive","fieldSettings","getSettingModel","getSettingCollection","dropCreditCardField","newField","stageCreditCardField","ListOptionCollection","updateOptionLabel","updateOptionValue","convertOptions","select","confirm","insertField","productFields","getProductFields","addMask","newFieldKey","updateLabel","d","Date","valueOf","setError","keyExists","testKey","startWiggle","stopWiggle","initWiggle","ClassyWiggle","degrees","delay","updateField","modified","modelClone","fieldData","created_at","formID","newType","newTypeDefaults","settingDefaults","typeCollection","typeSections","addDatepicker","pikadayResponsive","actionTypeData","installed","available","getType","getInstalledActions","getAvailableActions","actionType","addAction","removeAction","getAction","getTmpID","deleteAction","actionSettings","dropActionType","type_slug","actionTypeModel","filterActionTypes","newInstalled","newAvailable","defaultFields","clickListUpdate","maybeRenderFields","maybeRenderGroups","registerFieldsListener","registerGroupsListener","updateFieldMapping","updateInterestGroups","updateLists","lists","always","selectedList","list","groups","group","formSettingTypeData","settingsModel","getSettings","updateCalc","sortCalc","checkName","checkEQ","checkDec","checkAllCalcs","nameExists","eq","errorSelfRef","errorFutureCalc","calcs","calculations","targetCalc","selfRef","futureCalc","dec","errorNonIntDec","checked","Math","abs","nonIntDec","Remote","Drawer","DrawerConfig","DomainConfig","AppData","DrawerToggleSettingGroup","UpdateDB","FormData","PreviewLink","AppMenuButtons","AppTrackChanges","AppUndoChanges","AppPublishResponse","AppChangeDomain","Pushstate","Hotkeys","CleanState","CoreUndo","CloneModelDeep","DrawerSettingChildView","ChangeSettingDefault","Fieldset","ToggleSetting","ItemControls","MergeTags","MergeTagsBox","ItemSettingFill","ConfirmPublish","RTE","SettingFieldSelect","SettingFieldList","SettingHTML","SettingColor","ChangeMenu","AppMobile","AppNotices","AppUnloadCheck","FormContentFilters","FormContentGutterFilters","CloneCollectionDeep","TrackKeyDown","PerfectScroll","GetNewSettingGroupCollection","SettingMedia","FieldTypes","FieldTypeDrag","FieldStagingDrag","StagedFieldsData","StagedFieldsSortable","DrawerFilterFieldTypes","MainContentFieldsSortable","FieldData","OptionRepeater","FieldsEditActive","FieldSettings","FieldCreditCard","FieldList","FieldPassword","FieldQuantity","FieldShipping","FieldKey","Notices","FieldsMobile","SavedFields","FieldDatepicker","FieldDisplayCalc","ActionTypes","ActionData","ActionSettings","ActionEditActive","ActionAddTypes","ActionTypeDrag","ActionDroppable","ActionFilterTypes","ActionNewsletterList","SettingTypes","SettingData","FormSettings","SettingsEditActive","SettingsClickEdit","AdvancedCalculations","doingShortcut","touch","renderRequired","required","getFieldID","renderIcon","mousedown","singletap","swipeleft","swiperight","tapend","maybeShortcut","maybeTapEdit","swipeLeft","startEvnt","swipeRight","renderTitle","fieldItemView","mainContentEmptyView","FormTitleView","getFieldItem","getMainContentEmpty","getFormTitle","ready","$","BuilderView","LoadControllers","LoadViews","NinjaForms","Application","Renderer","onStart","evaluate","interpolate","variable","ninjaForms"],"mappings":"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ACA,4BACA,8BACA,kCACA,iCACA,sBACA,qCACA,mCACA,8BACA,+BACA,6BACA,yBACA,0BACA,8BACA,qCACA,2CACA,sCACA,+BACA,gCACA,+CACA,+BAIA,2BACA,mCACA,iCACA,6BACA,qCACA,iCACA,8BACA,0BACA,iCACA,gCACA,mCACA,qCACA,+BACA,mCACA,mCACA,mCACA,yBACA,6BACA,4BACA,iCACA,qCACA,sCAKA,4BACA,2BACA,qCACA,iCACA,qCACA,+BACA,gCACA,kCACA,qCAKA,6BACA,4BACA,oCACA,kCACA,iCACA,qCAEA,SAIAoxC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAIAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GACAC,GACAC,GACAC,IAGA,GAAAhjC,IAAAxN,WAAA7B,OAAA+B,QACAG,WAAA,WAIA,GAAAwtC,GACA,GAAAC,GACA,GAAAvB,GACA,GAAAf,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAE,GACA,GAAAG,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAG,GACA,GAAAC,GACA,GAAAC,GACA,GAAAK,GACA,GAAAI,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAW,GACA,GAAAV,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC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","file":"builder.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","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menuItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-app-menu-item',\n\n\t\tinitialize: function() {\n\t\t\t// Listen for domain changes and re-render when we detect one.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// Listen for clicks on our app menu.\n\t\tevents: {\n\t\t\t'click a': 'clickAppMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click on a menu item, fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * We pass this.model so that we know what item was clicked.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\te event\n\t\t * @return return\n\t\t */\n\t\tclickAppMenu: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t\t\t\t * If we have any dashicons in our model, render them.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDashicons: function() {\n\t\t\t\t\tif ( this.dashicons ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.dashicons + '\"></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\t\t\t\t/**\n\t\t\t\t * Render classes for our menu item, including active.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\n\t\t\t\t\t\tclasses += ' active';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its url.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderUrl: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\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\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its target.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderTarget: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\treturn '_blank';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '_self';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * If our menu item is disabled, output 'disabled'\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\tif ( this.disabled ) {\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\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Collection view that takes our app menu items and renders an individual view for each.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menu',['views/app/menuItem'], function( appMenuItemView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: appMenuItemView,\n\n\t\t/**\n\t\t * When we show this view, get rid of the extra <div> tag added by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonShow: function() {\n\t\t\tjQuery( this.el ).find( 'li:last' ).unwrap();\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Renders the action buttons to the right of the app menu. i.e. Publish\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menuButtons',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'span',\n\t\ttemplate: '#tmpl-nf-app-header-action-button',\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:loading', this.render, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.bounceIcon, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t \t\t/**\n\t \t\t * Render our Publish button. If we're loading, render the loading version.\n\t \t\t *\n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\trenderPublish: function() {\n\t \t\t\tif ( that.publishWidth ) {\n\t \t\t\t\tthis.publishWidth = 'style=\"width:' + that.publishWidth + 'px !important\"';\n\t \t\t\t} else {\n\t \t\t\t\tthis.publishWidth = '';\n\t \t\t\t}\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'loading' ) ) {\n\t \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-header-publish-loading' );\n\t \t\t\t} else {\n\t \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-app-header-publish-button' );\n\t \t\t\t}\n\t \t\t\treturn template( this );\n\t \t\t},\n\n\t \t\t/**\n\t \t\t * If our app state is clean, disable publish.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\n\t \t\t/**\n\t \t\t * If our app isn't clean, render our 'viewChanges' button.\n\t \t\t * @since version\n\t \t\t * @return {[type]} [description]\n\t \t\t */\n\t \t\tmaybeRenderCancel: function() {\n\t \t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\tvar viewChanges = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-app-header-view-changes' );\n\t \t\t\t\treturn viewChanges( this );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tvar publishEL = jQuery( this.el ).find( '.publish' );\n\t\t\t// this.publishWidth = jQuery( publishEL ).outerWidth( true );\n\t\t},\n\n\t\t/**\n\t\t * Listen for clicks on the Publish or view changes button.\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .publish': 'clickPublish',\n\t\t\t'click .viewChanges': 'clickViewChanges'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\n\t\t},\n\n\t\t/**\n\t\t * When we click view changes, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickViewChanges: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:viewChanges', e );\n\t\t},\n\n\t\tbounceIcon: function( changeModel ) {\n\t\t\tjQuery( this.el ).find( '.dashicons-backup' ).effect( 'bounce', { times: 3 }, 600 );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders the action buttons to the right of the app menu. i.e. Publish\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenuButton',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'span',\n\t\ttemplate: '#tmpl-nf-mobile-menu-button',\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\t/**\n\t \t\t * If our app state is clean, disable button.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t}\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Listen for clicks on the mobile menu button.\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .nf-mobile-menu': 'clickMobileMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickMobileMenu: function( e) {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Main application header. Includes links to all of our domains.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/header',['views/app/menu', 'views/app/menuButtons', 'views/app/mobileMenuButton'], function( appMenuCollectionView, appMenuButtonsView, mobileMenuButtonView ) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-app-header',\n\n\t\tregions: {\n\t\t\t// Menu is our main app menu.\n\t\t\tmenu: '.nf-app-menu',\n\t\t\t// Buttons represents the 'view changes' and 'Publish' buttons.\n\t\t\tbuttons: '.nf-app-buttons',\n\t\t\tmobileMenuButton: '.nf-mobile-menu-button'\n\t\t},\n\n\t\t/**\n\t\t * Since this is a layout region, we need to fill the two areas: menu and buttons whenever we show this view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonRender: function() {\n\t\t\t// Get our domains\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\t// show the menu area using the appropriate view, passing our domain collection.\n\t\t\tthis.menu.show( new appMenuCollectionView( { collection: appDomainCollection } ) );\n\t\t\tthis.buttons.show( new appMenuButtonsView() );\n\t\t\tthis.mobileMenuButton.show( new mobileMenuButtonView() );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click #nf-logo': 'clickLogo'\n\t\t},\n\n\t\tclickLogo: function( e ) {\n\t\t\t\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Renders our sub-header. i.e. add new field, add new action, etc.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our builder header.\n *\n * This is a layout view and handles two regions:\n * app - menu/buttons\n * subapp - title, add new field, etc.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/builderHeader',[ 'views/app/header', 'views/app/subHeader' ], function( appHeaderView, appSubHeaderView ) {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: \"div\",\n\t\ttemplate: \"#tmpl-nf-header\",\n\n\t\tregions: {\n\t\t\tapp: \"#nf-app-header\",\n\t\t\tformTitle: \"#nf-app-form-title\",\n\t\t\tappSub: \"#nf-app-sub-header\"\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changeSubHeader );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.app.show( new appHeaderView() );\n\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar formSettings = formData.get( 'settings' );\n\n\t\t\tvar formTitleView = nfRadio.channel( 'views' ).request( 'get:formTitle' );\n\t\t\tthis.formTitle.show( new formTitleView( { model: formSettings } ) );\n\n\t\t\tthis.changeSubHeader();\n\t\t},\n\n\t\tchangeSubHeader: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar subHeaderView = currentDomain.get( 'getSubHeaderView' ).call( currentDomain );\n\t\t\tthis.appSub.show( subHeaderView );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our builder.\n *\n * This is a layout view and handles three regions:\n * gutterLeft - gutter to the left of our main content area\n * body - main content area\n * gutterRight - gutter to the right of our main content area\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/main',[], function() {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main',\n\t\tclassName: 'nf-main-test',\n\t\tmaybeDone: false,\n\n\t\toffsetRight: false,\n\t\toffsetLeft: false,\n\n\t\tregions: {\n\t\t\tgutterLeft: '#nf-main-gutter-left',\n\t\t\tbody: '#nf-main-body',\n\t\t\tgutterRight: '#nf-main-gutter-right'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:mainEl', this.getMainEl, this );\n\n\t\t\t/*\n\t\t\t * Make sure that our gutters resize to match our screen upon resize or drawer open/close.\n\t\t\t */\n\t\t\tjQuery( window ).on( 'resize', { context: this }, this.resizeBothGutters );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:open', this.setBothGuttersAbsolute );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.setBothGuttersFixed );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.setBothGuttersAbsolute );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.setBothGuttersFixed );\n\n\t\t\t/*\n\t\t\t * Reply to messages requesting that we resize our gutters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:gutters', this.updateGutters, this );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tnfRadio.channel( 'main' ).trigger( 'show:main', this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar bodyView = currentDomain.get( 'getMainContentView' ).call( currentDomain );\n\t\t\tthis.body.show( bodyView );\n\n\t\t\tvar gutterLeftView = currentDomain.get( 'getGutterLeftView' ).call( currentDomain );\n\t\t\tthis.gutterLeft.show( gutterLeftView );\n\n\t\t\tvar gutterRightView = currentDomain.get( 'getGutterRightView' ).call( currentDomain );\n\t\t\tthis.gutterRight.show( gutterRightView );\n\t\t\t\n\t\t\tnfRadio.channel( 'main' ).trigger( 'render:main' );\n\t\t},\n\n\t\tgetMainEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tonAttach: function() {\n\t\t\tthis.initialGutterResize();\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( window ).off( 'resize', this.resize );\n\t\t},\n\n\t\tinitialGutterResize: function() {\n\t\t\tthis.resizeGutter( this.gutterLeft.el );\n\t\t\tthis.resizeGutter( this.gutterRight.el );\n\t\t\tthis.setBothGuttersFixed( this );\n\t\t},\n\n\t\tresizeBothGutters: function( e ) {\n\t\t\tvar context = ( e ) ? e.data.context : this;\n\n\t\t\tvar leftEl = context.gutterLeft.el;\n\t\t\tvar rightEl = context.gutterRight.el;\n\t\t\t\n\t\t\tcontext.resizeGutter( leftEl, context );\n\t\t\tcontext.resizeGutter( rightEl, context );\n\n\t\t\tcontext.setBothGuttersAbsolute( context );\n\n\t\t\t/*\n\t\t\t * Clear our timeout. If the timeout runs, it means we've stopped resizing.\n\t\t\t */\t\n\t\t\tclearTimeout( context.maybeDone );\n\t\t\t/*\n\t\t\t * Add our timeout.\n\t\t\t */\n\t\t\tcontext.maybeDone = setTimeout( context.setBothGuttersFixed, 100, context );\n\t\t},\n\n\t\tresizeGutter: function( el, context ) {\n\t\t\tvar top = jQuery( el ).offset().top;\n\t\t\tvar viewHeight = jQuery( window ).height();\n\t\t\tvar height = viewHeight - top;\n\t\t\tjQuery( el ).height( height );\n\t\t},\n\n\t\tsetBothGuttersFixed: function( context ) {\n\t\t\tcontext = context || this;\n\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\tvar topLeft = offsetLeft.top;\n\t\t\tvar leftLeft = offsetLeft.left;\n\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'fixed', left: leftLeft, top: topLeft } );\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\t\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\n\t\t\tvar topRight = offsetRight.top;\n\t\t\tvar leftRight = offsetRight.left;\n\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'fixed', left: leftRight, top: topRight } );\n\t\t},\n\n\t\tsetBothGuttersAbsolute: function( context ) {\n\t\t\tcontext = context || this;\n\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\n\n\t\t\tvar scrollTop = jQuery( '#nf-main' ).scrollTop();\n\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'absolute', left: 0, top: scrollTop } );\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'absolute', top: scrollTop, right: 0, left: 'auto' } );\n\t\t},\n\n\t\tupdateGutters: function() {\n\t\t\tthis.resizeBothGutters();\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenuItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-mobile-menu-item',\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// Listen for clicks on our app menu.\n\t\tevents: {\n\t\t\t'click a': 'clickAppMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click on a menu item, fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * We pass this.model so that we know what item was clicked.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\te event\n\t\t * @return return\n\t\t */\n\t\tclickAppMenu: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t\t\t\t * If we have any dashicons in our model, render them.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDashicons: function() {\n\t\t\t\t\tif ( this.mobileDashicon ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.mobileDashicon + '\"></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\t\t\t\t/**\n\t\t\t\t * Render classes for our menu item, including active.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\n\t\t\t\t\t\tclasses += ' active';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its url.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderUrl: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\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\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its target.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderTarget: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\treturn '_blank';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '_self';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * If our menu item is disabled, output 'disabled'\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\tif ( this.disabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Single item view used for the menu drawer.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenu',['views/app/mobileMenuItem'], function( mobileMenuItemView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-mobile-menu',\n\t\tchildView: mobileMenuItemView,\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.secondary' ).append( childView.el );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t \t\t * If our app state is clean, disable button.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-publish': 'clickPublish'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Empty drawer content view.\n * Called before we close the drawer.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our drawer region\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer',['views/app/drawer/contentEmpty'], function( drawerEmptyView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer',\n\n\t\tregions: {\n\t\t\theader: '#nf-drawer-header',\n\t\t\tcontent: '#nf-drawer-content',\n\t\t\tfooter: '#nf-drawer-footer'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerEl', this.getEl, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'load:drawerContent', this.loadContent, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'empty:drawerContent', this.emptyContent, this );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).parent().perfectScrollbar();\n\t\t\t}\n\t\t},\n\n\t\tloadContent: function( drawerID, data ) {\n\t\t\tvar drawer = nfRadio.channel( 'app' ).request( 'get:drawer', drawerID );\n\t\t\tvar contentView = drawer.get( 'getContentView' ).call( drawer, data );\n\t\t\tvar headerView = drawer.get( 'getHeaderView' ).call( drawer, data );\n\t\t\tvar footerView = drawer.get( 'getFooterView' ).call( drawer, data );\n\n\t\t\tthis.header.show( headerView );\n\t\t\tthis.content.show( contentView );\n\t\t\tthis.footer.show( footerView );\n\n\t\t},\n\n\t\temptyContent: function() {\n\t\t\tthis.header.empty();\n\t\t\tthis.content.empty();\n\t\t\tthis.footer.empty();\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-toggle-drawer': 'clickToggleDrawer'\n\t\t},\n\n\t\tclickToggleDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:toggleDrawerSize' );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Single item view used for merge tags.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'li',\n\n\t\ttemplate: '#tmpl-nf-merge-tags-item',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:active', this.render );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:active', this.render, this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click a': 'clickTag'\n\t\t},\n\n\t\tclickTag: function( e ) {\n\t\t\tnfRadio.channel( 'mergeTags' ).trigger( 'click:mergeTag', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tif ( this.active ) {\n\t\t\t\t\t\treturn 'active';\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Merge tags popup section\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagsSection',['views/app/drawer/mergeTagItem'], function( mergeTagItemView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttagName: 'div',\n\t\tchildView: mergeTagItemView,\n\t\ttemplate: '#tmpl-nf-merge-tags-section',\n\n\t\tinitialize: function() {\n\t\t\tthis.collection = this.model.get( 'tags' );\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\n\t\t\t\t// var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t// fieldCollection.on( 'all', this.updateFields, this );\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change', this.render );\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\tfieldCollection.off( 'all', this.updateFields, this );\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.merge-tags' ).append( childView.el );\n\t\t},\n\n\t\tupdateFields: function() {\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tthis.model.set( 'tags', fieldCollection );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Model that represents our merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tactive: false,\n\t\t\texclude: false\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collections of merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: mergeTagModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Merge tags popup\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagsContent',['views/app/drawer/mergeTagsSection', 'models/app/mergeTagCollection'], function( mergeTagsSectionView, MergeTagCollection ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-merge-tags-content',\n\t\tchildView: mergeTagsSectionView,\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:view', this.getMergeTagsView, this );\n\t\t},\n\n\t\treRender: function( settingModel ) {\n\t\t\tvar mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n\t\t\tvar defaultGroups = mergeTagCollection.where( { default_group: true } );\n\n\t\t\t/*\n\t\t\t * For the Actions Domain, Add Calc Merge Tags as a Default Group.\n\t\t\t */\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tif( 'actions' == currentDomain.get( 'id' ) ){\n\t\t\t\tvar calcMergeTagGroup = mergeTagCollection.where( { id: 'calcs' } );\n defaultGroups = defaultGroups.concat( calcMergeTagGroup );\n }\n\n\t\t\tthis.collection = new MergeTagCollection( defaultGroups );\n\t\t\tvar that = this;\n\t\t\tvar useMergeTags = settingModel.get( 'use_merge_tags' );\n\t\t\tif ( 'object' == typeof useMergeTags ) {\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.exclude ) {\n\t\t\t\t\t_.each( useMergeTags.exclude, function( exclude ) {\n\t\t\t\t\t\tthat.collection.remove( exclude )\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.include ) {\n\t\t\t\t\t_.each( mergeTagCollection.models, function( sectionModel ) {\n\t\t\t\t\t\tif ( -1 != useMergeTags.include.indexOf( sectionModel.get( 'id' ) ) ) {\n\t\t\t\t\t\t\t// console.log( sectionModel );\n\t\t\t\t\t\t\tthat.collection.add( sectionModel );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.render();\n\t\t},\n\n\t\tgetMergeTagsView: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Builder view.\n *\n * This layout view has regions that represent our application areas:\n * header\n * main\n * menuDrawer - Mobile side-menu\n * drawer\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/builder',['views/app/builderHeader', 'views/app/main', 'views/app/mobileMenu', 'views/app/drawer', 'views/app/drawer/mergeTagsContent'], function( headerView, mainView, mobileMenuView, drawerView, mergeTagsContentView ) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: \"#tmpl-nf-builder\",\n\t\tel: '#nf-builder',\n\n\t\tregions: {\n\t\t\theader: \"#nf-header\",\n\t\t\tmain: \"#nf-main\",\n\t\t\tmenuDrawer: \"#nf-menu-drawer\",\n\t\t\tdrawer: \"#nf-drawer\",\n\t\t\tmergeTagsContent: '.merge-tags-content'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Respond to requests asking for the builder dom element.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderEl', this.getBuilderEl, this );\n\t\t\t// Respond to requests asking for the builder view\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderView', this.getBuilderView, this );\n\t\t\t// Layout views aren't self-rendering.\n\t\t\tthis.render();\n\t\t\tvar mergeTags = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n\t\t\tvar mergeTagsClone = mergeTags.clone();\n\t\t\tthis.mergeTagsContent.show( new mergeTagsContentView( { collection: mergeTagsClone } ) );\n\t\t\t// Show our header.\n\t\t\tthis.header.show( new headerView() );\n\t\t\t// Show our main content.\n\t\t\tthis.main.show( new mainView() );\n\t\t\t// Show our mobile menu\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tthis.menuDrawer.show( new mobileMenuView( { collection: appDomainCollection } ) );\n\t\t\t// Show our drawer.\n\t\t\tthis.drawer.show( new drawerView() );\n\n\n\t\t},\n\n\t\tonRender: function() {\n\n\t\t},\n\n\t\tgetBuilderEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\tgetBuilderView: function() {\n\t\t\treturn this;\n\t\t},\n\n\t\t// Listen for clicks\n\t\tevents: {\n\t\t\t'click .nf-open-drawer': 'openDrawer',\n\t\t\t'click .nf-change-domain': 'changeDomain',\n\t\t\t'click .nf-close-drawer': 'closeDrawer'\n\t\t},\n\n\t\t/**\n\t\t * Someone clicked to open a drawer, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Object \te \tevent\n\t\t * @return void\n\t\t */\n\t\topenDrawer: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:openDrawer', e );\n\t\t},\n\t\t/**\n\t\t * Someone clicked to close a drawer, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tcloseDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:closeDrawer' );\n\t\t},\n\t\t/**\n\t\t * Someone clicked to change the domain, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Object \te \tevent\n\t\t * @return void\n\t\t */\n\t\tchangeDomain: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n\n","\ndefine( 'controllers/app/remote',[], function() {\n return Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'setting' ), 'remote', this.addListener );\n },\n\n addListener: function( model, dataModel ) {\n\n var listenTo = model.get( 'remote' ).listen;\n\n // TODO: Change seems to be triggering twice on each update.\n this.listenTo( nfRadio.channel( 'fieldSetting-' + listenTo ), 'update:setting', this.updateSetting );\n this.listenTo( nfRadio.channel( 'actionSetting-' + listenTo ), 'update:setting', this.updateSetting );\n\n this.listenTo( nfRadio.channel( 'setting-type-' + model.get( 'type' ) ), 'click:extra', this.clickExtra );\n\n model.listenTo( nfRadio.channel( 'setting-remote' ), 'get:remote', this.getRemote, model );\n\n // Auto-trigger get:remote on drawer load.\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n clickExtra: function( e, settingModel, dataModel, settingView ) {\n jQuery( e.srcElement ).addClass( 'spin' );\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n updateSetting: function( dataModel, settingModel ) {\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n getRemote: function( dataModel ) {\n\n var remote = this.get( 'remote' );\n\n var data = {\n parentValue: dataModel.get( remote.listen ),\n action: remote.action,\n security: ( remote.security ) ? remote.security : nfAdmin.ajaxNonce\n };\n\n // TODO: Disable setting and lock drawer while updating.\n var that = this;\n jQuery.post( ajaxurl, data, function( response ){\n var response = JSON.parse( response );\n\n if( 'textbox' == that.get( 'type' ) ) {\n dataModel.set( that.get('name'), response.value );\n }\n\n if( 'select' == that.get( 'type' ) ) {\n that.set( 'options', response.options );\n that.trigger( 'rerender' );\n }\n });\n },\n\n });\n} );\n","/**\n * Handles opening and closing our drawer. This is where we display settings for fields, actions, and settings.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawer',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our drawer-related click events.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:openDrawer', this.clickOpenDrawer );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:closeDrawer', this.closeDrawer );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:toggleDrawerSize', this.toggleDrawerSize );\n\n\t\t\t// Reply to direct requests to open or close the drawer.\n\t\t\tnfRadio.channel( 'app' ).reply( 'open:drawer', this.openDrawer, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'close:drawer', this.closeDrawer, this );\n\n\t\t\t/*\n\t\t\t * When we close the drawer, we have to figure out what the right position should be.\n\t\t\t * This listens to requests from other parts of our app asking what the closed right position is.\n\t\t\t */\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:closedRightPos', this.getClosedDrawerPos, this );\n\t\t\t\n\t\t\t// Reply to requests to prevent our drawer from closing\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'prevent:close', this.preventClose, this );\n\t\t\t// Reply to requests to enable drawer closing\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'enable:close', this.enableClose, this );\n\t\t\t// Reply to requests for our disabled/enabled state.\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:preventClose', this.maybePreventClose, this );\n\n\t\t\t/*\n\t\t\t * Object that holds our array of 'prevent close' values.\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\n\t\t\t */\n\t\t\tthis.objPreventClose = {};\n\n\t\t\t/*\n\t\t\t * Listen to focus events on the filter and stop our interval when it happens.\n\t\t\t * This is to fix a bug that can cause the filter to gain focus every few seconds.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:focused', this.filterFocused );\n\t\t},\n\n\t\t/**\n\t\t * Handles closing our drawer\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tcloseDrawer: function() {\n\t\t\t// Get our current domain.\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\n\t\t\tif ( ! currentDrawer || this.maybePreventClose() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Triggers the before close drawer action on our current domain's drawer channel.\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'before:closeDrawer' );\n\t\t\t/*\n\t\t\t * The 'before:closeDrawer' message is deprecated as of version 3.0 in favour of 'before:close'.\n\t\t\t * TODO: Remove this radio message in the future.\n\t\t\t */\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:closeDrawer' );\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:close' );\n\t\t\t\n\t\t\t// Send a message to our drawer to empty its contents.\n\t\t\tnfRadio.channel( 'drawer' ).request( 'empty:drawerContent' );\n\n\t\t\t// To close our drawer, we have to add our closed class to the builder and remove the opened class.\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-closed' ).removeClass( 'nf-drawer-opened' );\n\t\t\tjQuery( builderEl ).removeClass( 'disable-main' );\n\n\t\t\t// Get the right position of our closed drawer. Should be container size in -px.\n\t\t\tvar rightClosed = this.getClosedDrawerPos();\n\n\t\t\t// Get our drawer element and give change the 'right' property to our closed position.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tjQuery( drawerEl ).css( { 'right': rightClosed } );\n\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've closed the drawer.\n\t\t\t *\n\t\t\t * Once our drawer is closed, we:\n\t\t\t * clear our interval\n\t\t\t * request that the app change it's current drawer to false\n\t\t\t * trigger a drawer closed message\n\t\t\t */\n\t\t\tthis.checkCloseDrawerPos = setInterval( function() {\n\t \tif ( rightClosed == jQuery( drawerEl ).css( 'right' ) ) {\n\t \t\tclearInterval( that.checkCloseDrawerPos );\n\t\t \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', false );\n\t\t \t\tnfRadio.channel( 'drawer' ).trigger( 'closed' );\n\t\t \t\t/*\n\t\t \t\t * Reset the add new button z-index to 98.\n\t\t \t\t */\n\t\t \t\tjQuery( '.nf-master-control' ).css( 'z-index', 98 );\n\t\t \t\t// jQuery( drawerEl ).scrollTop( 0 );\n\t \t}\n\t\t\t}, 150 );\n\t\t},\n\n\t\t/**\n\t\t * Click handler for our 'open drawer' event.\n\t\t * @since 3.0\n\t\t * @param e jQuery event\n\t\t * @return void\n\t\t */\n\t\tclickOpenDrawer: function( e ) {\n\t\t\tvar drawerID = jQuery( e.target ).data( 'drawerid' );\n\t\t\tthis.openDrawer( drawerID );\n\t\t},\n\n\t\t/**\n\t\t * Open our drawer.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string drawerID \tID of the drawer we want to open.\n\t\t * @param object data \tOptional data that we want to pass to the drawer.\n\t\t * @return void\n\t\t */\n\t\topenDrawer: function( drawerID, data ) {\n\t\t\tif ( this.maybePreventClose() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If we haven't sent a data object, set the variable to an empty object.\n\t\t\tdata = data || {};\n\n\t\t\t/*\n\t\t\t * If we're dealing with something that has a model, set the proper active state.\n\t\t\t *\n\t\t\t * TODO: Make this more dynamic. I'm not sure that it fits in the drawer controller.\n\t\t\t */\n\t\t\tif ( 'undefined' != typeof data.model ) {\n\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\t\tnfRadio.channel( currentDomainID ).request( 'clear:editActive' );\n\t\t\t\tdata.model.set( 'editActive', true );\n\t\t\t\tthis.dataModel = data.model;\n\t\t\t}\n\n\t\t\t// Send out a message requesting our drawer view to load the content for our drawer ID.\n\t\t\tnfRadio.channel( 'drawer' ).request( 'load:drawerContent', drawerID, data );\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:open' );\n\t\t\t\n\t\t\t// To open our drawer, we have to add our opened class to our builder element and remove the closed class.\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-opened' ).removeClass( 'nf-drawer-closed' );\n\t\t\t\n\t\t\t// To open our drawer, we have to set the right position of our drawer to 0px.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tjQuery( drawerEl ).css( { 'right': '0px' } );\n\t\t\t\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've opened the drawer.\n\t\t\t *\n\t\t\t * Once our drawer is opened, we:\n\t\t\t * clear our interval\n\t\t\t * focus our filter\n\t\t\t * request that the app update its current drawer to the one we opened\n\t\t\t * trigger a drawer opened message\n\t\t\t */\n\t\t\tthis.hasFocus = false;\n\n\t\t\t/*\n\t\t\t * Set our add new button z-index to 0;\n\t\t\t */\n\t\t\tjQuery( '.nf-master-control' ).css( 'z-index', 0 );\n\n\t\t\tthis.checkOpenDrawerPos = setInterval( function() {\n\t \tif ( '0px' == jQuery( drawerEl ).css( 'right' ) ) {\n\t \t\tclearInterval( that.checkOpenDrawerPos );\n\t\t\t\t\tif ( ! that.hasFocus ) {\n\t\t \t\tthat.focusFilter();\n\t\t\t\t\t\tthat.hasFocus = true;\n\t\t\t \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', drawerID );\n\t\t\t \t\tjQuery( drawerEl ).scrollTop( 0 );\n\t\t\t \t\tnfRadio.channel( 'drawer' ).trigger( 'opened' );\n\t\t\t\t\t} \t\t\n\t \t}\n\t\t\t}, 150 );\n\t\t},\n\n\t\t/**\n\t\t * Toggle the drawer from half to full screen and vise-versa\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\ttoggleDrawerSize: function() {\n\t\t\t// Get our drawer element.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\t// toggle our drawer size class.\n\t\t\tjQuery( drawerEl ).toggleClass( 'nf-drawer-expand' );\n\t\t},\n\n\t\t/**\n\t\t * Focus our filter\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n focusFilter: function() {\n \t// Get our filter element\n \tvar filterEl = nfRadio.channel( 'drawer' ).request( 'get:filterEl' );\n \t// Focus\n \tjQuery( filterEl ).focus();\n },\n\n /**\n * Get the CSS right position (in px) of the closed drawer element.\n * This is calculated by:\n * getting the width of the builder element\n * add 300 pixels\n * make it negative\n * \n * @since 3.0\n * @return void\n */\n getClosedDrawerPos: function() {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tvar closedPos = jQuery( builderEl ).width() + 300;\n\t\t\treturn '-' + closedPos + 'px';\n },\n\n /**\n * Check to see if anything has registered a prevent close key.\n * \n * @since 3.0\n * @return boolean\n */\n maybePreventClose: function() {\n \tif ( 0 == Object.keys( this.objPreventClose ).length ) {\n \t\treturn false;\n \t} else {\n \t\treturn true;\n \t}\n },\n\n /**\n * Register a prevent close key.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent close' setting.\n * @return void\n */\n preventClose: function( key ) {\n \tthis.objPreventClose[ key ] = true;\n \t/*\n \t * When we disable closing the drawer, add the disable class.\n \t */\n \t// Get our current drawer.\n\t\t\tthis.dataModel.set( 'drawerDisabled', true );\n },\n\n /**\n * Remove a previously registered prevent close key.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent close' setting.\n * @return void\n */\n enableClose: function( key ) {\n \tdelete this.objPreventClose[ key ];\n \t /*\n \t * When we remove all of our disables preventing closing the drawer, remove the disable class.\n \t */\n \tif ( ! this.maybePreventClose() && 'undefined' != typeof this.dataModel ) {\n\t \t// Get our current drawer.\n\t\t\t\tthis.dataModel.set( 'drawerDisabled', false ); \t\t\n \t}\n },\n\n /**\n * When we focus our filter, make sure that our open drawer interval is cleared.\n * \n * @since 3.0\n * @return void\n */\n filterFocused: function() {\n \tclearInterval( this.checkOpenDrawerPos );\n },\n\n getPreventClose: function() {\n \treturn this.objPreventClose;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * Default drawer header.\n *\n * Includes our filter/search and 'Done' button.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerDefault',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-default',\n\n\t\tinitialize: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\t// Listen for our drawer being disabled.\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When we render, remove the extra div added by backbone and add listeners related to our filter.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonRender: function() {\n\t\t\t// Remove extra wrapping div.\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\t\t\t// Respond to requests related to our filter.\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'clear:filter', this.clearFilter, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'blur:filter', this.blurFilter, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:filterEl', this.getEl, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'keyup .nf-filter'\t: 'maybeChangeFilter',\n\t\t\t'input .nf-filter'\t: 'changeFilter',\n\t\t\t'focus input'\t\t: 'getFocus'\n\t\t},\n\n\t\t/**\n\t\t * When the filter text is changed, trigger an event on our current drawer.\n\t\t * This lets us keep the logic separate from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tchangeFilter: function( e ) {\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'change:filter', e.target.value, e );\n\t\t},\n\n\t\t/**\n\t\t * The user pressed a key. If it's the enter key, then run the change filter function.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tmaybeChangeFilter: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\te.addObject = true;\n\t\t\t\tthis.changeFilter( e );\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Clear our filter.\n\t\t *\n\t\t * This triggers 'input' on the field, which will trigger a change if necessary.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tclearFilter: function() {\n\t\t\tvar filterEl = jQuery( this.el ).find( '.nf-filter' );\n\t\t\tif ( '' != jQuery.trim( filterEl.val() ) ) {\n\t\t\t\tfilterEl.val('');\n\t\t\t\tfilterEl.trigger( 'input' );\n\t\t\t\tfilterEl.focus();\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fire the 'blur' event on our filter. Used to force a change event when the user tabs.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tblurFilter: function() {\n\t\t\tjQuery( this.el ).find( '.nf-filter' ).blur();\n\t\t},\n\n\t\t/**\n\t\t * Return our filter dom element.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).find( '.nf-filter' );\n\t\t},\n\n\t\tgetFocus: function() {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'filter:focused' );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\t// Get our current domain.\n\t\t\t\t\tif ( this.drawerDisabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Default drawer footer\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/footerDefault',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","define( 'models/app/drawerModel',['views/app/drawer/headerDefault', 'views/app/drawer/footerDefault'], function( defaultHeaderView, defaultFooterView ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tgetHeaderView: function( data ) {\n\t\t\t\treturn new defaultHeaderView( data );\n\t\t\t},\n\n\t\t\tgetFooterView: function( data ) {\n\t\t\t\treturn new defaultFooterView( data );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds all of our drawer models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/drawerCollection',['models/app/drawerModel'], function( drawerModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: drawerModel\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/drawer/stagedField',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-staged-field',\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\tevents: {\n\t\t\t'click .dashicons-dismiss': 'removeStagedField'\n\t\t},\n\n\t\tremoveStagedField: function( el ) {\n\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'click:removeStagedField', el, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/stagingEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-staged-fields-empty',\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/fields/drawer/stagingCollection',['views/fields/drawer/stagedField', 'views/fields/drawer/stagingEmpty'], function( stagedFieldView, stagedFieldsEmptyView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: stagedFieldView,\n\t\temptyView: stagedFieldsEmptyView,\n\n\t\tactiveClass: 'nf-staged-fields-active', // CSS Class for showing the reservoir.\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:stagedFieldsEl', this.getStagedFieldsEl, this );\n\t\t},\n\n\t\tonShow: function() {\n\n\t\t\tthis.$el = jQuery( this.el ).parent();\n\t\t\tjQuery( this.$el ).find( 'span:first' ).unwrap();\n\t\t\tthis.setElement( this.$el );\n\n\t\t\tvar that = this;\n\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\tplaceholder: 'nf-staged-fields-sortable-placeholder',\n\t\t\t\thelper: 'clone',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'over:stagedFields', e, ui );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'out:stagedFields', ui );\n\t\t\t\t},\n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'receive:stagedFields', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'start:stagedFields', ui );\n\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stop:stagedFields', ui );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tjQuery( this.el ).parent().draggable( {\n\t\t\t\topacity: 0.9,\n\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\n\t\t\t\tappendTo: '#nf-main',\n\t\t\t\trefreshPositions: true,\n\t\t\t\tgrid: [ 3, 3 ],\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\thelper: function( e ) {\n\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\n\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\n\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\n\t\t\t\t\tvar left = width / 4;\n\t\t\t\t\tvar top = height / 2;\n\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\n\t\t\t\t\tjQuery( element ).zIndex( 1000 );\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:fieldStaging', this, ui );\n\t\t\t\t},\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:fieldStaging', this, ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tgetStagedFieldsEl: function() {\n\t\t\treturn jQuery( this.el );\n\t\t},\n\n\t\tonAddChild: function() {\n\t\t\tjQuery( this.el ).addClass( this.activeClass );\n\t\t},\n\n\t\tonRemoveChild: function() {\n\t\t\tif( this.hasStagedFields() ) return;\n\t\t\tjQuery( this.el ).removeClass( this.activeClass );\n\t\t},\n\n\t\thasStagedFields: function() {\n\t\t\treturn 0 != this.collection.length;\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Model for our staged field.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/stagingModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection of staged fields.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/stagingCollection',['models/fields/stagingModel'], function( stagingModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: stagingModel,\n\t\tcomparator: 'order'\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/drawer/typeSection',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-field-type-section',\n\n\t\tinitialize: function() {\n\t\t\t_.bindAll( this, 'render' );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSection', this.getTypeSection, this );\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\tthis.dragging = false;\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * If we're on a mobile device, we don't want to enable dragging for our field type buttons.\n\t\t\t */\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).find( 'div.nf-field-type-draggable' ).draggable( {\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\ttolerance: 'pointer',\n\t\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\n\t\t\t\t\trefreshPositions: true,\n\t\t\t\t\tgrid: [ 5, 5 ],\n\t\t\t\t\tappendTo: '#nf-builder',\n\n\t\t\t\t\thelper: function( e ) {\n\t\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\n\t\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\n\t\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\n\t\t\t\t\t\tvar left = width / 4;\n\t\t\t\t\t\tvar top = height / 2;\n\t\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\n\t\t\t\t\t\tjQuery( element ).zIndex( 1000 );\n\t\t\t\t\t\treturn element;\n\t\t\t\t\t},\n\n\t\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = true;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = false;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tdrag: function(e, ui) {\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drag:type', this, ui, e );\t\n\t\t\t\t\t}\n\n\t\t\t\t} ).disableSelection();\n\n\t\t\t\tjQuery( this.el ).find( '.nf-item' ).focus( function() {\n\t\t\t \tjQuery( this ).addClass( 'active' );\n\t\t\t } ).blur( function() {\n\t\t\t \tjQuery( this ).removeClass( 'active' );\n\t\t\t } );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-item': 'clickFieldType',\n\t\t\t'keydown .nf-item': 'maybeClickFieldType',\n\t\t\t'mousedown .nf-item': 'mousedownFieldType'\n\t\t},\n\n\t\tclickFieldType: function( e ) {\n\t\t\tif ( ! this.dragging ) {\n\t\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:fieldType', e );\n\t\t\t}\n\t\t},\n\n\t\tmousedownFieldType: function( e ) {\n\t\t\tjQuery( e.target).addClass( 'clicked' );\n\t\t\tsetTimeout( function() {\n\t\t\t\tjQuery( e.target ).removeClass( 'clicked' );\n\t\t\t}, 1500 );\n\t\t},\n\n\t\tmaybeClickFieldType: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\tthis.clickFieldType( e );\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderFieldTypes: function() {\n\t\t\t var html = '';\n\t\t\t var that = this;\n\t\t\t _.each( this.fieldTypes, function( id ) {\n\t\t\t var type = nfRadio.channel( 'fields' ).request( 'get:type', id );\n\t\t\t var nicename = type.get( 'nicename' );\n\t\t\t var icon = type.get( 'icon' );\n\t\t\t var renderType = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-field-type-button' );\n\t\t\t html += renderType( { id: id, nicename: nicename, icon: icon, type: type, savedField: that.savedField } );\n\t\t\t } );\n\t\t\t return html;\n\t\t\t\t},\n\n\t\t\t\tsavedField: function() {\n\t\t\t\t\tif( this.type.get( 'savedField' ) ) {\n\t\t\t\t\t\treturn 'nf-saved';\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\t\t\t}\n\t\t},\n\n\t\tgetTypeSection: function() {\n\t\t\treturn this.el;\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/typeSectionCollection',['views/fields/drawer/typeSection'], function( fieldTypeSectionView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: fieldTypeSectionView,\n\n\t\tonShow: function() {\n\t\t\tjQuery( this.el ).find( '.nf-settings' ).unwrap();\n\t\t\tnfRadio.channel( 'fields' ).request( 'clear:editActive' );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/fields/drawer/addField',['views/fields/drawer/stagingCollection', 'models/fields/stagingCollection', 'views/fields/drawer/typeSectionCollection'], function( drawerStagingView, StagingCollection, fieldTypeSectionCollectionView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-content-add-field',\n\n\t\tregions: {\n\t\t\tstaging: '#nf-drawer-staging .nf-reservoir',\n\t\t\tprimary: '#nf-drawer-primary',\n\t\t\tsecondary: '#nf-drawer-secondary'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:fieldTypes', this.filterFieldTypes );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeFieldTypeFilter );\n\n\t\t\tthis.savedCollection = nfRadio.channel( 'fields' ).request( 'get:savedFields' );\n\t\t\tthis.primaryCollection = this.savedCollection;\n\n\t\t\tthis.fieldTypeSectionCollection = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\tthis.secondaryCollection = this.fieldTypeSectionCollection;\n\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tvar stagingCollection = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\tthis.staging.show( new drawerStagingView( { collection: stagingCollection } ) );\n\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.secondaryCollection } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tfilterFieldTypes: function( filteredSectionCollection ) {\n\t\t\tthis.primary.reset();\n\t\t\tthis.secondary.reset();\n\t\t\tthis.filteredSectionCollection = filteredSectionCollection;\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.filteredSectionCollection } ) );\n\t\t},\n\n\t\tremoveFieldTypeFilter: function () {\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.savedCollection } ) );\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.fieldTypeSectionCollection } ) );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingCollection',[], function() {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t},\n\n\t\tgetChildView: function( model ) {\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:settingChildView', model );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingGroup',['views/app/drawer/itemSettingCollection'], function( itemSettingCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-field-setting-group',\n\t\t\n\t\tregions: {\n\t\t\tsettings: '.nf-field-settings'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t\tthis.dataModel = data.dataModel;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.model.get( 'display' ) ) {\n\t\t\t\tthis.settings.show( new itemSettingCollectionView( { collection: this.model.get( 'settings' ), dataModel: this.dataModel } ) );\n\t\t\t} else {\n\t\t\t\tthis.settings.empty();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'render:settingGroup', this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .toggle': 'clickToggleGroup'\n\t\t},\n\n\t\tclickToggleGroup: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:toggleSettingGroup', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderLabel: function() {\n\t\t\t\t\tif ( '' != this.label ) {\n\t\t\t\t\t\tvar groupLabel = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-content-edit-setting-group-label' );\n\t\t\t\t\t\treturn groupLabel( this );\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\trenderArrowDir: function() {\n\t\t\t\t\tif ( this.display ) {\n\t\t\t\t\t\treturn 'down';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 'right';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingGroupCollection',['views/app/drawer/itemSettingGroup'], function( itemSettingGroupView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: itemSettingGroupView,\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/editSettings',['views/app/drawer/itemSettingGroupCollection'], function( itemSettingGroupCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings',\n\n\t\tregions: {\n\t\t\tsettingTitle: '.nf-setting-title',\n\t\t\tsettingGroups: '.nf-setting-groups'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.dataModel = data.model;\n\t\t\tthis.groupCollection = data.groupCollection;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar titleView = currentDomain.get( 'getSettingsTitleView' ).call( currentDomain, { model: this.model } );\n\n\t\t\tthis.settingTitle.show( titleView );\n\t\t\tthis.settingGroups.show( new itemSettingGroupCollectionView( { collection: this.groupCollection, dataModel: this.dataModel } ) );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\tmaybeRenderTitle: function() {\n\t \t\t\tif ( 'undefined' !== typeof this.type ) {\n\t \t\t\t\tvar title = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-content-edit-settings-title' );\n\t \t\t\t\treturn title( this );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\treturn type.get( 'nicename' );\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Edit Settings drawer header.\n *\n * Includes our 'Done' button.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerEditSettings',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-edit-settings',\n\n\t\tinitialize: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\t// Listen for our drawer being disabled.\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\t// Get our current domain.\n\t\t\t\t\tif ( this.drawerDisabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Button to add an action to the form.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/drawer/typeButton',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-action-type-button',\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\t\n\t\t\tjQuery( this.el ).disableSelection();\n\t\t\t\n\t\t\tif ( 'installed' == this.model.get( 'section') ) {\n\t\t\t\tvar that = this;\n\t\t\t\tjQuery( this.el ).draggable( {\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\ttolerance: 'intersect',\n\t\t\t\t\tscroll: false,\n\t\t\t\t\thelper: 'clone',\n\n\t\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = true;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'startDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = false;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'stopDrag:type', this, ui );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-item': 'clickAddAction'\n\t\t},\n\n\t\tclickAddAction: function( e ) {\n\t\t\tif ( ! this.dragging ) {\n\t\t\t\tif ( 'installed' == this.model.get( 'section' ) ) { // Is this an installed action?\n\t\t\t\t\tnfRadio.channel( 'actions' ).trigger( 'click:addAction', this.model );\n\t\t\t\t} else { // This isn't an installed action\n\t\t\t\t\twindow.open( this.model.get( 'link' ), '_blank' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-item';\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\n\t\t\t\t\t\tclasses += ' nf-has-img';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'installed' == this.section ) {\n\t\t\t\t\t\tclasses += ' nf-action-type';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderStyle: function() {\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\n\t\t\t\t\t\treturn \"style=\\\"background-image: url(\" + this.image + \");\\\"\"\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/actions/drawer/typeCollection',['views/actions/drawer/typeButton'], function( actionTypeButtonView ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-action-type-section',\n\t\tchildView: actionTypeButtonView,\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\trenderNicename: function() {\n\t\t\t\t\treturn that.collection.nicename;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\treturn that.collection.slug;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.action-types' ).append( childView.el );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Add action drawer.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/drawer/addAction',['views/actions/drawer/typeCollection'], function( actionTypeCollectionView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-content-add-action',\n\n\t\tregions: {\n\t\t\tprimary: '#nf-drawer-primary',\n\t\t\tsecondary: '#nf-drawer-secondary'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:actionTypes', this.filteractionTypes );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeactionTypeFilter );\n\t\t\n\t\t\tthis.installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n\t\t\tthis.primaryCollection = this.installedActions;\n\n\t\t\tthis.availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n\t\t\tthis.secondaryCollection = this.availableActions;\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.secondaryCollection } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tfilteractionTypes: function( filteredInstalled, filteredAvailable ) {\n\t\t\tthis.primary.reset();\n\t\t\tthis.secondary.reset();\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: filteredInstalled } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: filteredAvailable } ) );\n\t\t\t\n\t\t},\n\n\t\tremoveactionTypeFilter: function () {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.installedActions } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.availableActions } ) );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Individual change item.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentViewChangesItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-view-changes-item',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:disabled', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:disabled', this.render );\n\t\t},\n\n\t\t/**\n\t\t * When we render this element, remove the extra wrapping <div> that backbone creates.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\tevents: {\n\t\t\t'click .undoSingle': 'undoSingle'\n\t\t},\n\n\t\tundoSingle: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoSingle', this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Changes collection view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentViewChanges',['views/app/drawer/contentViewChangesItem'], function( viewChangesItem ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'table',\n className: 'nf-changes',\n\t\tchildView: viewChangesItem\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Handles clicks on the 'view changes' button in the header.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerViewChanges',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-view-changes',\n\n\t\tevents: {\n\t\t\t'click .undoChanges': 'clickUndoChanges'\n\t\t},\n\n\t\tclickUndoChanges: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoChanges' );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Error view used for settings.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/settingError',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-edit-setting-error'\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSetting',['views/app/drawer/mergeTagsContent', 'views/app/drawer/settingError'], function( mergeTagsContentView, settingErrorView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\n\n\t\tregions: {\n\t\t\terror: '.nf-setting-error'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\t/*\n\t\t\t * Send out a request on the setting-type-{type} channel asking if we should render on dataModel change.\n\t\t\t * Defaults to false.\n\t\t\t * This lets specific settings, like RTEs, say that they don't want to be re-rendered when their data model changes.\n\t\t\t */\n\t\t\tvar renderOnChange = ( 'undefined' == typeof nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' ) ) ? false : nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' );\n\t\t\t\n\t\t\tif ( renderOnChange ) {\n\t\t\t\tthis.dataModel.on( 'change:' + this.model.get( 'name' ), this.render, this );\n\t\t\t}\n\n\t\t\tthis.model.on( 'change:error', this.renderError, this );\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\n var remote = this.model.get( 'remote' );\n\t\t\tif( remote ) {\n\n if( 'undefined' != typeof remote.refresh || remote.refresh ) {\n // Add 'update' icons\n var label = this.model.get('label');\n this.model.set('label', label + ' <a class=\"extra\"><span class=\"dashicons dashicons-update\"></span></a>');\n }\n\n\t\t\t\tnfRadio.channel( 'setting' ).trigger( 'remote', this.model, this.dataModel, this );\n\t\t\t\tthis.model.on( 'rerender', this.render, this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * When our drawer opens, send out a radio message on our setting type channel.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.drawerOpened );\n\n\t\t\t/*\n\t\t\t * When our drawer closes, send out a radio message on our setting type channel.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.drawerClosed );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.dataModel.off( 'change:' + this.model.get( 'name' ), this.render );\n\t\t\tthis.model.off( 'change:error', this.renderError );\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( this.model.get( 'remote' ) ) {\n\t\t\t\tthis.model.off( 'rerender', this.render, this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\n\t\t\n\t\t\t/*\n\t\t\t * Unescape any HTML being saved if we are a textbox.\n\t\t\t */\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\n\t\t\t\tvar setting = this.model.get( 'name' );\n\t\t\t\tvar value = this.dataModel.get( setting );\n\t\t\t\tthis.dataModel.set( setting, _.unescape( value ), { silent: true } );\n\t\t\t}\n\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\t/*\n\t\t\t * We want to escape any HTML being output if we are a textbox.\n\t\t\t */\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\n\t\t\t\tvar setting = this.model.get( 'name' );\n\t\t\t\tvar value = this.dataModel.get( setting );\n\t\t\t\tthis.dataModel.set( setting, _.escape( value ), { silent: true } );\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.mergeTagsContentView = false;\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\n\t\t\tjQuery( this.el ).find( '.nf-help' ).each(function() {\n\t\t\t\tvar content = jQuery(this).next('.nf-help-text');\n\t\t\t\tjQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\tcontent: content,\n\t\t\t\t\tmaxWidth: 200,\n\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\ttrigger: 'click',\n\t\t\t\t\tcloseOnClick: true\n\t\t\t\t})\n\t\t });\n\t\t\t\n\t\t if ( this.model.get( 'use_merge_tags' ) ) {\n\t\t \tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t }\n\n\t\t\t/*\n\t\t\t * Apply Setting Field Masks\n\t\t\t */\n\t\t\tvar mask = this.model.get( 'mask' );\n\n\t\t\tif( typeof mask != \"undefined\" ){\n\n\t\t\t\tvar input = jQuery( this.$el ).find( 'input' );\n\n\t\t\t\tswitch( mask.type ){\n\t\t\t\t\tcase 'numeric':\n\t\t\t\t\t\tinput.autoNumeric({\n\t\t\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\t\t\taDec: decimalPoint\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'currency':\n\n\t\t\t\t\t\tvar currency = nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' );\n\t\t\t\t\t\tvar currencySymbol = nfAdmin.currencySymbols[ currency ] || '';\n\n\t\t\t\t\t\tinput.autoNumeric({\n\t\t\t\t\t\t\taSign: jQuery('<div />').html(currencySymbol).text(),\n\t\t\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\t\t\taDec: decimalPoint\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'custom':\n\t\t\t\t\t\tif( mask.format ) input.mask( mask.format )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// TODO: Error Logging.\n\t\t\t\t\t\tconsole.log( 'Notice: Mask type of \"' + mask.type + '\" is not supported.' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderError();\n\t\t},\n\n\t\tonShow: function() {\t\t\t\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonAttach: function() {\t\t\t\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\trenderError: function() {\n\t\t\tif ( this.model.get( 'error' ) ) {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).addClass( 'nf-error' );\n\t\t\t\tthis.error.show( new settingErrorView( { model: this.model } ) );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).removeClass( 'nf-error' );\n\t\t\t\tthis.error.empty();\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t \t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) != this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\n\t \t\trenderSetting: function(){\n\t \t\t\tif ( 'undefined' != typeof that.dataModel.get( this.name ) ) {\n\t \t\t\t\tthis.value = that.dataModel.get( this.name );\n\t \t\t\t} else if ( 'undefined' == typeof this.value ) {\n\t \t\t\t\tthis.value = '';\n\t \t\t\t}\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( 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 ( this.use_merge_tags ) {\n\t\t\t\t\t\tclasses += ' has-merge-tags';\n\t\t\t\t\t}\n\t\t\t\t\tif ( 'rte' == this.type ) {\n\t\t\t\t\t\tclasses += ' rte';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-setting ';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += 'nf-' + this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' nf-one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( this.help ) {\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</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\trenderMergeTags: function() {\n\t\t\t\t\tif ( this.use_merge_tags && ! this.hide_merge_tags ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></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\trenderPlaceholder: function() {\n\t\t\t\t\tif ( this.placeholder ) {\n\t\t\t\t\t\treturn 'placeholder=\"' + this.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\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .setting': 'changeSetting',\n\t\t\t'keyup .setting': 'keyUpSetting',\n\t\t\t'click .setting': 'clickSetting',\n\t\t\t'click .extra': 'clickExtra'\n\t\t},\n\n\t\tchangeSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:setting', e, this.model, this.dataModel );\n\t\t},\n\n\t\tkeyUpSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'keyup:setting', e, this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'keyup:setting', e, this.model, this.dataModel );\n\t\t},\n\n\t\tclickSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:setting', e, this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:setting', e, this.model, this.dataModel, this );\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-name-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t},\n\n\t\tdrawerOpened: function() {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:opened', this.model, this.dataModel, this );\n\t\t},\n\n\t\tdrawerClosed: function() {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:closed', this.model, this.dataModel, this );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","/**\n * Changes collection view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentNewForm',['views/app/drawer/itemSetting'], function( itemSettingView) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-new-form',\n\n\t\tregions: {\n\t\t\tformName: '.new-form-name',\n\t\t\tformSubmit: '.new-form-submit'\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar titleSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'title' );\n\t\t\tvar addSubmitSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'add_submit' );\n\t\t\tvar dataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tthis.formName.show( new itemSettingView( { model: titleSettingModel, dataModel: dataModel } ) );\n\t\t\t/*\n\t\t\t * If we don't have any submit buttons on the form, prompt the user to add one on publish.\n\t\t\t */\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar submitButtons = fieldCollection.findWhere( { type: 'submit' } );\n\t\t\tif ( 'undefined' == typeof submitButtons ) {\n\t\t\t\tthis.formSubmit.show( new itemSettingView( { model: addSubmitSettingModel, dataModel: dataModel } ) );\n\t\t\t} else {\n\t\t\t\tdataModel.set( 'add_submit', 0 );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .publish': 'clickPublish'\n\t\t},\n\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:confirmPublish', e );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Handles clicks on the 'view changes' button in the header.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerNewForm',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-new-form'\n\t});\n\n\treturn view;\n} );\n","/**\n * Config file for our app drawers.\n *\n * this.collection represents all of our registered drawers.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawerConfig',[\n\t'models/app/drawerCollection',\n\t'views/fields/drawer/addField',\n\t'views/app/drawer/editSettings',\n\t'views/app/drawer/headerEditSettings',\n\t'views/actions/drawer/addAction',\n\t'views/app/drawer/contentViewChanges',\n\t'views/app/drawer/headerViewChanges',\n\t'views/app/drawer/contentNewForm',\n\t'views/app/drawer/headerNewForm'\n\t], function(\n\t\tdrawerCollection,\n\t\taddFieldView,\n\t\teditSettingsView,\n\t\teditSettingsHeaderView,\n\t\taddActionView,\n\t\tviewChangesView,\n\t\tviewChangesHeaderView,\n\t\tnewFormView,\n\t\tnewFormHeaderView,\n\t\tmobileItemControlsView\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\tthis.collection = new drawerCollection( [\n\t\t\t\t{\n\t\t\t\t\tid: 'addField',\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new addFieldView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'addAction',\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new addActionView( data );\n\t\t\t\t\t}\n\t\t\t\t},\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\tid: 'editSettings',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * TODO: Add filtering when editing settings. For now, removing them from settings.\n\t\t\t\t\t */\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Get a custom setting header view if one is set.\n\t\t\t\t\t\t * TODO: Currently, this only works for advanced settings.\n\t\t\t\t\t\t * This could be used to replace the need for a single config file.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( 'undefined' != typeof data.typeModel ) {\n\t\t\t\t\t\t\tvar view = nfRadio.channel( data.typeModel.get( 'id' ) ).request( 'get:drawerHeaderView' ) || editSettingsHeaderView;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar view = editSettingsHeaderView;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new view( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new editSettingsView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'viewChanges',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the viewChanges drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new viewChangesHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new viewChangesView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'newForm',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the newForm drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new newFormHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new newFormView( data );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\t// Listen for requests for our drawer collection.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerCollection', this.getDrawerCollection, this );\n\t\t\t// Listen for requests for specific drawer models.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawer', this.getDrawer, this );\n\t\t},\n\n\t\tgetDrawerCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetDrawer: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Default settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/defaultSettingsTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-default',\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\tif ( 'undefined' != typeof type ) {\n\t \t\t\t\treturn type.get( 'nicename' );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Empty view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/empty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","/**\n * Model for our individual domains.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/domainModel',[ 'views/app/drawer/defaultSettingsTitle', 'views/app/empty' ], function( DefaultSettingsTitleView, EmptyView ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdashicons: '',\n\t\t\tclasses: '',\n\t\t\tactive: false,\n\t\t\turl: '',\n\t\t\thotkeys: false,\n\t\t\tdisabled: false,\n\n\t\t\tgetSettingsTitleView: function( data ) {\n\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t},\n\n\t\t\tgetDefaultSettingsTitleView: function( data ) {\n\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t},\n\n\t\t\tgetGutterLeftView: function( data ) {\n\t\t\t\t/*\n\t\t\t\t * Return empty view\n\t\t\t\t */\n\t\t\t\treturn new EmptyView();\n\t\t\t},\n\n\t\t\tgetGutterRightView: function( data ) {\n\t\t\t\t/* \n\t\t\t\t * Return empty view\n\t\t\t\t */\n\t\t\t\treturn new EmptyView();\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Holds all of our domain models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/domainCollection',['models/app/domainModel'], function( domainModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: domainModel\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-fields'\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/mainContentFieldCollection',[], function() {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\treorderOnSort: true,\n\n\t\tgetChildView: function() {\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:fieldItem' );\n\t\t},\n\n\t\tgetEmptyView: function() {\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:mainContentEmpty' );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:sortableEl', this.getSortableEl, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'init:sortable', this.initSortable, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'destroy:sortable', this.destroySortable, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.collection.models.length > 0 ) {\n\t\t\t\tjQuery( this.el ).addClass( 'nf-field-type-droppable' ).addClass( 'nf-fields-sortable' );\n\t\t\t\tvar that = this;\n\t\t\t\t/* TODO: There's a bug with some Android phones and chrome. The fix below hasn't been implement.\n\n\t\t\t\t * Instantiate our sortable field list, but only if we aren't on a mobile device.\n\t\t\t\t *\n\t\t\t\t * On Android, our sortable list isn't scrollable if it's instantiated at render.\n\t\t\t\t * Instead, for mobile, we need to instantiate our sortable when the user tapholds and then\n\t\t\t\t * destroy it when the drag stops.\n\t\t\t\t */\n\t\t\t\t// if ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\t\tthis.initSortable();\n\t\t\t\t// }\n\t\t\t}\n\t\t\tnfRadio.channel( 'app' ).trigger( 'render:fieldsSortable', this );\n\t\t},\n\n\t\tgetSortableEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\tinitSortable: function() {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tvar tolerance = 'pointer';\n\t\t\t} else {\n\t\t\t\tvar tolerance = 'intersect';\n\t\t\t}\n\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\t//containment: '#nf-main',\n\t\t\t\thelper: 'clone',\n\t\t\t\tcancel: '.nf-item-controls',\n\t\t\t\tplaceholder: 'nf-fields-sortable-placeholder',\n\t\t\t\topacity: 0.95,\n\t\t\t\tgrid: [ 5, 5 ],\n\t\t\t\t// scroll: false,\n\t\t\t\tappendTo: '#nf-main',\n\t\t\t\tscrollSensitivity: 10,\n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'start:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:fieldsSortable', ui, this );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'stop:fieldsSortable', ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tdestroySortable: function() {\n\t\t\tjQuery( this.el ).sortable( 'destroy' );\n\t\t},\n\n\t\tonAddChild: function( childView ) {\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:adding' ) ) {\n\t\t\t\tchildView.$el.hide().show( 'clip' );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', false );\n\t\t\t}\n\t\t}\n\t\t\n\t} );\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/addSavedField',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-add-saved-field',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:addSavedLoading', this.renderAddButton, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.renderAddButton();\n\t\t},\n\n\t\trenderAddButton: function() {\n\t\t\tif ( this.model.get( 'addSavedLoading' ) ) {\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-saved-field-loading' );\n\t\t\t} else {\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-saved-field-button' );\n\t\t\t}\n\t\t\tjQuery( this.el ).find( '.add-button' ).html( button( this ) );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:addSavedLoading', this.render );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-button': 'clickAddSavedField'\n\t\t},\n\n\t\tclickAddSavedField: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:addSavedField', e, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","/**\n * Fields settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/fields/drawer/settingsTitle',['views/fields/drawer/addSavedField'], function( addSavedFieldView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-fields',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:saved', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.renderjBoxContent, this );\n\t\t},\n\n\t\tregions: {\n\t\t\taddSaved: '.nf-add-saved-field'\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:saved', this.render );\n\t\t\tthis.addSavedjBox.destroy();\n\t\t\tthis.model.unset( 'jBox', { silent: true } );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.renderjBoxContent();\n\t\t\tvar that = this;\n\t\t\tthis.addSavedjBox = new jBox( 'Tooltip', {\n\t\t\t\ttrigger: 'click',\n\t\t\t\ttitle: 'Add to Saved Fields',\n\t\t\t\tposition: {\n\t\t\t\t\tx:'left',\n\t\t\t\t\ty:'center'\n\t\t\t\t},\n\t\t\t\toutside:'x',\n\t\t\t\tcloseOnClick: 'body',\n\n\t\t\t\tonCreated: function() {\n\t\t\t\t\tthis.setContent( jQuery( that.el ).find( '.nf-add-saved-field' ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.addSavedjBox.attach( jQuery( this.el ).find( '.dashicons') );\n\t\t\tthis.model.set( 'jBox', this.addSavedjBox, { silent: true } );\n\t\t},\n\n\t\trenderjBoxContent: function() {\n\t\t\tif ( this.addSaved ) {\n\t\t\t\tthis.addSaved.show( new addSavedFieldView( { model: this.model } ) );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\tvar displayName = type.get( 'nicename' );\n\n\t \t\t\tif ( this.saved ) {\n\t \t\t\t\tvar realType = nfRadio.channel( domainID ).request( 'get:type', type.get( 'type' ) );\n\t \t\t\t\tdisplayName += ' - ' + realType.get( 'nicename' );\n\t \t\t\t}\n\t \t\t\treturn displayName;\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\trenderSavedStar: function() {\n\t\t\t\t\tif ( this.saved ) {\n\t\t\t\t\t\tvar star = 'filled';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar star = 'empty';\n\t\t\t\t\t}\n\t\t\t\t\treturn '<span class=\"dashicons dashicons-star-' + star + '\"></span>'\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Add main header.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/mainHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-header-actions',\n\n\t\tinitialize: function() {\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\tthis.listenTo( actionCollection, 'add', this.render );\n\t\t\tthis.listenTo( actionCollection, 'remove', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\tif ( actionCollection.models.length == 0 ) {\n\t\t\t\tjQuery( this.el ).hide();\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).show();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Actions subheader view.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-actions'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/itemControls',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-item-controls',\n\n\t\tinitialize: function() {\n\t\t\t// Listen for domain changes and re-render when we detect one.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t},\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// \n\t\t\tthis.currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'click .nf-edit-settings': 'clickEdit',\n\t\t\t'singletap .nf-edit-settings': 'singleTapEdit',\n\t\t\t'click .nf-delete': 'clickDelete',\n\t\t\t'click .nf-duplicate': 'clickDuplicateField'\n\t\t},\n\n\t\tclickEdit: function( e ) {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tsingleTapEdit: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t},\n\n\t\tclickDelete: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t},\n\n\t\tclickDuplicateField: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'mouseover:itemControl', e, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Single action table row\n *\n * TODO: make dynamic\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/actionItem',['views/app/itemControls'], function( itemControlsView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'tr',\n\t\ttemplate: '#tmpl-nf-action-item',\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:actionItemTemplate' ) || this.template;\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:active', this.maybeDeactivate, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:active', this.maybeDeactivate );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.model.get( 'editActive' ) ) {\n\t\t\t\tjQuery( this.el ).addClass( 'active' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).removeClass( 'active' );\n\t\t\t}\n\n\t\t\tthis.maybeDeactivate();\n\n\t\t\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t},\n\n\t\tmaybeDeactivate: function() {\n\t\t\tif ( 0 == this.model.get( 'active' ) ) {\n\t\t\t\tjQuery( this.el ).addClass( 'deactivated' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).removeClass( 'deactivated' );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change input': 'changeToggle',\n\t\t\t'click': 'maybeClickEdit'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( 'TR' == jQuery( e.target ).parent().prop( 'tagName' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tchangeToggle: function( e ) {\n\t\t\tvar setting = jQuery( e.target ).data( 'setting' );\n\t\t\tvar settingModel = nfRadio.channel( 'actions' ).request( 'get:settingModel', setting );\n\t\t\tconsole.log( settingModel );\n\t\t\tconsole.log( this.model );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:setting', e, settingModel, this.model );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderToggle: function( settingName ) {\n\t\t\t\t\tthis.settingName = settingName || 'active';\n\t\t\t\t\tvar actionLabel = this.label;\n\t\t\t\t\tthis.label = '';\n\t\t\t\t\tthis.value = this[ this.settingName ];\n\t\t\t\t\tthis.name = this.id + '-' + this.settingName;\n\t\t\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-toggle' );\n\t\t\t\t\thtml = html( this );\n\t\t\t\t\tthis.label = actionLabel;\n\t\t\t\t\treturn html;\n\t\t\t\t},\n\n\t\t\t\trenderTypeNicename: function() {\n\t\t\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', this.type );\n\t\t\t\t\tif ( 'undefined' == typeof type ) return;\n\n\t\t\t\t\treturn type.get( 'nicename' );\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( this.help ) {\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</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\trenderMergeTags: function() {\n\t\t\t\t\tif ( this.use_merge_tags ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/actions/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-actions-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().parent().removeClass( 'nf-actions-empty' );\n\t\t\t// jQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\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\tjQuery( this.el ).parent().parent().addClass( 'nf-actions-empty' );\n\t\t\t// if ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t// \tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t// }\n\t\t\t// jQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\t// jQuery( this.el ).parent().droppable( {\n\t\t\t// \taccept: function( draggable ) {\n\t\t\t// \t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t// \t\t\treturn true;\n\t\t\t// \t\t}\n\t\t\t// \t},\n\t\t\t// \thoverClass: 'nf-droppable-hover',\n\t\t\t// \ttolerance: 'pointer',\n\t\t\t// \tover: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t// \t},\n\t\t\t// \tout: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t// \t},\n\t\t\t// \tdrop: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t// \t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t// \t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t// \t},\n\t\t\t// } );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Main content view for our actions.\n *\n * TODO: make dynamic\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/mainContent',['views/actions/actionItem', 'views/actions/mainContentEmpty'], function( actionView, emptyView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttemplate: '#tmpl-nf-action-table',\n\t\tchildView: actionView,\n\t\temptyView: emptyView,\n\n\t\tinitialize: function() {\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:mainContentTemplate' ) || this.template;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tjQuery( this.el ).droppable( {\n\t\t\t\taccept: '.nf-action-type-draggable',\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'drop:actionType', e, ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tif ( 'undefined' == typeof nfRadio.channel( 'actions' ).request( 'get:type', childView.model.get( 'type' ) ) ) return;\n\n\t\t\tjQuery( collectionView.el ).find( 'tbody' ).append( childView.el );\n\t\t},\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/advanced/mainHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-header-settings'\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-settings'\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/settingItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-form-setting-type',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.updateActiveClass );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.updateActiveClass, this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click': 'clickEdit'\n\t\t},\n\n\t\tclickEdit: function( e ) {\n\t\t\tnfRadio.channel( 'settings' ).trigger( 'click:edit', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-setting-wrap ' + this.id;\n\t \t\t\tif ( this.editActive ) {\n\t \t\t\t\tclasses += ' active';\n\t \t\t\t}\n\t \t\t\treturn classes;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateActiveClass: function() {\n\t\t\tif ( this.model.get( 'editActive' ) ) {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).addClass( 'active' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).removeClass( 'active' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/mainContent',['views/advanced/settingItem'], function( settingItem ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\tchildView: settingItem\n\t\t\n\t});\n\n\treturn view;\n} );\n","/**\n * Model that represents our form fields.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/fieldModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Field',\n\t\t\tobjectDomain: 'fields',\n\t\t\teditActive: false,\n\t\t\torder: 999\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tif ( 'undefined' == typeof this.get( 'type' ) ) return;\n\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', this.get( 'type' ) );\n\t\t\tvar parentType = fieldType.get( 'parentType' );\n\n\t\t\t// Loop through our field type \"settingDefaults\" and add any default settings.\n\t\t\t_.each( fieldType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( key ) ) {\n\t\t\t\t\tthis.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\t/*\n\t\t\t * If our field type is a saved field, set our field type to the actual field type\n\t\t\t */\n\t\t\tif ( 'saved' == fieldType.get( 'section' ) ) {\n\t\t\t\tthis.set( 'type', fieldType.get( 'type' ) );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * fields\n\t\t\t * fields-parentType\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:fieldModel', this );\n\t\t\tnfRadio.channel( 'fields-' + parentType ).trigger( 'init:fieldModel', this );\n\t\t\tnfRadio.channel( 'fields-' + this.get( 'type' ) ).trigger( 'init:fieldModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * Fires an event on the fieldSetting-{name} channel saying we've updated a setting.\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n\t\t\tnfRadio.channel( 'fieldSetting-' + _.keys( model.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'update:setting', this, options.settingModel );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field models.\n * This is the actual field data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new fields or removed fields property.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/fieldCollection',['models/fields/fieldModel'], function( fieldModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: fieldModel,\n\t\tcomparator: function( model ){\n\t\t\treturn parseInt( model.get( 'order' ) );\n\t\t},\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addField, this );\n\t\t\tthis.on( 'remove', this.removeField, this );\n\n\t\t\tthis.listenTo( this, 'add:field', this.addNewField );\n\t\t\tthis.listenTo( this, 'append:field', this.appendNewField );\n\t\t\tthis.listenTo( this, 'remove:field', this.removeFieldResponse );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new fields property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddField: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed fields property.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveField: function( model ) {\n\t\t\tthis.removedIDs = this.removedIDs || {};\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t},\n\n\t\taddNewField: function( model ) {\n\t\t\tthis.add( model );\n\t\t},\n\n\t\tappendNewField: function( model ) {\n\t\t\tif ( 0 == this.length ) {\n\t\t\t\tvar order = 0;\n\t\t\t} else {\n\t\t\t\tvar order = this.at( this.length -1 ).get( 'order' ) + 1;\n\t\t\t}\n\n\t\t\tmodel.set( 'order', order, { silent: true } );\n\t\t\tthis.add( model );\n\t\t},\n\n\t\tremoveFieldResponse: function( model ) {\n\t\t\tthis.remove( model );\n\t\t},\n\n\t\tfieldExists: function( fieldModel ) {\n\t\t\treturn -1 != this.indexOf( fieldModel );\n\t\t}\n\t} );\n\treturn collection;\n} );\n\n","/**\n * Config file for our app domains.\n * \n * this.collection represents all of our app domain (fields, actions, settings) information.\n *\n * This doesn't store the current domain, but rather all the data about each.\n * \n * This data includes:\n * hotkeys\n * header view\n * subheader view\n * content view\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/domainConfig',[\n\t// Require our domain collection\n\t'models/app/domainCollection',\n\t// Require our fields domain files\n\t'views/fields/subHeader',\n\t'views/fields/mainContentFieldCollection',\n\t'views/fields/drawer/settingsTitle',\n\t// Require our actions domain files\n\t'views/actions/mainHeader', \n\t'views/actions/subHeader',\n\t'views/actions/mainContent',\n\t// Require our settings domain files\n\t'views/advanced/mainHeader',\n\t'views/advanced/subHeader',\n\t'views/advanced/mainContent',\n\t// Empty View\n\t'views/app/empty',\n\t// FieldCollection: used by the default formContentData filter\n\t'models/fields/fieldCollection'\n\t], \n\tfunction( \n\t\tappDomainCollection,\n\t\tfieldsSubHeaderView,\n\t\tFieldsMainContentFieldCollectionView,\n\t\tfieldsSettingsTitleView,\n\t\tactionsMainHeaderView,\n\t\tactionsSubHeaderView,\n\t\tactionsMainContentView,\n\t\tsettingsMainHeaderView,\n\t\tsettingsSubHeaderView,\n\t\tsettingsMainContentView,\n\t\tEmptyView,\n\t\tFieldCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Add our default formContentView filter.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:viewFilter', this.defaultFormContentView, 10, this );\n\t\t\t\n\t\t\t/*\n\t\t\t * Add our default formContentData filter.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:loadFilter', this.defaultFormContentLoad, 10, this );\n\n\t\t\t/*\n\t\t\t * Add our default formContentGutterView filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:leftFilter', this.defaultFormContentGutterView, 10, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:rightFilter', this.defaultFormContentGutterView, 10, this );\n\n\t\t\t// Define our app domains\n\t\t\tthis.collection = new appDomainCollection( [\n\t\t\t\t{\n\t\t\t\t\tid: 'fields',\n\t\t\t\t\tnicename: nfi18n.domainFormFields,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newField',\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-menu',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new fieldsSubHeaderView();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the formContent view that should be used in our builder.\n\t\t\t\t\t * Uses two filters:\n\t\t\t\t\t * 1) One for our formContentData\n\t\t\t\t\t * 2) One for our formContentView\n\t\t\t\t\t *\n\t\t\t\t\t * If we don't have any view filters, we use the default formContentView.\n\t\t\t\t\t * \n\t\t\t\t\t * @since 3.0\n\t\t\t\t\t * @return formContentView backbone view.\n\t\t\t\t\t */\n\t\t\t\t\tgetMainContentView: function( collection ) {\n\t\t\t\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\n\t\t\t\t\t\t * If we don't have this setting, then we check for this deprecated value.\n\t\t\t\t\t\t * \n\t\t\t\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * TODO: Remove this backwards compatibility eventually.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( ! formContentData ) {\n\t\t\t\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If we don't have a filter for our formContentData, default to fieldCollection.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar formContentLoadFilters = nfRadio.channel( 'formContent' ).request( 'get:loadFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( formContentLoadFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tformContentData = callback( formContentData, nfRadio.channel( 'app' ).request( 'get:formModel' ), true );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar formContentViewFilters = nfRadio.channel( 'formContent' ).request( 'get:viewFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( formContentViewFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tformContentView = callback();\n\n\t\t\t\t\t\tnfRadio.channel( 'settings' ).request( 'update:setting', 'formContentData', formContentData, true );\n\t\t\t\t\t\treturn new formContentView( { collection: formContentData } );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetSettingsTitleView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If we are dealing with a field model, return the fields settings view, otherwise, return the default.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( 'fields' == data.model.get( 'objectDomain' ) ) {\n\t\t\t\t\t\t\treturn new fieldsSettingsTitleView( data );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn this.get( 'getDefaultSettingsTitleView' ).call( this, data );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\n\t\t\t\t\tgetGutterLeftView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:leftFilters' );\n\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tgutterView = callback();\n\n\t\t\t\t\t\treturn new gutterView(); \n\t\t\t\t\t},\n\n\t\t\t\t\tgetGutterRightView: function() {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:rightFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tgutterView = callback();\n\n\t\t\t\t\t\treturn new gutterView(); \n\t\t\t\t\t}\n\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'actions',\n\t\t\t\t\tnicename: nfi18n.domainActions,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newAction',\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-external',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new actionsSubHeaderView();\n\t\t\t\t\t},\n\t\t\t\t\t\n\t\t\t\t\tgetMainContentView: function() {\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\t\t\t\treturn new actionsMainContentView( { collection: collection } );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\tnicename: nfi18n.domainAdvanced,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-admin-generic',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new settingsSubHeaderView();\n\t\t\t\t\t},\n\t\t\t\t\t\n\t\t\t\t\tgetMainContentView: function() {\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n\t\t\t\t\t\treturn new settingsMainContentView( { collection: collection } );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'preview',\n\t\t\t\t\tnicename: 'Preview Form',\n\t\t\t\t\tclasses: 'preview',\n\t\t\t\t\tdashicons: 'dashicons-visibility',\n\t\t\t\t\tmobileDashicon: 'dashicons-visibility',\n\t\t\t\t\turl: nfAdmin.previewurl\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\t/*\n\t\t\t * Send out a radio message with our domain config collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:domainCollection', this.collection );\n\n\t\t\t/*\n\t\t\t * Respond to requests to get the app domain collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainCollection', this.getDomainCollection, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainModel', this.getDomainModel, this );\n\t\t},\n\n\t\tgetDomainCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetDomainModel: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\tdefaultFormContentView: function( formContentData ) {\n\t\t\treturn FieldsMainContentFieldCollectionView;\n\t\t},\n\n\t\tdefaultFormContentLoad: function( formContentData ) {\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\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\n\t\t\tif ( 1 == sortedArray.length || 'undefined' == typeof formContentData || true === formContentData instanceof Backbone.Collection ) return fieldCollection;\n\n\t\t\t/*\n\t\t\t * If another filter is registered, we are calling this from somewhere else.\n\t\t\t */\n\n \tvar fieldModels = _.map( formContentData, function( key ) {\n \t\treturn fieldCollection.findWhere( { key: key } );\n \t}, this );\n\n \treturn new FieldCollection( fieldModels );\n\t\t},\n\n\t\tdefaultFormContentGutterView: function( formContentData ) {\n\t\t\treturn EmptyView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our app data.\n * Listens for changes to the 'clean' attribute and triggers a radio message when the state changes.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/appModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tloading: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes to our 'clean' attribute.\n\t\t\tthis.on( 'change:clean', this.changeStatus, this );\n\t\t},\n\n\t\tchangeStatus: function() {\n\t\t\t// Send out a radio message when the 'clean' attribute changes.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:clean', this.get( 'clean' ) );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Creates and stores a model that represents app-wide data. i.e. current domain, current drawer, clean, etc.\n *\n * clean is a boolean that represents whether or not changes have been made.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/data',['models/app/appModel'], function( appModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Get the collection that represents all the parts of our application.\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\t// Setup our initial model.\n\t\t\tthis.model = new appModel( {\n\t\t\t\tcurrentDrawer: false,\n\t\t\t\tcurrentDomain: appDomainCollection.get( 'fields' ),\n\t\t\t\tclean: true\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Set the mobile setting used to track whether or not we're on a mobile device.\n\t\t\t */\n\t\t\tvar mobile = ( 1 == nfAdmin.mobile ) ? true : false;\n\t\t\tthis.model.set( 'mobile', mobile );\n\n\t\t\t/*\n\t\t\t * Respond to requests to see if we are on mobile.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'is:mobile', this.isMobile, this );\n\n\t\t\t/*\n\t\t\t * Respond to app channel requests for information about the state of our app.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:data', this.getData, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDomain', this.getCurrentDomain, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDrawer', this.getCurrentDrawer, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:current', this.getCurrentDrawer, this );\n\n\t\t\t/*\n\t\t\t * Respond to app channel requests to update app settings.\n\t\t\t */\t\t\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDomain', this.updateCurrentDomain, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDrawer', this.updateCurrentDrawer, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:setting', this.updateSetting, this );\n\n\t\t},\n\n\t\tupdateCurrentDomain: function( model ) {\n\t\t\tthis.updateSetting( 'currentDomain', model );\n\t\t},\n\n\t\tupdateSetting: function( setting, value ) {\n\t\t\tthis.model.set( setting, value );\n\t\t\treturn true;\n\t\t},\n\n\t\tgetSetting: function( setting ) {\n\t\t\treturn this.model.get( setting );\n\t\t},\n\n\t\tgetData: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tgetCurrentDomain: function() {\n\t\t\treturn this.model.get( 'currentDomain' );\n\t\t},\n\n\t\tupdateCurrentDrawer: function( drawerID ) {\n\t\t\tthis.updateSetting( 'currentDrawer', drawerID );\n\t\t\treturn true;\n\t\t},\n\n\t\tgetCurrentDrawer: function() {\n\t\t\tvar currentDrawerID = this.model.get( 'currentDrawer' );\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:drawer', currentDrawerID );\n\t\t},\n\n\t\tisMobile: function() {\n\t\t\treturn this.model.get( 'mobile' );\n\t\t}\n\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for click events to expand/collapse setting groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawerToggleSettingGroup',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for click events on our settings group.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:toggleSettingGroup', this.toggleSettingGroup );\n\t\t},\n\n\t\t/**\n\t\t * Set the 'display' attribute of our group model to true or false to toggle.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \tgroup setting model\n\t\t * @return void\n\t\t */\n\t\ttoggleSettingGroup: function( e, model ) {\n\t\t\tif ( model.get( 'display' ) ) {\n\t\t\t\t/*\n\t\t\t\t * Make sure that none of our settings have errors\n\t\t\t\t */\n\t\t\t\tvar errors = false;\n\t\t\t\t_.each( model.get( 'settings' ).models, function( setting ) {\n\t\t\t\t\tif ( setting.get( 'error' ) ) {\n\t\t\t\t\t\terrors = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( ! errors ) {\n\t\t\t\t\tmodel.set( 'display', false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmodel.set( 'display', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Updates our database with our form data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/updateDB',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the closing of the drawer and update when it's closed.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.updateDB );\n\t\t\t// Respond to requests to update the database.\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:db', this.updateDB, this );\n\t\t\t/*\n\t\t\t * Register our default formContent save filter.\n\t\t\t * This converts our collection into an array of keys.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:saveFilter', this.defaultSaveFilter, 10, this );\n\t\t},\n\n\t\t/**\n\t\t * Update our database.\n\t\t * If action isn't specified, assume we're updating the preview.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \taction preview or publish\n\t\t * @return void\n\t\t */\n\t\tupdateDB: function( action ) {\n\t\t\t// If our app is clean, dont' update.\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Default action to preview.\n\t\t\taction = action || 'preview';\n\n\t\t\t// Setup our ajax actions based on the action we're performing\n\t\t\tif ( 'preview' == action ) {\n\t\t\t\tvar jsAction = 'nf_preview_update';\n\t\t\t} else if ( 'publish' == action ) {\n\t\t\t\tvar jsAction = 'nf_save_form';\n\t\t\t}\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n\t\t\t/*\n\t\t\t * There are pieces of data that are only needed for the builder and not for the front-end.\n\t\t\t * We need to unset those.\n\t\t\t * TODO: Make this more dynamic/filterable.\n\t\t\t */\n\t\t\t_.each( formModel.get( 'fields' ).models, function( fieldModel, index ) {\n\t\t\t\tfieldModel.unset( 'jBox', { silent: true } );\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * The main content of our form is called the formContent.\n\t\t\t * In this next section, we check to see if any add-ons want to modify that contents before we save.\n\t\t\t * If there aren't any filters found, we default to the field collection.\n\t\t\t * \n\t\t\t */\n\t\t\t\n\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\n\t\t\t/*\n\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\n\t\t\t * If we don't have this setting, then we check for this deprecated value.\n\t\t\t * \n\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\n\t\t\t *\n\t\t\t * TODO: Remove this backwards compatibility eventually.\n\t\t\t */\n\t\t\tif ( ! formContentData ) {\n\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\n\t\t\t}\n\n\t\t\tvar formContentSaveDataFilters = nfRadio.channel( 'formContent' ).request( 'get:saveFilters' );\n\t\t\t\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( formContentSaveDataFilters, undefined );\n\t\t\tvar callback = _.first( sortedArray );\n\t\t\t/*\n\t\t\t * Set our formContentData to the callback specified in the filter, passing our current formContentData.\n\t\t\t */\n\t\t\tformContentData = callback( formContentData );\n\t\t\t\n\t\t\tif ( 'publish' == action && formModel.get( 'show_publish_options' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'newForm' );\n\t\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\t\tjQuery( builderEl ).addClass( 'disable-main' );\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Get our form data\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n\t\t\t// Turn our formData model into an object\n\t\t\tvar data = JSON.parse( JSON.stringify( formData ) );\n\t\t\tdata.settings.formContentData = formContentData;\n\t\t\t/**\n\t\t\t * Prepare fields for submission.\n\t\t\t */\n\t\t\t\n\t\t\t// Get the field IDs that we've deleted.\n\t\t\tvar removedIDs = formData.get( 'fields' ).removedIDs;\n\n\t\t\t/*\n\t\t\t * data.fields is an array of objects like:\n\t\t\t * field.label = blah\n\t\t\t * field.label_pos = blah\n\t\t\t * etc.\n\t\t\t *\n\t\t\t * And we need that format to be:\n\t\t\t * field.settings.label = blah\n\t\t\t * field.settings.label_pos = blah\n\t\t\t *\n\t\t\t * So, we loop through our fields and create a field.settings object.\n\t\t\t */\n\t\t\t_.each( data.fields, function( field ) {\n\t\t\t\tvar id = field.id;\n\t\t\t\t// We dont' want to update id or parent_id\n\t\t\t\tdelete field.id;\n\t\t\t\tdelete field.parent_id;\n\t\t\t\tvar settings = {};\n\t\t\t\t// Loop through all the attributes of our fields\n\t\t\t\tfor (var prop in field) {\n\t\t\t\t if ( field.hasOwnProperty( prop ) ) {\n\t\t\t\t \t// Set our settings.prop value.\n\t\t\t\t settings[ prop ] = field[ prop ];\n\t\t\t\t // Delete the property from the field.\n\t\t\t\t delete field[ prop ];\n\t\t\t\t }\n\t\t\t\t}\n\n\t\t\t\tfor( var setting in settings ){\n\t\t\t\t\tif( null === settings[ setting ] ) {\n\t\t\t\t\t\tdelete settings[setting];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update our field object.\n\t\t\t\tfield.settings = settings;\n\t\t\t\tfield.id = id;\n\t\t\t} );\n\n\t\t\t// Set our deleted_fields object so that we can know which fields were removed.\n\t\t\tdata.deleted_fields = removedIDs;\n\n\t\t\t/**\n\t\t\t * Prepare actions for submission.\n\t\t\t */\n\t\t\t\n\t\t\t// Get the action IDs that we've deleted.\n\t\t\tvar removedIDs = formData.get( 'actions' ).removedIDs;\n\n\t\t\t/*\n\t\t\t * data.actions is an array of objects like:\n\t\t\t * action.label = blah\n\t\t\t * action.label_pos = blah\n\t\t\t * etc.\n\t\t\t *\n\t\t\t * And we need that format to be:\n\t\t\t * action.settings.label = blah\n\t\t\t * action.settings.label_pos = blah\n\t\t\t *\n\t\t\t * So, we loop through our actions and create a field.settings object.\n\t\t\t */\n\t\t\t_.each( data.actions, function( action ) {\n\t\t\t\tvar id = action.id;\n\t\t\t\t// We dont' want to update id or parent_id\n\t\t\t\tdelete action.id;\n\t\t\t\tdelete action.parent_id;\n\t\t\t\tvar settings = {};\n\t\t\t\t// Loop through all the attributes of our actions\n\t\t\t\tfor (var prop in action) {\n\t\t\t\t if ( action.hasOwnProperty( prop ) ) {\n\t\t\t\t \t// Set our settings.prop value.\n\t\t\t\t settings[ prop ] = action[ prop ];\n\t\t\t\t // Delete the property from the action.\n\t\t\t\t delete action[ prop ];\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t\t// Update our action object.\n\t\t\t\taction.settings = settings;\n\t\t\t\taction.id = id;\n\t\t\t} );\n\n\t\t\t// Set our deleted_actions object so that we can know which actions were removed.\n\t\t\tdata.deleted_actions = removedIDs;\n\n\t\t\t// Turn our object into a JSON string.\n\t\t\tdata = JSON.stringify( data );\n\t\t\t// Run anything that needs to happen before we update.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:updateDB', data );\n\n\t\t\tif ( 'publish' == action ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', true );\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\t\n\n\t\t\t\t// If we're on mobile, show a notice that we're publishing\n\t\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'publishing', 'Your Changes Are Being Published', { autoClose: false } );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update\n\t\t\tjQuery.post( ajaxurl, { action: jsAction, form: data, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\t\tresponse.action = action;\n\t\t\t\t\t// Run anything that needs to happen after we update.\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'response:updateDB', response );\n\t\t\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) && 'preview' == action ) {\n\t\t\t\t\t\t// nfRadio.channel( 'notices' ).request( 'add', 'previewUpdate', 'Preview Updated'\t);\n\t\t\t\t\t}\n\t\t\t\t} catch( exception ) {\n\t\t\t\t\tconsole.log( 'Something went wrong!' );\n\t\t\t\t\tconsole.log( exception );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} );\n\t\t},\n\n\t\tdefaultSaveFilter: function( formContentData ) {\n\t\t\treturn formContentData.pluck( 'key' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our form data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/formModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\tif ( ! jQuery.isNumeric( this.get( 'id' ) ) ) {\n\t\t\t\tthis.set( 'show_publish_options', true, { silent: true } );\n\t\t\t} else {\n\t\t\t\tthis.set( 'show_publish_options', false, { silent: true } );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Stores our form data and responds to requests for it.\n * Form data stores fields, actions, and settings.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formData',['models/app/formModel'], function( formModel) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Instantiate Form Model\n\t\t\tthis.model = new formModel( { id: preloadedFormData.id } );\n\t\t\t// Set our field collection\n\t\t\tthis.model.set( 'fields', nfRadio.channel( 'fields' ).request( 'get:collection' ) );\n\t\t\t// Set our actions collection\n\t\t\tthis.model.set( 'actions', nfRadio.channel( 'actions' ).request( 'get:collection' ) );\n\t\t\t// Set our settings collection\n\t\t\tthis.model.set( 'settings', nfRadio.channel( 'settings' ).request( 'get:settings' ) );\n\t\t\t// Respond to requests for form data.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:formModel', this.getFormModel, this );\n\t\t},\n\n\t\t/**\n\t\t * Return form data model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return backbone.model\n\t\t */\n\t\tgetFormModel: function() {\n\t\t\treturn this.model;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles changing our preview link when we change the 'clean' state of our app.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/previewLink',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for events that would change our preview link\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:sendChanges', this.disablePreview, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:sendChanges', this.enablePreview, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.changePreviewNicename, this );\n\t\t},\n\n\t\t/**\n\t\t * Disable our preview link before we send data to update our preview.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tdisablePreview: function() {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\t\t\t// Set disabled to true. This will trigger the preview link view to redraw.\n\t\t\tpreview.set( 'disabled', true );\n\t\t},\n\n\t\t/**\n\t\t * Change the preview link text from \"Preview Form\" to \"Preview Changes\" or vice-versa\n\t\t * \n\t\t * @since 3.0\n\t\t * @param boolean \tclean app data state\n\t\t * @return void\n\t\t */\n\t\tchangePreviewNicename: function( clean ) {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\n\t\t\t// If we have unsaved changes, set our text to 'changes' otherwise, set it to 'form'\n\t\t\tif ( ! clean ) {\n\t\t\t\tvar nicename = 'Preview Changes';\n\t\t\t} else {\n\t\t\t\tvar nicename = 'Preview Form';\n\t\t\t}\n\n\t\t\tpreview.set( 'nicename', nicename );\n\t\t},\n\n\t\t/**\n\t\t * Enable our preview button.\n\t\t * This is triggered when we get a response from our preview update.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tenablePreview: function() {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\t\t\t// Set disabled to false. This will trigger the preview link view to redraw.\n\t\t\tpreview.set( 'disabled', false );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for requests to change the current domain.\n *\n * The app menu and the main submenu both contain clickable links that change the current domain.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/menuButtons',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:publish', this.publish );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:viewChanges', this.viewChanges );\n\t\t},\n\n\t\tpublish: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\n\t\t},\n\n\t\tviewChanges: function() {\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'viewChanges', { collection: changeCollection } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our change data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/changeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdisabled: false\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Holds all of our change models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/changeCollection',['models/app/changeModel'], function( domainModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: domainModel,\n\n\t\tcomparator: function( model ) {\n\t\t\tvar id = parseInt( model.cid.replace( 'c', '' ) );\n\t\t\treturn -id;\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Track settings changes across our app.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/trackChanges',['models/app/changeCollection', 'models/app/changeModel'], function( changeCollection, ChangeModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new changeCollection();\n\t\t\t// Respond to any requests to add a change directly.\n\t\t\tnfRadio.channel( 'changes' ).reply( 'register:change', this.registerChange, this );\n\t\t\t// Respond to requests for the change collection\n\t\t\tnfRadio.channel( 'changes' ).reply( 'get:collection', this.getCollection, this );\n\t\t\t// Listen for changes in our clean state. If it goes to clean, clear our collection.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.maybeResetCollection );\n\t\t},\n\n\t\tregisterChange: function( action, model, changes, label, data ) {\n\t\t\tvar data = typeof data !== 'undefined' ? data : {};\n\t\t\tif ( 'undefined' == typeof label.dashicon ) {\n\t\t\t\tlabel.dashicon = 'admin-generic';\n\t\t\t}\n\t\t\tvar changeModel = new ChangeModel({\n\t\t\t\taction: action,\n\t\t\t\tmodel: model,\n\t\t\t\tchanges: changes,\n\t\t\t\tlabel: label,\n\t\t\t\tdata: data\t\t\n\t\t\t} );\n\t\t\tthis.collection.add( changeModel );\n\t\t\treturn changeModel;\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tmaybeResetCollection: function( clean ) {\n\t\t\tif ( clean ) {\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'controllers/app/undoChanges',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoChanges', this.undoChanges, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoSingle', this.undoSingle, this );\n\t\t},\n\n\t\tundoChanges: function() {\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tchangeCollection.sort();\n\t\t\tvar that = this;\n\t\t\t_.each( changeCollection.models, function( change ) {\n\t\t\t\tthat.undoSingle( change, true );\n\t\t\t} );\n\t\t\tchangeCollection.reset();\n\t\t\t// Update preview.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t},\n\n\t\tundoSingle: function( change, undoAll ) {\n\t\t\tnfRadio.channel( 'changes' ).request( 'undo:' + change.get( 'action' ), change, undoAll );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for our update:db response and replaces tmp ids with new ids if we were performing the publish action.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/publishResponse',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our app channel for the updateDB response.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.publishResponse );\n\t\t},\n\n\t\tpublishResponse: function( response ) {\n\t\t\t// If we aren't performing a publish action, bail.\n\t\t\tif ( 'publish' !== response.action ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// Check to see if we have any new ids. \n\t\t\tif ( 'undefined' != typeof response.data.new_ids ) {\n\n\t\t\t\t// If we have any new fields, update their models with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.fields ) {\n\t\t\t\t\t_.each( response.data.new_ids.fields, function( newID, oldID ) {\n\t\t\t\t\t\tvar field = nfRadio.channel( 'fields' ).request( 'get:field', oldID );\n\t\t\t\t\t\tif ( field ) {\n\t\t\t\t\t\t\tfield.set( 'id', newID );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we have any new actions, update their models with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.actions ) {\n\t\t\t\t\t_.each( response.data.new_ids.actions, function( newID, oldID ) {\n\t\t\t\t\t\tvar action = nfRadio.channel( 'actions' ).request( 'get:action', oldID );\n\t\t\t\t\t\tif ( action ) {\n\t\t\t\t\t\t\taction.set( 'id', newID );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we have a new form id, update the model with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.forms ) {\n\t\t\t\t\t_.each( response.data.new_ids.forms, function( newID, oldID ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\tformModel.set( 'id', newID );\n\t\t\t\t\t\thistory.replaceState( '', '', 'admin.php?page=ninja-forms&form_id=' + newID );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', false );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\n\n\t\t\t// If we're on mobile, show a notice that we're publishing\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'close', 'publishing' );\n\t\t\t}\n\t\t\t// Add a notice that we've published.\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'published', 'Changes Published' );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'app:published', response );\n\n\t\t\t// Mark our app as clean. This will disable the publish button and fire anything else that cares about the state.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t}\n\t\t\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for requests to change the current domain.\n *\n * The app menu and the main submenu both contain clickable links that change the current domain.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeDomain',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for both menu and submenu clicks.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.changeAppDomain );\n\t\t\t// Reply to specific requests to change the domain\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:currentDomain', this.changeAppDomain, this );\n\n\t\t\t// Reply to requests to prevent our drawer from closing\n\t\t\tnfRadio.channel( 'app' ).reply( 'prevent:changeDomain', this.preventChange, this );\n\t\t\t// Reply to requests to enable drawer closing\n\t\t\tnfRadio.channel( 'app' ).reply( 'enable:changeDomain', this.enableChange, this );\n\n\t\t\t/*\n\t\t\t * Object that holds our array of 'prevent change' values.\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\n\t\t\t */\n\t\t\tthis.objPreventChange = {};\n\t\t},\n\n\t\tchangeAppDomain: function( e, model ) {\n\t\t\t/*\n\t\t\t * If we have disabled movement between domains, return false.\n\t\t\t */\n\t\t\tif ( this.maybePreventChange() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * If we are passed a model, use that model.\n\t\t\t * Otherwise, get the domain from the event target data.\n\t\t\t */ \n\t\t\tif ( 'undefined' == typeof model ) {\n\t\t\t\tvar domainID = jQuery( e.target ).data( 'domain' );\n\t\t\t\tvar model = nfRadio.channel( 'app' ).request( 'get:domainModel', domainID );\n\t\t\t}\n\t\t\t// If a drawer is open, close it.\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we aren't dealing with an external url (such as preview), update our app data\n\t\t\t * and trigger a radio message saying we've changed the domain.\n\t\t\t */ \n\t\t\tif ( 0 == model.get( 'url' ).length ) {\n\t\t\t\tvar mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:currentDomain', model );\n\t\t\t\tjQuery( mainEl ).scrollTop( 0 );\t\t\t\t\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:currentDomain', model );\n\t\t\t}\n\t\t},\n\n\t\t/**\n * Check to see if anything has registered a key to prevent changing the domain.\n * \n * @since 3.0\n * @return boolean\n */\n maybePreventChange: function() {\n \tif ( 0 == Object.keys( this.objPreventChange ).length ) {\n \t\treturn false;\n \t} else {\n \t\treturn true;\n \t}\n },\n\n /**\n * Register a key to prevent changing the domain.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent change domain' setting.\n * @return void\n */\n preventChange: function( key ) {\n \tthis.objPreventChange[ key ] = true;\n },\n\n /**\n * Remove a previously registered key that is preventing our domain from changing.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent change domain' setting.\n * @return void\n */\n enableChange: function( key ) {\n \tdelete this.objPreventChange[ key ];\n },\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Modify the user's browser history when they click on a domain\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/pushstate',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changePushState );\n\t\t},\n\n\t\tchangePushState: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\thistory.pushState( null, null, window.location.href + '&domain=' + currentDomain.get( 'id' ) );\n\t\t\tvar reExp = /domain=\\\\d+/;\n\t\t\tvar url = window.location.toString();\n\t\t\tvar newUrl = url.replace( reExp, '' );\n\t\t\tconsole.log( newUrl );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles our hotkey execution. Needs to be cleaned up and made more programmatic.\n * \n * Our hotkeys are defined by the domain that we're currently viewing. In each domain's model, there is a hotkey object.\n * \n * Currently too much hotkey data is hard-coded here.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/hotkeys',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we change our domain, change the hotkeys to those within that object.\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'render:main', this.changeHotkeys );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.changeHotkeys );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'render:settingGroup', this.changeHotkeys );\n\t\t\t// Currently, these are the functions that run when the new field or new action hotkey is pressed.\n\t\t\t// TODO: move these into a config module or into something more programmatic and scalable.\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newField', this.addNewField );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newAction', this.addNewAction );\n\t\t\t// Same as above, these functions need to be moved into a more modular/programmatic solution.\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:fields', this.changeDomainFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:actions', this.changeDomainActions );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:settings', this.changeDomainSettings );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'close:drawer', this.closeDrawer );\n\t\t},\n\n\t\tchangeHotkeys: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tjQuery( document ).off( '.nfDomainHotkeys' );\n\t\t\tjQuery( 'input' ).off( '.nfDomainHotkeys' );\n\t\t\tif ( currentDomain.get( 'hotkeys' ) ) {\n\t\t\t\tjQuery.each( currentDomain.get( 'hotkeys' ), function( hotkey, msg ) {\n\t\t\t\t\tjQuery( document ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery( 'input' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery( 'textarea' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\taddNewField: function() {\n\t\t\tif ( 'addField' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\taddNewAction: function() {\n\t\t\tif ( 'addAction' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addAction' );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t},\n\n\t\tchangeDomainFields: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar fieldsDomain = appDomainCollection.get( 'fields' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, fieldsDomain );\n\t\t},\n\n\t\tchangeDomainActions: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar actionsDomain = appDomainCollection.get( 'actions' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, actionsDomain );\n\t\t},\n\n\t\tchangeDomainSettings: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar settingsDomain = appDomainCollection.get( 'settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, settingsDomain );\n\t\t},\n\n\t\tcloseDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Change the clean state of our app when settings are changed.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cleanState',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Set an array of field model attributes to ignore.\n\t\t\t * This list will be filtered just before we ignore anything.\n\t\t\t */ \n\t\t\tthis.ignoreAttributes = [\n\t\t\t\t'editActive'\n\t\t\t];\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:setting', this.setAppClean );\n\t\t},\n\n\t\tsetAppClean: function( model ) {\n\t\t\tfor( var attr in model.changedAttributes() ) {\n\t\t\t\tvar changedAttr = attr;\n\t\t\t\tvar after = model.changedAttributes()[ attr ];\n\t\t\t}\n\n\t\t\tvar ignoreAttributes = nfRadio.channel( 'undo-' + model.get( 'type' ) ).request( 'ignore:attributes', this.ignoreAttributes ) || this.ignoreAttributes;\n\t\t\t\n\t\t\tif ( -1 != this.ignoreAttributes.indexOf( attr ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * All of the core undo functions. Listens on the 'changes' channel for an undo request.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/coreUndo',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:changeSetting', this.undoChangeSetting, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addObject', this.undoAddObject, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeObject', this.undoRemoveObject, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:duplicateObject', this.undoDuplicateObject, this );\n\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortFields', this.undoSortFields, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addListOption', this.undoAddListOption, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeListOption', this.undoRemoveListOption, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortListOptions', this.undoSortListOptions, this );\n\t\t},\n\n\t\t/**\n\t\t * Undo settings that have been changed.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoChangeSetting: function( change, undoAll ) {\n\t\t\tvar fieldModel = change.get( 'model' );\n\t\t\tvar changes = change.get( 'changes' );\n\t\t\tvar attr = changes.attr;\n\t\t\tvar before = changes.before;\n\t\t\tfieldModel.set( attr, before );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo adding a field or an action.\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoAddObject: function( change, undoAll ) {\n\t\t\tvar objectModel = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\n\t\t\tif ( 'undefined' != typeof collection.newIDs ) {\n\t\t\t\tdelete collection.newIDs[ objectModel.get( 'id' ) ];\n\t\t\t}\n\t\t\t\t\t\t\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( model );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tcollection.remove( objectModel );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\t\t\n\n\t\t/**\n\t\t * Undo adding a field or an action.\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoDuplicateObject: function( change, undoAll ) {\n\t\t\tvar objectModel = change.get( 'model' );\n\t\t\tvar objectCollection = change.get( 'data' ).collection;\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( model );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tobjectCollection.remove( objectModel );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo removing a field or an action.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoRemoveObject: function( change, undoAll ) {\n\t\t\tvar dataModel = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\n\t\t\tnfRadio.channel( dataModel.get( 'objectDomain' ) ).request( 'add', dataModel );\n\n\t\t\tdelete collection.removedIDs[ dataModel.get( 'id' ) ];\n\t\t\t\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: dataModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tmodel.set( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\t// Trigger a reset on our field collection so that our view re-renders\n\t\t\tcollection.trigger( 'reset', collection );\n\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo field sorting.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoSortFields: function( change, undoAll ) {\n\t\t\tvar data = change.get( 'data' );\n\t\t\tvar fields = data.fields;\n\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields, function( changeModel ) {\n\t\t\t\tvar before = changeModel.before;\n\t\t\t\tvar fieldModel = changeModel.model;\n\t\t\t\tfieldModel.set( 'order', before );\n\t\t\t\t// console.log( 'set ' + fieldModel.get( 'label' ) + ' to ' + before );\n\t\t\t} );\n\t\t\t// console.log( fieldCollection.where( { label: 'Name' } ) );\n\t\t\t// console.log( fieldCollection.where( { label: 'Email' } ) );\n\n\n\t\t\tfieldCollection.sort();\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoAddListOption: function( change, undoAll ) {\n\t\t\tvar model = change.get( 'model' );\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\t\tif ( changeModel !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( changeModel );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\tmodel.collection.remove( model );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoRemoveListOption: function( change, undoAll ) {\n\t\t\tvar model = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\t\t\tcollection.add( model );\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tmodel.set( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoSortListOptions: function( change, undoAll ) {\n\t\t\tvar data = change.get( 'data' );\n\t\t\tvar collection = data.collection;\n\t\t\t\n\t\t\tvar objModels = data.objModels;\n\n\t\t\t_.each( objModels, function( changeModel ) {\n\t\t\t\tvar before = changeModel.before;\n\t\t\t\tvar optionModel = changeModel.model;\n\t\t\t\toptionModel.set( 'order', before );\n\t\t\t} );\t\t\t\t\n\n\n\t\t\tcollection.sort();\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * If our undo action was requested to 'remove' the change from the collection, remove it.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tremove \tshould we remove this item from our change collection\n\t\t * @return void\n\t\t */\n\t\tmaybeRemoveChange: function( change, undoAll ) {\t\t\t\n\t\t\tvar undoAll = typeof undoAll !== 'undefined' ? undoAll : false;\n\t\t\tif ( ! undoAll ) {\n\t\t\t\t// Update preview.\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tchangeCollection.remove( change );\n\t\t\t\tif ( 0 == changeCollection.length ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns a clone of a backbone model with all the attributes looped through so that collections contained within are propely cloned.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cloneModelDeep',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:modelDeep', this.cloneModelDeep, this );\n\t\t},\n\n\t\tcloneModelDeep: function( model ) {\n\t\t\t// Temporary value used to store any new collections.\n\t\t\tvar replace = {};\n\t\t\t// Loop over every model attribute and if we find a collection, clone each model and instantiate a new collection.\n\t\t\t_.each( model.attributes, function( val, key ) {\n\t\t\t\tif( val instanceof Backbone.Collection ) { // Is this a backbone collection?\n\t\t\t\t\tvar clonedCollection = nfRadio.channel( 'app' ).request( 'clone:collectionDeep', val );\n\t\t\t\t\treplace[ key ] = clonedCollection;\n\t\t\t\t} else if ( val instanceof Backbone.Model ) { // Is this a backbone model?\n\t\t\t\t\treplace[ key ] = this.cloneModelDeep( val );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\t// Clone our original model\n\t\t\tvar newModel = model.clone();\n\t\t\t// Overwrite any collections we created above.\n\t\t\t_.each( replace, function( val, key ) {\n\t\t\t\tnewModel.set( key, val );\n\t\t\t} );\n\n\t\t\treturn newModel;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns the appropriate child view for our settings drawer.\n *\n * This enables settings types to register custom childviews for their settings.\n * The option-repeater setting for the list field is an example.\n * \n * @package Ninja Forms builder\n * @subpackage App - Edit Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/getSettingChildView',['views/app/drawer/itemSetting'], function( itemSettingView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for field settings child views.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t},\n\n\t\t/**\n\t\t * Return the appropriate child setting view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model\tmodel \tField setting\n\t\t * @return backbone.view\n\t\t */\n\t\tgetSettingChildView: function( model ) {\n\t\t\t// Get our setting type.\n\t\t\tvar type = model.get( 'type' );\n\t\t\t// Request a setting childview from our setting type channel. (Setting type, not field type)\n\t\t\tvar settingChildView = nfRadio.channel( type ).request( 'get:settingChildView', model ) || itemSettingView;\n\t\t\t\n\t\t\treturn settingChildView\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Updates our model when the user changes a setting.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeSettingDefault',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to update settings.\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:setting', this.changeSetting, this );\n\n\t\t\t// Listen on our app channel for the change setting event. Fired by the setting view.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.changeSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * When we change our setting, update the model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te event\n\t\t * @param backbone.model \tsettingModel model that holds our field type settings info\n\t\t * @param backbone.model \tdataModel model that holds our field settings\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( e, settingModel, dataModel, value ) {\n\t\t\tvar name = settingModel.get( 'name' );\n\t\t\tvar before = dataModel.get( name );\n\t\t\tvar value = value || null;\n\t\t\tif ( ! value ) {\n\t\t\t\t// Sends out a request on the fields-type (fields-text, fields-checkbox, etc) channel to see if that field type needs to return a special value for saving.\n\t\t\t\tvalue = nfRadio.channel( settingModel.get( 'type' ) ).request( 'before:updateSetting', e, dataModel, name, settingModel );\n\t\t\t}\n\n\t\t\tif( 'undefined' == typeof value ){\n\t\t\t value = jQuery( e.target ).val();\n }\n\t\t\t\n\t\t\t// Update our field model with the new setting value.\n\t\t\tdataModel.set( name, value, { settingModel: settingModel } );\n\t\t\tnfRadio.channel( 'setting-' + name ).trigger( 'after:updateSetting', dataModel, settingModel );\n\t\t\t// Register our setting change with our change tracker\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'views/app/drawer/typeSettingFieldset',['views/app/drawer/itemSetting'], function( itemSettingView ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\n\t\tchildView: itemSettingView,\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.collection = this.model.get( 'settings' );\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.model.on( 'rerender', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\t \t\trenderSetting: function(){\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( this );\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderError: function() {\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\treturn this.error;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.nf-field-sub-settings' ).append( childView.el );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Model that represents our setting.\n *\n * When the model is created, we trigger the init event in two radio channels.\n *\n * This lets specific types of settings modify the model before anything uses it.\n *\n * Fieldset, for instance, uses this hook to instantiate its settings as a collection.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tsettings: false,\n\t\t\thide_merge_tags: false,\n\t\t\terror: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Send out two messages saying that we've initialized a setting model.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:settingModel', this );\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'init:settingModel', this );\n\t\t\tnfRadio.channel( 'setting-name-' + this.get( 'name' ) ).trigger( 'init:settingModel', this );\n\t\t\tthis.on( 'change:error', this.maybePreventUI, this );\n\n\t\t\t/*\n\t\t\t * If we have an objectType set on our collection, then we're creating a model for the generic settings collection.\n\t\t\t * If we're using merge tags in this setting\n\t\t\t */\n\n\t\t\tif( 'undefined' == typeof this.collection ) return;\n\n\t\t\tif ( this.get( 'use_merge_tags' ) && 'undefined' != typeof this.collection.options.objectType ) {\n\t\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', this.updateKey );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, send out a radio message requesting that this setting be checked for the old key.\n\t\t * We want to send the message on the objectType channel.\n\t\t * This means that if this setting is for fields, it will trigger on the fields channel, actions, etc.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Backbone.Model \tkeyModel data model representing the field for which the key just changed\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( keyModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'fire:updateFieldKey', keyModel, this );\n\t\t},\n\n\t\tmaybePreventUI: function() {\n\t\t\tif ( this.get( 'error' ) ) {\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'prevent:close', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'prevent:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\t\t\t\t\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'enable:close', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'enable:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collections of settings for each field type.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingCollection',['models/app/settingModel'], function( settingModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: settingModel,\n\n\t\tinitialize: function( models, options ) {\n\t\t\tthis.options = options || {};\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles actions related to field settings that use a fieldset\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/fieldset',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fieldset' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t\t// When a list type field is initialized, create an option collection.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldset' ), 'init:settingModel', this.createSettingsCollection );\n\t\t},\n\n\t\tgetSettingChildView: function( model ) {\n\t\t\treturn fieldsetView;\n\t\t},\n\n\t\t/**\n\t\t * Instantiate settings collection when a fieldset type is initialized.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tfield model being initialized\n\t\t * @return void\n\t\t */\n\t\tcreateSettingsCollection: function( model ) {\n\t\t\tmodel.set( 'settings', new settingCollection( model.get( 'settings' ) ) );\n\t\t},\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to our toggle field.\n * When we change the toggle, the setting value will be 'on' or ''.\n * We need to change this to 1 or 0.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/toggleSetting',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\n\t\t\tnfRadio.channel( 'setting-type-toggle' ).reply( 'renderOnChange', function(){ return false } );\n\n\t\t\t// Respond to requests for field setting filtering.\n\t\t\tnfRadio.channel( 'toggle' ).reply( 'before:updateSetting', this.updateSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * Return either 1 or 0, depending upon the toggle position.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te event\n\t\t * @param backbone.model \tfieldModel field model\n\t\t * @param string \t\t\tname setting name\n\t\t * @param backbone.model \tsettingTypeModel field type model\n\t\t * @return int 1 or 0\n\t\t */\n\t\tupdateSetting: function( e, fieldModel, name, settingTypeModel ) {\n\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\n\t\t\t\tvar value = 1;\n\t\t\t} else {\n\t\t\t\tvar value = 0;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for clicks on our action item action buttons.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Main Sortable\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/itemControls',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for clicks to edit, delete, duplicate actions.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:edit', this.clickEdit );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:delete', this.clickDelete );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:duplicate', this.clickDuplicate );\n\n\t\t\t// Listen for our drawer close and remove our active edit state\n\t\t},\n\n\t\t/**\n\t\t * Open a drawer with our action model for editing settings.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickEdit: function( e, model ) {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\tvar type = nfRadio.channel( currentDomainID ).request( 'get:type' , model.get( 'type' ) );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: type.get( 'settingGroups' ) } );\n\t\t},\n\n\t\t/**\n\t\t * Delete a action model from our collection\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickDelete: function( e, dataModel ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\t// Add our action deletion to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Removed',\n\t\t\t\tdashicon: 'dismiss'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: dataModel.collection\n\t\t\t};\n\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tvar results = changeCollection.where( { model: dataModel } );\n\n\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\tvar data = changeModel.get( 'data' );\n\t\t\t\tif ( 'undefined' != typeof data.fields ) {\n\t\t\t\t\t_.each( data.fields, function( field, index ) {\n\t\t\t\t\t\tif ( field.model == dataModel ) {\n\t\t\t\t\t\t\tdata.fields[ index ].model = newModel;\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tchangeModel.set( 'data', data );\n\t\t\t\tchangeModel.set( 'model', newModel );\n\t\t\t\tchangeModel.set( 'disabled', true );\n\t\t\t} );\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeObject', newModel, null, label, data );\n\t\t\t\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\tnfRadio.channel( currentDomainID ).request( 'delete', dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Duplicate a action within our collection, adding the word \"copy\" to the label.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickDuplicate: function( e, model ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\n\t\t\t// Change our label.\n\t\t\tnewModel.set( 'label', newModel.get( 'label' ) + ' Copy' );\n\t\t\t// Update our ID to the new tmp id.\n\t\t\tvar tmpID = nfRadio.channel( currentDomainID ).request( 'get:tmpID' );\n\t\t\tnewModel.set( 'id', tmpID );\n\t\t\t// Add new model.\n\t\t\t// Params are: model, silent, renderTrigger, action\n\t\t\tnfRadio.channel( currentDomainID ).request( 'add', newModel, false, false, 'duplicate' );\n\t\t\t\n\t\t\t// Add our action addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: model.get( 'objectType' ),\n\t\t\t\tlabel: model.get( 'label' ),\n\t\t\t\tchange: 'Duplicated',\n\t\t\t\tdashicon: 'admin-page'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( currentDomainID ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'duplicateObject', newModel, null, label, data );\n\t\t\t\n\t\t\tmodel.trigger( 'change:label', model );\n\n\t\t\t// Update preview.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Config file for our merge tags.\n *\n * this.collection represents all of our registered merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/mergeTags',[\n\t'models/app/mergeTagCollection'\n\t], function(\n\tmergeTagCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.tagSectionCollection = new mergeTagCollection();\n\t\t\tvar that = this;\n\t\t\t_.each( mergeTags, function( tagSection ) {\n\t\t\t\tif ( tagSection.tags ) {\n\t\t\t\t\tvar tags = new mergeTagCollection( tagSection.tags );\n\t\t\t\t} else {\n\t\t\t\t\tvar tags = '';\n\t\t\t\t}\n\n\t\t\t\tthat.tagSectionCollection.add( {\n\t\t\t\t\tid: tagSection.id,\n\t\t\t\t\tlabel: tagSection.label,\n\t\t\t\t\ttags: tags,\n\t\t\t\t\tdefault_group: tagSection.default_group\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tvar fieldTags = this.tagSectionCollection.get( 'fields').get( 'tags' );\n\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\t// TODO: Make this dynamic\n\t\t\t\tif ( 'submit' !== field.get( 'type' ) ) {\n\t\t\t\t\tfieldTags.add( {\n\t\t\t\t\t\tid: field.get( 'id' ),\n\t\t\t\t\t\tlabel: field.get( 'label' ),\n\t\t\t\t\t\ttag: that.getFieldKeyFormat( field.get( 'key' ) )\n\t\t\t\t\t} );\t\t\t\t\t\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tvar calcTags = new mergeTagCollection();\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\n\t\t\t_.each( calcCollection.models, function( calcModel ) {\n\t\t\t\tcalcTags.add( {\n\t\t\t\t\tlabel: calcModel.get( 'name' ),\n\t\t\t\t\ttag: '{calc:' + calcModel.get( 'name' ) + '}'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\n\n\t\t\tthis.currentElement = {};\n\t\t\tthis.settingModel = {};\n\t\t\tthis.open = false;\n\n\t\t\t// Unhook jBox Merge Tag stuff.\n\t\t\t// nfRadio.channel( 'mergeTags' ).reply( 'init', this.initMergeTags, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'mergeTags' ), 'click:mergeTag', this.clickMergeTag );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.addFieldTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'delete:field', this.deleteFieldTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalcTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'remove:option', this.updateCalcTags );\n\n\t\t\t\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentElement', this.updateCurrentElement, this );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentSetting', this.updateCurrentSetting, this );\n\n\t\t\t// Listen for requests for our mergeTag collection.\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:mergeTag', this.getSectionModel, this );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.replaceFieldKey );\n\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:fieldKeyFormat', this.getFieldKeyFormat, this );\n\n\t\t\t/*\n\t\t\t * TODO: Hotkey support for adding tags.\n\t\t\t *\n\t\t\t\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'open:mergeTags', this.openMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'up:mergeTags', this.upMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'down:mergeTags', this.downMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'return:mergeTags', this.returnMergeTags );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:open', this.updateOpen, this );\n\t\t\t*/\n\t\t},\n\n\t\t/**\n\t\t * Init merge tags within the passed view.\n\t\t * @since 3.0\n\t\t * @param backbone.view view to be searched for merge tags.\n\t\t * @return void\n\t\t */\n\t\tinitMergeTags: function( view ) {\n\t\t\tvar mergeTagsView = nfRadio.channel( 'mergeTags' ).request( 'get:view' );\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * Apply merge tags jQuery plugin.\n\t\t\t *\n\t\t\t * Prevent jBox from being called multiple times on the same element\n\t\t\t */\n\t\t\tthis.jBoxes = {};\n\t\t\tvar that = this;\n\n\t\t\tjQuery( view.el ).find( '.merge-tags' ).each(function() {\n\t\t\t\tif ( 'undefined' == typeof jQuery( this ).data( 'jBox-id' ) ) {\n\t\t\t\t\tvar jBox = jQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\t\ttitle: 'Insert Merge Tag',\n\t\t\t\t\t\ttrigger: 'click',\n\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\tx: 'center',\n\t\t\t\t\t\t\ty: 'bottom'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcloseOnClick: 'body',\n\t\t\t\t\t\tcloseOnEsc: true,\n\t\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\t\tmaxHeight: 200,\n\n\t\t\t\t\t\tonOpen: function() {\n\t\t\t\t\t\t\tmergeTagsView.reRender( view.model );\n\t\t\t\t\t\t\tthis.setContent( jQuery( '.merge-tags-content' ) );\n\t\t\t\t\t\t\tvar currentElement = jQuery( this.target ).prev( '.setting' );\n\t\t\t\t\t\t\tif ( 0 == currentElement.length ) {\n\t\t\t\t\t\t\t\tcurrentElement = jQuery( view.el ).find( '.setting' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthat.updateCurrentSetting( view.model );\n\t\t\t\t\t\t\tthat.updateCurrentElement( currentElement );\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'prevent:close', 'merge-tags' );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonClose: function() {\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'enable:close', 'merge-tags' );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tjQuery( this ).data( 'jBox-id', jBox.id );\t\t\t\t\t\n\t\t\t\t}\n\t\t });\n\t\t},\n\n\t\tclickMergeTag: function( e, tagModel ) {\n\t\t\t/*\n\t\t\t * TODO: Make this more dynamic.\n\t\t\t * Currently, the RTE is the only section that modifies how merge tags work,\n\t\t\t * but another type of setting might need to do this in the future.\n\t\t\t */\n\n\t\t\tif( 'undefined' != typeof this.settingModel.get( 'settingModel' ) && 'calculations' == this.settingModel.get( 'settingModel' ).get( 'name' ) ) {\n\n\t\t\t\tconsole.log( tagModel );\n\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\n\n\t\t\t\tvar tag = ( 'undefined' != typeof tagModel.get( 'calcTag' ) ) ? tagModel.get( 'calcTag' ) : tagModel.get( 'tag' );\n\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tag + currentValue.substr( currentPos );\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\n\t\t\t} else if( 'rte' == this.settingModel.get( 'type' ) ) {\n\t\t\t\tjQuery( this.currentElement ).summernote( 'insertText', tagModel.get( 'tag' ) );\n\t\t\t} else {\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tagModel.get( 'tag' ) + currentValue.substr( currentPos );\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\n\t\t\t}\n\t\t},\n\n\t\taddFieldTags: function( fieldModel ) {\n\t\t\t// TODO: Make this dynamic\n\t\t\tif ( 'submit' !== fieldModel.get( 'type' ) ) {\n\t\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).add( {\n\t\t\t\t\tid: fieldModel.get( 'id' ),\n\t\t\t\t\tlabel: fieldModel.get( 'label' ),\n\t\t\t\t\ttag: this.getFieldKeyFormat( fieldModel.get( 'key' ) ),\n\t\t\t\t\tcalcTag: this.getFieldKeyFormatCalc( fieldModel.get( 'key' ) )\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tdeleteFieldTags: function( fieldModel ) {\n\t\t\tvar fieldID = fieldModel.get( 'id' );\n\t\t\tvar tagModel = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldID );\n\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).remove( tagModel );\n\t\t},\n\n\t\tupdateCalcTags: function( optionModel ) {\n\t\t\tvar calcTags = new mergeTagCollection();\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\n\n\t\t\t_.each( calcCollection.models, function( calc ) {\n\t\t\t\tcalcTags.add( {\n\t\t\t\t\tlabel: calc.get( 'name' ),\n\t\t\t\t\ttag: '{calc:' + calc.get( 'name' ) + '}'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\n\t\t},\n\n\t\topenMergeTags: function( e ) {\n\t\t\tif ( 'TEXTAREA' == jQuery( e.target )[0].tagName || 'INPUT' == jQuery( e.target )[0].tagName ) {\n\t\t\t\tjQuery( e.target ).parent().find( '.merge-tags' ).click();\n\t\t\t}\n\t\t},\n\n\t\treturnMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\n\t\t\t\tif ( currentModel ) {\n\t\t\t\t\tthis.clickMergeTag( e, currentModel );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.changeActiveTag( 'up' );\n\t\t\t}\n\t\t},\n\n\t\tdownMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.changeActiveTag( 'down' );\n\t\t\t}\n\t\t},\n\n\t\tchangeActiveTag: function( dir ) {\n\t\t\tif ( 'down' == dir ) {\n\t\t\t\tvar inc = 1;\n\t\t\t} else {\n\t\t\t\tvar inc = -1\n\t\t\t}\n\t\t\t// First, check to see if a field is currently active.\n\t\t\tif( 0 < this.fields.where( { 'active': true } ).length ) {\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\n\t\t\t\tvar currentIndex = this.fields.indexOf( currentModel );\n\t\t\t\tcurrentModel.set( 'active', false );\n\n\t\t\t\tvar nextModel = this.fields.models[ currentIndex + inc ];\n\t\t\t\tif ( nextModel ) {\n\t\t\t\t\tnextModel.set( 'active', true );\n\t\t\t\t} else {\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( 0 < this.fields.where( { 'active': true } ) ) { // There aren't any active fields. Check for active system tags.\n\t\t\t\tconsole.log( 'system' );\n\t\t\t} else if ( 0 < this.userInfo.where( { 'active': true } ) ) { // No active user info LIs.\n\t\t\t\tconsole.log( 'userinfo' );\n\t\t\t} else { // No active LIs. We haven't made any active yet, or we've gotten to the bottom of the list.\n\t\t\t\t// Make sure that we have fields\n\t\t\t\tif ( 0 < this.fields.models.length ) {\n\t\t\t\t\t// Set our first field to active.\n\t\t\t\t\tthis.fields.models[0].set( 'active', true );\n\t\t\t\t} else {\n\t\t\t\t\t// Set our first system model to active.\n\t\t\t\t\tthis.system.models[0].set( 'active', true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateCurrentElement: function( element ) {\n\t\t\tthis.currentElement = element;\n\t\t},\n\n\t\tupdateCurrentSetting: function( settingModel ) {\n\t\t\tthis.settingModel = settingModel;\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.tagSectionCollection;\n\t\t},\n\n\t\tgetSectionModel: function( id ) {\n\t\t\treturn this.tagSectionCollection.get( id );\n\t\t},\n\n\t\tupdateOpen: function( open ) {\n\t\t\tthis.open = open;\n\t\t\t_.each( this.tagSectionCollection.get( 'fields' ).models, function( model ) {\n\t\t\t\tmodel.set( 'active', false );\n\t\t\t} );\n\t\t},\n\n\t\tupdateKey: function( fieldModel ) {\n\t\t\tvar newKey = fieldModel.get( 'key' );\n\t\t\tvar oldTag = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldModel.get( 'id' ) );\n\t\t\tif ( 'undefined' != typeof oldTag ) {\n\t\t\t\toldTag.set( 'tag', this.getFieldKeyFormat( newKey ) );\t\t\t\t\n\t\t\t}\n\n\t\t},\n\n\t\tgetFieldKeyFormat: function( key ) {\n\t\t\treturn '{field:' + key + '}';\n\t\t},\n\n\t\tgetFieldKeyFormatCalc: function( key ) {\n\t\t\treturn '{field:' + key + ':calc}';\n\t\t},\n\n\t\treplaceFieldKey: function( dataModel, keyModel, settingModel ) {\n var oldKey = this.getFieldKeyFormat( keyModel._previousAttributes[ 'key' ] );\n\t\t\tvar newKey = this.getFieldKeyFormat( keyModel.get( 'key' ) );\n\t\t\tvar settingName = settingModel.get( 'name' );\n\t\t\tvar oldVal = dataModel.get( settingName );\n if(settingName == 'calculations' && 'undefined' != typeof(dataModel.get('calculations'))) {\n var calcModel = dataModel.get( 'calculations' );\n calcModel.each( function( model ) {\n var oldCalcKey = oldKey.slice( 0, (oldKey.length - 1) ) + ':calc}';\n var newCalcKey = newKey.slice( 0, (newKey.length - 1 ) ) + ':calc}';\n oldVal = model.get( 'eq' );\n if ( 'string' == typeof( oldVal ) ) {\n var re = new RegExp( oldCalcKey, 'g' );\n var newVal = oldVal.replace( re, newCalcKey );\n re = new RegExp( oldKey, 'g' );\n // TODO: We won't need this second replace when we no longer\n // have to append :calc to merge tags.\n newVal = newVal.replace( re, newKey );\n model.set( 'eq', newVal );\n }\n } );\n return false;\n }\n\t\t\tif ( 'string' == typeof oldVal ) {\n\t\t\t\tvar re = new RegExp( oldKey, 'g' );\n\t\t\t\tnewVal = oldVal.replace( re, newKey );\n\t\t\t\tdataModel.set( settingName, newVal );\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagLookupCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\n var collection = Backbone.Collection.extend( {\n model: mergeTagModel\n } );\n return collection;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTag',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'li',\n template: '#tmpl-nf-merge-tag-box-tag',\n\n events: {\n \"click\": \"insertTag\"\n },\n\n insertTag: function() {\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', this.model.get( 'tag' ) );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagList',[ 'views/app/drawer/mergeTag' ], function( mergeTagView ) {\n var view = Marionette.CollectionView.extend({\n tagName: 'ul',\n childView: mergeTagView,\n\n initialize: function() {\n nfRadio.channel( 'merge-tags' ).reply( 'update:taglist', this.sectionFilter, this );\n nfRadio.channel( 'merge-tags' ).reply( 'filtersearch', this.searchFilter, this );\n },\n\n filter: function( child, index, collection ){\n return 'fields' == child.get( 'section' );\n },\n\n sectionFilter: function( section ){\n this.filter = function( child, index, collection ){\n return section == child.get( 'section' );\n }\n this.render();\n nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n },\n\n searchFilter: function( term ){\n this.filter = function( child, index, collection ){\n var label = child.get( 'label' ).toLowerCase().indexOf( term.toLowerCase().replace( ':', '' ) ) >= 0;\n var tag = child.get( 'tag' ).toLowerCase().indexOf( term.toLowerCase() ) >= 0;\n return label || tag;\n }\n this.render();\n nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagGroup',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'li',\n template: '#tmpl-nf-merge-tag-box-section',\n events: {\n \"click\": \"onClick\"\n },\n\n initialize: function () {\n this.listenTo( nfRadio.channel( 'merge-tags' ), 'after:filtersearch', this.removeActive );\n },\n\n onClick: function(){\n this.updateTags();\n this.setActive();\n },\n\n updateTags: function() {\n nfRadio.channel( 'merge-tags' ).request( 'update:taglist', this.model.get( 'id' ) );\n },\n\n setActive: function(){\n this.$el.addClass( 'active' );\n this.$el.siblings().removeClass( 'active' );\n },\n\n removeActive: function(){\n this.$el.removeClass( 'active' );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagGroupList',[ 'views/app/drawer/mergeTagGroup' ], function( mergeTagGroupView ) {\n var view = Marionette.CollectionView.extend({\n tagName: 'ul',\n childView: mergeTagGroupView,\n\n initialize: function(){\n this.listenTo( nfRadio.channel( 'merge-tags' ), 'open', this.render, this );\n },\n\n // TODO: Update filter when a new tag is added. ie Calculations.\n filter: function( child, index, collection ){\n return 0 < child.get( 'tags' ).length;\n },\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagFilter',[], function() {\n var view = Marionette.ItemView.extend({\n template: '#tmpl-nf-merge-tag-box-filter',\n events: {\n \"keyup input\": \"updateFilter\",\n },\n updateFilter: function( event ) {\n\n if( /* ENTER */ 13 == event.keyCode ){ // Copied from Keyup Callback.\n // Get top listed merge tag.\n var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\n\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\n\n // COPIED FROM BELOW\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n return;\n }\n var value = this.$el.find( 'input' ).val();\n nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagBox',[], function() {\n var view = Marionette.LayoutView.extend({\n el: '#merge-tags-box',\n template: \"#tmpl-nf-merge-tag-box\",\n\n regions: {\n filter: '.merge-tag-filter',\n sections: '.merge-tag-sections',\n tags: '.merge-tag-list'\n },\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Merge Tag Box\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1\n */\n\ndefine( 'controllers/app/mergeTagBox',[\n 'models/app/mergeTagModel',\n 'models/app/mergeTagLookupCollection',\n 'views/app/drawer/mergeTag',\n 'views/app/drawer/mergeTagList',\n 'views/app/drawer/mergeTagGroup',\n 'views/app/drawer/mergeTagGroupList',\n 'views/app/drawer/mergeTagFilter',\n 'views/app/drawer/mergeTagBox'\n], function(\n MergeTagModel,\n MergeTagLookupCollection,\n MergeTagView,\n MergeTagListView,\n MergeTagGroupView,\n MergeTagGroupListView,\n MergeTagFilterView,\n MergeTagBoxLayout\n) {\n var controller = Marionette.Object.extend( {\n\n caret: 0, // Track the caret position of the current setting's input.\n old: '', // THe old merge tag that will be replaced.\n\n initialize: function(){\n\n this.listenTo( nfRadio.channel( 'app' ), 'after:appStart', this.afterAppStart );\n this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n this.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.beforeDrawerClose );\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n var that = this;\n nfRadio.channel( 'mergeTags' ).reply( 'set:caret', function( position ){\n that.caret = position;\n });\n nfRadio.channel( 'mergeTags' ).reply( 'get:caret', function(){\n return that.caret;\n });\n\n var that = this;\n nfRadio.channel( 'mergeTags' ).reply( 'set:old', function( value ){\n that.old = value;\n });\n nfRadio.channel( 'mergeTags' ).reply( 'get:old', function(){\n return that.old;\n });\n\n nfRadio.channel( 'mergeTags' ).reply( 'insert:tag', this.insertTag.bind( this ) );\n\n /** OPTION REPEATER */\n this.listenTo( nfRadio.channel( 'option-repeater' ), 'add:option', function( model ){\n var selector = '#' + model.cid + ' .has-merge-tags input.setting';\n jQuery( selector ).on( 'focus', function( event ){\n that.focusCallback( event, selector, 'option-repeater' );\n });\n jQuery( selector ).on( 'keyup', function( event ){\n that.keyupCallback( event, selector, 'option-repeater' );\n });\n jQuery( selector ).siblings( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n /* CALCULATIONS */\n this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', this.renderSetting );\n this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', function( settingModel, dataModel, view ){\n view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n /* SUMMERNOTE */\n this.listenTo( nfRadio.channel( 'summernote' ), 'focus', function( e, selector ) {\n that.focusCallback( false, selector, 'rte' );\n } );\n this.listenTo( nfRadio.channel( 'summernote' ), 'keydown', function( e, selector ){\n jQuery( selector ).closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\n } );\n this.listenTo( nfRadio.channel( 'summernote' ), 'keyup', function( e, selector ){\n that.keyupCallback( e, selector, 'rte' );\n } );\n\n jQuery( document ).on( 'keyup', function( event ){\n if( 27 == event.keyCode ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n // Copied from KeyupCallback.\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).blur();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n });\n },\n\n afterAppStart: function() {\n var mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n var mergeTags = [];\n mergeTagCollection.each( function( section ){\n section.get( 'tags' ).each( function( tag ){\n mergeTags.push({\n label: tag.get( 'label' ),\n tag: tag.get( 'tag' ),\n section: section.get( 'id' )\n });\n });\n });\n var layout = new MergeTagBoxLayout();\n layout.render();\n var tagCollection = new MergeTagLookupCollection( mergeTags );\n var mergeTagListView = new MergeTagListView({\n collection: tagCollection\n });\n var mergeTagGroupListView = new MergeTagGroupListView({\n collection: mergeTagCollection\n });\n\n layout.getRegion('tags').show(mergeTagListView);\n layout.getRegion('sections').show(mergeTagGroupListView);\n layout.getRegion('filter').show(new MergeTagFilterView);\n\n var that = this;\n this.listenTo( nfRadio.channel( 'mergeTags' ), 'open', function(){\n // layout.destroy();\n that.afterAppStart();\n });\n },\n\n beforeRenderSetting: function( settingModel, dataModel ){\n if( 'undefined' == typeof settingModel.get( 'use_merge_tags' ) ) return;\n if( ! settingModel.get( 'use_merge_tags' ) ) return;\n var name = settingModel.get( 'name' );\n this.listenTo( nfRadio.channel( 'setting-' + name ), 'render:setting', this.renderSetting );\n },\n\n renderSetting: function( settingModel, dataModel, view ){\n\n view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n\n if( 0 == jQuery( '#merge-tags-box' ).length ) this.afterAppStart();\n\n // Track Scrolling.\n jQuery( '#nf-drawer' ).on( 'scroll', function(){\n // COPIED AND MODIFIED FROM FOCUS\n if( 0 == jQuery( '.merge-tag-focus' ).length ) return;\n\n var rteEditor = jQuery( '.merge-tag-focus' ).closest( '.nf-setting' ).find( '.note-editor' );\n if( 0 != rteEditor.length ){\n var posY = rteEditor.offset().top - jQuery(window).scrollTop();\n var height = rteEditor.outerHeight();\n } else {\n var posY = jQuery('.merge-tag-focus').offset().top - jQuery(window).scrollTop();\n var height = jQuery('.merge-tag-focus').outerHeight();\n }\n jQuery( '#merge-tags-box' ).css( 'top', posY + height );\n\n var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\n\n var repeaterRow = jQuery( '.merge-tag-focus' ).closest( '.nf-list-options-tbody' );\n if( 0 != repeaterRow.length ){\n var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', left );\n } else {\n var posX = jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).width() );\n }\n });\n\n // On input focus, move the Merge Tag Box into position.\n jQuery( view.el ).find( '.setting' ).on( 'focus', this.focusCallback );\n\n // TODO: Maybe move to view events.\n // On input keyup, maybe show Merge Tag Box.\n jQuery( view.el ).find( '.setting' ).on( 'keyup', this.keyupCallback );\n },\n\n // TODO: Maybe move to view class.\n beforeDrawerClose: function(){\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n // jQuery( 'body' ).append( jQuery( '#merge-tags-box' ) );\n nfRadio.channel( 'mergeTags' ).trigger( 'open' );\n },\n\n insertTag: function( tag ) {\n\n var $input = jQuery( '.merge-tag-focus' );\n\n if( 0 != $input.closest( '.nf-setting' ).first().find( '.note-editable' ).length ){\n $input = $input.closest( '.nf-setting' ).first().find( '.note-editable' );\n }\n\n if( 1 < $input.length ){ $input = $input.first(); }\n\n if( $input.hasClass( 'note-editable' ) ){\n var str = $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code' );\n } else {\n var str = $input.val();\n }\n\n var find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\n var replace = tag;\n var caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\n\n var patt = /{([a-z0-9]|:|_|})*/g;\n\n // Loop through matches to find insert/replace index range.\n // Reference: http://codepen.io/kjohnson/pen/36c3a782644dfff40fe3c1f05f8739d9?editors=0012\n while (match = patt.exec(str)) {\n if (find != match[0]) continue; // This isn't the match you are looking for...\n var string = str.slice(0, match.index) + replace + str.slice(patt.lastIndex); // Fancy replace for the specifc match, using the index/position.\n\n if( $input.hasClass( 'note-editable' ) ){\n $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code', string );\n\n // Reposition the caret. http://stackoverflow.com/a/6249440 TODO: Determine the appropriate childNode.\n var el = $input;\n var childNode = null; // Default to first childNode.\n _.each( el[0].childNodes, function( node, index ){\n if( childNode ) return;\n if( ! node.nodeValue && ! node.innerHTML ) return;\n if( node.nodeValue ) {\n var position = node.nodeValue.indexOf(replace) + find.length;\n } else if( node.innerHTML ){\n var position = node.innerHTML.indexOf(replace) + find.length;\n }\n if( caretPos == position ) childNode = el[0].childNodes[index];\n });\n if( ! childNode ) childNode = el[0].childNodes[0];\n var offset = caretPos - find.length + replace.length;\n var range = document.createRange();\n var sel = window.getSelection();\n if( 0 != childNode.childNodes.length ) {\n try{\n range.setStart(childNode.childNodes[0], offset); \n } catch( err ) {\n console.log( 'error' );\n }\n \n } else {\n try {\n range.setStart(childNode, offset);\n } catch( err ) {\n console.log( 'error' );\n }\n \n }\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n\n\n } else {\n $input.val(string); // Update input value with parsed string.\n $input.change(); // Trigger a change event after inserting the merge tag so that it saves to the model.\n $input.caret(caretPos - find.length + replace.length); // Update Carept Position.\n }\n\n }\n\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n $input.removeClass( 'merge-tag-focus' );\n $input.closest( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n },\n\n mergeTagsButtonClick: function( e ){\n var $this = jQuery( this );\n if( $this.siblings().hasClass( 'merge-tag-focus' ) ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n return;\n }\n\n var $inputSetting = $this.siblings( '.setting' ).first();\n\n if( 0 !== $this.closest( '.nf-setting, .nf-table-row' ).find( '.note-tools' ).length ){\n $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\n } else {\n var text = $inputSetting.val() || '';\n $inputSetting.val( text + '{' ).change();\n nfRadio.channel('mergeTags').request('set:caret', text.length + 1 );\n }\n\n if( $this.parent().hasClass( 'note-tools' ) ){\n // $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\n }\n\n nfRadio.channel('mergeTags').request('set:old', '{' );\n\n $inputSetting.addClass( 'merge-tag-focus' );\n\n // Disable browser autocomplete.\n var autocomplete = $this.attr( 'autocomplete' );\n $this.attr( 'autocomplete', 'off' );\n $this.data( 'autocomplete', autocomplete );\n\n var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\n if( 0 != $overlayElement.find( '.note-editor' ).length ){\n $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\n } else {\n $overlayElement.addClass('merge-tag-focus-overlay');\n }\n\n jQuery( '#merge-tags-box' ).css( 'display', 'block' );\n nfRadio.channel( 'drawer' ).request( 'prevent:close' );\n\n jQuery( '.merge-tag-focus-overlay' ).on( 'click', function( e ) {\n if ( jQuery( e.target ).hasClass( 'note-editor' ) ) {\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n } );\n\n setTimeout(function(){\n jQuery( '#merge-tags-box' ).find( '.merge-tag-filter' ).find( 'input' ).focus();\n }, 500 );\n },\n\n focusCallback: function( e, target, type ){\n\n var type = type || 'setting';\n var $this = ( 'undefined' == typeof target ) ? jQuery( this ) : jQuery( target );\n\n jQuery( '.merge-tag-focus' ).each(function(index, el){\n if( this == el ) return;\n el.removeClass( 'merge-tag-focus' );\n });\n\n if( 'rte' == type ) {\n var posY = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().top - jQuery(window).scrollTop();\n var height = $this.closest( '.nf-setting' ).find( '.note-editor' ).outerHeight();\n } else {\n var posY = $this.offset().top - jQuery(window).scrollTop();\n var height = $this.outerHeight();\n }\n jQuery( '#merge-tags-box' ).css( 'top', posY + height );\n\n var repeaterRow = $this.closest( '.nf-list-options-tbody' );\n if( 0 != repeaterRow.length ) {\n var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', left );\n } else if( 'rte' == type ) {\n var posX = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-setting' ).find( '.note-editor' ).width() );\n }\n else\n {\n var posX = jQuery( this ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-settings' ).width() );\n }\n\n var dataID = jQuery( this ).data( 'id' );\n if( dataID && 'eq' != dataID ) return;\n\n // var offset = jQuery( view.el ).find( '.setting' ).parent().outerHeight();\n // jQuery( view.el ).find( '.setting' ).parent().append( jQuery( '#merge-tags-box' ) );\n // jQuery( '#merge-tags-box' ).css( 'top', offset );\n },\n\n keyupCallback: function( event, target, type ){\n\n var type = type || 'setting';\n\n if( /* ENTER */ 13 == event.keyCode ){\n\n // Get top listed merge tag.\n var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\n\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\n\n // COPIED FROM BELOW\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n\n return;\n }\n\n // Get the value.\n // var value = jQuery( summernote ).summernote( 'code' );\n // Update the value.\n // jQuery( summernote ).closest( '.nf-setting' ).find( '.note-editable' ).html( value );\n\n if( 'undefined' != typeof target ) {\n var $this = jQuery(target);\n } else {\n var $this = jQuery( this );\n }\n\n // TODO: Disable Browser Autocomplete\n // $this.attr()\n\n\n var dataID = jQuery( this ).data( 'id' );\n if( dataID && 'eq' != dataID ) return;\n\n // Store the current caret position.\n if( 'rte' == type ){\n var range = $this.summernote('createRange');\n if( range ) {\n var caretPos = range.so; // or .eo?\n } else {\n var caretPos = 0;\n }\n $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\n } else {\n var caretPos = $this.caret();\n }\n nfRadio.channel( 'mergeTags' ).request( 'set:caret', caretPos );\n\n // Find merge tags.\n if( 'rte' == type ) {\n var mergetags = $this.summernote( 'code' ).match(new RegExp(/{([a-z0-9]|:|_|})*/g));\n } else {\n var mergetags = $this.val().match(new RegExp(/{([a-z0-9]|:|_|})*/g));\n }\n\n // Filter out closed merge tags.\n mergetags = _.filter(mergetags, function(mergetag) {\n return -1 == mergetag.indexOf( '}' ); // Filter out \"closed\" merge tags.\n });\n\n // If an open merge tag is found, show the Merge Tag Box, else hide.\n if( 0 !== mergetags.length ) {\n\n nfRadio.channel( 'mergeTags' ).request( 'set:old', mergetags[0] );\n\n jQuery('#merge-tags-box').css( 'display', 'block' );\n nfRadio.channel( 'drawer' ).request( 'prevent:close' );\n $this.addClass('merge-tag-focus');\n\n var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\n\n // Disable browser autocomplete.\n var autocomplete = $this.attr( 'autocomplete' );\n $this.attr( 'autocomplete', 'off' );\n $this.data( 'autocomplete', autocomplete );\n\n var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\n if( 0 != $overlayElement.find( '.note-editor' ).length ){\n $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\n } else {\n $overlayElement.addClass('merge-tag-focus-overlay');\n }\n\n $overlayElement.on( 'click', function( event ){\n var elementClasses = jQuery( event.target ).attr( 'class' ) || [];\n if( -1 !== elementClasses.indexOf( 'merge-tag-focus-overlay' ) ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n });\n\n var value = mergetags[0].replace( '{', '' );\n nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\n } else {\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n }\n\n } );\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're about to render a setting model that's a select and has 'fields' as the 'fill' setting, add all our field models to its options.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/itemSettingFill',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel ) {\n\t\t\tif ( 'fields' == settingModel.get( 'fill' ) ) {\n\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Modify the user's browser history when they click on a domain\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/confirmPublish',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:confirmPublish', this.confirmPublish );\n\t\t},\n\n\t\tconfirmPublish: function() {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t// Check to see if we need to add a submit button.\n\t\t\tif ( 1 == formModel.get( 'settings' ).get( 'add_submit' ) ) {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add', { type: 'submit', label: 'Submit', order: 9999 } );\n\t\t\t}\n\t\t\tformModel.set( 'show_publish_options', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to settings that utilise the Rich Text Editor\n *\n * @package Ninja Forms builder\n * @subpackage App - Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/rte',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\n\t\t\tnfRadio.channel( 'setting-type-rte' ).reply( 'renderOnChange', function(){ return false } );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'rte' ), 'init:settingModel', this.initSettingModel );\n\n\t\t\t// When an RTE setting is shown, re-render RTE.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'render:setting', this.renderSetting );\n\n\t\t\t// When an RTE setting view is destroyed, remove our RTE.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'destroy:setting', this.destroySetting );\n\n\t\t\t// When an element within the RTE is clicked, check to see if we should insert a link.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), '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\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 this.currentContext = {};\n\t\t},\n\n\t\tinitSettingModel: function( settingModel ) {\n\t\t\tsettingModel.set( 'hide_merge_tags', true );\n\t\t},\n\n\t\tinitRTE: function( settingModel, dataModel, settingView ) {\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\t\t\tvar mergeTags = this.mergeTags();\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 [ 'tools', [ 'mediaButton', 'mergeTags', 'codeview' ] ]\n\t\t\t];\n\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( {\n\t\t\t\ttoolbar: toolbar,\n\t\t\t\tbuttons: {\n\t\t\t\t\tlinkButton: linkButton,\n\t\t\t\t\tmergeTags: mergeTags,\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 callbacks: {\n\t\t\t\t \tonBlur: function( editor ) {\n\t\t\t\t \t\tvar value = editor.getValue();\n\t\t\t\t \t\tthat.updateDataModel( settingModel, dataModel, value );\n\t\t\t\t \t}\n\t\t\t\t }\n\t\t\t\t},\n\t\t\t\tprettifyHtml: true,\n\t\t\t\tcallbacks: {\n\t\t\t\t\tonBlur: function( e, context ) {\n\t\t\t\t\t\tvar value = jQuery( this ).summernote( 'code' );\n\t\t\t\t\t\tthat.updateDataModel( settingModel, dataModel, value );\n nfRadio.channel( 'summernote' ).trigger( 'blur', settingModel, dataModel, value );\n\t\t\t\t\t},\n onFocus: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'focus', e, this, context );\n },\n onKeydown: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'keydown', e, this, context );\n },\n onKeyup: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'keyup', e, this, context );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tupdateDataModel: function( settingModel, dataModel, value ) {\n\t\t\tvar name = settingModel.get( 'name' );\n\t\t\tvar before = dataModel.get( name );\n\t\t\tvar after = value;\n\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\n\n\t\t\tdataModel.set( settingModel.get( 'name' ), after );\n\t\t},\n\n\t\trenderSetting: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.initRTE( settingModel, dataModel,settingView );\n\t\t\tvar linkMenu = jQuery( settingView.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\tdestroySetting: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.removeRTE( settingModel, dataModel, settingView );\n\t\t},\n\n\t\tremoveRTE: function( settingModel, dataModel, settingView ) {\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( 'destroy' );\n\t\t},\n\n\t\tdrawerOpened: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.initRTE( settingModel, dataModel, settingView );\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: 'Insert Link',\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\tmergeTags: function( context ) {\n\t\t\tvar ui = jQuery.summernote.ui;\n\t\t\tvar mergeTagsButton = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-rte-merge-tags-button' );\n\t\t\treturn ui.button({\n\t\t\t\tclassName: 'dropdown-toggle merge-tags',\n\t\t\t\tcontents: mergeTagsButton({}),\n\t\t\t\ttooltip: 'Merge Tags'\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: 'Insert Media',\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.createRange' );\n\t\t\tcontext.invoke( 'editor.saveRange' );\n\t\t\tthis.currentContext = context;\n\t\t\t\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: 'Select a file',\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, settingModel, dataModel, settingView ) {\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\tthis.currentContext.invoke( 'editor.restoreRange' );\n\t\t\tif ( 'image' == media.type ) {\n\t\t\t\tthis.currentContext.invoke( 'editor.insertImage', media.url );\n\t\t\t} else {\n\t\t\t\tthis.currentContext.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\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingFieldSelect',[], function() {\n var controller = Marionette.Object.extend( {\n\n initialize: function() {\n\n // Bind field key listener to field-select setting type.\n this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', this.trackKeyChanges );\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-field-select' ), 'before:renderSetting', this.beforeRender );\n\n // Add setting change listener only in drawers with a field-select setting.\n this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', function() {\n this.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.maybeSwitchToFieldsDomain );\n });\n\n this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.autoOpenDrawer );\n\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.filterDrawerContents );\n this.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.SwitchToFieldsDomain );\n },\n\n trackKeyChanges: function( settingModel ) {\n settingModel.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', settingModel.updateKey );\n\n // Update selected field if the selected field's key changes.\n this.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.updateFieldMap );\n },\n\n updateFieldMap: function( dataModel, keyModel, settingModel ) {\n\n var oldKey = keyModel._previousAttributes[ 'key' ];\n var newKey = keyModel.get( 'key' );\n\n if( 'field-select' == settingModel.get( 'type' ) && dataModel.get( settingModel.get( 'name' ) ) == oldKey ) {\n\n dataModel.set( settingModel.get( 'name' ), newKey );\n }\n },\n\n beforeRender: function( settingModel, dataModel ) {\n\n var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n var fieldTypes = settingModel.get( 'field_types' );\n\n var options = [\n {\n label: '--',\n value: 0\n }\n ];\n _.each( fieldCollection.models, function( field ){\n\n if( dataModel.cid == field.cid ) return;\n\n if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length && ! _.contains( fieldTypes, field.get( 'type' ) ) ) return;\n\n var fieldFilter = settingModel.get( 'field_filter' );\n if( fieldFilter && 'undefined' != typeof fieldFilter[ field.get( 'type' ) ] ) {\n var bail = false;\n _.each( fieldFilter[ field.get( 'type' ) ], function( value, setting ){\n console.log( value + \":\" + field.get( setting ) );\n if( value != field.get( setting ) ) bail = true;\n } );\n if( bail ) return;\n }\n\n var value = field.get( 'key' );\n switch ( settingModel.get( 'field_value_format' ) ) {\n case 'key':\n value = field.get( 'key' );\n break;\n case 'merge_tag':\n default:\n value = '{field:' + field.get( 'key' ) + '}';\n }\n\n options.push({\n label: field.get( 'label' ),\n value: value\n });\n });\n\n if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length ) {\n _.each( fieldTypes, function( fieldType ){\n\n var fieldTypeModel = nfRadio.channel( 'fields' ).request( 'get:type', fieldType );\n\n options.push({\n label: '-- Add ' + fieldTypeModel.get( 'nicename' ) + ' Field',\n value: 'addField:' + fieldType,\n });\n } );\n }\n\n settingModel.set( 'options', options );\n },\n\n maybeSwitchToFieldsDomain: function( e, model, dataModel ) {\n\n if( 'field-select' != model.get( 'type' ) ) return;\n\n var name = model.get( 'name' );\n var value = dataModel.get( name );\n\n if( ! value ) return;\n\n var rubble = value.split( ':' );\n\n if( 'addField' != rubble[0] ) return;\n\n this.openDrawer = 'addField';\n this.filterDrawer = rubble[1];\n\n dataModel.set( name, '' );\n\n this.switchDomain = true;\n nfRadio.channel( 'app' ).request( 'close:drawer' );\n },\n\n SwitchToFieldsDomain: function() {\n if( this.switchDomain ) {\n var fieldDomainModel = nfRadio.channel( 'app' ).request( 'get:domainModel', 'fields' );\n nfRadio.channel('app').request('change:currentDomain', null, fieldDomainModel);\n this.switchDomain = null;\n }\n },\n\n autoOpenDrawer: function() {\n if( this.openDrawer ) {\n nfRadio.channel( 'app' ).request( 'open:drawer', this.openDrawer );\n this.openDrawer = null;\n }\n },\n\n filterDrawerContents: function() {\n if( this.filterDrawer ) {\n nfRadio.channel('drawer-addField').trigger('change:filter', this.filterDrawer);\n this.filterDrawer = null;\n }\n }\n });\n\n return controller;\n} );\n","/**\n * The Field List setting is a container of settings (like the Fieldset setting), in which its children are instantiated.\n * Unlike the Fieldset setting, Field List settings are dynamically created based on the list of form fields.\n *\n * Note: Field references in the dynamic setting names are based on field keys, which may change.\n * Unlike regular field key tracking, a new setting needs to be created with the same value as the previous.\n *\n * @package Ninja Forms builder\n * @subpackage Action Settings\n * @copyright (c) 2016 WP Ninjas\n * @author Kyle B. Johnson\n * @since 3.0\n */\ndefine( 'controllers/app/settingFieldList',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\n return Marionette.Object.extend( {\n\n /**\n * A reference list of Field List setting models.\n */\n fieldListSettings: [],\n\n initialize: function() {\n this.listenTo( nfRadio.channel( 'field-list' ), 'init:settingModel', this.registerFieldListSettings );\n this.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateFieldListSettingKeys );\n nfRadio.channel( 'field-list' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n },\n\n /**\n * Build a reference list of Field List setting models for later reference.\n *\n * @param settingModel\n */\n registerFieldListSettings: function( settingModel ){\n this.fieldListSettings.push( settingModel.get( 'name' ) );\n },\n\n /**\n * Field List settings contain field keys in the setting names.\n * When a field key changes, so too must the Field List setting name.\n *\n * @param fieldModel\n */\n updateFieldListSettingKeys: function( fieldModel ){\n\n // We are only interested in field key changes.\n if( 'undefined' == typeof fieldModel.changed.key ) return;\n\n var oldKey = fieldModel._previousAttributes.key;\n var newKey = fieldModel.changed.key;\n\n /*\n * This is an absolute (functional) mess of nesting. I apologize to my future self, or Kenny.\n *\n * Each setting of each action model must be checked against each registered Field List setting.\n */\n var that = this;\n _.each( Backbone.Radio.channel( 'actions' ).request( 'get:collection' ).models, function( actionModel ) {\n _.each( actionModel.attributes, function( value, setting ) {\n var lastChanged = ''; // Used to avoid resetting the change with a duplicate call.\n _.each( that.fieldListSettings, function( prefix ) {\n if( setting != prefix + '-' + oldKey || lastChanged == oldKey ) return;\n var oldValue = actionModel.get( prefix + '-' + oldKey );\n actionModel.set( prefix + '-' + newKey, oldValue );\n actionModel.set( prefix + '-' + oldKey, 0 );\n lastChanged = oldKey;\n });\n });\n });\n },\n\n /**\n * Set the view for Field List sub-settings, just like the Fieldset setting.\n *\n * @param settingModel\n * @returns {*}\n */\n getSettingChildView: function( settingModel ) {\n\n /**\n * Dynamically build field-list settings as needed for the view.\n */\n\n // Filter fields based on the field_types setting property.\n var fields = _.filter( nfRadio.channel( 'fields' ).request( 'get:collection' ).models, function( field ) {\n return _.contains( settingModel.get( 'field_types' ), field.get( 'type' ) );\n });\n\n // Map fields into setting definitions.\n var settings = _.map( fields, function( field ) {\n return {\n name: settingModel.get( 'name' ) + '-' + field.get( 'key' ),\n type: 'toggle',\n label: field.get( 'label' ),\n width: 'full'\n };\n });\n\n settingModel.set( 'settings', new settingCollection( settings ) );\n\n // return the child view.\n return fieldsetView;\n },\n\n });\n} );\n\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n *\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingHTML',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-html' ), 'before:renderSetting', this.init );\n },\n\n init: function( settingModel, dataModel ) {\n\n if( 'undefined' == settingModel.get( 'mirror' ) ) return;\n\n // Listen to a setting change inside of the dataModel.\n dataModel.on( 'change:' + settingModel.get( 'mirror' ), this.update, settingModel );\n },\n\n update: function( dataModel, changedSettingValue ) {\n\n // Mirror the default value setting value.\n dataModel.set( this.get( 'name' ), changedSettingValue );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingColor',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n // We don't want to re-render this setting type when the data changes.\n nfRadio.channel( 'setting-type-color' ).reply( 'renderOnChange', this.setRenderFalse );\n // We want to close any color pickers before we close our styling tab or drawer.\n this.listenTo( nfRadio.channel( 'setting-type-color' ), 'destroy:setting', this.closeColorPickers );\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-color' ), 'render:setting', this.initColorPicker );\n },\n\n initColorPicker: function( settingModel, dataModel, view ) {\n\n var name = settingModel.get( 'name' );\n var el = jQuery( view.el ).find( 'input' );\n\n jQuery( el ).wpColorPicker( {\n change: function( event, ui ){\n nfRadio.channel( 'app' ).request( 'change:setting', event, settingModel, dataModel, ui.color.toString() );\n }\n } );\n },\n\n setRenderFalse: function() {\n return false;\n },\n\n closeColorPickers: function( settingModel, dataModel, view ) {\n jQuery( view.el ).find( '.wp-color-picker' ).wpColorPicker( 'close' );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for the app to start.\n *\n * If the form is a new form, then highlight the Add New submenu item.\n * Otherwise, append an Edit Form submenu for context.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeMenu',[], function() {\n var controller = Marionette.Object.extend({\n\n editFormText: '',\n\n initialize: function () {\n this.editFormText = nfAdmin.editFormText || 'Edit Form';\n this.listenTo(nfRadio.channel('app'), 'after:appStart', this.changeMenu);\n this.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.formPublish );\n },\n\n changeMenu: function () {\n var form = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n if ( this.isNewForm( form.id ) ) {\n this.highlightAddNew();\n } else {\n this.appendEditForm();\n }\n },\n\n isNewForm: function( form_id ) {\n return isNaN( form_id );\n },\n\n highlightAddNew: function() {\n jQuery( '.wp-submenu li' ).removeClass( 'current' );\n jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().addClass( 'current' );\n },\n\n appendEditForm: function() {\n var html = '<li class=\"current\"><a href=\"#\">' + this.editFormText + '</a></li>';\n if ( jQuery( 'li a:contains(\"' + this.editFormText + '\")' ).length == 0 ) {\n jQuery( '.wp-submenu li' ).removeClass( 'current' );\n jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().after( html );\n }\n },\n\n formPublish: function( response ) {\n if ( 'publish' !== response.action ) return false;\n this.changeMenu();\n }\n });\n\n return controller;\n});\n","/**\n * When we click on a domain link, close the mobile menu.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for clicks on our app menu.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.closeMobileMenu );\n\t\t},\n\n\t\tcloseMobileMenu: function() {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).removeClass( 'nf-menu-expand' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Add a jBox notice to the screen.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'notices' ).reply( 'add', this.addNotice, this );\n\t\t\tnfRadio.channel( 'notices' ).reply( 'close', this.closeNotice, this );\n\t\t\tthis.notices = {};\n\t\t},\n\n\t\taddNotice: function( key, msg, options ) {\n\n\t\t\tvar appDefaults = {\n\t\t\t\tcontent: msg,\n\t\t\t\tcolor: 'green',\n\t\t\t\tzIndex:12000,\n\t\t\t\tconstructOnInit: true,\n\t\t\t\tstack: true,\n\t\t\t\tanimation: {\n\t\t\t\t\topen: 'flip',\n\t\t\t\t\tclose: 'flip'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar mobileDefaults = {\n\t\t\t\tposition: {\n\t\t\t\t\tx: 'center',\n\t\t\t\t\ty: 'top'\n\t\t\t\t},\n\t\t\t\tanimation: {\n\t\t\t\t\topen:'slide:top',\n\t\t\t\t\tclose:'slide:left'\n\t\t\t\t},\n\t\t\t\tautoClose: 2000,\n\t\t\t\toffset: {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 55\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar desktopDefaults = {\n\t\t\t\tattributes: {\n\t\t\t\t\tx: 'left',\n\t\t\t\t\ty: 'bottom'\n\t\t\t\t},\n\t\t\t\tautoClose: 4000\n\t\t\t};\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tvar defaults = mobileDefaults;\t\n\t\t\t} else {\n\t\t\t\tvar defaults = desktopDefaults;\n\t\t\t}\n\t\t\tdefaults = jQuery.extend( defaults, appDefaults );\n\n\t\t\tvar options = jQuery.extend( defaults, options );\n\t\t\t// console.log( options );\n\t\t\tthis.notices[ key ] = new jBox( 'Notice', options );\n\t\t},\n\n\t\tcloseNotice: function( key ) {\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\n\t\t\t\tthis.notices[ key ].close();\n\t\t\t}\n\t\t},\n\n\t\topenNotice: function( key ) {\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\n\t\t\t\tthis.notices[ key ].open();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Prompt the user to save if they attempt to leave the page with unsaved changes.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/unloadCheck',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tjQuery( window ).bind( 'beforeunload', this.maybePrompt );\n\t\t},\n\n\t\tmaybePrompt: function( model ) {\n\t\t\t// If our app is clean, don't show a warning.\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t\t\t\treturn 'You have unsaved changes.';\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Before we save data to the database (on preview update or publish), we check to see if we have anyone\n * that wants to update the 'formContent' form setting. This setting is used on the front-end to allow\n * for custom display of form fields. i.e. layout rows.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formContentFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our formContent view filter array.\n\t\t\t */\n\t\t\tthis.viewFilters = [];\n\t\t\tthis.saveFilters = [];\n\t\t\tthis.loadFilters = [];\n\n\t\t\t/*\n\t\t * Listen for requests to add formContent filters.\n\t\t\t */\n\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:saveFilter', this.addSaveFilter, 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:saveFilters', this.getSaveFilters, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:loadFilters', this.getLoadFilters, this );\n\t\t\t\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\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:saveFilter', this.addSaveFilter, 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 */\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:viewFilters', this.getViewFilters, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:saveFilters', this.getSaveFilters, 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\taddSaveFilter: function( callback, priority ) {\n\t\t\tthis.saveFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetSaveFilters: function() {\n\t\t\treturn this.saveFilters;\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","/**\n * Handles filters for our main content gutter views.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formContentGutterFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our gutter view filter array.\n\t\t\t */\n\t\t\tthis.leftFilters = [];\n\t\t\tthis.rightFilters = [];\n\t\t\t/*\n\t\t * Listen for requests to add gutter filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:leftFilter', this.addLeftFilter, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:rightFilter', this.addRightFilter, this );\n\n\t\t\t/*\n\t\t\t * Listen for requests to get our content gutter filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:leftFilters', this.getLeftFilters, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:rightFilters', this.getRightFilters, this );\n\t\t},\n\n\t\taddLeftFilter: function( callback, priority ) {\n\t\t\tthis.leftFilters[ priority ] = callback;\n\t\t},\n\n\t\taddRightFilter: function( callback, priority ) {\n\t\t\tthis.rightFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetLeftFilters: function() {\n\t\t\treturn this.leftFilters;\n\t\t},\n\n\t\tgetRightFilters: function() {\n\t\t\treturn this.rightFilters;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns a clone of a backbone collection with all the models' attributes looped through so that collections contained within are propely cloned.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cloneCollectionDeep',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:collectionDeep', this.cloneCollectionDeep, this );\n\t\t},\n\n\t\tcloneCollectionDeep: function( collection ) {\n\t\t\tvar models = [];\n\t\t\t// Loop through every model in our collection, clone it, and add it to our model array\n\t\t\t_.each( collection.models, function( model ) {\n\t\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\t\t\t\tmodels.push( newModel );\n\t\t\t} );\n\t\t\t// Create a new instance of our collection\n\t\t\treturn new collection.constructor( models, collection.options );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Tracks which keys have been pressed.\n * Currently only used by fields to see if they should duplicate or delete on click.\n * (Shift + D + click = delete) (Shift + C + click = duplicate)\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/trackKeyDown',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tkeys: [],\n\n\t\tinitialize: function() {\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * Track keydowns and store the keys pressed.\n\t\t\t */\n\t\t\t\n\t\t\tjQuery( document ).on( 'keydown', function( e ) {\n\t\t\t\tthat.keyDown( e, that );\n\t\t\t} );\n\n\t\t\tjQuery( document ).on( 'keyup', function( e ) {\n\t\t\t\tthat.keyUp( e, that );\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Get the keys currently being pressed, if any\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:keydown', this.getKeyDown, this );\n\t\t},\n\n\t\tkeyDown: function( e, context ) {\n\t\t\t/*\n\t\t\t * Add our keycode to our keys array.\n\t\t\t */\n\t\t\tcontext.keys[ e.keyCode ] = e.keyCode;\n\t\t},\n\n\t\tkeyUp: function( e, context ) {\n\t\t\t/*\n\t\t\t * Remove our keycode from our keys array.\n\t\t\t */\n\t\t\tif ( -1 != context.keys.indexOf( e.keyCode ) ) {\n\t\t\t\tdelete context.keys[ e.keyCode ];\n\t\t\t}\n\t\t},\n\n\t\tgetKeyDown: function() {\n\t\t\treturn this.keys;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Initialize the perfectscroll jQuery plugin\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/perfectScroll',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tmovedPos: false,\n\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When we init the main view, init our perfectscroll\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'show:main', this.initPerfectScroll );\n\n\t\t\t/*\n\t\t\t * When our drawer opens and closes, change the position of our scroll rail.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.moveRail );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:closeDrawer', this.resetRail );\n\t\t},\n\n\t\tinitPerfectScroll: function( view ) {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).parent().perfectScrollbar( {\n\t\t\t\t\tsuppressScrollX: true\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tjQuery( 'head' ).append( '<style id=\"ps-scrollbar-css\" type=\"text/css\"></style>' );\n\t\t},\n\n\t\tmoveRail: function() {\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tvar movedPos = jQuery( drawerEl ).outerWidth();\n\n\t\t\tjQuery( '#ps-scrollbar-css' ).text( '.ps-scrollbar-moved { right: ' + movedPos + 'px !important; } ' );\n\t\t\tjQuery( '#nf-main .ps-scrollbar-y-rail' ).addClass( 'ps-scrollbar-moved ' );\n\t\t\t\n\t\t},\n\n\t\tresetRail: function() {\n\t\t\tjQuery( '.ps-scrollbar-y-rail' ).removeClass( 'ps-scrollbar-moved ' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our type settings groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingGroupModel',[ 'models/app/settingCollection' ], function( SettingCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdisplay: false\n\t\t},\n\n\t\tinitialize: function( options ) {\n\t\t\tif ( false == this.get( 'settings' ) instanceof Backbone.Collection ) {\n\t\t\t\tthis.set( 'settings', new SettingCollection( this.get( 'settings' ) ) );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection of our type settings groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingGroupCollection',['models/app/settingGroupModel'], function( settingGroupModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: settingGroupModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Returns a new setting group collection.\n * Used to settings drawers for custom data models (i.e. not fields, actions, or advanced)\n * \n * @package Ninja Forms builder\n * @subpackage App - Edit Settings Drawer\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/getNewSettingGroupCollection',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for a new setting group collection\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingGroupCollectionDefinition', this.getNewSettingGroupCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a new instance of the setting group collection.\n\t\t *\n\t\t * @since 3.0\n\t\t * @return backbone.collection\n\t\t */\n\t\tgetNewSettingGroupCollection: function() {\n\t\t\treturn SettingGroupCollection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.0.30\n */\ndefine( 'controllers/app/settingMedia',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n // When the media button is clicked, open the media manager.\n this.listenTo( nfRadio.channel( 'setting-type-media' ), 'click:extra', this.clickExtra );\n },\n\n clickExtra: function( e, settingModel, dataModel, settingView ) {\n var textEl = jQuery( e.target ).parent().find( '.setting' );\n\n if ( jQuery( e.target ).hasClass( 'open-media-manager' ) ) {\n // If the frame already exists, re-open it.\n if ( this.meta_image_frame ) {\n this.meta_image_frame.open();\n return;\n }\n\n // Sets up the media library frame\n this.meta_image_frame = wp.media.frames.meta_image_frame = wp.media({\n title: 'Select a file',\n button: { text: 'insert' }\n });\n\n var that = this;\n\n // Runs when an image is selected.\n this.meta_image_frame.on('select', function(){\n // Grabs the attachment selection and creates a JSON representation of the model.\n var media_attachment = that.meta_image_frame.state().get('selection').first().toJSON();\n textEl.val( media_attachment.url ).change();\n });\n\n // Opens the media library frame.\n this.meta_image_frame.open();\n }\n },\n });\n\n return controller;\n} );\n","/**\n * Model for our field type\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/typeModel',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\tif ( false === this.get( 'settingGroups' ) instanceof Backbone.Collection ) {\n\t\t\t\tthis.set( 'settingGroups', new SettingGroupCollection( this.get( 'settingGroups' ) ) );\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'init:typeModel', this );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field type models. \n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/typeCollection',['models/app/typeModel'], function( typeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: typeModel,\n\t\ttype: false,\n\n\t\tinitialize: function( models, options ) {\n\t\t\t_.each( options, function( option, key ) {\n\t\t\t\tthis[ key ] = option;\n\t\t\t}, this );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Model that represents our field type section on the add new field drawer.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/typeSectionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tclasses: ''\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/typeSectionCollection',['models/fields/typeSectionModel'], function( typeSectionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: typeSectionModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Creates and stores a collection of field types. This includes all of the settings shown when editing a field.\n *\n * 1) Create our settings sections config\n * 2) Loops over our preloaded data and adds that to our field type collection\n *\n * Also responds to requests for data about field types\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/types',[\n\t\t'models/app/typeCollection',\n\t\t'models/fields/typeSectionCollection'\n\t],\n\tfunction(\n\t\tTypeCollection,\n\t\tSectionCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Config for our settings sections\n\t\t\tthis.sections = new SectionCollection( fieldTypeSections );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'init:typeModel', this.registerSection );\n\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( fieldTypeData, { type: 'fields' } );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:type', this.getFieldType, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeCollection', this.getTypeCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSections', this.getTypeSections, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:savedFields', this.getSavedFields, this );\n\n\t\t\t// Listen to clicks on field types\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:fieldType', this.addField );\n\t\t},\n\n\t\tregisterSection: function( typeModel ) {\n\t\t\tif ( 'fields' != typeModel.collection.type || ! typeModel.get( 'section' ) ) return;\n\n\t\t\tthis.sections.get( typeModel.get( 'section' ) ).get( 'fieldTypes' ).push( typeModel.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetFieldType: function( id ) {\n \treturn this.collection.get( id );\n },\n\n /**\n * Return the entire field type collection\n *\n * @since 3.0\n * @param string \t\t\t\tid \t[description]\n * @return backbone.collection \tfield type collection\n */\n\t\tgetTypeCollection: function( id ) {\n \treturn this.collection;\n },\n\n /**\n * Add a field type to our fields sortable when the field type button is clicked.\n *\n * @since 3.0\n * @param Object e event\n * @return void\n */\n addField: function( e ) {\n\t\t\tvar type = jQuery( e.target ).data( 'id' );\n\n\t\t\tif( e.shiftKey ){\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n\t\t\t\treturn;\n\t\t\t}\n\n \tvar fieldModel = nfRadio.channel( 'fields' ).request( 'add', {\n\t\t\t\ttype: type,\n\t\t\t\tlabel: nfRadio.channel( 'fields' ).request( 'get:type', type ).get( 'nicename' )\n\t\t\t});\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Field',\n\t\t\t\tlabel: fieldModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', fieldModel, null, label, data );\n\n\t\t\t// Re-Draw the Field Collection\n\t\t\tnfRadio.channel( 'fields' ).request( 'redraw:collection' );\n },\n\n /**\n * Return our field type settings sections\n *\n * @since 3.0\n * @return backbone.collection field type settings sections\n */\n getTypeSections: function() {\n return this.sections;\n },\n\n /**\n * Return our saved fields\n *\n * @since 3.0\n * @return backbone.collection\n */\n getSavedFields: function() {\n \tthis.sections.get( 'saved' );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Handles the logic for our field type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldTypeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our field type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addField' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the dragging of our field staging area\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/stagingDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start and stop of our field staging dragging\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.stopDrag );\n\t\t},\n\n\t\t/**\n\t\t * When the user starts dragging the staging area, we have to:\n\t\t * set the overflow property of the drawer to visible !important. If we don't, the button goes underneath the main section.\n\t\t * set the overflow proerty of the main to visible !important. If we don't, the dragged element goes underneath the drawer.\n\t\t * replace our helper with the stacked \"x fields\" template.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t context jQuery UI Draggable\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-staged-fields-drag' );\n\t\t\tjQuery( ui.helper ).html( html( { num: stagedFields.models.length } ) );\n\t\t\tjQuery( ui.helper ).prop( 'id', 'nf-staged-fields-drag' );\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.7' );\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging the staging area, we have to set the overflow property to hidden !important\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t context jQuery UI Draggable\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles most things related to our staging area:\n * 1) Creates a collection\n * 2) Listens for requests to CRUD items from the collection\n * 3) Adds our staged fields to the fields sortable when the drawer is closed\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/staging',['models/fields/stagingCollection'], function( stagingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our staged fields collection\n\t\t\tthis.collection = new stagingCollection();\n\t\t\t// Respond to requests related to our staging area.\n\t\t nfRadio.channel( 'fields' ).reply( 'add:stagedField', this.addStagedField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'remove:stagedField', this.removeStagedField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:staging', this.getStagingCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:staging', this.sortStagedFields, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:staging', this.clearStagedFields, this );\n\t\t\t// Listen to our remove staged field click event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'click:removeStagedField', this.removeStagedField );\n\t\t\t// Listen to our event that fires just before a drawer is closed.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'before:closeDrawer', this.beforeCloseDrawer );\n\t\t},\n\n\t\tgetStagingCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\t/**\n\t\t * Add a field to our staging area\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string type Type of field we're adding\n\t\t * @return tmpID\n\t\t */\n\t\taddStagedField: function( type, silent ) {\n\t\t\tvar silent = silent || false;\n\t\t\t// Get our type model from the string.\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t// Our tmp ID is a string with the time appended to make it unique.\n\t\t\tvar tmpID = 'nf-staged-field-' + jQuery.now();\n\t\t\t// Object that will be added to our staging collection.\n\t\t\tvar data = {\n\t\t\t\tid: tmpID,\n\t\t\t\t// i.e. firstname, textbox, etc.\n\t\t\t\tslug: fieldType.get( 'type' ),\n\t\t\t\t// i.e. First Name, Textbox, etc.\n\t\t\t\tnicename: fieldType.get( 'nicename' ),\n\t\t\t\t// i.e. calendar, envelope, etc.\n\t\t\t\ticon: fieldType.get( 'icon' )\n\t\t\t}\n\t\t\t// \n\t\t\tvar model = this.collection.add( data );\n\n\t\t\tif( ! silent ) nfRadio.channel( 'fields').trigger( 'add:stagedField', model );\n\n\t\t\treturn tmpID;\n\t\t},\n\n\t\t/**\n\t\t * Remove a field from staging\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te \tEvent\n\t\t * @param Backbone.model \tmodel \tstaged field model to remove\n\t\t * @return void\n\t\t */\n\t\tremoveStagedField: function( e, model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'remove:stagedField', model );\n\t\t},\n\n\t\t/**\n\t\t * Adds our staged fields to the main fields sortable before the drawer is closed.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tbeforeCloseDrawer: function() {\n\t\t\tif ( 0 != this.collection.models.length ) { // Make sure that we have models\n\t\t\t\t// Get our field collection.\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n\t\t\t\tvar fields = [];\n\t\t\t\t// Loop through our staging collection\n\t\t\t\t_.each( this.collection.models, function( model ) {\n\t\t\t\t\t// Get a tmp ID for our new field.\n\t\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\n\t\t\t\t\t// Create an object that can be added as a model.\n\t\t\t\t\tvar tmpField = { id: tmpID, label: model.get( 'nicename' ), type: model.get( 'slug' ) };\n\t\t\t\t\t// Add our new field.\n\t\t\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add', tmpField, false );\n\t\t\t\t\t// Add our field addition to our change log.\n\t\t\t\t\tvar label = {\n\t\t\t\t\t\tobject: 'Field',\n\t\t\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\t\t\tchange: 'Added',\n\t\t\t\t\t\tdashicon: 'plus-alt'\n\t\t\t\t\t};\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\tcollection: fieldCollection\n\t\t\t\t\t}\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\t\n\t\t\t\t} );\n\t\t\t\t// Trigger a reset on our field collection so that our view re-renders\n\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t// Empty the staging collection\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t\t// Sort our fields.\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', null, null, false );\n\t\t},\n\n\t\t/**\n\t\t * Sort our staging area by the 'order' attribute.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tsortStagedFields: function() {\n\t\t\t// Get our staged fields sortable.\n\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t// Get the current order using jQuery sortable. Will be an array of IDs: [tmp-blah, tmp-blah]\n\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t// Loop through our models\n\t\t\t_.each( this.collection.models, function( field ) {\n\t\t\t\t// Search our order array for this field.\n\t\t\t\tvar search = field.get( 'id' );\n\t\t\t\tvar pos = order.indexOf( search );\n\t\t\t\t// Update our staged field model with the new order.\n\t\t\t\tfield.set( 'order', pos );\n\t\t\t} );\n\t\t\t// Sort our staging collection.\n\t\t\tthis.collection.sort();\n\t\t},\n\n\t\tclearStagedFields: function() {\n\t\t\tthis.collection.reset();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to our staged fields sortable.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/stagingSortable',['models/fields/stagingCollection'], function( stagingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our field type draggables\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\n\t\t\t// Listen to our sortable events\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'receive:stagedFields', this.receiveStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'over:stagedFields', this.overStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'out:stagedFields', this.outStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'start:stagedFields', this.startStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stop:stagedFields', this.stopStagedFields );\n\t\t},\n\n\t\t/**\n\t\t * Change our dropped field type helper so that it matches the other items in our sortable.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI item\n\t\t * @return void\n\t\t */\n\t\treceiveStagedFields: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drop:fieldType', type );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add an active class to our sortable when a field type item is dragged\n\t\t * \n\t\t * @since 3.0\n\t\t */\n\t\taddActiveClass: function() {\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\tjQuery( stagedFieldsEl ).addClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * Remove the active class from our sortable when the field type item is dropped.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tremoveActiveClass: function() {\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\tjQuery( stagedFieldsEl ).removeClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * When the field type item is dragged over our sortable, we change the helper to match the sortable items.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @param Object \tui jQuery UI Element\n\t\t * @return void\n\t\t */\n\t\toverStagedFields: function( e, ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t\tvar nicename = fieldType.get( 'nicename' );\n\t\t\t\tthis.currentHelper = ui.helper \n\t\t\t\tjQuery( ui.helper ).html( nicename + '<span class=\"dashicons dashicons-dismiss\"></span>' );\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-item-dock' ).css( { 'opacity': '0.8', 'width': '', 'height': '' } );\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * When a field type item is moved away from our sortable, we change the helper to its previous appearance\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toutStagedFields: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\t\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-item-dock' ).addClass( 'nf-field-type-button' );\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t},\n\n\t\t/**\n\t\t * When a user starts to drag a sortable item, we need to set a few properties on the item and the helper.\n\t\t * These keep the original item in place while dragging and changes the opacity of the helper.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartStagedFields: function( ui ) {\n\t\t\tjQuery( ui.item ).show();\n\t\t\tjQuery( ui.item ).css( { 'display': 'inline', 'opacity': '0.7' } );\n\t\t\tjQuery( ui.helper ).css( 'opacity', '0.5' );\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging a sortable item, remove our opacity setting and remove the helper item.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopStagedFields: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Filters our field type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/filterTypes',['models/fields/typeSectionCollection'], function( fieldTypeSectionCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'change:filter', this.filterFieldTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our field types in the add new field drawer\n\t\t * \n\t\t * Takes a search string and finds any field types that match either the name or alias.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string\t search \tstring being searched for\n\t\t * @param object \t e \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterFieldTypes: function( search, e ) {\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != jQuery.trim( search ) ) {\n \t\tvar filtered = [];\n \t\t/**\n \t\t * Call the function that actually filters our collection,\n \t\t * and then loop through our collection, adding each model to our filtered array.\n \t\t */\n \t\t_.each( this.filterCollection( search ), function( model ) {\n \t\t\tfiltered.push( model.get( 'id' ) );\n \t\t} );\n\n \t\t// Create a new Field Type Section collection with the filtered array.\n \t\tvar filteredSectionCollection = new fieldTypeSectionCollection( [\n\t\t\t\t{ \n\t\t\t\t\tid: 'filtered',\n\t\t\t\t\tnicename: 'Filtered Fields',\n\t\t\t\t\tfieldTypes: filtered\n\t\t\t\t}\n\t\t\t\t] );\n\n \t\t// Request that our field types filter be applied, passing the collection we created above.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:fieldTypes', filteredSectionCollection );\n \t\t// If we've pressed the 'enter' key, add the field to staging and clear the filter.\n \t\tif ( 'undefined' != typeof e && e.addObject ) {\n \t\t\tif ( 0 < filtered.length ) {\n \t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', filtered[0] );\n \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n \t\t\t}\n \t\t}\n \t} else {\n \t\t// Clear our filter if the search text is empty.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n \t}\n },\n\n /**\n * Search our field type collection for the search string.\n * \n * @since 3.0\n * @param string\t search \tstring being searched for\n * @return backbone.collection\n */\n filterCollection: function( search ) {\n \tsearch = search.toLowerCase();\n \t// Get our list of field types\n \tvar collection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n \t/*\n \t * Backbone collections have a 'filter' method that loops through every model,\n \t * waiting for you to return true or false. If you return true, the model is kept.\n \t * If you return false, it's removed from the filtered result.\n \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'type' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles all the actions/functions related to our main field sortable.\n * All of the actual logic for our sortable is held here; the view just calls it using nfRadio.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/sortable',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When our field type buttons are dragged, we need to add or remove the active (blue) class.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\n\t\t\t// When our field staging is dragged, we need to add or remove the active (blue) class.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.addActiveClass );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.removeActiveClass );\n\t\t\t\n\t\t\t/*\n\t\t\t * Handles all the events fired by our sortable:\n\t\t\t * receive - dropped from type button or staging\n\t\t\t * over - dragging within or over the sortable\n\t\t\t * out - leaving the sortable\n\t\t\t * stop - stopped sorting/dragging\n\t\t\t * start - started sorting/dragging\n\t\t\t * update - stopped sorting/dragging and order has changed\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'receive:fieldsSortable', this.receiveFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'over:fieldsSortable', this.overfieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'out:fieldsSortable', this.outFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'stop:fieldsSortable', this.stopFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'start:fieldsSortable', this.startFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:fieldsSortable', this.updateFieldsSortable, this );\n\t\t},\n\n\t\t/**\n\t\t * Add the active class to our sortable so that its border is blue.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\taddActiveClass: function() {\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-active' );\t\n\t\t},\n\n\t\t/**\n\t\t * Remove the active class from our sortable\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tremoveActiveClass: function() {\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * Fires when we drop a field type button or staging onto our sortable\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\treceiveFieldsSortable: function( ui ) {\n\t\t\t/*\n\t\t\t * We have to do different things if we're dealing with a field type button or staging area.\n\t\t\t */ \n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type Button\n\t\t\t\t// Get our type string\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\t// Add a field (returns the tmp ID )\n\t\t\t\tvar tmpID = this.addField( type, false );\n\t\t\t\t/*\n\t\t\t\t * Update our helper id to the tmpID.\n\t\t\t\t * We do this so that when we sort, we have the proper ID.\n\t\t\t\t */ \n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\n\t\t\t\t// Remove the helper. Gets rid of a weird type artifact.\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t\t// Trigger a drop field type event.\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'drop:fieldType', type, tmpID );\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// Later, we want to reference 'this' context, so we define it here.\n\t\t\t\tvar that = this;\n\t\t\t\t// Make sure that our staged fields are sorted properly.\t\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\t// Grab our staged fields.\n\t\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\t\t// Get our current field order.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\t\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Sortable isn't empty\n\t\t\t\t\t// If we're dealing with a sortable that isn't empty, get the order.\n\t\t\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t\t} else { // Sortable is empty\n\t\t\t\t\t// Sortable is empty, all we care about is our staged field draggable.\n\t\t\t\t\tvar order = ['nf-staged-fields-drag'];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Get the index of our droped element.\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\n\t\t\t\t// Loop through each staged fields model and insert a field.\n\t\t\t\tvar tmpIDs = [];\n\t\t\t\t_.each( stagedFields.models, function( field, index ) {\n\t\t\t\t\t// Add our field.\n\t\t\t\t\tvar tmpID = that.addField( field.get( 'slug' ) );\n\t\t\t\t\t// Add this newly created field to our order array.\n\t\t\t\t\torder.splice( insertedAt + index, 0, tmpID );\n\t\t\t\t} );\n\n\t\t\t\t// Remove our dropped element from our order array.\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\t\t\t\torder.splice( insertedAt, 1 );\n\t\t\t\t// Sort our fields\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', order );\n\t\t\t\t// Clear our staging\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'clear:staging' );\n\t\t\t\t// Remove our helper. Fixes a weird artifact.\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a field.\n\t\t * Builds the object necessary to add a field to the field model collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \ttype field type\n\t\t * @param boolean \tsilent add silently\n\t\t * @return string \ttmpID\n\t\t */\n\t\taddField: function( type, silent ) {\n\t\t\t// Default to false\n\t\t\tsilent = silent || false;\n\t\t\t// Get our field type model\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type ); \n\t\t\t// Get our tmp ID\n\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\n\t\t\t// Add our field\n\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add', { id: tmpID, label: fieldType.get( 'nicename' ), type: type }, silent );\n\t\t\t// Add our field addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: 'Field',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\n\t\t\treturn tmpID;\n\t\t},\n\n\t\t/**\n\t\t * When the user drags a field type or staging over our sortable, we need to modify the helper.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toverfieldsSortable: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\n\t\t\t\t// String type\n\t\t\t\tvar type = jQuery( ui.helper ).data( 'id' );\n\t\t\t\t// Get our field type model.\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t\t// Get our field type nicename.\n\t\t\t\tvar label = fieldType.get( 'nicename' );\n\t\t\t\t// Get our sortable element.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\t// Get our fieldwidth.\n\t\t\t\tvar fieldWidth = jQuery( sortableEl ).width();\n\t\t\t\t// Set our currentHelper to an object var so that we can access it later.\n\t\t\t\tthis.currentHelper = ui.helper;\n\t\t\t\t// Update our helper label.\n\t\t\t\tjQuery( ui.helper ).html( label );\n\t\t\t\t// Remove the field type draggable classes and add sortable classes.\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-field-wrap' ).css( { 'width': fieldWidth, 'height': '50px' } );\t\t\t\t\t\t\n\t\t\t\t// Add our hover class if our sortable has been initialized.\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// Get our sortable, and if it's initialized add our hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When the user moves a draggable outside of the sortable, we need to change the helper.\n\t\t * This returns the item to its pre-over state.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toutFieldsSortable: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\n\t\t\t\t/*\n\t\t\t\t * Get our helper clone.\n\t\t\t\t * This will let us access the previous label and classes of our helper.\n\t\t\t\t */ \n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\n\t\t\t\t// Set our helper label, remove our sortable class, and add the type class back to the type draggable.\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-field-wrap' ).addClass( 'nf-field-type-button' ).css( { 'width': '', 'height': '' } );\n\t\t\t\t// Get our sortable and if it has been intialized, remove the droppable hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// If we've initialized our sortable, remove the droppable hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging in the sortable:\n\t\t * remove our opacity setting\n\t\t * remove our ui helper\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopFieldsSortable: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:stop', ui );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging in the sortable:\n\t\t * add an opacity setting of 0.5\n\t\t * show our item (jQuery hides the original item by default)\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartFieldsSortable: function( ui ) {\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \n\t\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\n\t\t\t}\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:start', ui );\n\t\t},\n\n\t\t/**\n\t\t * Sort our fields when we change the order.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tupdateFieldsSortable: function( ui, sortable ) {\n\t\t\t\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\n\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \n\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\tvar dragFieldID = jQuery( ui.item ).prop( 'id' ).replace( 'field-', '' );\n\t\t\t\tvar dragModel = fieldCollection.get( dragFieldID );\n\n\t\t\t\t// Add our change event to the change tracker.\n\t\t\t\tvar data = { fields: [] };\n\t\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\t\tvar oldPos = field._previousAttributes.order;\n\t\t\t\t\tvar newPos = field.get( 'order' );\n\t\t\t\t\t\n\t\t\t\t\tdata.fields.push( {\n\t\t\t\t\t\tmodel: field,\n\t\t\t\t\t\tattr: 'order',\n\t\t\t\t\t\tbefore: oldPos,\n\t\t\t\t\t\tafter: newPos\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t\tvar label = {\n\t\t\t\t\tobject: 'Field',\n\t\t\t\t\tlabel: dragModel.get( 'label' ),\n\t\t\t\t\tchange: 'Re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\n\t\t\t\t\tdashicon: 'sort'\n\t\t\t\t};\n\n\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortFields', dragModel, null, label, data );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles interactions with our field collection.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/data',['models/fields/fieldCollection', 'models/fields/fieldModel'], function( fieldCollection, fieldModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tadding: false,\n\t\tremoving: false,\n\t\t\n\t\tinitialize: function() {\n\t\t\t// Load our field collection from our localized form data\n\t\t\tthis.collection = new fieldCollection( preloadedFormData.fields );\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a field is removed so that we can add it to our 'deleted_fields' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about fields and to update/change/delete fields from our collection.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:collection', this.getFieldCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:field', this.getField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'redraw:collection', this.redrawFieldCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:tmpID', this.getTmpFieldID, this );\n\n\t\t\tnfRadio.channel( 'fields' ).reply( 'add', this.addField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'delete', this.deleteField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:fields', this.sortFields, this );\n\n\t\t\t/*\n\t\t\t * Respond to requests to set our 'adding' and 'removing' state. This state is used to track whether or not\n\t\t\t * we should run animations in our fields collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:adding', this.getAdding, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:adding', this.setAdding, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:removing', this.getRemoving, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:removing', this.setRemoving, this );\n\t\t},\n\n\t\tgetFieldCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tredrawFieldCollection: function() {\n\t\t\tthis.collection.trigger( 'reset', this.collection );\n\t\t},\n\n\t\tgetField: function( id ) {\n\t\t\tif ( this.collection.findWhere( { key: id } ) ) {\n\t\t\t\t/*\n\t\t\t\t * First we check to see if a key matches what we were sent.\n\t\t\t\t */\t\t\t\t\n\t\t\t\treturn this.collection.findWhere( { key: id } );\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * If it doesn't, we try to return an ID that matches.\n\t\t\t\t */\n\t\t\t\treturn this.collection.get( id );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a field to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \t\t\tfield data to insert\n\t\t * @param bool \t\tsilent \t\t\tprevent events from firing as a result of adding\n\t\t * @param bool \trenderTrigger\tshould this cause the view to re-render?\n\t\t * @param string \taction\t\t\taction context - are we performing a higher level action? i.e. duplicate\n\t\t */\n\t\taddField: function( data, silent, renderTrigger, action ) {\n\n\t\t\t/*\n\t\t\t * Set our fields 'adding' value to true. This enables our add field animation.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', true );\n\n\t\t\tsilent = silent || false;\n\t\t\taction = action || '';\n\t\t\trenderTrigger = ( 'undefined' == typeof renderTrigger ) ? true : renderTrigger;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tif ( 'undefined' == typeof ( data.id ) ) {\n\t\t\t\t\tdata.id = this.getTmpFieldID();\n\t\t\t\t}\n\t\t\t\tvar model = new fieldModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\t// console.log( model );\n\n\t\t\t/*\n\t\t\t * TODO: Add an nfRadio message filter for the model variable.\n\t\t\t * Currently, we manually replace for saved fields; this should be moved to a separate controller.\n\t\t\t * \n\t\t\t * If we're adding a saved field, make sure that we set the type to the parentType.\n\t\t\t */\n\n\t\t\tif ( jQuery.isNumeric( model.get( 'type' ) ) ) {\n\t\t\t\tvar savedType = nfRadio.channel( 'fields' ).request( 'get:type', model.get( 'type' ) );\n\t\t\t\tmodel.set( 'type', savedType.get( 'parentType' ) );\n\t\t\t}\n\n\t\t\tvar newModel = this.collection.add( model, { silent: silent } );\n\t\t\t\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'add:field', model );\n\t\t\tif ( renderTrigger ) {\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'render:newField', newModel, action );\n\t\t\t}\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'after:addField', model );\n\t\t\t\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Update a field setting by ID\n\t\t * \n\t\t * @since 3.0\n\t\t * @param int \t\tid field id\n\t\t * @param string \tname setting name\n\t\t * @param mixed \tvalue setting value\n\t\t * @return void\n\t\t */\n\t\tupdateFieldSetting: function( id, name, value ) {\n\t\t\tvar fieldModel = this.collection.get( id );\n\t\t\tfieldModel.set( name, value );\n\t\t},\n\n\t\t/**\n\t\t * Get our fields sortable EL\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Array \torder optional order array like: [field-1, field-4, field-2]\n\t\t * @return void\n\t\t */\n\t\tsortFields: function( order, ui, updateDB ) {\n\t\t\tif ( null == updateDB ) {\n\t\t\t\tupdateDB = true;\n\t\t\t}\n\t\t\t// Get our sortable element\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Make sure that sortable is enabled\n\t\t\t\t// JS ternerary for setting our order\n\t\t\t\tvar order = order || jQuery( sortableEl ).sortable( 'toArray' );\n\n\t\t\t\t// Loop through all of our fields and update their order value\n\t\t\t\t_.each( this.collection.models, function( field ) {\n\t\t\t\t\t// Get our current position.\n\t\t\t\t\tvar oldPos = field.get( 'order' );\n\t\t\t\t\tvar id = field.get( 'id' );\n\t\t\t\t\tif ( jQuery.isNumeric( id ) ) {\n\t\t\t\t\t\tvar search = 'field-' + id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar search = id;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Get the index of our field inside our order array\n\t\t\t\t\tvar newPos = order.indexOf( search ) + 1;\n\t\t\t\t\tfield.set( 'order', newPos );\n\t\t\t\t} );\n\t\t\t\tthis.collection.sort();\n\n\t\t\t\tif ( updateDB ) {\n\t\t\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\t\t\t// Update our preview\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Delete a field from our collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tfield model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteField: function( model ) {\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'delete:field', model );\n\t\t\tthis.removing = true;\n\t\t\tthis.collection.remove( model );\n\t\t\t\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\t\t/**\n\t\t * Return a new tmp id for our fields.\n\t\t * Gets the field collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpFieldID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t},\n\n\t\tgetAdding: function() {\n\t\t\treturn this.adding;\n\t\t},\n\n\t\tsetAdding: function( val ) {\n\t\t\tthis.adding = val;\n\t\t},\n\n\t\tgetRemoving: function() {\n\t\t\treturn this.removing;\n\t\t},\n\n\t\tsetRemoving: function( val ) {\n\t\t\tthis.removing = val;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our repeater option.\n * \n * @package Ninja App builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/optionRepeaterModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\terrors: {},\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// When we add errors to the option row, run a function.\n\t\t\tthis.on( 'change:errors', this.changeErrors, this );\n\t\t},\n\n\t\t/**\n\t\t * When we change the errors on our model, check to see if we should add or remove \n\t\t * the error from the setting that this option is a part of.\n\t\t *\n\t\t * Adding an error to the setting model simply disables the drawer and other\n\t\t * navigation. As long as we have one option with an error, it should be set to true.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeErrors: function( model ) {\n\t\t\t/*\n\t\t\t * The errors attribute will be an object, so if we don't have any keys, it's empty.\n\t\t\t * If we have an empty object, check to see if we can remove the error from our setting model.\n\t\t\t */\n\n\t\t\tif ( 0 == _.size( model.get( 'errors' ) ) ) {\n\t\t\t\t/*\n\t\t\t\t * Loop through our collection to see if we have any other errors.\n\t\t\t\t */\n\t\t\t\tvar errorsFound = false;\n\t\t\t\t_.each( model.collection.models, function( opt ) {\n\t\t\t\t\tif ( 0 != _.size( opt.get( 'errors' ) ) ) {\n\t\t\t\t\t\terrorsFound = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( ! errorsFound ) {\n\t\t\t\t\tmodel.collection.settingModel.set( 'error', false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * We have errors, so make sure that the setting model has an error set.\n\t\t\t\t */\n\t\t\t\tmodel.collection.settingModel.set( 'error', true );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Model that represents our list options.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/optionRepeaterCollection',['models/app/optionRepeaterModel'], function( listOptionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: listOptionModel,\n\t\tcomparator: 'order',\n\n\t\tinitialize: function( models, options ) {\n\t\t\t// Listen to the 'sort' event\n\t\t\tthis.on( 'sort', this.changeCollection, this );\n\t\t\t// Listen to the 'add' event\n\t\t\tthis.on( 'add', this.addOption, this );\n\t\t\tthis.settingModel = options.settingModel;\n\t\t},\n\n\t\tchangeCollection: function() {\n\t\t\t// Trigger a 'sort:options' event so that our field model can update\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:options', this );\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'sort:options', this );\n\t\t},\n\n\t\taddOption: function( model, collection ) {\n\t\t\tmodel.set( 'settingModel', this.settingModel );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","define( 'views/app/drawer/optionRepeaterError',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'nf-error',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-error',\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\trenderErrors: function() {\n\t\t\t\t if ( 'undefined' != typeof that.errors ) {\n \t\t\t\t\treturn that.errors[ Object.keys( errors )[0] ];\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/optionRepeaterOption',['views/app/drawer/optionRepeaterError'], function( ErrorView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'nf-table-row',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-default-row',\n\t\tid: function() {\n\t\t\treturn this.model.cid;\n\t\t},\n\n\t\tregions: {\n\t\t\terror: '.nf-option-error'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.settingModel = data.settingModel;\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tthis.collection = data.collection;\n\t\t\tthis.columns = data.columns;\n\t\t\tthis.parentView = data.parentView;\n\t\t\tthis.model.on( 'change:errors', this.renderErrors, this );\n\n\t\t\t// Removed because the re-render was breaking tag insertion for merge tags.\n\t\t\t// this.model.on( 'change', this.render, this );\n\n\t\t\tif ( 'undefined' != typeof this.settingModel.get( 'tmpl_row' ) ) {\n\t\t\t\tthis.template = '#' + this.settingModel.get( 'tmpl_row' );\n\t\t\t}\n\n\t\t\tthis.hasErrors = false;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\t\n\t\t\tthis.model.off( 'change', this.render );\n\t\t\tthis.model.off( 'change:errors', this.renderErrors );\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\t/*\n\t\t\t * We want to escape any HTML being output for our label.\n\t\t\t */\n\t\t\tif ( this.model.get( 'label' ) ) {\n\t\t\t\tvar label = this.model.get( 'label' );\n\t\t\t\tthis.model.set( 'label', _.escape( label ), { silent: true } );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.settingModel.get( 'name' ) + '-option' ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\t/*\n\t\t\t * We want to unescape any HTML being output for our label.\n\t\t\t */\n\t\t\tif ( this.model.get( 'label' ) ) {\n\t\t\t\tvar label = this.model.get( 'label' );\n\t\t\t\tthis.model.set( 'label', _.unescape( label ), { silent: true } );\n\t\t\t}\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( this.model.get( 'new' ) ) {\n\t\t\t\tjQuery( this.el ).find( 'input:first' ).focus();\n\t\t\t\tthis.model.set( 'new', false );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .setting': 'changeOption',\n\t\t\t'click .nf-delete': 'deleteOption',\n\t\t\t'keyup': 'keyupOption'\n\t\t},\n\n\t\tchangeOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'change:option', e, this.model, this.dataModel, this.settingModel, this );\n\t\t},\n\n\t\tdeleteOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:deleteOption', this.model, this.collection, this.dataModel, this );\n\t\t},\n\n\t\tkeyupOption: function( e ) {\n\t\t\tthis.maybeAddOption( e );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n\t\t},\n\n\t\tmaybeAddOption: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel, this );\n\t\t\t\tjQuery( this.parentView.children.findByIndex(this.parentView.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n\t\t\t}\n\t\t},\n\n\t\trenderErrors: function() {\n\t\t\t\n\t\t\t// if ( jQuery.isEmptyObject( this.model.get( 'errors' ) ) ) {\n\t\t\t// \treturn false;\n\t\t\t// }\n\n\t\t\t/*\n\t\t\t * We don't want to redraw the entire row, which would remove focus from the eq textarea,\n\t\t\t * so we add and remove error classes manually.\n\t\t\t */\n\t\t\tif ( 0 == Object.keys( this.model.get( 'errors' ) ) ) {\n if ( this.hasErrors ) {\n\t\t\t\t this.error.empty();\n\t\t\t\t jQuery( this.el ).removeClass( 'nf-error' );\n }\n\t\t\t} else {\n\t\t\t\tthis.hasErrors = true;\n\t\t\t\tthis.error.show( new ErrorView( { model: this.model } ) );\n\t\t\t\tjQuery( this.el ).addClass( 'nf-error' );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\tgetColumns: function() {\n\t\t\t\t\treturn that.columns;\n\t\t\t\t},\n\t\t\t\trenderFieldSelect: function( dataID, value ){\n\t\t\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tvar _return = '<label class=\"nf-select\"><select class=\"setting\" data-id=\"' + dataID + '\">';\n\t\t\t\t\tfields.each( function( field ){\n\t\t\t\t\t\tvar selected = ( value == field.get( 'key' ) ) ? ' selected' : '';\n\t\t\t\t\t\t_return += '<option value=\"' + field.get( 'key' ) + '\"' + selected + '>' + field.get( 'label' ) + '</option>';\n\t\t\t\t\t});\n\t\t\t\t\t_return += '</select><div></div></label>';\n\t\t\t\t\treturn _return;\n\t\t\t\t},\n\t\t\t\trenderOptions: function( column, value ) {\n\n\t\t\t\t\tif( 'undefined' == typeof that.options.columns[ column ] ) return;\n\n\t\t\t\t\tvar html = '';\n\t\t\t\t\t_.each( that.options.columns[ column ].options, function( option ){\n\t\t\t\t\t\tvar selected = ( value == option.value ) ? ' selected' : '';\n\t\t\t\t\t\thtml += '<option value=\"' + option.value + '\"' + selected + '>' + option.label + '</option>';\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\treturn html;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/app/drawer/optionRepeaterEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'tr',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-empty'\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/optionRepeaterComposite',['views/app/drawer/optionRepeaterOption', 'views/app/drawer/optionRepeaterEmpty', 'models/app/optionRepeaterCollection'], function( listOptionView, listEmptyView, listOptionCollection ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-wrap',\n\t\tchildView: listOptionView,\n\t\temptyView: listEmptyView,\n\t\treorderOnSort: false,\n\n\t\tinitialize: function( data ) {\n\n\t\t\t/*\n\t\t\t * Our options are stored in our database as objects, not collections.\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n\t\t\t */ \n\t\t\tvar optionCollection = data.dataModel.get( this.model.get( 'name' ) );\n\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: this.model } );\n\t\t\t\toptionCollection.add( data.dataModel.get( this.model.get( 'name' ) ) );\n\t\t\t\tdata.dataModel.set( this.model.get( 'name' ), optionCollection, { silent: true } );\n\t\t\t}\n\n\t\t\tthis.collection = optionCollection;\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tthis.childViewOptions = { parentView: this, settingModel: this.model, collection: this.collection, dataModel: data.dataModel, columns: this.model.get( 'columns' ) };\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\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\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\t\tvar that = this;\n\t\t\tjQuery( this.el ).find( '.nf-list-options-tbody' ).sortable( {\n\t\t\t\thandle: '.handle',\n\t\t\t\thelper: 'clone',\n\t\t\t\tplaceholder: 'nf-list-options-sortable-placeholder',\n\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\topacity: 0.95,\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'start:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'stop:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'update:optionSortable', ui, this, that );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\n\t\t},\n\n\t\tonAttach: function() {\n \n\t\t\tvar importLink = jQuery( this.el ).find( '.nf-open-import-tooltip' );\n\t\t\tvar jBox = jQuery( importLink ).jBox( 'Tooltip', {\n title: '<h3>Please enter your options below:</h3>',\n content: jQuery( this.el ).find( '.nf-import-options' ),\n trigger: 'click',\n closeOnClick: 'body',\n closeButton: 'box',\n offset: { x: 20, y: 0 },\n addClass: 'import-options',\n\n onOpen: function() {\n \tvar that = this;\n \tsetTimeout( function() { jQuery( that.content ).find( 'textarea' ).focus(); }, 200 );\n }\n } );\n\n\t\t\tjQuery( this.el ).find( '.nf-import' ).on( 'click', { view: this, jBox: jBox }, this.clickImport );\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderHeaders: function() {\n\t \t\t\tvar columns = '<div> </div>';\n\t \t\t\t_.each( this.columns, function( col ) {\n\t \t\t\t\tcolumns += '<div>' + col.header + '</div>';\n\t \t\t\t} );\n\t \t\t\tcolumns += '<div> </div>';\n\t\t\t\t\treturn columns;\n\t\t\t\t},\n\n\t \t\trenderSetting: function() {\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( this );\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\n\t\t\t\trenderError: function() {\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\treturn this.error;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\n\t\t\t\trenderFieldsetClasses: function() {\n\t\t\t\t\treturn that.model.get( 'name' );\n\t\t\t\t},\n\n\t\t\t\tcurrencySymbol: function() {\n\t\t\t\t\treturn nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' ) || nfi18n.currency_symbol;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.nf-list-options-tbody' ).append( childView.el );\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-add-new': 'clickAddOption',\n\t\t\t'click .extra': 'clickExtra'\n\t\t},\n\n\t\tclickAddOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel );\n\t\t\tjQuery( this.children.findByIndex(this.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:extra', e, this.collection, this.dataModel );\n\t\t\tnfRadio.channel( 'option-repeater-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.collection, this.dataModel );\n\t\t},\n\n\t\tclickImport: function( e ) {\n\t\t\tvar textarea = jQuery( e.data.jBox.content ).find( 'textarea' );\n\t\t\tvar value = textarea.val().trimLeft().trimRight();\n\t\t\t/*\n\t\t\t * Return early if we have no strings.\n\t\t\t */\n\t\t\tif ( 0 == value.length ) {\n\t\t\t\te.data.jBox.close();\n\t\t\t\treturn false;\n\t\t\t}\t\t\t\n\t\t\t/*\n\t\t\t * Split our value based on new lines.\n\t\t\t */\n\n\t\t\tvar lines = value.split(/\\n/);\n\t\t\tif ( _.isArray( lines ) ) {\n\t\t\t\t/*\n\t\t\t\t * Loop over \n\t\t\t\t */\n\t\t\t\t_.each( lines, function( line ) {\n\t\t\t\t\tvar row = line.split( ',' );\n\t\t\t\t\tvar label = row[0];\n\t\t\t\t\tvar value = row[1] || jQuery.slugify( label, { separator: '-' } );\n\t\t\t\t\tvar calc = row[2] || '';\n\n\t\t\t\t\tlabel = label.trimLeft().trimRight();\n\t\t\t\t\tvalue = value.trimLeft().trimRight();\n\t\t\t\t\tcalc = calc.trimLeft().trimRight();\n\t\t\t\t\t/*\n\t\t\t\t\t * Add our row to the collection\n\t\t\t\t\t */\n\t\t\t\t\tvar model = e.data.view.collection.add( { label: row[0], value: value, calc: calc } );\n\t\t\t\t\t// Add our field addition to our change log.\n\t\t\t\t\tvar label = {\n\t\t\t\t\t\tobject: 'field',\n\t\t\t\t\t\tlabel: row[0],\n\t\t\t\t\t\tchange: 'Option Added',\n\t\t\t\t\t\tdashicon: 'plus-alt'\n\t\t\t\t\t};\n\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\n\t\t\t\t\tnfRadio.channel( 'option-repeater-' + e.data.view.model.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\n\t\t\t\t}, this );\n\t\t\t\t/*\n\t\t\t\t * Set our state to unclean so that the user can publish.\n\t\t\t\t */\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * TODO: Error Handling Here\n\t\t\t\t */\n\t\t\t}\n\t\t\ttextarea.val( '' );\n\t\t\te.data.jBox.close();\n\t\t},\n\t} );\n\n\treturn view;\n} );\n","/**\n * Handles tasks associated with our option-repeater.\n * \n * Return our repeater child view.\n *\n * Also listens for changes to the options settings.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/optionRepeater',['models/app/optionRepeaterModel', 'models/app/optionRepeaterCollection', 'views/app/drawer/optionRepeaterComposite'], function( listOptionModel, listOptionCollection, listCompositeView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for the childView for list type fields.\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t\t\n\t\t\t// Listen for changes to our list options.\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'change:option', this.changeOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:addOption', this.addOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:deleteOption', this.deleteOption );\n\n\t\t\t// Respond to requests related to our list options sortable.\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'update:optionSortable', this.updateOptionSortable, this );\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'stop:optionSortable', this.stopOptionSortable, this );\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'start:optionSortable', this.startOptionSortable, this );\n\t\t\n\t\t\t/**\n\t\t\t * When we init our setting model, we need to convert our array/objects into collections/models\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'init:dataModel', this.convertSettings );\n\t\t},\n\n\t\t/**\n\t\t * Update an option value in our model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te event\n\t\t * @param backbone.model \tmodel option model\n\t\t * @param backbone.model \tdataModel\n\t\t * @return void\n\t\t */\n\t\tchangeOption: function( e, model, dataModel, settingModel, optionView ) {\n\t\t\tvar name = jQuery( e.target ).data( 'id' );\n\t\t\tif ( 'selected' == name ) {\n\t\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\n\t\t\t\t\tvar value = 1;\n\t\t\t\t} else {\n\t\t\t\t\tvar value = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t}\n\t\t\t\n\t\t\tvar before = model.get( name );\n\t\t\t\n\t\t\tmodel.set( name, value );\n\t\t\t// Trigger an update on our dataModel\n\t\t\tthis.triggerDataModel( model, dataModel );\n\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + model.get( 'label' ) + ' ' + name + ' changed from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', model, changes, label );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-option-' + name ).trigger( 'update:option', e, model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-' + settingModel.get( 'name' ) ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t},\n\n\t\t/**\n\t\t * Add an option to our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\taddOption: function( collection, dataModel ) {\n\t\t\tvar modelData = {\n\t\t\t\torder: collection.length,\n\t\t\t\tnew: true,\n\t\t\t\toptions: {}\n\t\t\t};\n\t\t\t_.each( collection.settingModel.get( 'columns' ), function( col, key ) {\n\t\t\t\tmodelData[ key ] = col.default;\n\n\t\t\t\tif( 'undefined' != typeof col.options ){\n\t\t\t\t\tmodelData.options[ key ] = col.options;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvar model = new listOptionModel( modelData );\n\t\t\tcollection.add( model );\n\n\t\t\t// Add our field addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\n\t\t\tthis.triggerDataModel( model, dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Delete an option from our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \t\tmodel list option model\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\tdeleteOption: function( model, collection, dataModel ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\n\t\t\t// Add our field deletion to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + newModel.get( 'label' ) + ' Removed',\n\t\t\t\tdashicon: 'dismiss'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: collection\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeListOption', newModel, null, label, data );\n\t\t\t\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\tif ( 'object' == typeof changeModel.get( 'data' ) ) {\n\t\t\t\t\t_.each( changeModel.get( 'data' ), function( dataModel ) {\n\t\t\t\t\t\tif ( dataModel.model == dataModel ) {\n\t\t\t\t\t\t\tdataModel.model = newModel;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tchangeModel.set( 'model', newModel );\n\t\t\t\tchangeModel.set( 'disabled', true );\n\t\t\t} );\n\n\t\t\tcollection.remove( model );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'remove:option', model );\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'remove:option', model );\n\t\t\tthis.triggerDataModel( model, dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Creates an arbitrary value on our collection, then clones and updates that collection.\n\t\t * This forces a change event to be fired on the dataModel where the list option collection data is stored.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\ttriggerDataModel: function( model, dataModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\t\n\t\t},\n\n\t\t/**\n\t\t * Return our list composite view to the setting collection view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tsettings model\n\t\t * @return void\n\t\t */\n\t\tgetSettingChildView: function( model ) {\n\t\t\treturn listCompositeView;\n\t\t},\n\n\t\t/**\n\t\t * When we sort our list options, change the order in our option model and trigger a change.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t \t\tsortable \tjQuery UI element\n\t\t * @param backbone.view \tsetting \tSetting view\n\t\t * @return void\n\t\t */\n\t\tupdateOptionSortable: function( ui, sortable, setting ) {\n\t\t\tvar newOrder = jQuery( sortable ).sortable( 'toArray' );\n\t\t\tvar dragModel = setting.collection.get( { cid: jQuery( ui.item ).prop( 'id' ) } );\n\t\t\tvar data = {\n\t\t\t\tcollection: setting.collection,\n\t\t\t\tobjModels: []\n\t\t\t};\n\n\t\t\t_.each( newOrder, function( cid, index ) {\n\t\t\t\tvar optionModel = setting.collection.get( { cid: cid } );\n\t\t\t\tvar oldPos = optionModel.get( 'order' );\n\t\t\t\toptionModel.set( 'order', index );\n\t\t\t\tvar newPos = index;\n\n\t\t\t\tdata.objModels.push( {\n\t\t\t\t\tmodel: optionModel,\n\t\t\t\t\tattr: 'order',\n\t\t\t\t\tbefore: oldPos,\n\t\t\t\t\tafter: newPos\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t\n\t\t\tsetting.collection.sort( { silent: true } );\n\t\t\t\n\t\t\tvar label = {\n\t\t\t\tobject: setting.dataModel.get( 'objectType' ),\n\t\t\t\tlabel: setting.dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + dragModel.get( 'label' ) + ' re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\n\t\t\t\tdashicon: 'sort'\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortListOptions', dragModel, null, label, data );\n\t\t\tthis.triggerDataModel( dragModel, setting.dataModel );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:option', dragModel, setting );\n\t\t\tnfRadio.channel( 'option-repeater-' + setting.model.get( 'name' ) ).trigger( 'sort:option', dragModel, setting );\n\t\t},\n\n\t\t/**\n\t\t * When we stop sorting our list options, reset our item opacity.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopOptionSortable: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t},\n\n\t\t/**\n\t\t * When we start sorting our list options, remove containing divs and set our item opacity to 0.5\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Objects ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartOptionSortable: function( ui ) {\n\t\t\tjQuery( ui.placeholder ).find( 'div' ).remove();\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\n\t\t},\n\n\t\t/**\n\t\t * Convert settings from an array/object to a collection/model\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Backbone.Model dataModel\n\t\t * @param Backbone.Model settingModel\n\t\t * @return void\n\t\t */\n\t\tconvertSettings: function( dataModel, settingModel ) {\n\t\t\t/*\n\t\t\t * Our options are stored in our database as objects, not collections.\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n\t\t\t */ \n\t\t\tvar optionCollection = dataModel.get( settingModel.get( 'name' ) );\n\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: settingModel } );\n\t\t\t\toptionCollection.add( dataModel.get( settingModel.get( 'name' ) ) );\n\t\t\t\tdataModel.set( settingModel.get( 'name' ), optionCollection, { silent: true } );\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a field currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n _.each( fieldCollection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( fieldSettings, { objectType: 'fields' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t\t\n\t\t\t// Responds to requests for our collection.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingCollection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldCreditCard',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.dropCreditCardField );\n },\n\n dropCreditCardField: function( fieldModel ) {\n\n if( 'creditcard' == fieldModel.get( 'type' ) ) {\n\n var order = fieldModel.get( 'order' );\n\n nfRadio.channel( 'fields' ).request( 'delete', fieldModel );\n\n _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\n\n var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n var newField = {\n id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n type: type,\n label: fieldType.get( 'nicename' ),\n order: order\n };\n\n nfRadio.channel( 'fields' ).request( 'add', newField );\n });\n }\n\n },\n\n stageCreditCardField: function( model ) {\n\n if( 'creditcard' == model.get( 'slug' ) ) {\n\n nfRadio.channel( 'fields' ).request( 'remove:stagedField', '', model );\n\n _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\n nfRadio.channel('fields').request('add:stagedField', type );\n });\n }\n }\n\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel to add the individual List Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldList',[ 'models/app/optionRepeaterCollection' ], function( ListOptionCollection ) {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'option-repeater-option-label' ), 'update:option', this.updateOptionLabel );\n this.listenTo( nfRadio.channel( 'option-repeater-option-value' ), 'update:option', this.updateOptionValue );\n \n /*\n * When we init our model, convert our options from an array of objects to a collection of models.\n */\n this.listenTo( nfRadio.channel( 'fields-list' ), 'init:fieldModel', this.convertOptions );\n },\n\n updateOptionLabel: function( e, model, dataModel, settingModel, optionView ) {\n\n if( 'list' != _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } ).parentType ) return;\n\n if( model.get( 'manual_value' ) ) return;\n\n value = jQuery.slugify( model.get( 'label' ), { separator: '-' } );\n\n model.set( 'value', value );\n model.trigger( 'change', model );\n\n // Set focus on value input\n jQuery( optionView.el ).find( '[data-id=\"value\"]' ).focus().select();\n },\n\n updateOptionValue: function( e, model, dataModel, settingModel, optionView ) {\n\n var findWhere = _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } );\n if( 'undefined' == typeof findWhere ) return;\n if( 'list' != findWhere.parentType ) return;\n\n model.set( 'manual_value', true );\n \n // Set focus on calc input\n jQuery( optionView.el ).find( '[data-id=\"calc\"]' ).focus().select();\n },\n\n convertOptions: function( fieldModel ) {\n /*\n * Our options are stored in our database as objects, not collections.\n * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n */ \n var options = fieldModel.get( 'options' );\n\n var settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'options' );\n\n if ( false == options instanceof Backbone.Collection ) {\n options = new ListOptionCollection( [], { settingModel: settingModel } );\n options.add( fieldModel.get( 'options' ) );\n fieldModel.set( 'options', options, { silent: true } );\n }\n }\n\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldPassword',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.addField );\n },\n\n addField: function( model ) {\n\n if( 'password' == model.get( 'type' ) ) {\n\n var order = model.get( 'order' );\n\n var confirm = this.insertField( 'passwordconfirm', order + 1 );\n\n confirm.set( 'confirm_field', model.get( 'key' ) );\n }\n },\n\n insertField: function( type, order ) {\n var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n var newField = {\n id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n type: type,\n label: fieldType.get( 'nicename' ),\n order: order\n };\n\n return nfRadio.channel('fields').request('add', newField );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldQuantity',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\tif ( 'product_assignment' == settingModel.get( 'name' ) ) {\n\t\t\t\tvar productFields = this.getProductFields( settingModel );\n\t\t\t\tsettingModel.set( 'options', productFields );\n\t\t\t}\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldShipping',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options' ), 'render:setting', this.addMask );\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options-option' ), 'render:setting', this.addMask );\n\t\t},\n\n\t\taddMask: function( settingModel, dataModel, view ) {\n\t\t\tjQuery( view.el ).find( '[data-id=\"value\"]' ).each( function() {\n\t\t\t\tjQuery( this ).autoNumeric({\n\t\t\t\t\taSign: '$', // TODO: Use form setting\n\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\taDec: decimalPoint\n\t\t\t\t});\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * When we add a new field, update its key.\n *\n * When we change the key, update any refs to the key.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/key',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we add a field, update its key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.newFieldKey );\n\n\t\t\t// When we edit a label, update our key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-label' ), 'update:setting', this.updateLabel );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// When we type inside the admin key field, we need to save our manual_key setting.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-key' ), 'keyup:setting', this.keyUp );\n\t\t},\n\n\t\t/**\n\t\t * Add a key to our new field model.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model new field model\n\t\t * @return void\n\t\t */\n\t\tnewFieldKey: function( model ) {\n\t\t\tvar d = new Date();\n\t\t\tvar n = d.valueOf();\n\t\t\tvar key = this.slugify( model.get( 'type' ) + '_' + n );\n\n\t\t\tmodel.set( 'key', key, { silent: true } );\n\n\t\t\tif( 'undefined' == model.get( 'manual_key' ) ) {\n\t\t\t\tmodel.set('manual_key', false, {silent: true});\n\t\t\t}\n\t\t},\n\n\t\tupdateLabel: function( model ) {\n\n\t\t\t/*\n\t\t\t * If we haven't entered a key manually, update our key when our label changes.\n\t\t\t */\n\t\t\tif ( ! model.get( 'manual_key' ) && 0 != jQuery.trim( model.get( 'label' ) ).length ) {\n\t\t\t\t/*\n\t\t\t\t * When we're editing settings, we expect the edits to fire one at a time.\n\t\t\t\t * Since we're calling this in the middle of our label update, anything that inquires about what has changed after we set our key will see both label and key.\n\t\t\t\t * We need to remove the label from our model.changed property so that all that has changed is the key.\n\t\t\t\t *\n\t\t\t\t */\n\t\t\t\tdelete model.changed.label;\n\t\t\t\tvar d = new Date();\n\t\t\t\tvar n = d.valueOf();\n\t\t\t\tvar key = this.slugify( model.get( 'label' ) + '_' + n );\n\t\t\t\tmodel.set( 'key', key );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, find any merge tags using the key and update them.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model field model\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( dataModel ) {\n\t\t\tvar key = dataModel.get( 'key' );\n\t\t\tthis.settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'key' );\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tkeyUp: function( e, settingModel, dataModel ) {\n\t\t\tdataModel.set( 'manual_key', true );\n\t\t\tthis.settingModel = settingModel;\n\t\t\tvar key = jQuery( e.target ).val();\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tsetError: function( key, dataModel ) {\n\t\t\tvar error = false;\n\t\t\tif ( '' == jQuery.trim( key ) ) {\n\t\t\t\terror = 'Field keys can\\'t be empty. Please enter a key.';\n\t\t\t} else if ( key != key.toLowerCase() ) {\n\t\t\t\terror = 'Field keys must be lowercase.';\n\t\t\t} else if ( key != key.replace( ' ', '_' ) ) {\n\t\t\t\terror = 'Field keys must cannot use spaces. Separate with \"_\" instead.';\n\t\t\t} else if ( '_' == key.slice( -1 ) ) {\n\t\t\t\terror = 'Field keys cannot end with a \"_\"';\n\t\t\t} else if ( key != this.slugify( key ) ) {\n\t\t\t\terror = 'Invalid Format.';\n\t\t\t} else if ( key != this.keyExists( key, dataModel ) ) {\n\t\t\t\terror = 'Field keys must be unique. Please enter another key.'\n\t\t\t}\n\n\t\t\tif ( error ) {\n\t\t\t\tthis.settingModel.set( 'error', error );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:fieldKey', dataModel );\n\t\t\t\tthis.settingModel.set( 'error', false );\n\t\t\t}\n\t\t},\n\n\t\tkeyExists: function( key, dataModel ) {\n\t\t\tvar newKey = this.slugify( key );\n\t\t\tif ( 0 != newKey.length ) {\n\t\t\t\tkey = newKey;\n\t\t\t}\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar x = 1;\n\t\t\tvar testKey = key;\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\tif ( dataModel != field && testKey == field.get( 'key' ) ) {\n\t\t\t\t\ttestKey = key + '_' + x;\n\t\t\t\t\tx++;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tkey = testKey;\n\n\t\t\treturn key;\n\t\t},\n\n\t\tslugify: function( string ){\n\t\t\treturn jQuery.slugify( string, { separator: '_' } )\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Creates notices for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:stagedField', this.addStagedField );\n\t\t},\n\n\t\taddStagedField: function( model ) {\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addStagedField', model.get( 'nicename' ) + ' added to staging' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles mobile-specific JS for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start of our sorting.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'render:fieldsSortable', this.initWiggle );\n\t\t\t// Listen for when we start sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:start', this.startWiggle );\n\t\t\t// Listen for when we stop sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:stop', this.stopWiggle );\n\t\t},\n\n\t\tinitWiggle: function( view ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).find( '.nf-field-wrap' ).on( 'taphold', function() {\n\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tstartWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper' ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.helper ).css( 'opacity', '0.75' ).ClassyWiggle( 'start', { degrees: ['.5', '1', '.5', '0', '-.5', '-1', '-.5', '0'] } );\n\t\t\t}\n\t\t},\n\n\t\tstopWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.helper ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * If we add a saved field to our form and then update it, set the \"saved\" flag to false.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/savedFields',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tignoreAttributes: [\n\t\t\t'editActive',\n\t\t\t'order',\n\t\t\t'saved',\n\t\t\t'jBox'\n\t\t],\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateField );\n\t\t\t// Listen to clicks on our add saved field button.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:addSavedField', this.clickAddSavedField, this );\n\t\t},\n\n\t\tupdateField: function( dataModel ) {\n\t\t\tif ( dataModel.get( 'saved' ) ) {\n\t\t\t\t\n\t\t\t\tvar modified = false;\n\t\t\t\tvar changedAttributes = _.keys( dataModel.changedAttributes() );\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( changedAttributes, function( changed ) {\n\t\t\t\t\tif ( -1 == that.ignoreAttributes.indexOf( changed ) ) {\n\t\t\t\t\t\tmodified = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t\n\t\t\t\tif ( modified ) {\n\t\t\t\t\tdataModel.set( 'saved', false );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tclickAddSavedField: function( e, dataModel ) {\n\t\t\tvar modelClone = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\tvar fieldData = modelClone.attributes;\n\t\t\tfieldData.saved = true;\n\n\t\t\tdelete fieldData.jBox;\n\t\t\tdelete fieldData.editActive;\n\t\t\tdelete fieldData.created_at;\n\t\t\tdelete fieldData.order;\n\t\t\tdelete fieldData.id;\n\t\t\tdelete fieldData.formID;\n\t\t\tdelete fieldData.parent_id;\n\t\t\t\n\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', fieldData.type );\n\t\t\tvar newType = _.clone( type.attributes );\n\n\t\t\tvar nicename = jQuery( e.target ).parent().parent().find( 'input' ).val();\n\t\t\tconsole.log( nicename );\n\t\t\tnewType.nicename = nicename;\n\t\t\tfieldData.label = nicename;\n\t\t\tfieldData.nicename = nicename;\n\t\t\tdataModel.set( 'addSavedLoading', true );\n\t\t\tvar newTypeDefaults = JSON.stringify( fieldData );\n\n\t\t\tjQuery.post( ajaxurl, { action: 'nf_create_saved_field', field: newTypeDefaults, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\tnewType.id = response.data.id;\n\t\t\t\tnewType.nicename = nicename;\n\t\t\t\tnewType.settingDefaults = fieldData;\n\n\t\t\t\tvar typeCollection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n\t\t\t\tvar newModel = typeCollection.add( newType );\n\n\t\t\t\tvar typeSections = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\t\ttypeSections.get( 'saved' ).get( 'fieldTypes' ).push( newType.id );\n\n\t\t\t\t// dataModel.set( 'type', response.data.id );\n\t\t\t\tdataModel.set( 'addSavedLoading', false );\n\t\t\t\tdataModel.unset( 'addSavedLoading', { silent: true } );\n\t\t\t\tdataModel.get( 'jBox' ).close();\n\t\t\t\t// dataModel.set( 'saved', true );\n\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addSaved', 'Saved Field Added' );\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a datepicker setting, add our datepicker.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDatepicker',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-datepicker' ), 'render:setting', this.addDatepicker );\n\t\t},\n\n\t\taddDatepicker: function( settingModel, dataModel, view ) {\n\t\t\tvar dateObject = pikadayResponsive( jQuery( view.el ).find( '.setting' )[0] );\t\t\t\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDisplayCalc',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-calc_var' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\t// console.log( 'render!' );\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Creates and stores a collection of action types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our action type collection\n *\n * Also responds to requests for data about action types\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/types',[ 'models/app/typeCollection' ], function( TypeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\t/*\n\t\t\t * Instantiate \"installed\" actions collection.\n\t\t\t */\n\t\t\tthis.installedActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'installed';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'installed',\n\t\t\t\t\tnicename: nfi18n.installed\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.availableActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'available';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'available',\n\t\t\t\t\tnicename: nfi18n.available\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:installedActions', this.getInstalledActions, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:availableActions', this.getAvailableActions, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\t// Search our installed actions first\n\t\t\tvar type = this.installedActions.get( id );\n\t\t\tif ( ! type ) {\n\t\t\t\ttype = this.availableActions.get( id );\n\t\t\t}\n \treturn type;\n },\n\n /**\n * Return the installed action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetInstalledActions: function() {\n \treturn this.installedActions;\n },\n\n /**\n * Return the available action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetAvailableActions: function() {\n \treturn this.availableActions;\n },\n\n /**\n * Add a field type to our staging area when the field type button is clicked.\n *\n * @since 3.0\n * @param Object e event\n * @return void\n */\n addStagedField: function( e ) {\n \tvar type = jQuery( e.target ).data( 'id' );\n \tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n },\n\n /**\n * Return our field type settings sections\n *\n * @since 3.0\n * @return backbone.collection field type settings sections\n */\n getTypeSections: function() {\n return this.fieldTypeSections;\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form action.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Action',\n\t\t\tobjectDomain: 'actions',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar actionType = nfRadio.channel( 'actions' ).request( 'get:type', this.get( 'type' ) );\n\n\t\t\tif( 'undefined' == typeof actionType ) return;\n\n\t\t\t// Loop through our action type \"settingDefaults\" and add any default settings.\n\t\t\tvar that = this;\n\t\t\t_.each( actionType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( ! that.get( key ) ) {\n\t\t\t\t\tthat.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * actions\n\t\t\t * action-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( 'actions' ).trigger( 'init:actionModel', this );\n\t\t\tnfRadio.channel( 'actions-' + this.get( 'type' ) ).trigger( 'init:actionModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n nfRadio.channel( 'actionSetting-' + _.keys( this.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'actions').trigger( 'update:setting', this, options.settingModel );\n nfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action models. \n * This is the actual action data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new action or removed action property.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionCollection',['models/actions/actionModel'], function( actionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionModel,\n\t\tcomparator: 'order',\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addAction, this );\n\t\t\tthis.on( 'remove', this.removeAction, this );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new action property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddAction: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed action property.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveAction: function( model ) {\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles interactions with our actions collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/data',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.collection = new actionCollection( preloadedFormData.actions );\n\t\t\tthis.collection.tmpNum = 1;\n\n\t\t\tif ( 0 != this.collection.models.length ) {\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( this.collection.models, function( action ) {\n\t\t\t\t\tif ( ! jQuery.isNumeric( action.get( 'id' ) ) ) {\n\t\t\t\t\t\tthat.collection.tmpNum++;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a action is removed so that we can add it to our 'deleted_actions' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about actions and to update/change/delete actions from our collection.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:action', this.getAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:tmpID', this.getTmpID, this );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add', this.addAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'delete', this.deleteAction, this );\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetAction: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\t/**\n\t\t * Add a action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( data, silent ) {\n\t\t\tsilent = silent || false;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tvar model = new actionModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\tthis.collection.add( model, { silent: silent } );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Delete a action from our collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \taction model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteAction: function( model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\n\t\t/**\n\t\t * Return a new tmp id for our actions.\n\t\t * Gets the action collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/actionSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( actionSettings, { objectType: 'actions' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a action currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - Edit Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our actions.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our actions collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n _.each( actionCollection.models, function( action ) {\n\t\t\t\taction.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Handles clicks and dragging for our action types.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/addActionTypes',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'actions' ), 'click:addAction', this.addAction );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add:actionType', this.addAction, this );\n\t\t},\n\n\t\t/**\n\t\t * Add an action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( type ) {\n\n\t\t\tvar data = {\n\t\t\t\tid: nfRadio.channel( 'actions' ).request( 'get:tmpID' ),\n\t\t\t\ttype: type.get( 'id' ),\n\t\t\t\tlabel: type.get( 'settingDefaults').label || type.get( 'nicename' )\n\t\t\t}\n\n\t\t\tvar newModel = nfRadio.channel( 'actions' ).request( 'add', data );\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Action',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'actions' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', {}, newModel );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/typeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our action type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addAction' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type droppable.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/droppable',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'app' ).reply( 'drop:actionType', this.dropActionType, this );\n\t\t},\n\n\t\tdropActionType: function( e, ui ) {\n\t\t\tvar type_slug = jQuery( ui.helper ).data( 'type' );\n\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', type_slug );\n\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', type );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our action type\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action type models. \n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeCollection',['models/actions/typeModel'], function( actionTypeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionTypeModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Filters our action type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/filterTypes',['models/actions/typeCollection'], function( typeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'change:filter', this.filterActionTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our action types in the add new action drawer\n\t\t * \n\t\t * Takes a search string and finds any action types that match either the name or alias.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string\t search \tstring being searched for\n\t\t * @param object \t e \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterActionTypes: function( search, e ) {\n\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != jQuery.trim( search ) ) {\n\n \t\tvar filteredInstalled = [];\n \t\t/**\n \t\t * Call the function that actually filters our collection,\n \t\t * and then loop through our collection, adding each model to our filteredInstalled array.\n \t\t */\n\t\t\t\tvar installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n \t\t_.each( this.filterCollection( search, installedActions ), function( model ) {\n \t\t\tfilteredInstalled.push( model );\n \t\t} );\n\n \t\tvar filteredAvailable = [];\n \t\tvar availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n \t\t_.each( this.filterCollection( search, availableActions ), function( model ) {\n \t\t\tfilteredAvailable.push( model );\n \t\t} );\n\n \t\t// Create a new Action Type Section collection with the filtered array.\n \t\tvar newInstalled = new typeCollection( filteredInstalled );\n \t\tnewInstalled.slug = 'installed';\n \t\tnewInstalled.nicename = 'Installed';\n\n \t\tvar newAvailable = new typeCollection( filteredAvailable );\n \t\tnewAvailable.slug = 'available';\n \t\tnewAvailable.nicename = 'Available';\n\n \t\t// Request that our action types filter be applied, passing the collection we created above.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:actionTypes', newInstalled, newAvailable );\n \t\t// If we've pressed the 'enter' key, add the action to staging and clear the filter.\n \t\tif ( e.addObject ) {\n \t\t\tif ( 0 < newInstalled.length ) {\n \t\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', newInstalled.models[0] );\n \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n \t\t\t}\n \t\t}\n \t} else {\n \t\t// Clear our filter if the search text is empty.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n \t}\n },\n\n /**\n * Search our action type collection for the search string.\n * \n * @since 3.0\n * @param string\t search \tstring being searched for\n * @return backbone.collection\n */\n filterCollection: function( search, collection ) {\n \tsearch = search.toLowerCase();\n \t/*\n \t * Backbone collections have a 'filter' method that loops through every model,\n \t * waiting for you to return true or false. If you return true, the model is kept.\n \t * If you return false, it's removed from the filtered result.\n \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'id' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/newsletterList',[], function( ) {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'setting-newsletter_list' ), 'show:setting', this.defaultFields );\n this.listenTo( nfRadio.channel( 'setting-type-newsletter_list' ), 'click:extra', this.clickListUpdate );\n this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ), 'update:setting', this.maybeRenderFields );\n this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ), 'update:setting', this.maybeRenderGroups );\n this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_fields' ), 'init:settingModel', this.registerFieldsListener );\n this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_groups' ), 'init:settingModel', this.registerGroupsListener );\n },\n\n defaultFields: function( settingModel, dataModel ) {\n this.maybeRenderFields( dataModel, settingModel );\n this.maybeRenderGroups( dataModel, settingModel );\n },\n\n registerFieldsListener: function ( model ) {\n model.listenTo( nfRadio.channel( 'newsletter_list_fields' ), 'update:fieldMapping', this.updateFieldMapping, model );\n },\n\n registerGroupsListener: function ( model ) {\n model.listenTo( nfRadio.channel( 'newsletter_list_groups' ), 'update:interestGroups', this.updateInterestGroups, model );\n },\n\n clickListUpdate: function( e, settingModel, dataModel, settingView ) {\n\n var data = {\n action: 'nf_' + dataModel.attributes.type + '_get_lists',\n security: nfAdmin.ajaxNonce\n };\n\n var that = this;\n jQuery( e.srcElement ).addClass( 'spin' );\n jQuery.post( ajaxurl, data, function( response ){\n var response = JSON.parse( response );\n that.updateLists( settingModel, response.lists, settingView, dataModel );\n dataModel.set( 'newsletter_list', response.lists[0].value, { settingModel: settingModel } );\n }).always( function() {\n jQuery( e.srcElement ).removeClass( 'spin' );\n });\n },\n\n updateLists: function( settingModel, lists, settingView, dataModel ) {\n settingModel.set( 'options', lists );\n settingView.render();\n },\n\n maybeRenderFields: function( dataModel, settingModel ) {\n\n if( 'undefined' == typeof settingModel ) return;\n\n var selectedList = dataModel.get( 'newsletter_list' );\n var lists = settingModel.get( 'options' );\n _.each( lists, function( list ) {\n if ( selectedList == list.value ) {\n nfRadio.channel( 'newsletter_list_fields').trigger( 'update:fieldMapping', list.fields );\n }\n } );\n\n dataModel.set( 'newsletter_list_fields', 0 );\n },\n\n maybeRenderGroups: function( dataModel, settingModel ) {\n if( 'undefined' == typeof settingModel ) return;\n\n var selectedList = dataModel.get( 'newsletter_list' );\n var lists = settingModel.get( 'options' );\n _.each( lists, function( list ) {\n if ( selectedList == list.value ) {\n nfRadio.channel( 'newsletter_list_groups').trigger( 'update:interestGroups', list.groups );\n }\n } );\n\n dataModel.set( 'newsletter_list_fields', 0 );\n },\n\n updateFieldMapping: function( fields ) {\n var settings = this.get( 'settings' );\n settings.reset();\n _.each( fields, function( field ){\n\n settings.add({\n name: field.value,\n type: 'textbox',\n label: field.label,\n width: 'full',\n use_merge_tags: { exclude: [ 'user', 'post', 'system', 'querystrings' ] }\n });\n });\n this.set( 'settings', settings );\n },\n\n updateInterestGroups: function( groups ) {\n var settings = this.get( 'settings' );\n settings.reset();\n _.each( groups, function( group ){\n\n settings.add({\n name: group.value,\n type: 'toggle',\n label: group.label,\n width: 'full',\n });\n });\n this.set( 'settings', settings );\n },\n\n });\n\n return controller;\n} );\n\n","/**\n * Creates and stores a collection of form setting types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our form setting type collection\n *\n * Also responds to requests for data about form setting types\n *\n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/types',[\n\t\t'models/app/typeCollection'\n\t],\n\tfunction(\n\t\tTypeCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( formSettingTypeData );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:typeCollection', this.getCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\treturn this.collection.get( id );\n },\n\n /**\n * Return the installed action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetCollection: function() {\n \treturn this.collection;\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form settings.\n * \n * @package Ninja Forms builder\n * @subpackage Form Settings\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/advanced/settingsModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Form Setting',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.bind( 'change', this.changeSetting, this );\n\t\t\t/*\n\t\t\t * Check to see if we have any setting defaults to set.\n\t\t\t */\n\t\t\tvar formSettings = nfRadio.channel( 'settings' ).request( 'get:collection' );\n\t\t\t_.each( formSettings.models, function( settingModel ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( settingModel.get( 'name' ) ) ) {\n\t\t\t\t\tthis.set( settingModel.get( 'name' ), settingModel.get( 'value' ), { silent: true } );\n\t\t\t\t}\n\t\t\t\tnfRadio.channel( settingModel.get( 'type' ) ).trigger( 'init:dataModel', this, settingModel );\n\t\t\t}, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Handles interactions with our form settings collection.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/data',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.model = new settingsModel( preloadedFormData.settings );\n\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settings', this.getSettings, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'update:setting', this.updateSetting, this );\n\t\t},\n\n\t\tgetSettings: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tupdateSetting: function( name, value, silent ) {\n\t\t\tsilent = silent || false;\n\t\t\tthis.model.set( name, value, { silent: silent } );\n\t\t},\n\n\t\tgetSetting: function( name ) {\n\t\t\treturn this.model.get( name );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/formSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( formSettings, { objectType: 'settings' } );\n\t\t\t\t\t\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settingModel', this.getSettingModel, this );\n\n\t\t\t// Responds to requests for our setting collection\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:collection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from form settings currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n _.each( collection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Listens for clicks on our form settings sections.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/clickEdit',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'settings' ), 'click:edit', this.clickEdit );\n\t\t},\n\n\t\tclickEdit: function( e, typeModel ) {\n\t\t\tvar model = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: typeModel.get( 'settingGroups' ), typeModel: typeModel } );\n\t\t\tvar preventClose = nfRadio.channel( 'drawer' ).request( 'get:preventClose' );\n\t\t\tif ( ! preventClose ) {\n\t\t\t\ttypeModel.set( 'editActive', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Makes sure that calculations don't reference calculations with a lower order.\n *\n * For example, our first caclulation can't reference the second, but the second can reference the first.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/calculations',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When someone types in the \"name\" or \"eq\" portion of our calculation, we need to make sure\n\t\t\t * that they haven't duplicated a name or made a bad EQ reference.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'keyup:option', this.keyUp );\n\t\t\t/*\n\t\t\t * Same thing for when our calculation option is updated\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalc );\n\t\t\t/*\n\t\t\t * When we sort our calcluations, we need to make sure that we don't get any bad EQ\n\t\t\t * references.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'sort:option', this.sortCalc );\n\t\t},\n\n\t\tkeyUp: function( e, optionModel ) {\n\t\t\t// Get our current value\n\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t// Check to see if we're editing a name or eq\n var id = jQuery( e.target ).data( 'id' );\n\t\t\tif( 'name' == id ) { // We are editing the name field\n\t\t\t\t// Check to see if our name already exists.\n\t\t\t\tthis.checkName( value, optionModel );\n\t\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\t} else if( 'eq' == id ) { // We're editing the eq\n\t\t\t\t// Check to see if there are any calcs referenced in our eq\n\t\t\t\tthis.checkEQ( value, optionModel );\n\t\t\t} else if( 'dec' == id ) { // We're editing the dec\n // Check to see that we have a non-negative integer\n this.checkDec( value, optionModel );\n }\n\t\t},\n\n\t\tupdateCalc: function( optionModel ) {\n\t\t\tthis.checkName( optionModel.get( 'name' ), optionModel, false );\n\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\tthis.checkDec( optionModel.get( 'dec' ), optionModel );\n\t\t},\n\n\t\tsortCalc: function( optionModel, setting ) {\n\t\t\tthis.checkAllCalcs( setting.collection );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if a calc name exists.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \t\t\tname calc name to check\n\t\t * @param backbone.model \toptionModel \n\t\t * @return void\n\t\t */\n\t\tcheckName: function( name, optionModel, silent ) {\n\t\t\tsilent = silent || true;\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t// Search our calc collection for our name\n\t\t\tvar found = optionModel.collection.where( { name: jQuery.trim( name ) } );\n\n\t\t\t// If the name that was passed is the same as our current name, return false.\n\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\tfound = [];\n\t\t\t}\n\n\t\t\t// If our name exists, add an errors to the option model\n\t\t\tif ( 0 != found.length ) {\n\t\t\t\terrors.nameExists = 'Calculation names must be unique. Please enter another name.';\n\t\t\t} else {\n\t\t\t\toptionModel.set( 'name', name, { silent: silent } );\n\t\t\t\tdelete errors.nameExists;\n\t\t\t}\n\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if an eq contains a reference to a calc at a lower priority.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\teq our equation\n\t\t * @param backbone.model \toptionModel\n\t\t * @return void\n\t\t */\n\t\tcheckEQ: function( eq, optionModel ) {\n\t\t\t// Get any current errors on our optionModel\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t/*\n\t\t\t * We're looking for two errors:\n\t\t\t * - Calculations that are below the current one can't be processed.\n\t\t\t * - Calculations can't refer to themselves.\n\t\t\t */ \n\t\t\tvar errorSelfRef = false;\n\t\t\tvar errorFutureCalc = false;\n\t\t\t// Regex that searches for {calc:key}\n\t\t\tvar calcs = eq.match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\t/*\n\t\t\t * Calcs will be an array like:\n\t\t\t * ['{calc:test}'], ['{calc:another}']\n\t\t\t * \n\t\t\t * If we have any calcs in the eq, loop through them and search for the errors.\n\t\t\t */\n\t\t\tif ( calcs ) {\n\t\t\t\tvar calculations = optionModel.collection;\n\t\t\t\t// Maps a function to each item in our calcs array.\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 optionModel from our calculations collection.\n\t\t\t\t\tvar targetCalc = calculations.findWhere( { name: name } );\n\t\t\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\t\t\t// If we already have a calc with this name, set an error.\n\t\t\t\t\t\terrors.selfRef = 'A calculation can\\'t reference itself!';\n\t\t\t\t\t\terrorSelfRef = true;\n\t\t\t\t\t} else if ( targetCalc && targetCalc.get( 'order' ) > optionModel.get( 'order' ) ) {\n\t\t\t\t\t\t// If the calc is after this one, set an error. \n\t\t\t\t\t\terrorFutureCalc = true;\n\t\t\t\t\t\terrors.futureCalc = 'Can\\'t reference a future calculation!';\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// If we didn't find any self ref errors, remove the key.\n\t\t\tif ( ! errorSelfRef ) {\n\t\t\t\tdelete errors.selfRef;\n\t\t\t}\n\n\t\t\t// If we didn't find any future calc errors, remove the key.\n\t\t\tif ( ! errorFutureCalc ) {\n\t\t\t\tdelete errors.futureCalc;\n\t\t\t}\n\n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\n\t\t},\n\n /**\n * Ceck to see if a dec is an integer value.\n * \n * @since 3.1\n * @param string dec our decimal value\n * @param backbone.model optionModel\n * @return void\n */\n checkDec: function( dec, optionModel ) {\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n /**\n * We're looking for one error:\n * - dec is not a non-negative integer.\n */\n var errorNonIntDec = false;\n \n // Get our target value and see if it matches what we got.\n var checked = Math.abs( parseInt( dec.trim() ) );\n if ( dec.trim() !== '' && checked.toString() !== dec.trim() ) {\n errorNonIntDec = true;\n errors.nonIntDec = 'Decimals must be a non-negative integer!';\n }\n \n // If our dec value is a non-negative integer.\n if ( ! errorNonIntDec ) {\n delete errors.nonIntDec;\n }\n \n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n \n },\n \n\t\tcheckAllCalcs: function( collection ) {\n\t\t\tvar that = this;\n\t\t\tcollection.models.map( function( opt ) {\n\t\t\t\tthat.checkName( opt.get( 'name' ), opt );\n\t\t\t\tthat.checkEQ( opt.get( 'eq' ), opt );\n that.checkDec( opt.get( 'dec' ), opt );\n\t\t\t} );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Loads all of our controllers using Require JS.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine(\n\t'controllers/loadControllers',[\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\t'controllers/app/remote',\n\t\t'controllers/app/drawer',\n\t\t'controllers/app/drawerConfig',\n\t\t'controllers/app/domainConfig',\n\t\t'controllers/app/data',\t\t\n\t\t'controllers/app/drawerToggleSettingGroup',\n\t\t'controllers/app/updateDB',\n\t\t'controllers/app/formData',\n\t\t'controllers/app/previewLink',\n\t\t'controllers/app/menuButtons',\n\t\t'controllers/app/trackChanges',\n\t\t'controllers/app/undoChanges',\n\t\t'controllers/app/publishResponse',\n\t\t'controllers/app/changeDomain',\n\t\t'controllers/app/pushstate',\n\t\t'controllers/app/hotkeys',\n\t\t'controllers/app/cleanState',\n\t\t'controllers/app/coreUndo',\n\t\t'controllers/app/cloneModelDeep',\n\t\t'controllers/app/getSettingChildView',\n\t\t'controllers/app/changeSettingDefault',\n\t\t'controllers/app/fieldset',\n\t\t'controllers/app/toggleSetting',\n\t\t'controllers/app/itemControls',\n\t\t'controllers/app/mergeTags',\n\t\t'controllers/app/mergeTagBox',\n\t\t'controllers/app/itemSettingFill',\n\t\t'controllers/app/confirmPublish',\n\t\t'controllers/app/rte',\n\t\t'controllers/app/settingFieldSelect',\n\t\t'controllers/app/settingFieldList',\n\t\t'controllers/app/settingHTML',\n\t\t'controllers/app/settingColor',\n\t\t'controllers/app/changeMenu',\n\t\t'controllers/app/mobile',\n\t\t'controllers/app/notices',\n\t\t'controllers/app/unloadCheck',\n\t\t'controllers/app/formContentFilters',\n\t\t'controllers/app/formContentGutterFilters',\n\t\t'controllers/app/cloneCollectionDeep',\n\t\t'controllers/app/trackKeyDown',\n\t\t'controllers/app/perfectScroll',\n\t\t'controllers/app/getNewSettingGroupCollection',\n\t\t'controllers/app/settingMedia',\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\t'controllers/fields/types',\n\t\t'controllers/fields/fieldTypeDrag',\n\t\t'controllers/fields/stagingDrag',\n\t\t'controllers/fields/staging',\n\t\t'controllers/fields/stagingSortable',\n\t\t'controllers/fields/filterTypes',\n\t\t'controllers/fields/sortable',\n\t\t'controllers/fields/data',\n\t\t'controllers/app/optionRepeater',\n\t\t'controllers/fields/editActive',\n\t\t'controllers/fields/fieldSettings',\n\t\t'controllers/fields/fieldCreditCard',\n\t\t'controllers/fields/fieldList',\n\t\t'controllers/fields/fieldPassword',\n\t\t'controllers/fields/fieldQuantity',\n\t\t'controllers/fields/fieldShipping',\n\t\t'controllers/fields/key',\n\t\t'controllers/fields/notices',\n\t\t'controllers/fields/mobile',\n\t\t'controllers/fields/savedFields',\n\t\t'controllers/fields/fieldDatepicker',\n\t\t'controllers/fields/fieldDisplayCalc',\n\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\t'controllers/actions/types',\n\t\t'controllers/actions/data',\n\t\t'controllers/actions/actionSettings',\n\t\t'controllers/actions/editActive',\n\t\t'controllers/actions/addActionTypes',\n\t\t'controllers/actions/typeDrag',\n\t\t'controllers/actions/droppable',\n\t\t'controllers/actions/filterTypes',\n\t\t'controllers/actions/newsletterList',\n\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\t'controllers/advanced/types',\n\t\t'controllers/advanced/data',\n\t\t'controllers/advanced/formSettings',\n\t\t'controllers/advanced/editActive',\n\t\t'controllers/advanced/clickEdit',\n\t\t'controllers/advanced/calculations'\n\t],\n\tfunction(\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\tRemote,\n\t\tDrawer,\n\t\tDrawerConfig,\n\t\tDomainConfig,\n\t\tAppData,\n\t\tDrawerToggleSettingGroup,\n\t\tUpdateDB,\n\t\tFormData,\n\t\tPreviewLink,\n\t\tAppMenuButtons,\n\t\tAppTrackChanges,\n\t\tAppUndoChanges,\n\t\tAppPublishResponse,\n\t\tAppChangeDomain,\n\t\tPushstate,\n\t\tHotkeys,\n\t\tCleanState,\n\t\tCoreUndo,\n\t\tCloneModelDeep,\n\t\tDrawerSettingChildView,\n\t\tChangeSettingDefault,\n\t\tFieldset,\n\t\tToggleSetting,\n\t\tItemControls,\n\t\tMergeTags,\n\t\tMergeTagsBox,\n\t\tItemSettingFill,\n\t\tConfirmPublish,\n\t\tRTE,\n\t\tSettingFieldSelect,\n\t\tSettingFieldList,\n\t\tSettingHTML,\n\t\tSettingColor,\n\t\tChangeMenu,\n\t\tAppMobile,\n\t\tAppNotices,\n\t\tAppUnloadCheck,\n\t\tFormContentFilters,\n\t\tFormContentGutterFilters,\n\t\tCloneCollectionDeep,\n\t\tTrackKeyDown,\n\t\tPerfectScroll,\n\t\tGetNewSettingGroupCollection,\n\t\tSettingMedia,\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\tFieldTypes,\n\t\tFieldTypeDrag,\n\t\tFieldStagingDrag,\n\t\tStagedFieldsData,\n\t\tStagedFieldsSortable,\n\t\tDrawerFilterFieldTypes,\n\t\tMainContentFieldsSortable,\n\t\tFieldData,\n\t\tOptionRepeater,\n\t\tFieldsEditActive,\n\t\tFieldSettings,\n\t\tFieldCreditCard,\n\t\tFieldList,\n\t\tFieldPassword,\n\t\tFieldQuantity,\n\t\tFieldShipping,\n\t\tFieldKey,\n\t\tNotices,\n\t\tFieldsMobile,\n\t\tSavedFields,\n\t\tFieldDatepicker,\n\t\tFieldDisplayCalc,\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\tActionTypes,\n\t\tActionData,\n\t\tActionSettings,\n\t\tActionEditActive,\n\t\tActionAddTypes,\n\t\tActionTypeDrag,\n\t\tActionDroppable,\n\t\tActionFilterTypes,\n\t\tActionNewsletterList,\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\tSettingTypes,\n\t\tSettingData,\n\t\tFormSettings,\n\t\tSettingsEditActive,\n\t\tSettingsClickEdit,\n\t\tAdvancedCalculations\n\t\t\n\t) {\n\t\tvar controller = Marionette.Object.extend( {\n\t\t\tinitialize: function() {\n\t\t\t\t/*\n\t\t\t\t * Application controllers\n\t\t\t\t */\n\t\t\t\tnew FormContentFilters();\n\t\t\t\tnew FormContentGutterFilters();\n\t\t\t\tnew Hotkeys();\n\t\t\t\tnew Remote();\n\t\t\t\tnew Drawer();\n\t\t\t\tnew DrawerConfig();\n\t\t\t\tnew DomainConfig();\n\t\t\t\tnew DrawerToggleSettingGroup();\n\t\t\t\tnew PreviewLink();\n\t\t\t\tnew AppMenuButtons();\n\t\t\t\tnew AppTrackChanges();\n\t\t\t\tnew AppUndoChanges();\n\t\t\t\tnew AppPublishResponse();\n\t\t\t\tnew AppChangeDomain();\n\t\t\t\tnew CleanState();\n\t\t\t\tnew CoreUndo();\n\t\t\t\tnew CloneModelDeep();\n\t\t\t\tnew ItemControls();\n\t\t\t\tnew ConfirmPublish();\n\t\t\t\tnew RTE();\n\t\t\t\tnew SettingFieldSelect();\n\t\t\t\tnew SettingFieldList();\n\t\t\t\tnew SettingHTML();\n\t\t\t\tnew SettingColor();\n\t\t\t\tnew SettingMedia();\n\t\t\t\tnew ChangeMenu();\n\t\t\t\tnew AppMobile();\n\t\t\t\tnew AppNotices();\n\t\t\t\tnew AppUnloadCheck();\n\t\t\t\tnew UpdateDB();\n\t\t\t\tnew CloneCollectionDeep();\n\t\t\t\tnew TrackKeyDown();\n\t\t\t\tnew PerfectScroll();\n\t\t\t\tnew GetNewSettingGroupCollection();\n\t\t\t\t// new Pushstate();\n\t\t\t\t/*\n\t\t\t\t * Fields domain controllers\n\t\t\t\t * \n\t\t\t\t * Field-specific controllers should be loaded before our field type controller.\n\t\t\t\t * This ensures that any 'init' hooks are properly registered.\n\t\t\t\t */\n\t\t\t\tnew Fieldset();\n\t\t\t\tnew OptionRepeater();\n\n\t\t\t\tnew FieldTypes();\n\t\t\t\tnew FieldTypeDrag();\n\t\t\t\tnew FieldStagingDrag();\n\t\t\t\tnew StagedFieldsData();\n\t\t\t\tnew StagedFieldsSortable();\n\t\t\t\tnew DrawerFilterFieldTypes();\n\t\t\t\tnew MainContentFieldsSortable();\n\t\t\t\tnew ChangeSettingDefault();\n\t\t\t\tnew ToggleSetting();\n\t\t\t\tnew DrawerSettingChildView();\n\t\t\t\tnew FieldsEditActive();\n\t\t\t\tnew FieldSettings();\n\t\t\t\tnew FieldCreditCard();\n\t\t\t\tnew FieldList();\n\t\t\t\tnew FieldPassword;\n\t\t\t\tnew FieldQuantity();\n\t\t\t\tnew FieldShipping();\n\t\t\t\tnew FieldKey();\n\t\t\t\tnew Notices();\n\t\t\t\tnew FieldsMobile();\n\t\t\t\tnew SavedFields();\n\t\t\t\tnew FieldDatepicker();\n\t\t\t\tnew FieldDisplayCalc();\n\t\t\t\t/*\n\t\t\t\t * TODO: Actions domain controllers\n\t\t\t\t */\n\t\t\t\tnew ActionNewsletterList();\n\t\t\t\tnew ActionTypes();\n\t\t\t\tnew ActionData();\n\t\t\t\tnew ActionSettings();\n\t\t\t\tnew ActionEditActive();\n\t\t\t\tnew ActionAddTypes();\n\t\t\t\tnew ActionTypeDrag();\n\t\t\t\tnew ActionDroppable();\n\t\t\t\tnew ActionFilterTypes();\n\t\t\t\t/*\n\t\t\t\t * TODO: Settings domain controllers\n\t\t\t\t */\n\t\t\t\tnew SettingTypes();\n\t\t\t\tnew FormSettings();\n\t\t\t\tnew AdvancedCalculations();\n\t\t\t\tnew SettingData();\n\t\t\t\tnew SettingsEditActive();\n\t\t\t\tnew SettingsClickEdit();\n\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Data controllers need to be set after every other controller has been setup, even if they aren't domain-specific.\n\t\t\t\t * AppData() was after FormData();\n\t\t\t\t */\n\t\t\t\tnew AppData();\n\t\t\t\tnew FieldData();\n\t\t\t\tnew FormData();\n\t\t\t\tnew MergeTags();\n\t\t\t\tnew MergeTagsBox();\n\t\t\t\tnew ItemSettingFill();\n\t\t\t}\n\t\t});\n\n\t\treturn controller;\n} );\n\n","define( 'views/fields/fieldItem',['views/app/itemControls'], function( itemControlsView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-field',\n\t\tdoingShortcut: false,\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:required', this.render, this );\n\t\t\tthis.model.on( 'change:id', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:required', this.render );\n\t\t\tthis.model.off( 'change:id', this.render );\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\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t\tjQuery( this.el ).disableSelection();\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).on( 'taphold', function( e, touch ) {\n\t\t\t\t\tif ( ! jQuery( e.target ).hasClass( 'nf-edit-settings' ) ) {\n\t\t\t\t\t\tjQuery( this ).addClass( 'ui-sortable-helper drag-selected' );\n\t\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderClasses: function() {\n\t \t\t\tvar classes = 'nf-field-wrap';\n\t \t\t\tif ( this.editActive ) {\n\t \t\t\t\tclasses += ' active';\n\t \t\t\t}\n\t \t\t\treturn classes;\n\t \t\t},\n\t \t\trenderRequired: function() {\n\t \t\t\tif ( 1 == this.required ) {\n\t \t\t\t\treturn '<span class=\"required\">*</span>';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\t \t\tgetFieldID: function() {\n\t\t\t\t\tif ( jQuery.isNumeric( this.id ) ) {\n\t\t\t\t\t\treturn 'field-' + this.id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn this.id;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trenderIcon: function() {\n\t\t\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', this.type );\n\t\t\t\t\treturn '<span class=\"fa fa-' + type.get( 'icon' ) + '\"></span>';\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'mousedown': 'maybeShortcut',\n\t\t\t'click': 'maybeClickEdit',\n\t\t\t'singletap': 'maybeTapEdit',\n\t\t\t'swipeleft': 'swipeLeft',\n\t\t\t'swiperight': 'swipeRight',\n\t\t\t'tapend': 'tapend'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( this.doingShortcut ) {\n\t\t\t\tthis.doingShortcut = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) || jQuery( e.target ).parent().hasClass( 'nf-field-wrap' ) || jQuery( e.target ).hasClass( 'nf-field-wrap' ) ) && ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ':focus' ).blur();\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tmaybeShortcut: function( e ) {\n\t\t\tvar keys = nfRadio.channel( 'app' ).request( 'get:keydown' );\n\t\t\t/*\n\t\t\t * If the shift key isn't held down, return.\n\t\t\t */\n\t\t\tif ( -1 == keys.indexOf( 16 ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we are pressing D, delete this field.\n\t\t\t */\n\t\t\tif ( -1 != keys.indexOf( 68 ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\treturn false;\n\t\t\t} else if ( -1 != keys.indexOf( 67 ) ) {\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tmaybeTapEdit: function( e ) {\n\t\t\tif ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tswipeLeft: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).show();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).show();\n\t\t},\n\n\t\tswipeRight: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).hide();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).hide();\n\t\t},\n\n\t\ttapend: function( e, touch ) {\n\t\t\tjQuery( this.el ).ClassyWiggle( 'stop' );\n\t\t\tjQuery( this.el ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t},\n\n\t\tremove: function(){\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:removing' ) ) {\n\t\t\t\tthis.$el.hide( 'clip', function(){\n\t\t\t\t\tjQuery( this ).remove();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.$el.remove();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:removing', false );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tjQuery( this.el ).find( '.nf-item-control' ).css( 'display', '' );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-fields-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\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\tif ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t\tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t}\n\t\t\tjQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\tjQuery( this.el ).parent().droppable( {\n\t\t\t\taccept: function( draggable ) {\n\t\t\t\t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t},\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our form title.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/formTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-header-form-title',\n\n\t\tinitialize: function() {\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change:title', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderTitle: function(){\n\t \t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t \t\t\treturn _.escape( formData.get( 'settings' ).get( 'title' ) );\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\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( 'views/loadViews',[ 'views/fields/fieldItem', 'views/fields/mainContentEmpty', 'views/app/formTitle' ], function( fieldItemView, mainContentEmptyView, FormTitleView ) {\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\t\t\n\t\t\t// Reply to requests for our empty content view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:mainContentEmpty', this.getMainContentEmpty );\n\t\t\n\t\t\t// Reply to requests for our form title view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:formTitle', this.getFormTitle );\n\t\t},\n\n\t\tgetFieldItem: function( model ) {\n\t\t\treturn fieldItemView;\n\t\t},\n\n\t\tgetMainContentEmpty: function() {\n\t\t\treturn mainContentEmptyView;\n\t\t},\n\n\t\tgetFormTitle: function() {\n\t\t\treturn FormTitleView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","var nfRadio = Backbone.Radio;\n\njQuery( document ).ready( function( $ ) {\n\trequire( ['views/app/builder', 'controllers/loadControllers', 'views/loadViews'], function( BuilderView, LoadControllers, LoadViews ) {\n\n\t\tvar NinjaForms = Marionette.Application.extend( {\n\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// Trigger an event before we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadControllers', this );\n\t\t\t\t// Load our controllers.\n\t\t\t\tvar loadControllers = new LoadControllers();\n\t\t\t\t// Trigger an event after we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadControllers', this );\n\n\t\t\t\t// Trigger an event before we load un-instantiated views\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadViews', this );\n\t\t\t\tvar loadViews = new LoadViews();\n\t\t\t\t// Trigger an event after we load un-instantiated views.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadViews', this );\n\n\t\t\t\tnfRadio.channel( 'app' ).reply( 'get:template', this.template );\n\t\t\t},\n\n\t\t\tonStart: function() {\n\t\t\t\tvar builderView = new BuilderView();\n\t\t\t\t// Trigger our after start event.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:appStart', this );\n\n\t\t\t\t/*\n\t\t\t\t * If we're on the new forms builder, open the add fields drawer.\n\t\t\t\t */\n\t\t\t\tif ( 0 == nfAdmin.formID ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\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();\n\t} );\n} );\ndefine(\"main\", function(){});\n\n"],"sourceRoot":"/source/"}1 {"version":3,"sources":["../../../config-wrap-start-default.js","../lib/almond.js","views/app/menuItem.js","views/app/menu.js","views/app/menuButtons.js","views/app/mobileMenuButton.js","views/app/header.js","views/app/subHeader.js","views/app/builderHeader.js","views/app/main.js","views/app/mobileMenuItem.js","views/app/mobileMenu.js","views/app/drawer/contentEmpty.js","views/app/drawer.js","views/app/drawer/mergeTagItem.js","views/app/drawer/mergeTagsSection.js","models/app/mergeTagModel.js","models/app/mergeTagCollection.js","views/app/drawer/mergeTagsContent.js","views/app/builder.js","controllers/app/remote.js","controllers/app/drawer.js","views/app/drawer/headerDefault.js","views/app/drawer/footerDefault.js","models/app/drawerModel.js","models/app/drawerCollection.js","views/fields/drawer/stagedField.js","views/fields/drawer/stagingEmpty.js","views/fields/drawer/stagingCollection.js","models/fields/stagingModel.js","models/fields/stagingCollection.js","views/fields/drawer/typeSection.js","views/fields/drawer/typeSectionCollection.js","views/fields/drawer/addField.js","views/app/drawer/itemSettingCollection.js","views/app/drawer/itemSettingGroup.js","views/app/drawer/itemSettingGroupCollection.js","views/app/drawer/editSettings.js","views/app/drawer/headerEditSettings.js","views/actions/drawer/typeButton.js","views/actions/drawer/typeCollection.js","views/actions/drawer/addAction.js","views/app/drawer/contentViewChangesItem.js","views/app/drawer/contentViewChanges.js","views/app/drawer/headerViewChanges.js","views/app/drawer/settingError.js","views/app/drawer/itemSetting.js","views/app/drawer/contentNewForm.js","views/app/drawer/headerNewForm.js","controllers/app/drawerConfig.js","views/app/drawer/defaultSettingsTitle.js","views/app/empty.js","models/app/domainModel.js","models/app/domainCollection.js","views/fields/subHeader.js","views/fields/mainContentFieldCollection.js","views/fields/drawer/addSavedField.js","views/fields/drawer/settingsTitle.js","views/actions/mainHeader.js","views/actions/subHeader.js","views/app/itemControls.js","views/actions/actionItem.js","views/actions/mainContentEmpty.js","views/actions/mainContent.js","views/advanced/mainHeader.js","views/advanced/subHeader.js","views/advanced/settingItem.js","views/advanced/mainContent.js","models/fields/fieldModel.js","models/fields/fieldCollection.js","controllers/app/domainConfig.js","models/app/appModel.js","controllers/app/data.js","controllers/app/drawerToggleSettingGroup.js","controllers/app/updateDB.js","models/app/formModel.js","controllers/app/formData.js","controllers/app/previewLink.js","controllers/app/menuButtons.js","models/app/changeModel.js","models/app/changeCollection.js","controllers/app/trackChanges.js","controllers/app/undoChanges.js","controllers/app/publishResponse.js","controllers/app/changeDomain.js","controllers/app/pushstate.js","controllers/app/hotkeys.js","controllers/app/cleanState.js","controllers/app/coreUndo.js","controllers/app/cloneModelDeep.js","controllers/app/getSettingChildView.js","controllers/app/changeSettingDefault.js","views/app/drawer/typeSettingFieldset.js","models/app/settingModel.js","models/app/settingCollection.js","controllers/app/fieldset.js","controllers/app/toggleSetting.js","controllers/app/itemControls.js","controllers/app/mergeTags.js","models/app/mergeTagLookupCollection.js","views/app/drawer/mergeTag.js","views/app/drawer/mergeTagList.js","views/app/drawer/mergeTagGroup.js","views/app/drawer/mergeTagGroupList.js","views/app/drawer/mergeTagFilter.js","views/app/drawer/mergeTagBox.js","controllers/app/mergeTagBox.js","controllers/app/itemSettingFill.js","controllers/app/confirmPublish.js","controllers/app/rte.js","controllers/app/settingFieldSelect.js","controllers/app/settingFieldList.js","controllers/app/settingHTML.js","controllers/app/settingColor.js","controllers/app/changeMenu.js","controllers/app/mobile.js","controllers/app/notices.js","controllers/app/unloadCheck.js","controllers/app/formContentFilters.js","controllers/app/formContentGutterFilters.js","controllers/app/cloneCollectionDeep.js","controllers/app/trackKeyDown.js","controllers/app/perfectScroll.js","models/app/settingGroupModel.js","models/app/settingGroupCollection.js","controllers/app/getNewSettingGroupCollection.js","controllers/app/settingMedia.js","models/app/typeModel.js","models/app/typeCollection.js","models/fields/typeSectionModel.js","models/fields/typeSectionCollection.js","controllers/fields/types.js","controllers/fields/fieldTypeDrag.js","controllers/fields/stagingDrag.js","controllers/fields/staging.js","controllers/fields/stagingSortable.js","controllers/fields/filterTypes.js","controllers/fields/sortable.js","controllers/fields/data.js","models/app/optionRepeaterModel.js","models/app/optionRepeaterCollection.js","views/app/drawer/optionRepeaterError.js","views/app/drawer/optionRepeaterOption.js","views/app/drawer/optionRepeaterEmpty.js","views/app/drawer/optionRepeaterComposite.js","controllers/app/optionRepeater.js","controllers/fields/editActive.js","controllers/fields/fieldSettings.js","controllers/fields/fieldCreditCard.js","controllers/fields/fieldList.js","controllers/fields/fieldPassword.js","controllers/fields/fieldQuantity.js","controllers/fields/fieldShipping.js","controllers/fields/key.js","controllers/fields/notices.js","controllers/fields/mobile.js","controllers/fields/savedFields.js","controllers/fields/fieldDatepicker.js","controllers/fields/fieldDisplayCalc.js","controllers/actions/types.js","models/actions/actionModel.js","models/actions/actionCollection.js","controllers/actions/data.js","controllers/actions/actionSettings.js","controllers/actions/editActive.js","controllers/actions/addActionTypes.js","controllers/actions/typeDrag.js","controllers/actions/droppable.js","models/actions/typeModel.js","models/actions/typeCollection.js","controllers/actions/filterTypes.js","controllers/actions/newsletterList.js","controllers/advanced/types.js","models/advanced/settingsModel.js","controllers/advanced/data.js","controllers/advanced/formSettings.js","controllers/advanced/editActive.js","controllers/advanced/clickEdit.js","controllers/advanced/calculations.js","controllers/loadControllers.js","views/fields/fieldItem.js","views/fields/mainContentEmpty.js","views/app/formTitle.js","views/loadViews.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","view","Marionette","ItemView","extend","tagName","template","initialize","this","listenTo","nfRadio","channel","render","model","on","onRender","$el","children","unwrap","setElement","events","click a","clickAppMenu","trigger","templateHelpers","renderDashicons","dashicons","renderClasses","classes","currentDomain","request","get","renderUrl","url","formModel","renderTarget","renderDisabled","disabled","appMenuItemView","CollectionView","childView","onShow","el","find","bounceIcon","that","renderPublish","publishWidth","maybeDisabled","maybeRenderCancel","viewChanges","click .publish","click .viewChanges","clickPublish","clickViewChanges","changeModel","effect","times","click .nf-mobile-menu","clickMobileMenu","builderEl","toggleClass","appMenuCollectionView","appMenuButtonsView","mobileMenuButtonView","LayoutView","regions","menu","buttons","mobileMenuButton","appDomainCollection","show","collection","click #nf-logo","clickLogo","appHeaderView","appSubHeaderView","app","formTitle","appSub","changeSubHeader","formData","formSettings","formTitleView","subHeaderView","className","maybeDone","offsetRight","offsetLeft","gutterLeft","body","gutterRight","reply","getMainEl","window","context","resizeBothGutters","setBothGuttersAbsolute","setBothGuttersFixed","updateGutters","bodyView","gutterLeftView","gutterRightView","parent","onAttach","initialGutterResize","onBeforeDestroy","off","resize","resizeGutter","data","leftEl","rightEl","clearTimeout","top","offset","viewHeight","height","topLeft","leftLeft","left","css","position","topRight","leftRight","scrollTop","right","mobileDashicon","mobileMenuItemView","CompositeView","attachHtml","collectionView","append","click .nf-publish","drawerEmptyView","header","content","footer","getEl","loadContent","emptyContent","perfectScrollbar","drawerID","drawer","contentView","headerView","footerView","empty","click .nf-toggle-drawer","clickToggleDrawer","clickTag","active","mergeTagItemView","fieldCollection","updateFields","set","Backbone","Model","defaults","exclude","mergeTagModel","Collection","mergeTagsSectionView","MergeTagCollection","getMergeTagsView","reRender","settingModel","mergeTagCollection","defaultGroups","where","default_group","calcMergeTagGroup","useMergeTags","_","each","remove","include","models","sectionModel","add","mainView","mobileMenuView","drawerView","mergeTagsContentView","menuDrawer","mergeTagsContent","getBuilderEl","getBuilderView","mergeTags","mergeTagsClone","clone","click .nf-open-drawer","click .nf-change-domain","click .nf-close-drawer","openDrawer","closeDrawer","changeDomain","addListener","dataModel","listen","updateSetting","clickExtra","getRemote","settingView","srcElement","addClass","remote","parentValue","action","security","nfAdmin","ajaxNonce","post","ajaxurl","response","JSON","parse","options","controller","clickOpenDrawer","toggleDrawerSize","getClosedDrawerPos","preventClose","enableClose","maybePreventClose","objPreventClose","filterFocused","currentDrawer","removeClass","rightClosed","drawerEl","checkCloseDrawerPos","setInterval","clearInterval","target","currentDomainID","hasFocus","checkOpenDrawerPos","focusFilter","filterEl","focus","closedPos","width","keys","key","getPreventClose","clearFilter","blurFilter","keyup .nf-filter","input .nf-filter","focus input","changeFilter","maybeChangeFilter","keyCode","addObject","trim","val","blur","getFocus","drawerDisabled","defaultHeaderView","defaultFooterView","getHeaderView","getFooterView","drawerModel","click .dashicons-dismiss","removeStagedField","stagedFieldView","stagedFieldsEmptyView","emptyView","activeClass","getStagedFieldsEl","sortable","placeholder","helper","tolerance","over","ui","out","receive","update","start","stop","draggable","opacity","connectToSortable","appendTo","refreshPositions","grid","element","zIndex","onAddChild","onRemoveChild","hasStagedFields","stagingModel","comparator","bindAll","getTypeSection","dragging","drag","disableSelection","click .nf-item","keydown .nf-item","mousedown .nf-item","clickFieldType","mousedownFieldType","maybeClickFieldType","renderFieldTypes","html","fieldTypes","type","nicename","icon","renderType","savedField","fieldTypeSectionView","drawerStagingView","StagingCollection","fieldTypeSectionCollectionView","staging","primary","secondary","filterFieldTypes","removeFieldTypeFilter","savedCollection","primaryCollection","fieldTypeSectionCollection","secondaryCollection","stagingCollection","filteredSectionCollection","reset","childViewOptions","getChildView","itemSettingCollectionView","settings","click .toggle","clickToggleGroup","renderLabel","label","groupLabel","renderArrowDir","display","itemSettingGroupView","itemSettingGroupCollectionView","settingTitle","settingGroups","groupCollection","titleView","maybeRenderTitle","title","renderTypeNicename","domainID","scroll","clickAddAction","open","image","section","renderStyle","actionTypeButtonView","renderNicename","slug","actionTypeCollectionView","filteractionTypes","removeactionTypeFilter","installedActions","availableActions","filteredInstalled","filteredAvailable","click .undoSingle","undoSingle","viewChangesItem","click .undoChanges","clickUndoChanges","settingErrorView","error","renderOnChange","renderError","refresh","drawerOpened","drawerClosed","setting","unescape","silent","onBeforeRender","escape","next","jBox","maxWidth","theme","closeOnClick","mask","input","autoNumeric","aSep","thousandsSeparator","aDec","decimalPoint","currency","currencySymbol","currencySymbols","aSign","text","format","console","log","renderVisible","renderSetting","renderLabelClasses","use_merge_tags","renderTooltip","help","renderMergeTags","hide_merge_tags","renderPlaceholder","change .setting","keyup .setting","click .setting","click .extra","changeSetting","keyUpSetting","clickSetting","itemSettingView","formName","formSubmit","titleSettingModel","addSubmitSettingModel","submitButtons","findWhere","drawerCollection","addFieldView","editSettingsView","editSettingsHeaderView","addActionView","viewChangesView","viewChangesHeaderView","newFormView","newFormHeaderView","mobileItemControlsView","getContentView","typeModel","getDrawerCollection","getDrawer","DefaultSettingsTitleView","EmptyView","hotkeys","getSettingsTitleView","getDefaultSettingsTitleView","getGutterLeftView","getGutterRightView","domainModel","reorderOnSort","getEmptyView","getSortableEl","initSortable","destroySortable","cancel","scrollSensitivity","item","dropping","hide","renderAddButton","button","click .nf-button","clickAddSavedField","addSavedFieldView","renderjBoxContent","addSaved","addSavedjBox","destroy","unset","x","y","outside","onCreated","setContent","attach","displayName","saved","realType","renderSavedStar","star","actionCollection","mouseover .nf-item-control","click .nf-edit-settings","singletap .nf-edit-settings","click .nf-delete","click .nf-duplicate","clickEdit","singleTapEdit","clickDelete","clickDuplicateField","mouseoverItemControl","itemControlsView","itemControls","maybeDeactivate","change input","click","maybeClickEdit","changeToggle","renderToggle","settingName","actionLabel","actionView","droppable","accept","hoverClass","drop","updateActiveClass","editActive","settingItem","objectType","objectDomain","order","fieldType","parentType","updateFieldKey","changedAttributes","keyModel","fieldModel","parseInt","tmpNum","addField","removeField","addNewField","appendNewField","removeFieldResponse","newIDs","removedIDs","at","fieldExists","fieldsSubHeaderView","FieldsMainContentFieldCollectionView","fieldsSettingsTitleView","actionsMainHeaderView","actionsSubHeaderView","actionsMainContentView","settingsMainHeaderView","settingsSubHeaderView","settingsMainContentView","FieldCollection","defaultFormContentView","defaultFormContentLoad","defaultFormContentGutterView","nfi18n","domainFormFields","Esc","Ctrl+Shift+n","Ctrl+Shift+a","Ctrl+Shift+s","Alt+Ctrl+t","up","down","Shift+return","getSubHeaderView","getMainContentView","formContentData","formContentLoadFilters","sortedArray","without","first","formContentViewFilters","formContentView","gutterFilters","gutterView","domainActions","Ctrl+Shift+f","domainAdvanced","previewurl","getDomainCollection","getDomainModel","fieldModels","loading","changeStatus","appModel","clean","mobile","isMobile","getData","getSetting","getCurrentDomain","getCurrentDrawer","updateCurrentDomain","updateCurrentDrawer","currentDrawerID","toggleSettingGroup","errors","updateDB","defaultSaveFilter","jsAction","formContentSaveDataFilters","stringify","fields","field","parent_id","deleted_fields","actions","deleted_actions","autoClose","form","exception","pluck","isNumeric","preloadedFormData","getFormModel","disablePreview","enablePreview","changePreviewNicename","appDomains","preview","publish","changeCollection","cid","ChangeModel","registerChange","getCollection","maybeResetCollection","changes","dashicon","undoChanges","sort","change","undoAll","publishResponse","new_ids","newID","oldID","forms","history","replaceState","changeAppDomain","preventChange","enableChange","objPreventChange","maybePreventChange","mainEl","changePushState","pushState","location","href","reExp","toString","newUrl","changeHotkeys","addNewAction","changeDomainFields","changeDomainActions","changeDomainSettings","document","hotkey","msg","fieldsDomain","actionsDomain","settingsDomain","ignoreAttributes","setAppClean","attr","changedAttr","after","undoChangeSetting","undoAddObject","undoRemoveObject","undoDuplicateObject","undoSortFields","undoAddListOption","undoRemoveListOption","undoSortListOptions","before","maybeRemoveChange","objectModel","results","objectCollection","objModels","optionModel","cloneModelDeep","attributes","clonedCollection","newModel","getSettingChildView","settingChildView","object","maybePreventUI","updateKey","fieldsetView","settingCollection","createSettingsCollection","settingTypeModel","clickDuplicate","tmpID","tagSectionCollection","tagSection","tags","fieldTags","tag","getFieldKeyFormat","calcTags","calcCollection","calcModel","currentElement","clickMergeTag","addFieldTags","deleteFieldTags","updateCalcTags","updateCurrentElement","updateCurrentSetting","getSectionModel","replaceFieldKey","initMergeTags","mergeTagsView","jBoxes","closeOnEsc","maxHeight","onOpen","prev","onClose","tagModel","currentValue","currentPos","caret","newPos","substr","summernote","calcTag","getFieldKeyFormatCalc","fieldID","calc","openMergeTags","returnMergeTags","preventDefault","currentModel","upMergeTags","changeActiveTag","downMergeTags","dir","inc","currentIndex","nextModel","userInfo","system","updateOpen","newKey","oldTag","oldKey","_previousAttributes","oldVal","oldCalcKey","newCalcKey","re","RegExp","newVal","insertTag","mergeTagView","sectionFilter","searchFilter","filter","child","term","toLowerCase","removeActive","onClick","updateTags","setActive","siblings","mergeTagGroupView","keyup input","updateFilter","event","firstFilteredTag","sections","MergeTagModel","MergeTagLookupCollection","MergeTagView","MergeTagListView","MergeTagGroupView","MergeTagGroupListView","MergeTagFilterView","MergeTagBoxLayout","old","mergeTagsButtonClick","afterAppStart","beforeRenderSetting","beforeDrawerClose","bind","selector","focusCallback","keyupCallback","closest","layout","tagCollection","mergeTagListView","mergeTagGroupListView","getRegion","rteEditor","posY","outerHeight","boxHeight","repeaterRow","scrollLeft","posX","$input","hasClass","str","caretPos","patt","match","exec","string","childNode","childNodes","node","nodeValue","innerHTML","range","createRange","sel","getSelection","setStart","err","collapse","removeAllRanges","addRange","$this","$inputSetting","autocomplete","$overlayElement","dataID","so","mergetags","mergetag","elementClasses","confirmPublish","initSettingModel","destroySetting","meta_image_frame","icons","align","alignCenter","alignJustify","alignLeft","alignRight","indent","outdent","bold","close","code","eraser","italic","link","unlink","magic","minus","orderedlist","redo","square","table","underline","undo","unorderedlist","currentContext","initRTE","linkButton","mediaButton","toolbar","codemirror","lineNumbers","callbacks","onBlur","editor","getValue","updateDataModel","prettifyHtml","onFocus","onKeydown","onKeyup","linkMenu","replaceWith","class","removeRTE","linkDropdown","buttonGroup","contents","tooltip","clickLinkButton","toggle","dropdown","mergeTagsButton","openMediaManager","invoke","wp","media","frames","media_attachment","state","toJSON","insertMedia","textEl","urlEl","isNewWindowEl","isNewWindow","filename","trackKeyChanges","beforeRender","maybeSwitchToFieldsDomain","autoOpenDrawer","filterDrawerContents","SwitchToFieldsDomain","updateFieldMap","contains","fieldFilter","bail","fieldTypeModel","rubble","filterDrawer","switchDomain","fieldDomainModel","fieldListSettings","registerFieldListSettings","updateFieldListSettingKeys","changed","Radio","actionModel","lastChanged","oldValue","init","changedSettingValue","setRenderFalse","closeColorPickers","initColorPicker","wpColorPicker","color","editFormText","changeMenu","formPublish","isNewForm","highlightAddNew","appendEditForm","form_id","isNaN","closeMobileMenu","addNotice","closeNotice","notices","appDefaults","constructOnInit","stack","animation","mobileDefaults","desktopDefaults","openNotice","maybePrompt","viewFilters","saveFilters","loadFilters","addViewFilter","addSaveFilter","addLoadFilter","getViewFilters","getSaveFilters","getLoadFilters","priority","leftFilters","rightFilters","addLeftFilter","addRightFilter","getLeftFilters","getRightFilters","cloneCollectionDeep","constructor","keyDown","keyUp","getKeyDown","movedPos","initPerfectScroll","moveRail","resetRail","suppressScrollX","outerWidth","SettingCollection","settingGroupModel","SettingGroupCollection","getNewSettingGroupCollection","option","typeSectionModel","TypeCollection","SectionCollection","fieldTypeSections","registerSection","fieldTypeData","getFieldType","getTypeCollection","getTypeSections","getSavedFields","shiftKey","startDrag","stopDrag","getCurrentDraggableHelperClone","style","setProperty","draggableHelperClone","stagedFields","num","addStagedField","getStagingCollection","sortStagedFields","clearStagedFields","beforeCloseDrawer","now","tmpField","sortableEl","search","pos","receiveStagedFields","overStagedFields","outStagedFields","startStagedFields","stopStagedFields","addActiveClass","stagedFieldsEl","removeActiveClass","currentHelper","helperClone","filtered","filterCollection","found","alias","receiveFieldsSortable","overfieldsSortable","outFieldsSortable","stopFieldsSortable","startFieldsSortable","updateFieldsSortable","insertedAt","fieldWidth","dragFieldID","dragModel","oldPos","adding","removing","getFieldCollection","getField","redrawFieldCollection","getTmpFieldID","deleteField","sortFields","getAdding","setAdding","getRemoving","setRemoving","renderTrigger","savedType","updateFieldSetting","changeErrors","size","errorsFound","opt","listOptionModel","addOption","renderErrors","ErrorView","columns","parentView","hasErrors","keyup","changeOption","deleteOption","keyupOption","maybeAddOption","findByIndex","getColumns","renderFieldSelect","_return","selected","renderOptions","column","listOptionView","listEmptyView","listOptionCollection","optionCollection","handle","forcePlaceholderSize","importLink","closeButton","clickImport","renderHeaders","col","renderFieldsetClasses","currency_symbol","click .nf-add-new","clickAddOption","textarea","trimLeft","trimRight","lines","isArray","line","row","slugify","separator","listCompositeView","updateOptionSortable","stopOptionSortable","startOptionSortable","convertSettings","optionView","triggerDataModel","modelData","new","default","newOrder","clearEditActive","fieldSettings","getSettingModel","getSettingCollection","dropCreditCardField","newField","stageCreditCardField","ListOptionCollection","updateOptionLabel","updateOptionValue","convertOptions","select","confirm","insertField","productFields","getProductFields","addMask","newFieldKey","updateLabel","d","Date","valueOf","setError","keyExists","testKey","startWiggle","stopWiggle","initWiggle","ClassyWiggle","degrees","delay","updateField","modified","modelClone","fieldData","created_at","formID","newType","newTypeDefaults","settingDefaults","typeCollection","typeSections","addDatepicker","pikadayResponsive","actionTypeData","installed","available","getType","getInstalledActions","getAvailableActions","actionType","addAction","removeAction","getAction","getTmpID","deleteAction","actionSettings","dropActionType","type_slug","actionTypeModel","filterActionTypes","newInstalled","newAvailable","defaultFields","clickListUpdate","maybeRenderFields","maybeRenderGroups","registerFieldsListener","registerGroupsListener","updateFieldMapping","updateInterestGroups","updateLists","lists","always","selectedList","list","groups","group","formSettingTypeData","settingsModel","getSettings","updateCalc","sortCalc","checkName","checkEQ","checkDec","checkAllCalcs","nameExists","eq","errorSelfRef","errorFutureCalc","calcs","calculations","targetCalc","selfRef","futureCalc","dec","errorNonIntDec","checked","Math","abs","nonIntDec","Remote","Drawer","DrawerConfig","DomainConfig","AppData","DrawerToggleSettingGroup","UpdateDB","FormData","PreviewLink","AppMenuButtons","AppTrackChanges","AppUndoChanges","AppPublishResponse","AppChangeDomain","Pushstate","Hotkeys","CleanState","CoreUndo","CloneModelDeep","DrawerSettingChildView","ChangeSettingDefault","Fieldset","ToggleSetting","ItemControls","MergeTags","MergeTagsBox","ItemSettingFill","ConfirmPublish","RTE","SettingFieldSelect","SettingFieldList","SettingHTML","SettingColor","ChangeMenu","AppMobile","AppNotices","AppUnloadCheck","FormContentFilters","FormContentGutterFilters","CloneCollectionDeep","TrackKeyDown","PerfectScroll","GetNewSettingGroupCollection","SettingMedia","FieldTypes","FieldTypeDrag","FieldStagingDrag","StagedFieldsData","StagedFieldsSortable","DrawerFilterFieldTypes","MainContentFieldsSortable","FieldData","OptionRepeater","FieldsEditActive","FieldSettings","FieldCreditCard","FieldList","FieldPassword","FieldQuantity","FieldShipping","FieldKey","Notices","FieldsMobile","SavedFields","FieldDatepicker","FieldDisplayCalc","ActionTypes","ActionData","ActionSettings","ActionEditActive","ActionAddTypes","ActionTypeDrag","ActionDroppable","ActionFilterTypes","ActionNewsletterList","SettingTypes","SettingData","FormSettings","SettingsEditActive","SettingsClickEdit","AdvancedCalculations","doingShortcut","touch","renderRequired","required","getFieldID","renderIcon","mousedown","singletap","swipeleft","swiperight","tapend","maybeShortcut","maybeTapEdit","swipeLeft","startEvnt","swipeRight","renderTitle","fieldItemView","mainContentEmptyView","FormTitleView","getFieldItem","getMainContentEmpty","getFormTitle","ready","$","BuilderView","LoadControllers","LoadViews","NinjaForms","Application","Renderer","onStart","evaluate","interpolate","variable","ninjaForms"],"mappings":"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rgB,IAAA,SAAA8a,GACAuF,EAAAzoB,QAAA,gBAAAyoB,IAIA0gB,cAAA,SAAAlmC,GACA,GAAA3B,GAAArC,IACAgE,GAAAyG,OAAApP,IAAA,SAAAgmC,GACAh/B,EAAA0nC,UAAA1I,EAAA9/B,IAAA,QAAA8/B,GACAh/B,EAAA2nC,QAAA3I,EAAA9/B,IAAA,MAAA8/B,GACAh/B,EAAA4nC,SAAA5I,EAAA9/B,IAAA,OAAA8/B,OAMA,OAAAn0B,KC/LApT,EACA,+BAIA,yBACA,yBACA,+BACA,+BACA,uBACA,2CACA,2BACA,2BACA,8BACA,8BACA,+BACA,8BACA,kCACA,+BACA,4BACA,0BACA,6BACA,2BACA,iCACA,sCACA,uCACA,2BACA,gCACA,+BACA,4BACA,8BACA,kCACA,iCACA,sBACA,qCACA,mCACA,8BACA,+BACA,6BACA,yBACA,0BACA,8BACA,qCACA,2CACA,sCACA,+BACA,gCACA,+CACA,+BAIA,2BACA,mCACA,iCACA,6BACA,qCACA,iCACA,8BACA,0BACA,iCACA,gCACA,mCACA,qCACA,+BACA,mCACA,mCACA,mCACA,yBACA,6BACA,4BACA,iCACA,qCACA,sCAKA,4BACA,2BACA,qCACA,iCACA,qCACA,+BACA,gCACA,kCACA,qCAKA,6BACA,4BACA,oCACA,kCACA,iCACA,qCAEA,SAIAoxC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAIAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GACAC,GACAC,GAC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","file":"builder.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","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menuItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-app-menu-item',\n\n\t\tinitialize: function() {\n\t\t\t// Listen for domain changes and re-render when we detect one.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// Listen for clicks on our app menu.\n\t\tevents: {\n\t\t\t'click a': 'clickAppMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click on a menu item, fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * We pass this.model so that we know what item was clicked.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\te event\n\t\t * @return return\n\t\t */\n\t\tclickAppMenu: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t\t\t\t * If we have any dashicons in our model, render them.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDashicons: function() {\n\t\t\t\t\tif ( this.dashicons ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.dashicons + '\"></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\t\t\t\t/**\n\t\t\t\t * Render classes for our menu item, including active.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\n\t\t\t\t\t\tclasses += ' active';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its url.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderUrl: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\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\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its target.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderTarget: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\treturn '_blank';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '_self';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * If our menu item is disabled, output 'disabled'\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\tif ( this.disabled ) {\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\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Collection view that takes our app menu items and renders an individual view for each.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menu',['views/app/menuItem'], function( appMenuItemView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: appMenuItemView,\n\n\t\t/**\n\t\t * When we show this view, get rid of the extra <div> tag added by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonShow: function() {\n\t\t\tjQuery( this.el ).find( 'li:last' ).unwrap();\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Renders the action buttons to the right of the app menu. i.e. Publish\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/menuButtons',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'span',\n\t\ttemplate: '#tmpl-nf-app-header-action-button',\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:loading', this.render, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.bounceIcon, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t \t\t/**\n\t \t\t * Render our Publish button. If we're loading, render the loading version.\n\t \t\t *\n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\trenderPublish: function() {\n\t \t\t\tif ( that.publishWidth ) {\n\t \t\t\t\tthis.publishWidth = 'style=\"width:' + that.publishWidth + 'px !important\"';\n\t \t\t\t} else {\n\t \t\t\t\tthis.publishWidth = '';\n\t \t\t\t}\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'loading' ) ) {\n\t \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-header-publish-loading' );\n\t \t\t\t} else {\n\t \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-app-header-publish-button' );\n\t \t\t\t}\n\t \t\t\treturn template( this );\n\t \t\t},\n\n\t \t\t/**\n\t \t\t * If our app state is clean, disable publish.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\n\t \t\t/**\n\t \t\t * If our app isn't clean, render our 'viewChanges' button.\n\t \t\t * @since version\n\t \t\t * @return {[type]} [description]\n\t \t\t */\n\t \t\tmaybeRenderCancel: function() {\n\t \t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\tvar viewChanges = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-app-header-view-changes' );\n\t \t\t\t\treturn viewChanges( this );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tvar publishEL = jQuery( this.el ).find( '.publish' );\n\t\t\t// this.publishWidth = jQuery( publishEL ).outerWidth( true );\n\t\t},\n\n\t\t/**\n\t\t * Listen for clicks on the Publish or view changes button.\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .publish': 'clickPublish',\n\t\t\t'click .viewChanges': 'clickViewChanges'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\n\t\t},\n\n\t\t/**\n\t\t * When we click view changes, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickViewChanges: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:viewChanges', e );\n\t\t},\n\n\t\tbounceIcon: function( changeModel ) {\n\t\t\tjQuery( this.el ).find( '.dashicons-backup' ).effect( 'bounce', { times: 3 }, 600 );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders the action buttons to the right of the app menu. i.e. Publish\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenuButton',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'span',\n\t\ttemplate: '#tmpl-nf-mobile-menu-button',\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\t/**\n\t \t\t * If our app state is clean, disable button.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t}\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Listen for clicks on the mobile menu button.\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .nf-mobile-menu': 'clickMobileMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickMobileMenu: function( e) {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Main application header. Includes links to all of our domains.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/header',['views/app/menu', 'views/app/menuButtons', 'views/app/mobileMenuButton'], function( appMenuCollectionView, appMenuButtonsView, mobileMenuButtonView ) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-app-header',\n\n\t\tregions: {\n\t\t\t// Menu is our main app menu.\n\t\t\tmenu: '.nf-app-menu',\n\t\t\t// Buttons represents the 'view changes' and 'Publish' buttons.\n\t\t\tbuttons: '.nf-app-buttons',\n\t\t\tmobileMenuButton: '.nf-mobile-menu-button'\n\t\t},\n\n\t\t/**\n\t\t * Since this is a layout region, we need to fill the two areas: menu and buttons whenever we show this view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonRender: function() {\n\t\t\t// Get our domains\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\t// show the menu area using the appropriate view, passing our domain collection.\n\t\t\tthis.menu.show( new appMenuCollectionView( { collection: appDomainCollection } ) );\n\t\t\tthis.buttons.show( new appMenuButtonsView() );\n\t\t\tthis.mobileMenuButton.show( new mobileMenuButtonView() );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click #nf-logo': 'clickLogo'\n\t\t},\n\n\t\tclickLogo: function( e ) {\n\t\t\t\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Renders our sub-header. i.e. add new field, add new action, etc.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our builder header.\n *\n * This is a layout view and handles two regions:\n * app - menu/buttons\n * subapp - title, add new field, etc.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/builderHeader',[ 'views/app/header', 'views/app/subHeader' ], function( appHeaderView, appSubHeaderView ) {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: \"div\",\n\t\ttemplate: \"#tmpl-nf-header\",\n\n\t\tregions: {\n\t\t\tapp: \"#nf-app-header\",\n\t\t\tformTitle: \"#nf-app-form-title\",\n\t\t\tappSub: \"#nf-app-sub-header\"\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changeSubHeader );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.app.show( new appHeaderView() );\n\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar formSettings = formData.get( 'settings' );\n\n\t\t\tvar formTitleView = nfRadio.channel( 'views' ).request( 'get:formTitle' );\n\t\t\tthis.formTitle.show( new formTitleView( { model: formSettings } ) );\n\n\t\t\tthis.changeSubHeader();\n\t\t},\n\n\t\tchangeSubHeader: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar subHeaderView = currentDomain.get( 'getSubHeaderView' ).call( currentDomain );\n\t\t\tthis.appSub.show( subHeaderView );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our builder.\n *\n * This is a layout view and handles three regions:\n * gutterLeft - gutter to the left of our main content area\n * body - main content area\n * gutterRight - gutter to the right of our main content area\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/main',[], function() {\n\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main',\n\t\tclassName: 'nf-main-test',\n\t\tmaybeDone: false,\n\n\t\toffsetRight: false,\n\t\toffsetLeft: false,\n\n\t\tregions: {\n\t\t\tgutterLeft: '#nf-main-gutter-left',\n\t\t\tbody: '#nf-main-body',\n\t\t\tgutterRight: '#nf-main-gutter-right'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:mainEl', this.getMainEl, this );\n\n\t\t\t/*\n\t\t\t * Make sure that our gutters resize to match our screen upon resize or drawer open/close.\n\t\t\t */\n\t\t\tjQuery( window ).on( 'resize', { context: this }, this.resizeBothGutters );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:open', this.setBothGuttersAbsolute );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.setBothGuttersFixed );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.setBothGuttersAbsolute );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.setBothGuttersFixed );\n\n\t\t\t/*\n\t\t\t * Reply to messages requesting that we resize our gutters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:gutters', this.updateGutters, this );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tnfRadio.channel( 'main' ).trigger( 'show:main', this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar bodyView = currentDomain.get( 'getMainContentView' ).call( currentDomain );\n\t\t\tthis.body.show( bodyView );\n\n\t\t\tvar gutterLeftView = currentDomain.get( 'getGutterLeftView' ).call( currentDomain );\n\t\t\tthis.gutterLeft.show( gutterLeftView );\n\n\t\t\tvar gutterRightView = currentDomain.get( 'getGutterRightView' ).call( currentDomain );\n\t\t\tthis.gutterRight.show( gutterRightView );\n\t\t\t\n\t\t\tnfRadio.channel( 'main' ).trigger( 'render:main' );\n\t\t},\n\n\t\tgetMainEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tonAttach: function() {\n\t\t\tthis.initialGutterResize();\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( window ).off( 'resize', this.resize );\n\t\t},\n\n\t\tinitialGutterResize: function() {\n\t\t\tthis.resizeGutter( this.gutterLeft.el );\n\t\t\tthis.resizeGutter( this.gutterRight.el );\n\t\t\tthis.setBothGuttersFixed( this );\n\t\t},\n\n\t\tresizeBothGutters: function( e ) {\n\t\t\tvar context = ( e ) ? e.data.context : this;\n\n\t\t\tvar leftEl = context.gutterLeft.el;\n\t\t\tvar rightEl = context.gutterRight.el;\n\t\t\t\n\t\t\tcontext.resizeGutter( leftEl, context );\n\t\t\tcontext.resizeGutter( rightEl, context );\n\n\t\t\tcontext.setBothGuttersAbsolute( context );\n\n\t\t\t/*\n\t\t\t * Clear our timeout. If the timeout runs, it means we've stopped resizing.\n\t\t\t */\t\n\t\t\tclearTimeout( context.maybeDone );\n\t\t\t/*\n\t\t\t * Add our timeout.\n\t\t\t */\n\t\t\tcontext.maybeDone = setTimeout( context.setBothGuttersFixed, 100, context );\n\t\t},\n\n\t\tresizeGutter: function( el, context ) {\n\t\t\tvar top = jQuery( el ).offset().top;\n\t\t\tvar viewHeight = jQuery( window ).height();\n\t\t\tvar height = viewHeight - top;\n\t\t\tjQuery( el ).height( height );\n\t\t},\n\n\t\tsetBothGuttersFixed: function( context ) {\n\t\t\tcontext = context || this;\n\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\tvar topLeft = offsetLeft.top;\n\t\t\tvar leftLeft = offsetLeft.left;\n\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'fixed', left: leftLeft, top: topLeft } );\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\t\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\n\t\t\tvar topRight = offsetRight.top;\n\t\t\tvar leftRight = offsetRight.left;\n\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'fixed', left: leftRight, top: topRight } );\n\t\t},\n\n\t\tsetBothGuttersAbsolute: function( context ) {\n\t\t\tcontext = context || this;\n\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\n\n\t\t\tvar scrollTop = jQuery( '#nf-main' ).scrollTop();\n\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'absolute', left: 0, top: scrollTop } );\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'absolute', top: scrollTop, right: 0, left: 'auto' } );\n\t\t},\n\n\t\tupdateGutters: function() {\n\t\t\tthis.resizeBothGutters();\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenuItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-mobile-menu-item',\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// Listen for clicks on our app menu.\n\t\tevents: {\n\t\t\t'click a': 'clickAppMenu'\n\t\t},\n\n\t\t/**\n\t\t * When we click on a menu item, fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * We pass this.model so that we know what item was clicked.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\te event\n\t\t * @return return\n\t\t */\n\t\tclickAppMenu: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t\t\t\t * If we have any dashicons in our model, render them.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDashicons: function() {\n\t\t\t\t\tif ( this.mobileDashicon ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.mobileDashicon + '\"></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\t\t\t\t/**\n\t\t\t\t * Render classes for our menu item, including active.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = this.classes;\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\n\t\t\t\t\t\tclasses += ' active';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its url.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderUrl: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\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\t\t\t\t/**\n\t\t\t\t * If our menu is a link (like preview), render its target.\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderTarget: function() {\n\t\t\t\t\tif ( '' != this.url ) {\n\t\t\t\t\t\treturn '_blank';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn '_self';\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * If our menu item is disabled, output 'disabled'\n\t\t\t\t * \n\t\t\t\t * @since 3.0\n\t\t\t\t * @return string\n\t\t\t\t */\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\tif ( this.disabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Single item view used for the menu drawer.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/mobileMenu',['views/app/mobileMenuItem'], function( mobileMenuItemView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-mobile-menu',\n\t\tchildView: mobileMenuItemView,\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.secondary' ).append( childView.el );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\t/**\n\t \t\t * If our app state is clean, disable button.\n\t \t\t * \n\t \t\t * @since 3.0\n\t \t\t * @return string\n\t \t\t */\n\t \t\tmaybeDisabled: function() {\n\t \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t \t\t\t\treturn 'disabled';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-publish': 'clickPublish'\n\t\t},\n\n\t\t/**\n\t\t * When we click publish, trigger a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Empty drawer content view.\n * Called before we close the drawer.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our drawer region\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer',['views/app/drawer/contentEmpty'], function( drawerEmptyView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer',\n\n\t\tregions: {\n\t\t\theader: '#nf-drawer-header',\n\t\t\tcontent: '#nf-drawer-content',\n\t\t\tfooter: '#nf-drawer-footer'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerEl', this.getEl, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'load:drawerContent', this.loadContent, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'empty:drawerContent', this.emptyContent, this );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).parent().perfectScrollbar();\n\t\t\t}\n\t\t},\n\n\t\tloadContent: function( drawerID, data ) {\n\t\t\tvar drawer = nfRadio.channel( 'app' ).request( 'get:drawer', drawerID );\n\t\t\tvar contentView = drawer.get( 'getContentView' ).call( drawer, data );\n\t\t\tvar headerView = drawer.get( 'getHeaderView' ).call( drawer, data );\n\t\t\tvar footerView = drawer.get( 'getFooterView' ).call( drawer, data );\n\n\t\t\tthis.header.show( headerView );\n\t\t\tthis.content.show( contentView );\n\t\t\tthis.footer.show( footerView );\n\n\t\t},\n\n\t\temptyContent: function() {\n\t\t\tthis.header.empty();\n\t\t\tthis.content.empty();\n\t\t\tthis.footer.empty();\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-toggle-drawer': 'clickToggleDrawer'\n\t\t},\n\n\t\tclickToggleDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:toggleDrawerSize' );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Single item view used for merge tags.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'li',\n\n\t\ttemplate: '#tmpl-nf-merge-tags-item',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:active', this.render );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:active', this.render, this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click a': 'clickTag'\n\t\t},\n\n\t\tclickTag: function( e ) {\n\t\t\tnfRadio.channel( 'mergeTags' ).trigger( 'click:mergeTag', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tif ( this.active ) {\n\t\t\t\t\t\treturn 'active';\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Merge tags popup section\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagsSection',['views/app/drawer/mergeTagItem'], function( mergeTagItemView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttagName: 'div',\n\t\tchildView: mergeTagItemView,\n\t\ttemplate: '#tmpl-nf-merge-tags-section',\n\n\t\tinitialize: function() {\n\t\t\tthis.collection = this.model.get( 'tags' );\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\n\t\t\t\t// var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t// fieldCollection.on( 'all', this.updateFields, this );\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change', this.render );\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\tfieldCollection.off( 'all', this.updateFields, this );\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.merge-tags' ).append( childView.el );\n\t\t},\n\n\t\tupdateFields: function() {\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tthis.model.set( 'tags', fieldCollection );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Model that represents our merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tactive: false,\n\t\t\texclude: false\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collections of merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: mergeTagModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Merge tags popup\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagsContent',['views/app/drawer/mergeTagsSection', 'models/app/mergeTagCollection'], function( mergeTagsSectionView, MergeTagCollection ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-merge-tags-content',\n\t\tchildView: mergeTagsSectionView,\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:view', this.getMergeTagsView, this );\n\t\t},\n\n\t\treRender: function( settingModel ) {\n\t\t\tvar mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n\t\t\tvar defaultGroups = mergeTagCollection.where( { default_group: true } );\n\n\t\t\t/*\n\t\t\t * For the Actions Domain, Add Calc Merge Tags as a Default Group.\n\t\t\t */\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tif( 'actions' == currentDomain.get( 'id' ) ){\n\t\t\t\tvar calcMergeTagGroup = mergeTagCollection.where( { id: 'calcs' } );\n defaultGroups = defaultGroups.concat( calcMergeTagGroup );\n }\n\n\t\t\tthis.collection = new MergeTagCollection( defaultGroups );\n\t\t\tvar that = this;\n\t\t\tvar useMergeTags = settingModel.get( 'use_merge_tags' );\n\t\t\tif ( 'object' == typeof useMergeTags ) {\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.exclude ) {\n\t\t\t\t\t_.each( useMergeTags.exclude, function( exclude ) {\n\t\t\t\t\t\tthat.collection.remove( exclude )\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.include ) {\n\t\t\t\t\t_.each( mergeTagCollection.models, function( sectionModel ) {\n\t\t\t\t\t\tif ( -1 != useMergeTags.include.indexOf( sectionModel.get( 'id' ) ) ) {\n\t\t\t\t\t\t\t// console.log( sectionModel );\n\t\t\t\t\t\t\tthat.collection.add( sectionModel );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.render();\n\t\t},\n\n\t\tgetMergeTagsView: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Builder view.\n *\n * This layout view has regions that represent our application areas:\n * header\n * main\n * menuDrawer - Mobile side-menu\n * drawer\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/builder',['views/app/builderHeader', 'views/app/main', 'views/app/mobileMenu', 'views/app/drawer', 'views/app/drawer/mergeTagsContent'], function( headerView, mainView, mobileMenuView, drawerView, mergeTagsContentView ) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: \"#tmpl-nf-builder\",\n\t\tel: '#nf-builder',\n\n\t\tregions: {\n\t\t\theader: \"#nf-header\",\n\t\t\tmain: \"#nf-main\",\n\t\t\tmenuDrawer: \"#nf-menu-drawer\",\n\t\t\tdrawer: \"#nf-drawer\",\n\t\t\tmergeTagsContent: '.merge-tags-content'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Respond to requests asking for the builder dom element.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderEl', this.getBuilderEl, this );\n\t\t\t// Respond to requests asking for the builder view\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderView', this.getBuilderView, this );\n\t\t\t// Layout views aren't self-rendering.\n\t\t\tthis.render();\n\t\t\tvar mergeTags = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n\t\t\tvar mergeTagsClone = mergeTags.clone();\n\t\t\tthis.mergeTagsContent.show( new mergeTagsContentView( { collection: mergeTagsClone } ) );\n\t\t\t// Show our header.\n\t\t\tthis.header.show( new headerView() );\n\t\t\t// Show our main content.\n\t\t\tthis.main.show( new mainView() );\n\t\t\t// Show our mobile menu\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tthis.menuDrawer.show( new mobileMenuView( { collection: appDomainCollection } ) );\n\t\t\t// Show our drawer.\n\t\t\tthis.drawer.show( new drawerView() );\n\n\n\t\t},\n\n\t\tonRender: function() {\n\n\t\t},\n\n\t\tgetBuilderEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\tgetBuilderView: function() {\n\t\t\treturn this;\n\t\t},\n\n\t\t// Listen for clicks\n\t\tevents: {\n\t\t\t'click .nf-open-drawer': 'openDrawer',\n\t\t\t'click .nf-change-domain': 'changeDomain',\n\t\t\t'click .nf-close-drawer': 'closeDrawer'\n\t\t},\n\n\t\t/**\n\t\t * Someone clicked to open a drawer, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Object \te \tevent\n\t\t * @return void\n\t\t */\n\t\topenDrawer: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:openDrawer', e );\n\t\t},\n\t\t/**\n\t\t * Someone clicked to close a drawer, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tcloseDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:closeDrawer' );\n\t\t},\n\t\t/**\n\t\t * Someone clicked to change the domain, so fire a radio event.\n\t\t * This lets us separate the logic from the click event and view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param Object \te \tevent\n\t\t * @return void\n\t\t */\n\t\tchangeDomain: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n\n","\ndefine( 'controllers/app/remote',[], function() {\n return Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'setting' ), 'remote', this.addListener );\n },\n\n addListener: function( model, dataModel ) {\n\n var listenTo = model.get( 'remote' ).listen;\n\n // TODO: Change seems to be triggering twice on each update.\n this.listenTo( nfRadio.channel( 'fieldSetting-' + listenTo ), 'update:setting', this.updateSetting );\n this.listenTo( nfRadio.channel( 'actionSetting-' + listenTo ), 'update:setting', this.updateSetting );\n\n this.listenTo( nfRadio.channel( 'setting-type-' + model.get( 'type' ) ), 'click:extra', this.clickExtra );\n\n model.listenTo( nfRadio.channel( 'setting-remote' ), 'get:remote', this.getRemote, model );\n\n // Auto-trigger get:remote on drawer load.\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n clickExtra: function( e, settingModel, dataModel, settingView ) {\n jQuery( e.srcElement ).addClass( 'spin' );\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n updateSetting: function( dataModel, settingModel ) {\n nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\n },\n\n getRemote: function( dataModel ) {\n\n var remote = this.get( 'remote' );\n\n var data = {\n parentValue: dataModel.get( remote.listen ),\n action: remote.action,\n security: ( remote.security ) ? remote.security : nfAdmin.ajaxNonce\n };\n\n // TODO: Disable setting and lock drawer while updating.\n var that = this;\n jQuery.post( ajaxurl, data, function( response ){\n var response = JSON.parse( response );\n\n if( 'textbox' == that.get( 'type' ) ) {\n dataModel.set( that.get('name'), response.value );\n }\n\n if( 'select' == that.get( 'type' ) ) {\n that.set( 'options', response.options );\n that.trigger( 'rerender' );\n }\n });\n },\n\n });\n} );\n","/**\n * Handles opening and closing our drawer. This is where we display settings for fields, actions, and settings.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawer',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our drawer-related click events.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:openDrawer', this.clickOpenDrawer );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:closeDrawer', this.closeDrawer );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:toggleDrawerSize', this.toggleDrawerSize );\n\n\t\t\t// Reply to direct requests to open or close the drawer.\n\t\t\tnfRadio.channel( 'app' ).reply( 'open:drawer', this.openDrawer, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'close:drawer', this.closeDrawer, this );\n\n\t\t\t/*\n\t\t\t * When we close the drawer, we have to figure out what the right position should be.\n\t\t\t * This listens to requests from other parts of our app asking what the closed right position is.\n\t\t\t */\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:closedRightPos', this.getClosedDrawerPos, this );\n\t\t\t\n\t\t\t// Reply to requests to prevent our drawer from closing\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'prevent:close', this.preventClose, this );\n\t\t\t// Reply to requests to enable drawer closing\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'enable:close', this.enableClose, this );\n\t\t\t// Reply to requests for our disabled/enabled state.\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:preventClose', this.maybePreventClose, this );\n\n\t\t\t/*\n\t\t\t * Object that holds our array of 'prevent close' values.\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\n\t\t\t */\n\t\t\tthis.objPreventClose = {};\n\n\t\t\t/*\n\t\t\t * Listen to focus events on the filter and stop our interval when it happens.\n\t\t\t * This is to fix a bug that can cause the filter to gain focus every few seconds.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:focused', this.filterFocused );\n\t\t},\n\n\t\t/**\n\t\t * Handles closing our drawer\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tcloseDrawer: function() {\n\t\t\t// Get our current domain.\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\n\t\t\tif ( ! currentDrawer || this.maybePreventClose() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Triggers the before close drawer action on our current domain's drawer channel.\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'before:closeDrawer' );\n\t\t\t/*\n\t\t\t * The 'before:closeDrawer' message is deprecated as of version 3.0 in favour of 'before:close'.\n\t\t\t * TODO: Remove this radio message in the future.\n\t\t\t */\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:closeDrawer' );\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:close' );\n\t\t\t\n\t\t\t// Send a message to our drawer to empty its contents.\n\t\t\tnfRadio.channel( 'drawer' ).request( 'empty:drawerContent' );\n\n\t\t\t// To close our drawer, we have to add our closed class to the builder and remove the opened class.\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-closed' ).removeClass( 'nf-drawer-opened' );\n\t\t\tjQuery( builderEl ).removeClass( 'disable-main' );\n\n\t\t\t// Get the right position of our closed drawer. Should be container size in -px.\n\t\t\tvar rightClosed = this.getClosedDrawerPos();\n\n\t\t\t// Get our drawer element and give change the 'right' property to our closed position.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tjQuery( drawerEl ).css( { 'right': rightClosed } );\n\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've closed the drawer.\n\t\t\t *\n\t\t\t * Once our drawer is closed, we:\n\t\t\t * clear our interval\n\t\t\t * request that the app change it's current drawer to false\n\t\t\t * trigger a drawer closed message\n\t\t\t */\n\t\t\tthis.checkCloseDrawerPos = setInterval( function() {\n\t \tif ( rightClosed == jQuery( drawerEl ).css( 'right' ) ) {\n\t \t\tclearInterval( that.checkCloseDrawerPos );\n\t\t \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', false );\n\t\t \t\tnfRadio.channel( 'drawer' ).trigger( 'closed' );\n\t\t \t\t/*\n\t\t \t\t * Reset the add new button z-index to 98.\n\t\t \t\t */\n\t\t \t\tjQuery( '.nf-master-control' ).css( 'z-index', 98 );\n\t\t \t\t// jQuery( drawerEl ).scrollTop( 0 );\n\t \t}\n\t\t\t}, 150 );\n\t\t},\n\n\t\t/**\n\t\t * Click handler for our 'open drawer' event.\n\t\t * @since 3.0\n\t\t * @param e jQuery event\n\t\t * @return void\n\t\t */\n\t\tclickOpenDrawer: function( e ) {\n\t\t\tvar drawerID = jQuery( e.target ).data( 'drawerid' );\n\t\t\tthis.openDrawer( drawerID );\n\t\t},\n\n\t\t/**\n\t\t * Open our drawer.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string drawerID \tID of the drawer we want to open.\n\t\t * @param object data \tOptional data that we want to pass to the drawer.\n\t\t * @return void\n\t\t */\n\t\topenDrawer: function( drawerID, data ) {\n\t\t\tif ( this.maybePreventClose() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If we haven't sent a data object, set the variable to an empty object.\n\t\t\tdata = data || {};\n\n\t\t\t/*\n\t\t\t * If we're dealing with something that has a model, set the proper active state.\n\t\t\t *\n\t\t\t * TODO: Make this more dynamic. I'm not sure that it fits in the drawer controller.\n\t\t\t */\n\t\t\tif ( 'undefined' != typeof data.model ) {\n\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\t\tnfRadio.channel( currentDomainID ).request( 'clear:editActive' );\n\t\t\t\tdata.model.set( 'editActive', true );\n\t\t\t\tthis.dataModel = data.model;\n\t\t\t}\n\n\t\t\t// Send out a message requesting our drawer view to load the content for our drawer ID.\n\t\t\tnfRadio.channel( 'drawer' ).request( 'load:drawerContent', drawerID, data );\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:open' );\n\t\t\t\n\t\t\t// To open our drawer, we have to add our opened class to our builder element and remove the closed class.\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-opened' ).removeClass( 'nf-drawer-closed' );\n\t\t\t\n\t\t\t// To open our drawer, we have to set the right position of our drawer to 0px.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tjQuery( drawerEl ).css( { 'right': '0px' } );\n\t\t\t\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've opened the drawer.\n\t\t\t *\n\t\t\t * Once our drawer is opened, we:\n\t\t\t * clear our interval\n\t\t\t * focus our filter\n\t\t\t * request that the app update its current drawer to the one we opened\n\t\t\t * trigger a drawer opened message\n\t\t\t */\n\t\t\tthis.hasFocus = false;\n\n\t\t\t/*\n\t\t\t * Set our add new button z-index to 0;\n\t\t\t */\n\t\t\tjQuery( '.nf-master-control' ).css( 'z-index', 0 );\n\n\t\t\tthis.checkOpenDrawerPos = setInterval( function() {\n\t \tif ( '0px' == jQuery( drawerEl ).css( 'right' ) ) {\n\t \t\tclearInterval( that.checkOpenDrawerPos );\n\t\t\t\t\tif ( ! that.hasFocus ) {\n\t\t \t\tthat.focusFilter();\n\t\t\t\t\t\tthat.hasFocus = true;\n\t\t\t \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', drawerID );\n\t\t\t \t\tjQuery( drawerEl ).scrollTop( 0 );\n\t\t\t \t\tnfRadio.channel( 'drawer' ).trigger( 'opened' );\n\t\t\t\t\t} \t\t\n\t \t}\n\t\t\t}, 150 );\n\t\t},\n\n\t\t/**\n\t\t * Toggle the drawer from half to full screen and vise-versa\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\ttoggleDrawerSize: function() {\n\t\t\t// Get our drawer element.\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\t// toggle our drawer size class.\n\t\t\tjQuery( drawerEl ).toggleClass( 'nf-drawer-expand' );\n\t\t},\n\n\t\t/**\n\t\t * Focus our filter\n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n focusFilter: function() {\n \t// Get our filter element\n \tvar filterEl = nfRadio.channel( 'drawer' ).request( 'get:filterEl' );\n \t// Focus\n \tjQuery( filterEl ).focus();\n },\n\n /**\n * Get the CSS right position (in px) of the closed drawer element.\n * This is calculated by:\n * getting the width of the builder element\n * add 300 pixels\n * make it negative\n * \n * @since 3.0\n * @return void\n */\n getClosedDrawerPos: function() {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tvar closedPos = jQuery( builderEl ).width() + 300;\n\t\t\treturn '-' + closedPos + 'px';\n },\n\n /**\n * Check to see if anything has registered a prevent close key.\n * \n * @since 3.0\n * @return boolean\n */\n maybePreventClose: function() {\n \tif ( 0 == Object.keys( this.objPreventClose ).length ) {\n \t\treturn false;\n \t} else {\n \t\treturn true;\n \t}\n },\n\n /**\n * Register a prevent close key.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent close' setting.\n * @return void\n */\n preventClose: function( key ) {\n \tthis.objPreventClose[ key ] = true;\n \t/*\n \t * When we disable closing the drawer, add the disable class.\n \t */\n \t// Get our current drawer.\n\t\t\tthis.dataModel.set( 'drawerDisabled', true );\n },\n\n /**\n * Remove a previously registered prevent close key.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent close' setting.\n * @return void\n */\n enableClose: function( key ) {\n \tdelete this.objPreventClose[ key ];\n \t /*\n \t * When we remove all of our disables preventing closing the drawer, remove the disable class.\n \t */\n \tif ( ! this.maybePreventClose() && 'undefined' != typeof this.dataModel ) {\n\t \t// Get our current drawer.\n\t\t\t\tthis.dataModel.set( 'drawerDisabled', false ); \t\t\n \t}\n },\n\n /**\n * When we focus our filter, make sure that our open drawer interval is cleared.\n * \n * @since 3.0\n * @return void\n */\n filterFocused: function() {\n \tclearInterval( this.checkOpenDrawerPos );\n },\n\n getPreventClose: function() {\n \treturn this.objPreventClose;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * Default drawer header.\n *\n * Includes our filter/search and 'Done' button.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerDefault',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-default',\n\n\t\tinitialize: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\t// Listen for our drawer being disabled.\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When we render, remove the extra div added by backbone and add listeners related to our filter.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tonRender: function() {\n\t\t\t// Remove extra wrapping div.\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\t\t\t// Respond to requests related to our filter.\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'clear:filter', this.clearFilter, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'blur:filter', this.blurFilter, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:filterEl', this.getEl, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'keyup .nf-filter'\t: 'maybeChangeFilter',\n\t\t\t'input .nf-filter'\t: 'changeFilter',\n\t\t\t'focus input'\t\t: 'getFocus'\n\t\t},\n\n\t\t/**\n\t\t * When the filter text is changed, trigger an event on our current drawer.\n\t\t * This lets us keep the logic separate from the click event and view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tchangeFilter: function( e ) {\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'change:filter', e.target.value, e );\n\t\t},\n\n\t\t/**\n\t\t * The user pressed a key. If it's the enter key, then run the change filter function.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @return void\n\t\t */\n\t\tmaybeChangeFilter: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\te.addObject = true;\n\t\t\t\tthis.changeFilter( e );\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Clear our filter.\n\t\t *\n\t\t * This triggers 'input' on the field, which will trigger a change if necessary.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tclearFilter: function() {\n\t\t\tvar filterEl = jQuery( this.el ).find( '.nf-filter' );\n\t\t\tif ( '' != jQuery.trim( filterEl.val() ) ) {\n\t\t\t\tfilterEl.val('');\n\t\t\t\tfilterEl.trigger( 'input' );\n\t\t\t\tfilterEl.focus();\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fire the 'blur' event on our filter. Used to force a change event when the user tabs.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tblurFilter: function() {\n\t\t\tjQuery( this.el ).find( '.nf-filter' ).blur();\n\t\t},\n\n\t\t/**\n\t\t * Return our filter dom element.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).find( '.nf-filter' );\n\t\t},\n\n\t\tgetFocus: function() {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'filter:focused' );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\t// Get our current domain.\n\t\t\t\t\tif ( this.drawerDisabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Default drawer footer\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/footerDefault',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","define( 'models/app/drawerModel',['views/app/drawer/headerDefault', 'views/app/drawer/footerDefault'], function( defaultHeaderView, defaultFooterView ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tgetHeaderView: function( data ) {\n\t\t\t\treturn new defaultHeaderView( data );\n\t\t\t},\n\n\t\t\tgetFooterView: function( data ) {\n\t\t\t\treturn new defaultFooterView( data );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds all of our drawer models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/drawerCollection',['models/app/drawerModel'], function( drawerModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: drawerModel\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/drawer/stagedField',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-staged-field',\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\tevents: {\n\t\t\t'click .dashicons-dismiss': 'removeStagedField'\n\t\t},\n\n\t\tremoveStagedField: function( el ) {\n\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'click:removeStagedField', el, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/stagingEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-staged-fields-empty',\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/fields/drawer/stagingCollection',['views/fields/drawer/stagedField', 'views/fields/drawer/stagingEmpty'], function( stagedFieldView, stagedFieldsEmptyView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: stagedFieldView,\n\t\temptyView: stagedFieldsEmptyView,\n\n\t\tactiveClass: 'nf-staged-fields-active', // CSS Class for showing the reservoir.\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:stagedFieldsEl', this.getStagedFieldsEl, this );\n\t\t},\n\n\t\tonShow: function() {\n\n\t\t\tthis.$el = jQuery( this.el ).parent();\n\t\t\tjQuery( this.$el ).find( 'span:first' ).unwrap();\n\t\t\tthis.setElement( this.$el );\n\n\t\t\tvar that = this;\n\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\tplaceholder: 'nf-staged-fields-sortable-placeholder',\n\t\t\t\thelper: 'clone',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'over:stagedFields', e, ui );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'out:stagedFields', ui );\n\t\t\t\t},\n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'receive:stagedFields', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'start:stagedFields', ui );\n\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stop:stagedFields', ui );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tjQuery( this.el ).parent().draggable( {\n\t\t\t\topacity: 0.9,\n\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\n\t\t\t\tappendTo: '#nf-main',\n\t\t\t\trefreshPositions: true,\n\t\t\t\tgrid: [ 3, 3 ],\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\thelper: function( e ) {\n\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\n\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\n\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\n\t\t\t\t\tvar left = width / 4;\n\t\t\t\t\tvar top = height / 2;\n\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\n\t\t\t\t\tjQuery( element ).zIndex( 1000 );\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:fieldStaging', this, ui );\n\t\t\t\t},\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:fieldStaging', this, ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tgetStagedFieldsEl: function() {\n\t\t\treturn jQuery( this.el );\n\t\t},\n\n\t\tonAddChild: function() {\n\t\t\tjQuery( this.el ).addClass( this.activeClass );\n\t\t},\n\n\t\tonRemoveChild: function() {\n\t\t\tif( this.hasStagedFields() ) return;\n\t\t\tjQuery( this.el ).removeClass( this.activeClass );\n\t\t},\n\n\t\thasStagedFields: function() {\n\t\t\treturn 0 != this.collection.length;\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Model for our staged field.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/stagingModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection of staged fields.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/stagingCollection',['models/fields/stagingModel'], function( stagingModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: stagingModel,\n\t\tcomparator: 'order'\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/drawer/typeSection',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-field-type-section',\n\n\t\tinitialize: function() {\n\t\t\t_.bindAll( this, 'render' );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSection', this.getTypeSection, this );\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\tthis.dragging = false;\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * If we're on a mobile device, we don't want to enable dragging for our field type buttons.\n\t\t\t */\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).find( 'div.nf-field-type-draggable' ).draggable( {\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\ttolerance: 'pointer',\n\t\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\n\t\t\t\t\trefreshPositions: true,\n\t\t\t\t\tgrid: [ 5, 5 ],\n\t\t\t\t\tappendTo: '#nf-builder',\n\n\t\t\t\t\thelper: function( e ) {\n\t\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\n\t\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\n\t\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\n\t\t\t\t\t\tvar left = width / 4;\n\t\t\t\t\t\tvar top = height / 2;\n\t\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\n\t\t\t\t\t\tjQuery( element ).zIndex( 1000 );\n\t\t\t\t\t\treturn element;\n\t\t\t\t\t},\n\n\t\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = true;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = false;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tdrag: function(e, ui) {\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drag:type', this, ui, e );\t\n\t\t\t\t\t}\n\n\t\t\t\t} ).disableSelection();\n\n\t\t\t\tjQuery( this.el ).find( '.nf-item' ).focus( function() {\n\t\t\t \tjQuery( this ).addClass( 'active' );\n\t\t\t } ).blur( function() {\n\t\t\t \tjQuery( this ).removeClass( 'active' );\n\t\t\t } );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-item': 'clickFieldType',\n\t\t\t'keydown .nf-item': 'maybeClickFieldType',\n\t\t\t'mousedown .nf-item': 'mousedownFieldType'\n\t\t},\n\n\t\tclickFieldType: function( e ) {\n\t\t\tif ( ! this.dragging ) {\n\t\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:fieldType', e );\n\t\t\t}\n\t\t},\n\n\t\tmousedownFieldType: function( e ) {\n\t\t\tjQuery( e.target).addClass( 'clicked' );\n\t\t\tsetTimeout( function() {\n\t\t\t\tjQuery( e.target ).removeClass( 'clicked' );\n\t\t\t}, 1500 );\n\t\t},\n\n\t\tmaybeClickFieldType: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\tthis.clickFieldType( e );\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderFieldTypes: function() {\n\t\t\t var html = '';\n\t\t\t var that = this;\n\t\t\t _.each( this.fieldTypes, function( id ) {\n\t\t\t var type = nfRadio.channel( 'fields' ).request( 'get:type', id );\n\t\t\t var nicename = type.get( 'nicename' );\n\t\t\t var icon = type.get( 'icon' );\n\t\t\t var renderType = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-field-type-button' );\n\t\t\t html += renderType( { id: id, nicename: nicename, icon: icon, type: type, savedField: that.savedField } );\n\t\t\t } );\n\t\t\t return html;\n\t\t\t\t},\n\n\t\t\t\tsavedField: function() {\n\t\t\t\t\tif( this.type.get( 'savedField' ) ) {\n\t\t\t\t\t\treturn 'nf-saved';\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\t\t\t}\n\t\t},\n\n\t\tgetTypeSection: function() {\n\t\t\treturn this.el;\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/typeSectionCollection',['views/fields/drawer/typeSection'], function( fieldTypeSectionView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: fieldTypeSectionView,\n\n\t\tonShow: function() {\n\t\t\tjQuery( this.el ).find( '.nf-settings' ).unwrap();\n\t\t\tnfRadio.channel( 'fields' ).request( 'clear:editActive' );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/fields/drawer/addField',['views/fields/drawer/stagingCollection', 'models/fields/stagingCollection', 'views/fields/drawer/typeSectionCollection'], function( drawerStagingView, StagingCollection, fieldTypeSectionCollectionView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-content-add-field',\n\n\t\tregions: {\n\t\t\tstaging: '#nf-drawer-staging .nf-reservoir',\n\t\t\tprimary: '#nf-drawer-primary',\n\t\t\tsecondary: '#nf-drawer-secondary'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:fieldTypes', this.filterFieldTypes );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeFieldTypeFilter );\n\n\t\t\tthis.savedCollection = nfRadio.channel( 'fields' ).request( 'get:savedFields' );\n\t\t\tthis.primaryCollection = this.savedCollection;\n\n\t\t\tthis.fieldTypeSectionCollection = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\tthis.secondaryCollection = this.fieldTypeSectionCollection;\n\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tvar stagingCollection = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\tthis.staging.show( new drawerStagingView( { collection: stagingCollection } ) );\n\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.secondaryCollection } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tfilterFieldTypes: function( filteredSectionCollection ) {\n\t\t\tthis.primary.reset();\n\t\t\tthis.secondary.reset();\n\t\t\tthis.filteredSectionCollection = filteredSectionCollection;\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.filteredSectionCollection } ) );\n\t\t},\n\n\t\tremoveFieldTypeFilter: function () {\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.savedCollection } ) );\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.fieldTypeSectionCollection } ) );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingCollection',[], function() {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t},\n\n\t\tgetChildView: function( model ) {\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:settingChildView', model );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingGroup',['views/app/drawer/itemSettingCollection'], function( itemSettingCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-field-setting-group',\n\t\t\n\t\tregions: {\n\t\t\tsettings: '.nf-field-settings'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.model.on( 'change', this.render, this );\n\t\t\tthis.dataModel = data.dataModel;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.model.get( 'display' ) ) {\n\t\t\t\tthis.settings.show( new itemSettingCollectionView( { collection: this.model.get( 'settings' ), dataModel: this.dataModel } ) );\n\t\t\t} else {\n\t\t\t\tthis.settings.empty();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'render:settingGroup', this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .toggle': 'clickToggleGroup'\n\t\t},\n\n\t\tclickToggleGroup: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:toggleSettingGroup', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderLabel: function() {\n\t\t\t\t\tif ( '' != this.label ) {\n\t\t\t\t\t\tvar groupLabel = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-content-edit-setting-group-label' );\n\t\t\t\t\t\treturn groupLabel( this );\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\trenderArrowDir: function() {\n\t\t\t\t\tif ( this.display ) {\n\t\t\t\t\t\treturn 'down';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 'right';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSettingGroupCollection',['views/app/drawer/itemSettingGroup'], function( itemSettingGroupView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\tchildView: itemSettingGroupView,\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","define( 'views/app/drawer/editSettings',['views/app/drawer/itemSettingGroupCollection'], function( itemSettingGroupCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings',\n\n\t\tregions: {\n\t\t\tsettingTitle: '.nf-setting-title',\n\t\t\tsettingGroups: '.nf-setting-groups'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.dataModel = data.model;\n\t\t\tthis.groupCollection = data.groupCollection;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar titleView = currentDomain.get( 'getSettingsTitleView' ).call( currentDomain, { model: this.model } );\n\n\t\t\tthis.settingTitle.show( titleView );\n\t\t\tthis.settingGroups.show( new itemSettingGroupCollectionView( { collection: this.groupCollection, dataModel: this.dataModel } ) );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\tmaybeRenderTitle: function() {\n\t \t\t\tif ( 'undefined' !== typeof this.type ) {\n\t \t\t\t\tvar title = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-drawer-content-edit-settings-title' );\n\t \t\t\t\treturn title( this );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\treturn type.get( 'nicename' );\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Edit Settings drawer header.\n *\n * Includes our 'Done' button.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerEditSettings',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-edit-settings',\n\n\t\tinitialize: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\t// Listen for our drawer being disabled.\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderDisabled: function() {\n\t\t\t\t\t// Get our current domain.\n\t\t\t\t\tif ( this.drawerDisabled ) {\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Button to add an action to the form.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/drawer/typeButton',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-action-type-button',\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\t\n\t\t\tjQuery( this.el ).disableSelection();\n\t\t\t\n\t\t\tif ( 'installed' == this.model.get( 'section') ) {\n\t\t\t\tvar that = this;\n\t\t\t\tjQuery( this.el ).draggable( {\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\ttolerance: 'intersect',\n\t\t\t\t\tscroll: false,\n\t\t\t\t\thelper: 'clone',\n\n\t\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = true;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'startDrag:type', this, ui );\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\t\tthat.dragging = false;\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'stopDrag:type', this, ui );\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-item': 'clickAddAction'\n\t\t},\n\n\t\tclickAddAction: function( e ) {\n\t\t\tif ( ! this.dragging ) {\n\t\t\t\tif ( 'installed' == this.model.get( 'section' ) ) { // Is this an installed action?\n\t\t\t\t\tnfRadio.channel( 'actions' ).trigger( 'click:addAction', this.model );\n\t\t\t\t} else { // This isn't an installed action\n\t\t\t\t\twindow.open( this.model.get( 'link' ), '_blank' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-item';\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\n\t\t\t\t\t\tclasses += ' nf-has-img';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'installed' == this.section ) {\n\t\t\t\t\t\tclasses += ' nf-action-type';\n\t\t\t\t\t}\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderStyle: function() {\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\n\t\t\t\t\t\treturn \"style=\\\"background-image: url(\" + this.image + \");\\\"\"\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/actions/drawer/typeCollection',['views/actions/drawer/typeButton'], function( actionTypeButtonView ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-action-type-section',\n\t\tchildView: actionTypeButtonView,\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\trenderNicename: function() {\n\t\t\t\t\treturn that.collection.nicename;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\treturn that.collection.slug;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.action-types' ).append( childView.el );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Add action drawer.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/drawer/addAction',['views/actions/drawer/typeCollection'], function( actionTypeCollectionView ) {\n\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttemplate: '#tmpl-nf-drawer-content-add-action',\n\n\t\tregions: {\n\t\t\tprimary: '#nf-drawer-primary',\n\t\t\tsecondary: '#nf-drawer-secondary'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:actionTypes', this.filteractionTypes );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeactionTypeFilter );\n\t\t\n\t\t\tthis.installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n\t\t\tthis.primaryCollection = this.installedActions;\n\n\t\t\tthis.availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n\t\t\tthis.secondaryCollection = this.availableActions;\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.secondaryCollection } ) );\n\t\t},\n\n\t\tgetEl: function() {\n\t\t\treturn jQuery( this.el ).parent();\n\t\t},\n\n\t\tfilteractionTypes: function( filteredInstalled, filteredAvailable ) {\n\t\t\tthis.primary.reset();\n\t\t\tthis.secondary.reset();\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: filteredInstalled } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: filteredAvailable } ) );\n\t\t\t\n\t\t},\n\n\t\tremoveactionTypeFilter: function () {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.installedActions } ) );\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.availableActions } ) );\n\t\t}\n\n\t} );\n\n\treturn view;\n} );\n","/**\n * Individual change item.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentViewChangesItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-view-changes-item',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:disabled', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:disabled', this.render );\n\t\t},\n\n\t\t/**\n\t\t * When we render this element, remove the extra wrapping <div> that backbone creates.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\tevents: {\n\t\t\t'click .undoSingle': 'undoSingle'\n\t\t},\n\n\t\tundoSingle: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoSingle', this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Changes collection view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentViewChanges',['views/app/drawer/contentViewChangesItem'], function( viewChangesItem ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'table',\n className: 'nf-changes',\n\t\tchildView: viewChangesItem\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Handles clicks on the 'view changes' button in the header.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerViewChanges',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-view-changes',\n\n\t\tevents: {\n\t\t\t'click .undoChanges': 'clickUndoChanges'\n\t\t},\n\n\t\tclickUndoChanges: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoChanges' );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Error view used for settings.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/settingError',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-edit-setting-error'\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/itemSetting',['views/app/drawer/mergeTagsContent', 'views/app/drawer/settingError'], function( mergeTagsContentView, settingErrorView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\n\n\t\tregions: {\n\t\t\terror: '.nf-setting-error'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\t/*\n\t\t\t * Send out a request on the setting-type-{type} channel asking if we should render on dataModel change.\n\t\t\t * Defaults to false.\n\t\t\t * This lets specific settings, like RTEs, say that they don't want to be re-rendered when their data model changes.\n\t\t\t */\n\t\t\tvar renderOnChange = ( 'undefined' == typeof nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' ) ) ? false : nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' );\n\t\t\t\n\t\t\tif ( renderOnChange ) {\n\t\t\t\tthis.dataModel.on( 'change:' + this.model.get( 'name' ), this.render, this );\n\t\t\t}\n\n\t\t\tthis.model.on( 'change:error', this.renderError, this );\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\n var remote = this.model.get( 'remote' );\n\t\t\tif( remote ) {\n\n if( 'undefined' != typeof remote.refresh || remote.refresh ) {\n // Add 'update' icons\n var label = this.model.get('label');\n this.model.set('label', label + ' <a class=\"extra\"><span class=\"dashicons dashicons-update\"></span></a>');\n }\n\n\t\t\t\tnfRadio.channel( 'setting' ).trigger( 'remote', this.model, this.dataModel, this );\n\t\t\t\tthis.model.on( 'rerender', this.render, this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * When our drawer opens, send out a radio message on our setting type channel.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.drawerOpened );\n\n\t\t\t/*\n\t\t\t * When our drawer closes, send out a radio message on our setting type channel.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.drawerClosed );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.dataModel.off( 'change:' + this.model.get( 'name' ), this.render );\n\t\t\tthis.model.off( 'change:error', this.renderError );\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( this.model.get( 'remote' ) ) {\n\t\t\t\tthis.model.off( 'rerender', this.render, this );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\n\t\t\n\t\t\t/*\n\t\t\t * Unescape any HTML being saved if we are a textbox.\n\t\t\t */\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\n\t\t\t\tvar setting = this.model.get( 'name' );\n\t\t\t\tvar value = this.dataModel.get( setting );\n\t\t\t\tthis.dataModel.set( setting, _.unescape( value ), { silent: true } );\n\t\t\t}\n\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\t/*\n\t\t\t * We want to escape any HTML being output if we are a textbox.\n\t\t\t */\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\n\t\t\t\tvar setting = this.model.get( 'name' );\n\t\t\t\tvar value = this.dataModel.get( setting );\n\t\t\t\tthis.dataModel.set( setting, _.escape( value ), { silent: true } );\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.mergeTagsContentView = false;\n\t\t\tvar that = this;\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\n\t\t\tjQuery( this.el ).find( '.nf-help' ).each(function() {\n\t\t\t\tvar content = jQuery(this).next('.nf-help-text');\n\t\t\t\tjQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\tcontent: content,\n\t\t\t\t\tmaxWidth: 200,\n\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\ttrigger: 'click',\n\t\t\t\t\tcloseOnClick: true\n\t\t\t\t})\n\t\t });\n\t\t\t\n\t\t if ( this.model.get( 'use_merge_tags' ) ) {\n\t\t \tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t }\n\n\t\t\t/*\n\t\t\t * Apply Setting Field Masks\n\t\t\t */\n\t\t\tvar mask = this.model.get( 'mask' );\n\n\t\t\tif( typeof mask != \"undefined\" ){\n\n\t\t\t\tvar input = jQuery( this.$el ).find( 'input' );\n\n\t\t\t\tswitch( mask.type ){\n\t\t\t\t\tcase 'numeric':\n\t\t\t\t\t\tinput.autoNumeric({\n\t\t\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\t\t\taDec: decimalPoint\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'currency':\n\n\t\t\t\t\t\tvar currency = nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' );\n\t\t\t\t\t\tvar currencySymbol = nfAdmin.currencySymbols[ currency ] || '';\n\n\t\t\t\t\t\tinput.autoNumeric({\n\t\t\t\t\t\t\taSign: jQuery('<div />').html(currencySymbol).text(),\n\t\t\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\t\t\taDec: decimalPoint\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'custom':\n\t\t\t\t\t\tif( mask.format ) input.mask( mask.format )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// TODO: Error Logging.\n\t\t\t\t\t\tconsole.log( 'Notice: Mask type of \"' + mask.type + '\" is not supported.' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderError();\n\t\t},\n\n\t\tonShow: function() {\t\t\t\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonAttach: function() {\t\t\t\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\trenderError: function() {\n\t\t\tif ( this.model.get( 'error' ) ) {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).addClass( 'nf-error' );\n\t\t\t\tthis.error.show( new settingErrorView( { model: this.model } ) );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).removeClass( 'nf-error' );\n\t\t\t\tthis.error.empty();\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\n\t \t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) != this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\n\t \t\trenderSetting: function(){\n\t \t\t\tif ( 'undefined' != typeof that.dataModel.get( this.name ) ) {\n\t \t\t\t\tthis.value = that.dataModel.get( this.name );\n\t \t\t\t} else if ( 'undefined' == typeof this.value ) {\n\t \t\t\t\tthis.value = '';\n\t \t\t\t}\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( 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 ( this.use_merge_tags ) {\n\t\t\t\t\t\tclasses += ' has-merge-tags';\n\t\t\t\t\t}\n\t\t\t\t\tif ( 'rte' == this.type ) {\n\t\t\t\t\t\tclasses += ' rte';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-setting ';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += 'nf-' + this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' nf-one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( this.help ) {\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</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\trenderMergeTags: function() {\n\t\t\t\t\tif ( this.use_merge_tags && ! this.hide_merge_tags ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></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\trenderPlaceholder: function() {\n\t\t\t\t\tif ( this.placeholder ) {\n\t\t\t\t\t\treturn 'placeholder=\"' + this.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\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .setting': 'changeSetting',\n\t\t\t'keyup .setting': 'keyUpSetting',\n\t\t\t'click .setting': 'clickSetting',\n\t\t\t'click .extra': 'clickExtra'\n\t\t},\n\n\t\tchangeSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:setting', e, this.model, this.dataModel );\n\t\t},\n\n\t\tkeyUpSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'keyup:setting', e, this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'keyup:setting', e, this.model, this.dataModel );\n\t\t},\n\n\t\tclickSetting: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:setting', e, this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:setting', e, this.model, this.dataModel, this );\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-name-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\n\t\t},\n\n\t\tdrawerOpened: function() {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:opened', this.model, this.dataModel, this );\n\t\t},\n\n\t\tdrawerClosed: function() {\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:closed', this.model, this.dataModel, this );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","/**\n * Changes collection view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/contentNewForm',['views/app/drawer/itemSetting'], function( itemSettingView) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-new-form',\n\n\t\tregions: {\n\t\t\tformName: '.new-form-name',\n\t\t\tformSubmit: '.new-form-submit'\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar titleSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'title' );\n\t\t\tvar addSubmitSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'add_submit' );\n\t\t\tvar dataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tthis.formName.show( new itemSettingView( { model: titleSettingModel, dataModel: dataModel } ) );\n\t\t\t/*\n\t\t\t * If we don't have any submit buttons on the form, prompt the user to add one on publish.\n\t\t\t */\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar submitButtons = fieldCollection.findWhere( { type: 'submit' } );\n\t\t\tif ( 'undefined' == typeof submitButtons ) {\n\t\t\t\tthis.formSubmit.show( new itemSettingView( { model: addSubmitSettingModel, dataModel: dataModel } ) );\n\t\t\t} else {\n\t\t\t\tdataModel.set( 'add_submit', 0 );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .publish': 'clickPublish'\n\t\t},\n\n\t\tclickPublish: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:confirmPublish', e );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n\n","/**\n * Handles clicks on the 'view changes' button in the header.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/headerNewForm',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-new-form'\n\t});\n\n\treturn view;\n} );\n","/**\n * Config file for our app drawers.\n *\n * this.collection represents all of our registered drawers.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawerConfig',[\n\t'models/app/drawerCollection',\n\t'views/fields/drawer/addField',\n\t'views/app/drawer/editSettings',\n\t'views/app/drawer/headerEditSettings',\n\t'views/actions/drawer/addAction',\n\t'views/app/drawer/contentViewChanges',\n\t'views/app/drawer/headerViewChanges',\n\t'views/app/drawer/contentNewForm',\n\t'views/app/drawer/headerNewForm'\n\t], function(\n\t\tdrawerCollection,\n\t\taddFieldView,\n\t\teditSettingsView,\n\t\teditSettingsHeaderView,\n\t\taddActionView,\n\t\tviewChangesView,\n\t\tviewChangesHeaderView,\n\t\tnewFormView,\n\t\tnewFormHeaderView,\n\t\tmobileItemControlsView\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\tthis.collection = new drawerCollection( [\n\t\t\t\t{\n\t\t\t\t\tid: 'addField',\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new addFieldView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'addAction',\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new addActionView( data );\n\t\t\t\t\t}\n\t\t\t\t},\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\tid: 'editSettings',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * TODO: Add filtering when editing settings. For now, removing them from settings.\n\t\t\t\t\t */\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Get a custom setting header view if one is set.\n\t\t\t\t\t\t * TODO: Currently, this only works for advanced settings.\n\t\t\t\t\t\t * This could be used to replace the need for a single config file.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( 'undefined' != typeof data.typeModel ) {\n\t\t\t\t\t\t\tvar view = nfRadio.channel( data.typeModel.get( 'id' ) ).request( 'get:drawerHeaderView' ) || editSettingsHeaderView;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar view = editSettingsHeaderView;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new view( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new editSettingsView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'viewChanges',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the viewChanges drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new viewChangesHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new viewChangesView( data );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'newForm',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the newForm drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new newFormHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new newFormView( data );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\t// Listen for requests for our drawer collection.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerCollection', this.getDrawerCollection, this );\n\t\t\t// Listen for requests for specific drawer models.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawer', this.getDrawer, this );\n\t\t},\n\n\t\tgetDrawerCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetDrawer: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Default settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/defaultSettingsTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-default',\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\tif ( 'undefined' != typeof type ) {\n\t \t\t\t\treturn type.get( 'nicename' );\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Empty view.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/empty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-empty'\n\t});\n\n\treturn view;\n} );\n","/**\n * Model for our individual domains.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/domainModel',[ 'views/app/drawer/defaultSettingsTitle', 'views/app/empty' ], function( DefaultSettingsTitleView, EmptyView ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdashicons: '',\n\t\t\tclasses: '',\n\t\t\tactive: false,\n\t\t\turl: '',\n\t\t\thotkeys: false,\n\t\t\tdisabled: false,\n\n\t\t\tgetSettingsTitleView: function( data ) {\n\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t},\n\n\t\t\tgetDefaultSettingsTitleView: function( data ) {\n\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t},\n\n\t\t\tgetGutterLeftView: function( data ) {\n\t\t\t\t/*\n\t\t\t\t * Return empty view\n\t\t\t\t */\n\t\t\t\treturn new EmptyView();\n\t\t\t},\n\n\t\t\tgetGutterRightView: function( data ) {\n\t\t\t\t/* \n\t\t\t\t * Return empty view\n\t\t\t\t */\n\t\t\t\treturn new EmptyView();\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Holds all of our domain models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/domainCollection',['models/app/domainModel'], function( domainModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: domainModel\n\t} );\n\treturn collection;\n} );\n","define( 'views/fields/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-fields'\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/mainContentFieldCollection',[], function() {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\treorderOnSort: true,\n\n\t\tgetChildView: function() {\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:fieldItem' );\n\t\t},\n\n\t\tgetEmptyView: function() {\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:mainContentEmpty' );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:sortableEl', this.getSortableEl, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'init:sortable', this.initSortable, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'destroy:sortable', this.destroySortable, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.collection.models.length > 0 ) {\n\t\t\t\tjQuery( this.el ).addClass( 'nf-field-type-droppable' ).addClass( 'nf-fields-sortable' );\n\t\t\t\tvar that = this;\n\t\t\t\t/* TODO: There's a bug with some Android phones and chrome. The fix below hasn't been implement.\n\n\t\t\t\t * Instantiate our sortable field list, but only if we aren't on a mobile device.\n\t\t\t\t *\n\t\t\t\t * On Android, our sortable list isn't scrollable if it's instantiated at render.\n\t\t\t\t * Instead, for mobile, we need to instantiate our sortable when the user tapholds and then\n\t\t\t\t * destroy it when the drag stops.\n\t\t\t\t */\n\t\t\t\t// if ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\t\tthis.initSortable();\n\t\t\t\t// }\n\t\t\t}\n\t\t\tnfRadio.channel( 'app' ).trigger( 'render:fieldsSortable', this );\n\t\t},\n\n\t\tgetSortableEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\tinitSortable: function() {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tvar tolerance = 'pointer';\n\t\t\t} else {\n\t\t\t\tvar tolerance = 'intersect';\n\t\t\t}\n\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\t//containment: '#nf-main',\n\t\t\t\thelper: 'clone',\n\t\t\t\tcancel: '.nf-item-controls',\n\t\t\t\tplaceholder: 'nf-fields-sortable-placeholder',\n\t\t\t\topacity: 0.95,\n\t\t\t\tgrid: [ 5, 5 ],\n\t\t\t\t// scroll: false,\n\t\t\t\tappendTo: '#nf-main',\n\t\t\t\tscrollSensitivity: 10,\n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'start:fieldsSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:fieldsSortable', ui, this );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'stop:fieldsSortable', ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tdestroySortable: function() {\n\t\t\tjQuery( this.el ).sortable( 'destroy' );\n\t\t},\n\n\t\tonAddChild: function( childView ) {\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:adding' ) ) {\n\t\t\t\tchildView.$el.hide().show( 'clip' );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', false );\n\t\t\t}\n\t\t}\n\t\t\n\t} );\n\n\treturn view;\n} );\n\n","define( 'views/fields/drawer/addSavedField',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-add-saved-field',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:addSavedLoading', this.renderAddButton, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.renderAddButton();\n\t\t},\n\n\t\trenderAddButton: function() {\n\t\t\tif ( this.model.get( 'addSavedLoading' ) ) {\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-saved-field-loading' );\n\t\t\t} else {\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-add-saved-field-button' );\n\t\t\t}\n\t\t\tjQuery( this.el ).find( '.add-button' ).html( button( this ) );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:addSavedLoading', this.render );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-button': 'clickAddSavedField'\n\t\t},\n\n\t\tclickAddSavedField: function( e ) {\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:addSavedField', e, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","/**\n * Fields settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/fields/drawer/settingsTitle',['views/fields/drawer/addSavedField'], function( addSavedFieldView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-fields',\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:saved', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.renderjBoxContent, this );\n\t\t},\n\n\t\tregions: {\n\t\t\taddSaved: '.nf-add-saved-field'\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:saved', this.render );\n\t\t\tthis.addSavedjBox.destroy();\n\t\t\tthis.model.unset( 'jBox', { silent: true } );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.renderjBoxContent();\n\t\t\tvar that = this;\n\t\t\tthis.addSavedjBox = new jBox( 'Tooltip', {\n\t\t\t\ttrigger: 'click',\n\t\t\t\ttitle: 'Add to Saved Fields',\n\t\t\t\tposition: {\n\t\t\t\t\tx:'left',\n\t\t\t\t\ty:'center'\n\t\t\t\t},\n\t\t\t\toutside:'x',\n\t\t\t\tcloseOnClick: 'body',\n\n\t\t\t\tonCreated: function() {\n\t\t\t\t\tthis.setContent( jQuery( that.el ).find( '.nf-add-saved-field' ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.addSavedjBox.attach( jQuery( this.el ).find( '.dashicons') );\n\t\t\tthis.model.set( 'jBox', this.addSavedjBox, { silent: true } );\n\t\t},\n\n\t\trenderjBoxContent: function() {\n\t\t\tif ( this.addSaved ) {\n\t\t\t\tthis.addSaved.show( new addSavedFieldView( { model: this.model } ) );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderTypeNicename: function() {\n\t \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\n\t \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\n\t \t\t\tvar displayName = type.get( 'nicename' );\n\n\t \t\t\tif ( this.saved ) {\n\t \t\t\t\tvar realType = nfRadio.channel( domainID ).request( 'get:type', type.get( 'type' ) );\n\t \t\t\t\tdisplayName += ' - ' + realType.get( 'nicename' );\n\t \t\t\t}\n\t \t\t\treturn displayName;\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\trenderSavedStar: function() {\n\t\t\t\t\tif ( this.saved ) {\n\t\t\t\t\t\tvar star = 'filled';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar star = 'empty';\n\t\t\t\t\t}\n\t\t\t\t\treturn '<span class=\"dashicons dashicons-star-' + star + '\"></span>'\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Add main header.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/mainHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-header-actions',\n\n\t\tinitialize: function() {\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\tthis.listenTo( actionCollection, 'add', this.render );\n\t\t\tthis.listenTo( actionCollection, 'remove', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\tif ( actionCollection.models.length == 0 ) {\n\t\t\t\tjQuery( this.el ).hide();\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).show();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Actions subheader view.\n *\n * TODO: make dynamic\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-actions'\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders an application menu item from a domain model.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/itemControls',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-item-controls',\n\n\t\tinitialize: function() {\n\t\t\t// Listen for domain changes and re-render when we detect one.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\n\t\t},\n\n\t\t/**\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\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\t// \n\t\t\tthis.currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'click .nf-edit-settings': 'clickEdit',\n\t\t\t'singletap .nf-edit-settings': 'singleTapEdit',\n\t\t\t'click .nf-delete': 'clickDelete',\n\t\t\t'click .nf-duplicate': 'clickDuplicateField'\n\t\t},\n\n\t\tclickEdit: function( e ) {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tsingleTapEdit: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t},\n\n\t\tclickDelete: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t},\n\n\t\tclickDuplicateField: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'mouseover:itemControl', e, this.model );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Single action table row\n *\n * TODO: make dynamic\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/actionItem',['views/app/itemControls'], function( itemControlsView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'tr',\n\t\ttemplate: '#tmpl-nf-action-item',\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:actionItemTemplate' ) || this.template;\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:active', this.maybeDeactivate, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:active', this.maybeDeactivate );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif ( this.model.get( 'editActive' ) ) {\n\t\t\t\tjQuery( this.el ).addClass( 'active' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).removeClass( 'active' );\n\t\t\t}\n\n\t\t\tthis.maybeDeactivate();\n\n\t\t\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t},\n\n\t\tmaybeDeactivate: function() {\n\t\t\tif ( 0 == this.model.get( 'active' ) ) {\n\t\t\t\tjQuery( this.el ).addClass( 'deactivated' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).removeClass( 'deactivated' );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change input': 'changeToggle',\n\t\t\t'click': 'maybeClickEdit'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( 'TR' == jQuery( e.target ).parent().prop( 'tagName' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tchangeToggle: function( e ) {\n\t\t\tvar setting = jQuery( e.target ).data( 'setting' );\n\t\t\tvar settingModel = nfRadio.channel( 'actions' ).request( 'get:settingModel', setting );\n\t\t\tconsole.log( settingModel );\n\t\t\tconsole.log( this.model );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:setting', e, settingModel, this.model );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderToggle: function( settingName ) {\n\t\t\t\t\tthis.settingName = settingName || 'active';\n\t\t\t\t\tvar actionLabel = this.label;\n\t\t\t\t\tthis.label = '';\n\t\t\t\t\tthis.value = this[ this.settingName ];\n\t\t\t\t\tthis.name = this.id + '-' + this.settingName;\n\t\t\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-toggle' );\n\t\t\t\t\thtml = html( this );\n\t\t\t\t\tthis.label = actionLabel;\n\t\t\t\t\treturn html;\n\t\t\t\t},\n\n\t\t\t\trenderTypeNicename: function() {\n\t\t\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', this.type );\n\t\t\t\t\tif ( 'undefined' == typeof type ) return;\n\n\t\t\t\t\treturn type.get( 'nicename' );\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( this.help ) {\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</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\trenderMergeTags: function() {\n\t\t\t\t\tif ( this.use_merge_tags ) {\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/actions/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-actions-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().parent().removeClass( 'nf-actions-empty' );\n\t\t\t// jQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\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\tjQuery( this.el ).parent().parent().addClass( 'nf-actions-empty' );\n\t\t\t// if ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t// \tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t// }\n\t\t\t// jQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\t// jQuery( this.el ).parent().droppable( {\n\t\t\t// \taccept: function( draggable ) {\n\t\t\t// \t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t// \t\t\treturn true;\n\t\t\t// \t\t}\n\t\t\t// \t},\n\t\t\t// \thoverClass: 'nf-droppable-hover',\n\t\t\t// \ttolerance: 'pointer',\n\t\t\t// \tover: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t// \t},\n\t\t\t// \tout: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t// \t},\n\t\t\t// \tdrop: function( e, ui ) {\n\t\t\t// \t\tui.item = ui.draggable;\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t// \t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t// \t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t// \t},\n\t\t\t// } );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Main content view for our actions.\n *\n * TODO: make dynamic\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/actions/mainContent',['views/actions/actionItem', 'views/actions/mainContentEmpty'], function( actionView, emptyView ) {\n\tvar view = Marionette.CompositeView.extend({\n\t\ttemplate: '#tmpl-nf-action-table',\n\t\tchildView: actionView,\n\t\temptyView: emptyView,\n\n\t\tinitialize: function() {\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:mainContentTemplate' ) || this.template;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tjQuery( this.el ).droppable( {\n\t\t\t\taccept: '.nf-action-type-draggable',\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'drop:actionType', e, ui );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tif ( 'undefined' == typeof nfRadio.channel( 'actions' ).request( 'get:type', childView.model.get( 'type' ) ) ) return;\n\n\t\t\tjQuery( collectionView.el ).find( 'tbody' ).append( childView.el );\n\t\t},\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/advanced/mainHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-header-settings'\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/subHeader',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-sub-header-settings'\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/settingItem',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-form-setting-type',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.updateActiveClass );\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.updateActiveClass, this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click': 'clickEdit'\n\t\t},\n\n\t\tclickEdit: function( e ) {\n\t\t\tnfRadio.channel( 'settings' ).trigger( 'click:edit', e, this.model );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = 'nf-setting-wrap ' + this.id;\n\t \t\t\tif ( this.editActive ) {\n\t \t\t\t\tclasses += ' active';\n\t \t\t\t}\n\t \t\t\treturn classes;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateActiveClass: function() {\n\t\t\tif ( this.model.get( 'editActive' ) ) {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).addClass( 'active' );\n\t\t\t} else {\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).removeClass( 'active' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/advanced/mainContent',['views/advanced/settingItem'], function( settingItem ) {\n\tvar view = Marionette.CollectionView.extend({\n\t\tchildView: settingItem\n\t\t\n\t});\n\n\treturn view;\n} );\n","/**\n * Model that represents our form fields.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/fieldModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Field',\n\t\t\tobjectDomain: 'fields',\n\t\t\teditActive: false,\n\t\t\torder: 999\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tif ( 'undefined' == typeof this.get( 'type' ) ) return;\n\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', this.get( 'type' ) );\n\t\t\tvar parentType = fieldType.get( 'parentType' );\n\n\t\t\t// Loop through our field type \"settingDefaults\" and add any default settings.\n\t\t\t_.each( fieldType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( key ) ) {\n\t\t\t\t\tthis.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\t/*\n\t\t\t * If our field type is a saved field, set our field type to the actual field type\n\t\t\t */\n\t\t\tif ( 'saved' == fieldType.get( 'section' ) ) {\n\t\t\t\tthis.set( 'type', fieldType.get( 'type' ) );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * fields\n\t\t\t * fields-parentType\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:fieldModel', this );\n\t\t\tnfRadio.channel( 'fields-' + parentType ).trigger( 'init:fieldModel', this );\n\t\t\tnfRadio.channel( 'fields-' + this.get( 'type' ) ).trigger( 'init:fieldModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * Fires an event on the fieldSetting-{name} channel saying we've updated a setting.\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n\t\t\tnfRadio.channel( 'fieldSetting-' + _.keys( model.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'update:setting', this, options.settingModel );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field models.\n * This is the actual field data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new fields or removed fields property.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/fieldCollection',['models/fields/fieldModel'], function( fieldModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: fieldModel,\n\t\tcomparator: function( model ){\n\t\t\treturn parseInt( model.get( 'order' ) );\n\t\t},\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addField, this );\n\t\t\tthis.on( 'remove', this.removeField, this );\n\n\t\t\tthis.listenTo( this, 'add:field', this.addNewField );\n\t\t\tthis.listenTo( this, 'append:field', this.appendNewField );\n\t\t\tthis.listenTo( this, 'remove:field', this.removeFieldResponse );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new fields property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddField: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed fields property.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveField: function( model ) {\n\t\t\tthis.removedIDs = this.removedIDs || {};\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t},\n\n\t\taddNewField: function( model ) {\n\t\t\tthis.add( model );\n\t\t},\n\n\t\tappendNewField: function( model ) {\n\t\t\tif ( 0 == this.length ) {\n\t\t\t\tvar order = 0;\n\t\t\t} else {\n\t\t\t\tvar order = this.at( this.length -1 ).get( 'order' ) + 1;\n\t\t\t}\n\n\t\t\tmodel.set( 'order', order, { silent: true } );\n\t\t\tthis.add( model );\n\t\t},\n\n\t\tremoveFieldResponse: function( model ) {\n\t\t\tthis.remove( model );\n\t\t},\n\n\t\tfieldExists: function( fieldModel ) {\n\t\t\treturn -1 != this.indexOf( fieldModel );\n\t\t}\n\t} );\n\treturn collection;\n} );\n\n","/**\n * Config file for our app domains.\n * \n * this.collection represents all of our app domain (fields, actions, settings) information.\n *\n * This doesn't store the current domain, but rather all the data about each.\n * \n * This data includes:\n * hotkeys\n * header view\n * subheader view\n * content view\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/domainConfig',[\n\t// Require our domain collection\n\t'models/app/domainCollection',\n\t// Require our fields domain files\n\t'views/fields/subHeader',\n\t'views/fields/mainContentFieldCollection',\n\t'views/fields/drawer/settingsTitle',\n\t// Require our actions domain files\n\t'views/actions/mainHeader', \n\t'views/actions/subHeader',\n\t'views/actions/mainContent',\n\t// Require our settings domain files\n\t'views/advanced/mainHeader',\n\t'views/advanced/subHeader',\n\t'views/advanced/mainContent',\n\t// Empty View\n\t'views/app/empty',\n\t// FieldCollection: used by the default formContentData filter\n\t'models/fields/fieldCollection'\n\t], \n\tfunction( \n\t\tappDomainCollection,\n\t\tfieldsSubHeaderView,\n\t\tFieldsMainContentFieldCollectionView,\n\t\tfieldsSettingsTitleView,\n\t\tactionsMainHeaderView,\n\t\tactionsSubHeaderView,\n\t\tactionsMainContentView,\n\t\tsettingsMainHeaderView,\n\t\tsettingsSubHeaderView,\n\t\tsettingsMainContentView,\n\t\tEmptyView,\n\t\tFieldCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Add our default formContentView filter.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:viewFilter', this.defaultFormContentView, 10, this );\n\t\t\t\n\t\t\t/*\n\t\t\t * Add our default formContentData filter.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:loadFilter', this.defaultFormContentLoad, 10, this );\n\n\t\t\t/*\n\t\t\t * Add our default formContentGutterView filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:leftFilter', this.defaultFormContentGutterView, 10, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:rightFilter', this.defaultFormContentGutterView, 10, this );\n\n\t\t\t// Define our app domains\n\t\t\tthis.collection = new appDomainCollection( [\n\t\t\t\t{\n\t\t\t\t\tid: 'fields',\n\t\t\t\t\tnicename: nfi18n.domainFormFields,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newField',\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-menu',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new fieldsSubHeaderView();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the formContent view that should be used in our builder.\n\t\t\t\t\t * Uses two filters:\n\t\t\t\t\t * 1) One for our formContentData\n\t\t\t\t\t * 2) One for our formContentView\n\t\t\t\t\t *\n\t\t\t\t\t * If we don't have any view filters, we use the default formContentView.\n\t\t\t\t\t * \n\t\t\t\t\t * @since 3.0\n\t\t\t\t\t * @return formContentView backbone view.\n\t\t\t\t\t */\n\t\t\t\t\tgetMainContentView: function( collection ) {\n\t\t\t\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\n\t\t\t\t\t\t * If we don't have this setting, then we check for this deprecated value.\n\t\t\t\t\t\t * \n\t\t\t\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * TODO: Remove this backwards compatibility eventually.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( ! formContentData ) {\n\t\t\t\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If we don't have a filter for our formContentData, default to fieldCollection.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar formContentLoadFilters = nfRadio.channel( 'formContent' ).request( 'get:loadFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( formContentLoadFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tformContentData = callback( formContentData, nfRadio.channel( 'app' ).request( 'get:formModel' ), true );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar formContentViewFilters = nfRadio.channel( 'formContent' ).request( 'get:viewFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( formContentViewFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tformContentView = callback();\n\n\t\t\t\t\t\tnfRadio.channel( 'settings' ).request( 'update:setting', 'formContentData', formContentData, true );\n\t\t\t\t\t\treturn new formContentView( { collection: formContentData } );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetSettingsTitleView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If we are dealing with a field model, return the fields settings view, otherwise, return the default.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( 'fields' == data.model.get( 'objectDomain' ) ) {\n\t\t\t\t\t\t\treturn new fieldsSettingsTitleView( data );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn this.get( 'getDefaultSettingsTitleView' ).call( this, data );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\n\t\t\t\t\tgetGutterLeftView: function( data ) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:leftFilters' );\n\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tgutterView = callback();\n\n\t\t\t\t\t\treturn new gutterView(); \n\t\t\t\t\t},\n\n\t\t\t\t\tgetGutterRightView: function() {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:rightFilters' );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\n\t\t\t\t\t\tgutterView = callback();\n\n\t\t\t\t\t\treturn new gutterView(); \n\t\t\t\t\t}\n\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'actions',\n\t\t\t\t\tnicename: nfi18n.domainActions,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newAction',\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-external',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new actionsSubHeaderView();\n\t\t\t\t\t},\n\t\t\t\t\t\n\t\t\t\t\tgetMainContentView: function() {\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n\t\t\t\t\t\treturn new actionsMainContentView( { collection: collection } );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'settings',\n\t\t\t\t\tnicename: nfi18n.domainAdvanced,\n\t\t\t\t\thotkeys: {\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\n\t\t\t\t\t},\n\t\t\t\t\tmobileDashicon: 'dashicons-admin-generic',\n\n\t\t\t\t\tgetSubHeaderView: function() {\n\t\t\t\t\t\treturn new settingsSubHeaderView();\n\t\t\t\t\t},\n\t\t\t\t\t\n\t\t\t\t\tgetMainContentView: function() {\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n\t\t\t\t\t\treturn new settingsMainContentView( { collection: collection } );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'preview',\n\t\t\t\t\tnicename: 'Preview Form',\n\t\t\t\t\tclasses: 'preview',\n\t\t\t\t\tdashicons: 'dashicons-visibility',\n\t\t\t\t\tmobileDashicon: 'dashicons-visibility',\n\t\t\t\t\turl: nfAdmin.previewurl\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\t/*\n\t\t\t * Send out a radio message with our domain config collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:domainCollection', this.collection );\n\n\t\t\t/*\n\t\t\t * Respond to requests to get the app domain collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainCollection', this.getDomainCollection, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainModel', this.getDomainModel, this );\n\t\t},\n\n\t\tgetDomainCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetDomainModel: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\tdefaultFormContentView: function( formContentData ) {\n\t\t\treturn FieldsMainContentFieldCollectionView;\n\t\t},\n\n\t\tdefaultFormContentLoad: function( formContentData ) {\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\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\n\t\t\tif ( 1 == sortedArray.length || 'undefined' == typeof formContentData || true === formContentData instanceof Backbone.Collection ) return fieldCollection;\n\n\t\t\t/*\n\t\t\t * If another filter is registered, we are calling this from somewhere else.\n\t\t\t */\n\n \tvar fieldModels = _.map( formContentData, function( key ) {\n \t\treturn fieldCollection.findWhere( { key: key } );\n \t}, this );\n\n \treturn new FieldCollection( fieldModels );\n\t\t},\n\n\t\tdefaultFormContentGutterView: function( formContentData ) {\n\t\t\treturn EmptyView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our app data.\n * Listens for changes to the 'clean' attribute and triggers a radio message when the state changes.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/appModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tloading: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen to changes to our 'clean' attribute.\n\t\t\tthis.on( 'change:clean', this.changeStatus, this );\n\t\t},\n\n\t\tchangeStatus: function() {\n\t\t\t// Send out a radio message when the 'clean' attribute changes.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:clean', this.get( 'clean' ) );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Creates and stores a model that represents app-wide data. i.e. current domain, current drawer, clean, etc.\n *\n * clean is a boolean that represents whether or not changes have been made.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/data',['models/app/appModel'], function( appModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Get the collection that represents all the parts of our application.\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\t// Setup our initial model.\n\t\t\tthis.model = new appModel( {\n\t\t\t\tcurrentDrawer: false,\n\t\t\t\tcurrentDomain: appDomainCollection.get( 'fields' ),\n\t\t\t\tclean: true\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Set the mobile setting used to track whether or not we're on a mobile device.\n\t\t\t */\n\t\t\tvar mobile = ( 1 == nfAdmin.mobile ) ? true : false;\n\t\t\tthis.model.set( 'mobile', mobile );\n\n\t\t\t/*\n\t\t\t * Respond to requests to see if we are on mobile.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'is:mobile', this.isMobile, this );\n\n\t\t\t/*\n\t\t\t * Respond to app channel requests for information about the state of our app.\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:data', this.getData, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDomain', this.getCurrentDomain, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDrawer', this.getCurrentDrawer, this );\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:current', this.getCurrentDrawer, this );\n\n\t\t\t/*\n\t\t\t * Respond to app channel requests to update app settings.\n\t\t\t */\t\t\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDomain', this.updateCurrentDomain, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDrawer', this.updateCurrentDrawer, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:setting', this.updateSetting, this );\n\n\t\t},\n\n\t\tupdateCurrentDomain: function( model ) {\n\t\t\tthis.updateSetting( 'currentDomain', model );\n\t\t},\n\n\t\tupdateSetting: function( setting, value ) {\n\t\t\tthis.model.set( setting, value );\n\t\t\treturn true;\n\t\t},\n\n\t\tgetSetting: function( setting ) {\n\t\t\treturn this.model.get( setting );\n\t\t},\n\n\t\tgetData: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tgetCurrentDomain: function() {\n\t\t\treturn this.model.get( 'currentDomain' );\n\t\t},\n\n\t\tupdateCurrentDrawer: function( drawerID ) {\n\t\t\tthis.updateSetting( 'currentDrawer', drawerID );\n\t\t\treturn true;\n\t\t},\n\n\t\tgetCurrentDrawer: function() {\n\t\t\tvar currentDrawerID = this.model.get( 'currentDrawer' );\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:drawer', currentDrawerID );\n\t\t},\n\n\t\tisMobile: function() {\n\t\t\treturn this.model.get( 'mobile' );\n\t\t}\n\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for click events to expand/collapse setting groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/drawerToggleSettingGroup',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for click events on our settings group.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:toggleSettingGroup', this.toggleSettingGroup );\n\t\t},\n\n\t\t/**\n\t\t * Set the 'display' attribute of our group model to true or false to toggle.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \tgroup setting model\n\t\t * @return void\n\t\t */\n\t\ttoggleSettingGroup: function( e, model ) {\n\t\t\tif ( model.get( 'display' ) ) {\n\t\t\t\t/*\n\t\t\t\t * Make sure that none of our settings have errors\n\t\t\t\t */\n\t\t\t\tvar errors = false;\n\t\t\t\t_.each( model.get( 'settings' ).models, function( setting ) {\n\t\t\t\t\tif ( setting.get( 'error' ) ) {\n\t\t\t\t\t\terrors = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( ! errors ) {\n\t\t\t\t\tmodel.set( 'display', false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmodel.set( 'display', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Updates our database with our form data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/updateDB',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the closing of the drawer and update when it's closed.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.updateDB );\n\t\t\t// Respond to requests to update the database.\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:db', this.updateDB, this );\n\t\t\t/*\n\t\t\t * Register our default formContent save filter.\n\t\t\t * This converts our collection into an array of keys.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:saveFilter', this.defaultSaveFilter, 10, this );\n\t\t},\n\n\t\t/**\n\t\t * Update our database.\n\t\t * If action isn't specified, assume we're updating the preview.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \taction preview or publish\n\t\t * @return void\n\t\t */\n\t\tupdateDB: function( action ) {\n\t\t\t// If our app is clean, dont' update.\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Default action to preview.\n\t\t\taction = action || 'preview';\n\n\t\t\t// Setup our ajax actions based on the action we're performing\n\t\t\tif ( 'preview' == action ) {\n\t\t\t\tvar jsAction = 'nf_preview_update';\n\t\t\t} else if ( 'publish' == action ) {\n\t\t\t\tvar jsAction = 'nf_save_form';\n\t\t\t}\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n\t\t\t/*\n\t\t\t * There are pieces of data that are only needed for the builder and not for the front-end.\n\t\t\t * We need to unset those.\n\t\t\t * TODO: Make this more dynamic/filterable.\n\t\t\t */\n\t\t\t_.each( formModel.get( 'fields' ).models, function( fieldModel, index ) {\n\t\t\t\tfieldModel.unset( 'jBox', { silent: true } );\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * The main content of our form is called the formContent.\n\t\t\t * In this next section, we check to see if any add-ons want to modify that contents before we save.\n\t\t\t * If there aren't any filters found, we default to the field collection.\n\t\t\t * \n\t\t\t */\n\t\t\t\n\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\n\t\t\t/*\n\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\n\t\t\t * If we don't have this setting, then we check for this deprecated value.\n\t\t\t * \n\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\n\t\t\t *\n\t\t\t * TODO: Remove this backwards compatibility eventually.\n\t\t\t */\n\t\t\tif ( ! formContentData ) {\n\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\n\t\t\t}\n\n\t\t\tvar formContentSaveDataFilters = nfRadio.channel( 'formContent' ).request( 'get:saveFilters' );\n\t\t\t\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( formContentSaveDataFilters, undefined );\n\t\t\tvar callback = _.first( sortedArray );\n\t\t\t/*\n\t\t\t * Set our formContentData to the callback specified in the filter, passing our current formContentData.\n\t\t\t */\n\t\t\tformContentData = callback( formContentData );\n\t\t\t\n\t\t\tif ( 'publish' == action && formModel.get( 'show_publish_options' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'newForm' );\n\t\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\t\tjQuery( builderEl ).addClass( 'disable-main' );\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Get our form data\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n\t\t\t// Turn our formData model into an object\n\t\t\tvar data = JSON.parse( JSON.stringify( formData ) );\n\t\t\tdata.settings.formContentData = formContentData;\n\t\t\t/**\n\t\t\t * Prepare fields for submission.\n\t\t\t */\n\t\t\t\n\t\t\t// Get the field IDs that we've deleted.\n\t\t\tvar removedIDs = formData.get( 'fields' ).removedIDs;\n\n\t\t\t/*\n\t\t\t * data.fields is an array of objects like:\n\t\t\t * field.label = blah\n\t\t\t * field.label_pos = blah\n\t\t\t * etc.\n\t\t\t *\n\t\t\t * And we need that format to be:\n\t\t\t * field.settings.label = blah\n\t\t\t * field.settings.label_pos = blah\n\t\t\t *\n\t\t\t * So, we loop through our fields and create a field.settings object.\n\t\t\t */\n\t\t\t_.each( data.fields, function( field ) {\n\t\t\t\tvar id = field.id;\n\t\t\t\t// We dont' want to update id or parent_id\n\t\t\t\tdelete field.id;\n\t\t\t\tdelete field.parent_id;\n\t\t\t\tvar settings = {};\n\t\t\t\t// Loop through all the attributes of our fields\n\t\t\t\tfor (var prop in field) {\n\t\t\t\t if ( field.hasOwnProperty( prop ) ) {\n\t\t\t\t \t// Set our settings.prop value.\n\t\t\t\t settings[ prop ] = field[ prop ];\n\t\t\t\t // Delete the property from the field.\n\t\t\t\t delete field[ prop ];\n\t\t\t\t }\n\t\t\t\t}\n\n\t\t\t\tfor( var setting in settings ){\n\t\t\t\t\tif( null === settings[ setting ] ) {\n\t\t\t\t\t\tdelete settings[setting];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update our field object.\n\t\t\t\tfield.settings = settings;\n\t\t\t\tfield.id = id;\n\t\t\t} );\n\n\t\t\t// Set our deleted_fields object so that we can know which fields were removed.\n\t\t\tdata.deleted_fields = removedIDs;\n\n\t\t\t/**\n\t\t\t * Prepare actions for submission.\n\t\t\t */\n\t\t\t\n\t\t\t// Get the action IDs that we've deleted.\n\t\t\tvar removedIDs = formData.get( 'actions' ).removedIDs;\n\n\t\t\t/*\n\t\t\t * data.actions is an array of objects like:\n\t\t\t * action.label = blah\n\t\t\t * action.label_pos = blah\n\t\t\t * etc.\n\t\t\t *\n\t\t\t * And we need that format to be:\n\t\t\t * action.settings.label = blah\n\t\t\t * action.settings.label_pos = blah\n\t\t\t *\n\t\t\t * So, we loop through our actions and create a field.settings object.\n\t\t\t */\n\t\t\t_.each( data.actions, function( action ) {\n\t\t\t\tvar id = action.id;\n\t\t\t\t// We dont' want to update id or parent_id\n\t\t\t\tdelete action.id;\n\t\t\t\tdelete action.parent_id;\n\t\t\t\tvar settings = {};\n\t\t\t\t// Loop through all the attributes of our actions\n\t\t\t\tfor (var prop in action) {\n\t\t\t\t if ( action.hasOwnProperty( prop ) ) {\n\t\t\t\t \t// Set our settings.prop value.\n\t\t\t\t settings[ prop ] = action[ prop ];\n\t\t\t\t // Delete the property from the action.\n\t\t\t\t delete action[ prop ];\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t\t// Update our action object.\n\t\t\t\taction.settings = settings;\n\t\t\t\taction.id = id;\n\t\t\t} );\n\n\t\t\t// Set our deleted_actions object so that we can know which actions were removed.\n\t\t\tdata.deleted_actions = removedIDs;\n\n\t\t\t// Turn our object into a JSON string.\n\t\t\tdata = JSON.stringify( data );\n\t\t\t// Run anything that needs to happen before we update.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:updateDB', data );\n\n\t\t\tif ( 'publish' == action ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', true );\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\t\n\n\t\t\t\t// If we're on mobile, show a notice that we're publishing\n\t\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'publishing', 'Your Changes Are Being Published', { autoClose: false } );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update\n\t\t\tjQuery.post( ajaxurl, { action: jsAction, form: data, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\t\tresponse.action = action;\n\t\t\t\t\t// Run anything that needs to happen after we update.\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'response:updateDB', response );\n\t\t\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) && 'preview' == action ) {\n\t\t\t\t\t\t// nfRadio.channel( 'notices' ).request( 'add', 'previewUpdate', 'Preview Updated'\t);\n\t\t\t\t\t}\n\t\t\t\t} catch( exception ) {\n\t\t\t\t\tconsole.log( 'Something went wrong!' );\n\t\t\t\t\tconsole.log( exception );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} );\n\t\t},\n\n\t\tdefaultSaveFilter: function( formContentData ) {\n\t\t\treturn formContentData.pluck( 'key' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our form data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/formModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\tif ( ! jQuery.isNumeric( this.get( 'id' ) ) ) {\n\t\t\t\tthis.set( 'show_publish_options', true, { silent: true } );\n\t\t\t} else {\n\t\t\t\tthis.set( 'show_publish_options', false, { silent: true } );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Stores our form data and responds to requests for it.\n * Form data stores fields, actions, and settings.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formData',['models/app/formModel'], function( formModel) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Instantiate Form Model\n\t\t\tthis.model = new formModel( { id: preloadedFormData.id } );\n\t\t\t// Set our field collection\n\t\t\tthis.model.set( 'fields', nfRadio.channel( 'fields' ).request( 'get:collection' ) );\n\t\t\t// Set our actions collection\n\t\t\tthis.model.set( 'actions', nfRadio.channel( 'actions' ).request( 'get:collection' ) );\n\t\t\t// Set our settings collection\n\t\t\tthis.model.set( 'settings', nfRadio.channel( 'settings' ).request( 'get:settings' ) );\n\t\t\t// Respond to requests for form data.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:formModel', this.getFormModel, this );\n\t\t},\n\n\t\t/**\n\t\t * Return form data model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return backbone.model\n\t\t */\n\t\tgetFormModel: function() {\n\t\t\treturn this.model;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles changing our preview link when we change the 'clean' state of our app.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/previewLink',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for events that would change our preview link\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:sendChanges', this.disablePreview, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:sendChanges', this.enablePreview, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.changePreviewNicename, this );\n\t\t},\n\n\t\t/**\n\t\t * Disable our preview link before we send data to update our preview.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tdisablePreview: function() {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\t\t\t// Set disabled to true. This will trigger the preview link view to redraw.\n\t\t\tpreview.set( 'disabled', true );\n\t\t},\n\n\t\t/**\n\t\t * Change the preview link text from \"Preview Form\" to \"Preview Changes\" or vice-versa\n\t\t * \n\t\t * @since 3.0\n\t\t * @param boolean \tclean app data state\n\t\t * @return void\n\t\t */\n\t\tchangePreviewNicename: function( clean ) {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\n\t\t\t// If we have unsaved changes, set our text to 'changes' otherwise, set it to 'form'\n\t\t\tif ( ! clean ) {\n\t\t\t\tvar nicename = 'Preview Changes';\n\t\t\t} else {\n\t\t\t\tvar nicename = 'Preview Form';\n\t\t\t}\n\n\t\t\tpreview.set( 'nicename', nicename );\n\t\t},\n\n\t\t/**\n\t\t * Enable our preview button.\n\t\t * This is triggered when we get a response from our preview update.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tenablePreview: function() {\n\t\t\t// Get our preview domain\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar preview = appDomains.get( 'preview' );\n\t\t\t// Set disabled to false. This will trigger the preview link view to redraw.\n\t\t\tpreview.set( 'disabled', false );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for requests to change the current domain.\n *\n * The app menu and the main submenu both contain clickable links that change the current domain.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/menuButtons',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:publish', this.publish );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:viewChanges', this.viewChanges );\n\t\t},\n\n\t\tpublish: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\n\t\t},\n\n\t\tviewChanges: function() {\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'viewChanges', { collection: changeCollection } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our change data.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/changeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdisabled: false\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Holds all of our change models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/changeCollection',['models/app/changeModel'], function( domainModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: domainModel,\n\n\t\tcomparator: function( model ) {\n\t\t\tvar id = parseInt( model.cid.replace( 'c', '' ) );\n\t\t\treturn -id;\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Track settings changes across our app.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/trackChanges',['models/app/changeCollection', 'models/app/changeModel'], function( changeCollection, ChangeModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new changeCollection();\n\t\t\t// Respond to any requests to add a change directly.\n\t\t\tnfRadio.channel( 'changes' ).reply( 'register:change', this.registerChange, this );\n\t\t\t// Respond to requests for the change collection\n\t\t\tnfRadio.channel( 'changes' ).reply( 'get:collection', this.getCollection, this );\n\t\t\t// Listen for changes in our clean state. If it goes to clean, clear our collection.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.maybeResetCollection );\n\t\t},\n\n\t\tregisterChange: function( action, model, changes, label, data ) {\n\t\t\tvar data = typeof data !== 'undefined' ? data : {};\n\t\t\tif ( 'undefined' == typeof label.dashicon ) {\n\t\t\t\tlabel.dashicon = 'admin-generic';\n\t\t\t}\n\t\t\tvar changeModel = new ChangeModel({\n\t\t\t\taction: action,\n\t\t\t\tmodel: model,\n\t\t\t\tchanges: changes,\n\t\t\t\tlabel: label,\n\t\t\t\tdata: data\t\t\n\t\t\t} );\n\t\t\tthis.collection.add( changeModel );\n\t\t\treturn changeModel;\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tmaybeResetCollection: function( clean ) {\n\t\t\tif ( clean ) {\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'controllers/app/undoChanges',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoChanges', this.undoChanges, this );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoSingle', this.undoSingle, this );\n\t\t},\n\n\t\tundoChanges: function() {\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tchangeCollection.sort();\n\t\t\tvar that = this;\n\t\t\t_.each( changeCollection.models, function( change ) {\n\t\t\t\tthat.undoSingle( change, true );\n\t\t\t} );\n\t\t\tchangeCollection.reset();\n\t\t\t// Update preview.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t},\n\n\t\tundoSingle: function( change, undoAll ) {\n\t\t\tnfRadio.channel( 'changes' ).request( 'undo:' + change.get( 'action' ), change, undoAll );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for our update:db response and replaces tmp ids with new ids if we were performing the publish action.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/publishResponse',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our app channel for the updateDB response.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.publishResponse );\n\t\t},\n\n\t\tpublishResponse: function( response ) {\n\t\t\t// If we aren't performing a publish action, bail.\n\t\t\tif ( 'publish' !== response.action ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// Check to see if we have any new ids. \n\t\t\tif ( 'undefined' != typeof response.data.new_ids ) {\n\n\t\t\t\t// If we have any new fields, update their models with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.fields ) {\n\t\t\t\t\t_.each( response.data.new_ids.fields, function( newID, oldID ) {\n\t\t\t\t\t\tvar field = nfRadio.channel( 'fields' ).request( 'get:field', oldID );\n\t\t\t\t\t\tif ( field ) {\n\t\t\t\t\t\t\tfield.set( 'id', newID );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we have any new actions, update their models with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.actions ) {\n\t\t\t\t\t_.each( response.data.new_ids.actions, function( newID, oldID ) {\n\t\t\t\t\t\tvar action = nfRadio.channel( 'actions' ).request( 'get:action', oldID );\n\t\t\t\t\t\tif ( action ) {\n\t\t\t\t\t\t\taction.set( 'id', newID );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we have a new form id, update the model with the new id.\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.forms ) {\n\t\t\t\t\t_.each( response.data.new_ids.forms, function( newID, oldID ) {\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t\t\t\tformModel.set( 'id', newID );\n\t\t\t\t\t\thistory.replaceState( '', '', 'admin.php?page=ninja-forms&form_id=' + newID );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', false );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\n\n\t\t\t// If we're on mobile, show a notice that we're publishing\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'close', 'publishing' );\n\t\t\t}\n\t\t\t// Add a notice that we've published.\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'published', 'Changes Published' );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'app:published', response );\n\n\t\t\t// Mark our app as clean. This will disable the publish button and fire anything else that cares about the state.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t}\n\t\t\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for requests to change the current domain.\n *\n * The app menu and the main submenu both contain clickable links that change the current domain.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeDomain',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for both menu and submenu clicks.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.changeAppDomain );\n\t\t\t// Reply to specific requests to change the domain\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:currentDomain', this.changeAppDomain, this );\n\n\t\t\t// Reply to requests to prevent our drawer from closing\n\t\t\tnfRadio.channel( 'app' ).reply( 'prevent:changeDomain', this.preventChange, this );\n\t\t\t// Reply to requests to enable drawer closing\n\t\t\tnfRadio.channel( 'app' ).reply( 'enable:changeDomain', this.enableChange, this );\n\n\t\t\t/*\n\t\t\t * Object that holds our array of 'prevent change' values.\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\n\t\t\t */\n\t\t\tthis.objPreventChange = {};\n\t\t},\n\n\t\tchangeAppDomain: function( e, model ) {\n\t\t\t/*\n\t\t\t * If we have disabled movement between domains, return false.\n\t\t\t */\n\t\t\tif ( this.maybePreventChange() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * If we are passed a model, use that model.\n\t\t\t * Otherwise, get the domain from the event target data.\n\t\t\t */ \n\t\t\tif ( 'undefined' == typeof model ) {\n\t\t\t\tvar domainID = jQuery( e.target ).data( 'domain' );\n\t\t\t\tvar model = nfRadio.channel( 'app' ).request( 'get:domainModel', domainID );\n\t\t\t}\n\t\t\t// If a drawer is open, close it.\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we aren't dealing with an external url (such as preview), update our app data\n\t\t\t * and trigger a radio message saying we've changed the domain.\n\t\t\t */ \n\t\t\tif ( 0 == model.get( 'url' ).length ) {\n\t\t\t\tvar mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:currentDomain', model );\n\t\t\t\tjQuery( mainEl ).scrollTop( 0 );\t\t\t\t\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:currentDomain', model );\n\t\t\t}\n\t\t},\n\n\t\t/**\n * Check to see if anything has registered a key to prevent changing the domain.\n * \n * @since 3.0\n * @return boolean\n */\n maybePreventChange: function() {\n \tif ( 0 == Object.keys( this.objPreventChange ).length ) {\n \t\treturn false;\n \t} else {\n \t\treturn true;\n \t}\n },\n\n /**\n * Register a key to prevent changing the domain.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent change domain' setting.\n * @return void\n */\n preventChange: function( key ) {\n \tthis.objPreventChange[ key ] = true;\n },\n\n /**\n * Remove a previously registered key that is preventing our domain from changing.\n * \n * @since 3.0\n * @param string \tkey unique id for our 'prevent change domain' setting.\n * @return void\n */\n enableChange: function( key ) {\n \tdelete this.objPreventChange[ key ];\n },\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Modify the user's browser history when they click on a domain\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/pushstate',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changePushState );\n\t\t},\n\n\t\tchangePushState: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\thistory.pushState( null, null, window.location.href + '&domain=' + currentDomain.get( 'id' ) );\n\t\t\tvar reExp = /domain=\\\\d+/;\n\t\t\tvar url = window.location.toString();\n\t\t\tvar newUrl = url.replace( reExp, '' );\n\t\t\tconsole.log( newUrl );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles our hotkey execution. Needs to be cleaned up and made more programmatic.\n * \n * Our hotkeys are defined by the domain that we're currently viewing. In each domain's model, there is a hotkey object.\n * \n * Currently too much hotkey data is hard-coded here.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/hotkeys',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we change our domain, change the hotkeys to those within that object.\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'render:main', this.changeHotkeys );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.changeHotkeys );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'render:settingGroup', this.changeHotkeys );\n\t\t\t// Currently, these are the functions that run when the new field or new action hotkey is pressed.\n\t\t\t// TODO: move these into a config module or into something more programmatic and scalable.\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newField', this.addNewField );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newAction', this.addNewAction );\n\t\t\t// Same as above, these functions need to be moved into a more modular/programmatic solution.\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:fields', this.changeDomainFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:actions', this.changeDomainActions );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:settings', this.changeDomainSettings );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'close:drawer', this.closeDrawer );\n\t\t},\n\n\t\tchangeHotkeys: function() {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tjQuery( document ).off( '.nfDomainHotkeys' );\n\t\t\tjQuery( 'input' ).off( '.nfDomainHotkeys' );\n\t\t\tif ( currentDomain.get( 'hotkeys' ) ) {\n\t\t\t\tjQuery.each( currentDomain.get( 'hotkeys' ), function( hotkey, msg ) {\n\t\t\t\t\tjQuery( document ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery( 'input' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery( 'textarea' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\taddNewField: function() {\n\t\t\tif ( 'addField' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\taddNewAction: function() {\n\t\t\tif ( 'addAction' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addAction' );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t}\n\t\t},\n\n\t\tchangeDomainFields: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar fieldsDomain = appDomainCollection.get( 'fields' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, fieldsDomain );\n\t\t},\n\n\t\tchangeDomainActions: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar actionsDomain = appDomainCollection.get( 'actions' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, actionsDomain );\n\t\t},\n\n\t\tchangeDomainSettings: function() {\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\n\t\t\tvar settingsDomain = appDomainCollection.get( 'settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, settingsDomain );\n\t\t},\n\n\t\tcloseDrawer: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Change the clean state of our app when settings are changed.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cleanState',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Set an array of field model attributes to ignore.\n\t\t\t * This list will be filtered just before we ignore anything.\n\t\t\t */ \n\t\t\tthis.ignoreAttributes = [\n\t\t\t\t'editActive'\n\t\t\t];\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:setting', this.setAppClean );\n\t\t},\n\n\t\tsetAppClean: function( model ) {\n\t\t\tfor( var attr in model.changedAttributes() ) {\n\t\t\t\tvar changedAttr = attr;\n\t\t\t\tvar after = model.changedAttributes()[ attr ];\n\t\t\t}\n\n\t\t\tvar ignoreAttributes = nfRadio.channel( 'undo-' + model.get( 'type' ) ).request( 'ignore:attributes', this.ignoreAttributes ) || this.ignoreAttributes;\n\t\t\t\n\t\t\tif ( -1 != this.ignoreAttributes.indexOf( attr ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * All of the core undo functions. Listens on the 'changes' channel for an undo request.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/coreUndo',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:changeSetting', this.undoChangeSetting, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addObject', this.undoAddObject, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeObject', this.undoRemoveObject, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:duplicateObject', this.undoDuplicateObject, this );\n\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortFields', this.undoSortFields, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addListOption', this.undoAddListOption, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeListOption', this.undoRemoveListOption, this );\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortListOptions', this.undoSortListOptions, this );\n\t\t},\n\n\t\t/**\n\t\t * Undo settings that have been changed.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoChangeSetting: function( change, undoAll ) {\n\t\t\tvar fieldModel = change.get( 'model' );\n\t\t\tvar changes = change.get( 'changes' );\n\t\t\tvar attr = changes.attr;\n\t\t\tvar before = changes.before;\n\t\t\tfieldModel.set( attr, before );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo adding a field or an action.\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoAddObject: function( change, undoAll ) {\n\t\t\tvar objectModel = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\n\t\t\tif ( 'undefined' != typeof collection.newIDs ) {\n\t\t\t\tdelete collection.newIDs[ objectModel.get( 'id' ) ];\n\t\t\t}\n\t\t\t\t\t\t\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( model );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tcollection.remove( objectModel );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\t\t\n\n\t\t/**\n\t\t * Undo adding a field or an action.\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoDuplicateObject: function( change, undoAll ) {\n\t\t\tvar objectModel = change.get( 'model' );\n\t\t\tvar objectCollection = change.get( 'data' ).collection;\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( model );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tobjectCollection.remove( objectModel );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo removing a field or an action.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoRemoveObject: function( change, undoAll ) {\n\t\t\tvar dataModel = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\n\t\t\tnfRadio.channel( dataModel.get( 'objectDomain' ) ).request( 'add', dataModel );\n\n\t\t\tdelete collection.removedIDs[ dataModel.get( 'id' ) ];\n\t\t\t\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: dataModel } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tmodel.set( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\t// Trigger a reset on our field collection so that our view re-renders\n\t\t\tcollection.trigger( 'reset', collection );\n\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * Undo field sorting.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tundoAll are we in the middle of an undo all action?\n\t\t * @return void\n\t\t */\n\t\tundoSortFields: function( change, undoAll ) {\n\t\t\tvar data = change.get( 'data' );\n\t\t\tvar fields = data.fields;\n\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields, function( changeModel ) {\n\t\t\t\tvar before = changeModel.before;\n\t\t\t\tvar fieldModel = changeModel.model;\n\t\t\t\tfieldModel.set( 'order', before );\n\t\t\t\t// console.log( 'set ' + fieldModel.get( 'label' ) + ' to ' + before );\n\t\t\t} );\n\t\t\t// console.log( fieldCollection.where( { label: 'Name' } ) );\n\t\t\t// console.log( fieldCollection.where( { label: 'Email' } ) );\n\n\n\t\t\tfieldCollection.sort();\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoAddListOption: function( change, undoAll ) {\n\t\t\tvar model = change.get( 'model' );\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\t\tif ( changeModel !== change ) {\n\t\t\t\t\t\tchangeCollection.remove( changeModel );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\tmodel.collection.remove( model );\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoRemoveListOption: function( change, undoAll ) {\n\t\t\tvar model = change.get( 'model' );\n\t\t\tvar collection = change.get( 'data' ).collection;\n\t\t\tcollection.add( model );\n\n\t\t\tif ( ! undoAll ) {\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t\t_.each( results, function( model ) {\n\t\t\t\t\tif ( model !== change ) {\n\t\t\t\t\t\tmodel.set( 'disabled', false );\n\t\t\t\t\t}\n\t\t\t\t} );\t\t\t\t\n\t\t\t}\n\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\tundoSortListOptions: function( change, undoAll ) {\n\t\t\tvar data = change.get( 'data' );\n\t\t\tvar collection = data.collection;\n\t\t\t\n\t\t\tvar objModels = data.objModels;\n\n\t\t\t_.each( objModels, function( changeModel ) {\n\t\t\t\tvar before = changeModel.before;\n\t\t\t\tvar optionModel = changeModel.model;\n\t\t\t\toptionModel.set( 'order', before );\n\t\t\t} );\t\t\t\t\n\n\n\t\t\tcollection.sort();\n\t\t\tthis.maybeRemoveChange( change, undoAll );\n\t\t},\n\n\t\t/**\n\t\t * If our undo action was requested to 'remove' the change from the collection, remove it.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tchange \tmodel of our change\n\t\t * @param boolean \t\t\tremove \tshould we remove this item from our change collection\n\t\t * @return void\n\t\t */\n\t\tmaybeRemoveChange: function( change, undoAll ) {\t\t\t\n\t\t\tvar undoAll = typeof undoAll !== 'undefined' ? undoAll : false;\n\t\t\tif ( ! undoAll ) {\n\t\t\t\t// Update preview.\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\t\tchangeCollection.remove( change );\n\t\t\t\tif ( 0 == changeCollection.length ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns a clone of a backbone model with all the attributes looped through so that collections contained within are propely cloned.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cloneModelDeep',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:modelDeep', this.cloneModelDeep, this );\n\t\t},\n\n\t\tcloneModelDeep: function( model ) {\n\t\t\t// Temporary value used to store any new collections.\n\t\t\tvar replace = {};\n\t\t\t// Loop over every model attribute and if we find a collection, clone each model and instantiate a new collection.\n\t\t\t_.each( model.attributes, function( val, key ) {\n\t\t\t\tif( val instanceof Backbone.Collection ) { // Is this a backbone collection?\n\t\t\t\t\tvar clonedCollection = nfRadio.channel( 'app' ).request( 'clone:collectionDeep', val );\n\t\t\t\t\treplace[ key ] = clonedCollection;\n\t\t\t\t} else if ( val instanceof Backbone.Model ) { // Is this a backbone model?\n\t\t\t\t\treplace[ key ] = this.cloneModelDeep( val );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\t// Clone our original model\n\t\t\tvar newModel = model.clone();\n\t\t\t// Overwrite any collections we created above.\n\t\t\t_.each( replace, function( val, key ) {\n\t\t\t\tnewModel.set( key, val );\n\t\t\t} );\n\n\t\t\treturn newModel;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns the appropriate child view for our settings drawer.\n *\n * This enables settings types to register custom childviews for their settings.\n * The option-repeater setting for the list field is an example.\n * \n * @package Ninja Forms builder\n * @subpackage App - Edit Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/getSettingChildView',['views/app/drawer/itemSetting'], function( itemSettingView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for field settings child views.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t},\n\n\t\t/**\n\t\t * Return the appropriate child setting view.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model\tmodel \tField setting\n\t\t * @return backbone.view\n\t\t */\n\t\tgetSettingChildView: function( model ) {\n\t\t\t// Get our setting type.\n\t\t\tvar type = model.get( 'type' );\n\t\t\t// Request a setting childview from our setting type channel. (Setting type, not field type)\n\t\t\tvar settingChildView = nfRadio.channel( type ).request( 'get:settingChildView', model ) || itemSettingView;\n\t\t\t\n\t\t\treturn settingChildView\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Updates our model when the user changes a setting.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeSettingDefault',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to update settings.\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:setting', this.changeSetting, this );\n\n\t\t\t// Listen on our app channel for the change setting event. Fired by the setting view.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.changeSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * When we change our setting, update the model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te event\n\t\t * @param backbone.model \tsettingModel model that holds our field type settings info\n\t\t * @param backbone.model \tdataModel model that holds our field settings\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( e, settingModel, dataModel, value ) {\n\t\t\tvar name = settingModel.get( 'name' );\n\t\t\tvar before = dataModel.get( name );\n\t\t\tvar value = value || null;\n\t\t\tif ( ! value ) {\n\t\t\t\t// Sends out a request on the fields-type (fields-text, fields-checkbox, etc) channel to see if that field type needs to return a special value for saving.\n\t\t\t\tvalue = nfRadio.channel( settingModel.get( 'type' ) ).request( 'before:updateSetting', e, dataModel, name, settingModel );\n\t\t\t}\n\n\t\t\tif( 'undefined' == typeof value ){\n\t\t\t value = jQuery( e.target ).val();\n }\n\t\t\t\n\t\t\t// Update our field model with the new setting value.\n\t\t\tdataModel.set( name, value, { settingModel: settingModel } );\n\t\t\tnfRadio.channel( 'setting-' + name ).trigger( 'after:updateSetting', dataModel, settingModel );\n\t\t\t// Register our setting change with our change tracker\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","define( 'views/app/drawer/typeSettingFieldset',['views/app/drawer/itemSetting'], function( itemSettingView ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\n\t\tchildView: itemSettingView,\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.collection = this.model.get( 'settings' );\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.model.on( 'rerender', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\t \t\trenderSetting: function(){\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( this );\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderError: function() {\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\treturn this.error;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.nf-field-sub-settings' ).append( childView.el );\n\t\t}\n\t} );\n\n\treturn view;\n} );\n","/**\n * Model that represents our setting.\n *\n * When the model is created, we trigger the init event in two radio channels.\n *\n * This lets specific types of settings modify the model before anything uses it.\n *\n * Fieldset, for instance, uses this hook to instantiate its settings as a collection.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tsettings: false,\n\t\t\thide_merge_tags: false,\n\t\t\terror: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Send out two messages saying that we've initialized a setting model.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:settingModel', this );\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'init:settingModel', this );\n\t\t\tnfRadio.channel( 'setting-name-' + this.get( 'name' ) ).trigger( 'init:settingModel', this );\n\t\t\tthis.on( 'change:error', this.maybePreventUI, this );\n\n\t\t\t/*\n\t\t\t * If we have an objectType set on our collection, then we're creating a model for the generic settings collection.\n\t\t\t * If we're using merge tags in this setting\n\t\t\t */\n\n\t\t\tif( 'undefined' == typeof this.collection ) return;\n\n\t\t\tif ( this.get( 'use_merge_tags' ) && 'undefined' != typeof this.collection.options.objectType ) {\n\t\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', this.updateKey );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, send out a radio message requesting that this setting be checked for the old key.\n\t\t * We want to send the message on the objectType channel.\n\t\t * This means that if this setting is for fields, it will trigger on the fields channel, actions, etc.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Backbone.Model \tkeyModel data model representing the field for which the key just changed\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( keyModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'fire:updateFieldKey', keyModel, this );\n\t\t},\n\n\t\tmaybePreventUI: function() {\n\t\t\tif ( this.get( 'error' ) ) {\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'prevent:close', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'prevent:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\t\t\t\t\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'enable:close', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t\tnfRadio.channel( 'app' ).request( 'enable:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collections of settings for each field type.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingCollection',['models/app/settingModel'], function( settingModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: settingModel,\n\n\t\tinitialize: function( models, options ) {\n\t\t\tthis.options = options || {};\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles actions related to field settings that use a fieldset\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/fieldset',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'fieldset' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t\t// When a list type field is initialized, create an option collection.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldset' ), 'init:settingModel', this.createSettingsCollection );\n\t\t},\n\n\t\tgetSettingChildView: function( model ) {\n\t\t\treturn fieldsetView;\n\t\t},\n\n\t\t/**\n\t\t * Instantiate settings collection when a fieldset type is initialized.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tfield model being initialized\n\t\t * @return void\n\t\t */\n\t\tcreateSettingsCollection: function( model ) {\n\t\t\tmodel.set( 'settings', new settingCollection( model.get( 'settings' ) ) );\n\t\t},\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to our toggle field.\n * When we change the toggle, the setting value will be 'on' or ''.\n * We need to change this to 1 or 0.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/toggleSetting',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\n\t\t\tnfRadio.channel( 'setting-type-toggle' ).reply( 'renderOnChange', function(){ return false } );\n\n\t\t\t// Respond to requests for field setting filtering.\n\t\t\tnfRadio.channel( 'toggle' ).reply( 'before:updateSetting', this.updateSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * Return either 1 or 0, depending upon the toggle position.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te event\n\t\t * @param backbone.model \tfieldModel field model\n\t\t * @param string \t\t\tname setting name\n\t\t * @param backbone.model \tsettingTypeModel field type model\n\t\t * @return int 1 or 0\n\t\t */\n\t\tupdateSetting: function( e, fieldModel, name, settingTypeModel ) {\n\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\n\t\t\t\tvar value = 1;\n\t\t\t} else {\n\t\t\t\tvar value = 0;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens for clicks on our action item action buttons.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Main Sortable\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/itemControls',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for clicks to edit, delete, duplicate actions.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:edit', this.clickEdit );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:delete', this.clickDelete );\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:duplicate', this.clickDuplicate );\n\n\t\t\t// Listen for our drawer close and remove our active edit state\n\t\t},\n\n\t\t/**\n\t\t * Open a drawer with our action model for editing settings.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickEdit: function( e, model ) {\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\tvar type = nfRadio.channel( currentDomainID ).request( 'get:type' , model.get( 'type' ) );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: type.get( 'settingGroups' ) } );\n\t\t},\n\n\t\t/**\n\t\t * Delete a action model from our collection\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickDelete: function( e, dataModel ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\t// Add our action deletion to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Removed',\n\t\t\t\tdashicon: 'dismiss'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: dataModel.collection\n\t\t\t};\n\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tvar results = changeCollection.where( { model: dataModel } );\n\n\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\tvar data = changeModel.get( 'data' );\n\t\t\t\tif ( 'undefined' != typeof data.fields ) {\n\t\t\t\t\t_.each( data.fields, function( field, index ) {\n\t\t\t\t\t\tif ( field.model == dataModel ) {\n\t\t\t\t\t\t\tdata.fields[ index ].model = newModel;\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tchangeModel.set( 'data', data );\n\t\t\t\tchangeModel.set( 'model', newModel );\n\t\t\t\tchangeModel.set( 'disabled', true );\n\t\t\t} );\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeObject', newModel, null, label, data );\n\t\t\t\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\t\t\tnfRadio.channel( currentDomainID ).request( 'delete', dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Duplicate a action within our collection, adding the word \"copy\" to the label.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te \tevent\n\t\t * @param backbone.model \tmodel \taction model\n\t\t * @return void\n\t\t */\n\t\tclickDuplicate: function( e, model ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\n\n\t\t\t// Change our label.\n\t\t\tnewModel.set( 'label', newModel.get( 'label' ) + ' Copy' );\n\t\t\t// Update our ID to the new tmp id.\n\t\t\tvar tmpID = nfRadio.channel( currentDomainID ).request( 'get:tmpID' );\n\t\t\tnewModel.set( 'id', tmpID );\n\t\t\t// Add new model.\n\t\t\t// Params are: model, silent, renderTrigger, action\n\t\t\tnfRadio.channel( currentDomainID ).request( 'add', newModel, false, false, 'duplicate' );\n\t\t\t\n\t\t\t// Add our action addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: model.get( 'objectType' ),\n\t\t\t\tlabel: model.get( 'label' ),\n\t\t\t\tchange: 'Duplicated',\n\t\t\t\tdashicon: 'admin-page'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( currentDomainID ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'duplicateObject', newModel, null, label, data );\n\t\t\t\n\t\t\tmodel.trigger( 'change:label', model );\n\n\t\t\t// Update preview.\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Config file for our merge tags.\n *\n * this.collection represents all of our registered merge tags.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/mergeTags',[\n\t'models/app/mergeTagCollection'\n\t], function(\n\tmergeTagCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.tagSectionCollection = new mergeTagCollection();\n\t\t\tvar that = this;\n\t\t\t_.each( mergeTags, function( tagSection ) {\n\t\t\t\tif ( tagSection.tags ) {\n\t\t\t\t\tvar tags = new mergeTagCollection( tagSection.tags );\n\t\t\t\t} else {\n\t\t\t\t\tvar tags = '';\n\t\t\t\t}\n\n\t\t\t\tthat.tagSectionCollection.add( {\n\t\t\t\t\tid: tagSection.id,\n\t\t\t\t\tlabel: tagSection.label,\n\t\t\t\t\ttags: tags,\n\t\t\t\t\tdefault_group: tagSection.default_group\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tvar fieldTags = this.tagSectionCollection.get( 'fields').get( 'tags' );\n\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\t// TODO: Make this dynamic\n\t\t\t\tif ( 'submit' !== field.get( 'type' ) ) {\n\t\t\t\t\tfieldTags.add( {\n\t\t\t\t\t\tid: field.get( 'id' ),\n\t\t\t\t\t\tlabel: field.get( 'label' ),\n\t\t\t\t\t\ttag: that.getFieldKeyFormat( field.get( 'key' ) )\n\t\t\t\t\t} );\t\t\t\t\t\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tvar calcTags = new mergeTagCollection();\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\n\t\t\t_.each( calcCollection.models, function( calcModel ) {\n\t\t\t\tcalcTags.add( {\n\t\t\t\t\tlabel: calcModel.get( 'name' ),\n\t\t\t\t\ttag: '{calc:' + calcModel.get( 'name' ) + '}'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\n\n\t\t\tthis.currentElement = {};\n\t\t\tthis.settingModel = {};\n\t\t\tthis.open = false;\n\n\t\t\t// Unhook jBox Merge Tag stuff.\n\t\t\t// nfRadio.channel( 'mergeTags' ).reply( 'init', this.initMergeTags, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'mergeTags' ), 'click:mergeTag', this.clickMergeTag );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.addFieldTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'delete:field', this.deleteFieldTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalcTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'remove:option', this.updateCalcTags );\n\n\t\t\t\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentElement', this.updateCurrentElement, this );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentSetting', this.updateCurrentSetting, this );\n\n\t\t\t// Listen for requests for our mergeTag collection.\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:mergeTag', this.getSectionModel, this );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.replaceFieldKey );\n\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:fieldKeyFormat', this.getFieldKeyFormat, this );\n\n\t\t\t/*\n\t\t\t * TODO: Hotkey support for adding tags.\n\t\t\t *\n\t\t\t\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'open:mergeTags', this.openMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'up:mergeTags', this.upMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'down:mergeTags', this.downMergeTags );\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'return:mergeTags', this.returnMergeTags );\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:open', this.updateOpen, this );\n\t\t\t*/\n\t\t},\n\n\t\t/**\n\t\t * Init merge tags within the passed view.\n\t\t * @since 3.0\n\t\t * @param backbone.view view to be searched for merge tags.\n\t\t * @return void\n\t\t */\n\t\tinitMergeTags: function( view ) {\n\t\t\tvar mergeTagsView = nfRadio.channel( 'mergeTags' ).request( 'get:view' );\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * Apply merge tags jQuery plugin.\n\t\t\t *\n\t\t\t * Prevent jBox from being called multiple times on the same element\n\t\t\t */\n\t\t\tthis.jBoxes = {};\n\t\t\tvar that = this;\n\n\t\t\tjQuery( view.el ).find( '.merge-tags' ).each(function() {\n\t\t\t\tif ( 'undefined' == typeof jQuery( this ).data( 'jBox-id' ) ) {\n\t\t\t\t\tvar jBox = jQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\t\ttitle: 'Insert Merge Tag',\n\t\t\t\t\t\ttrigger: 'click',\n\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\tx: 'center',\n\t\t\t\t\t\t\ty: 'bottom'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcloseOnClick: 'body',\n\t\t\t\t\t\tcloseOnEsc: true,\n\t\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\t\tmaxHeight: 200,\n\n\t\t\t\t\t\tonOpen: function() {\n\t\t\t\t\t\t\tmergeTagsView.reRender( view.model );\n\t\t\t\t\t\t\tthis.setContent( jQuery( '.merge-tags-content' ) );\n\t\t\t\t\t\t\tvar currentElement = jQuery( this.target ).prev( '.setting' );\n\t\t\t\t\t\t\tif ( 0 == currentElement.length ) {\n\t\t\t\t\t\t\t\tcurrentElement = jQuery( view.el ).find( '.setting' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthat.updateCurrentSetting( view.model );\n\t\t\t\t\t\t\tthat.updateCurrentElement( currentElement );\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'prevent:close', 'merge-tags' );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonClose: function() {\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'enable:close', 'merge-tags' );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tjQuery( this ).data( 'jBox-id', jBox.id );\t\t\t\t\t\n\t\t\t\t}\n\t\t });\n\t\t},\n\n\t\tclickMergeTag: function( e, tagModel ) {\n\t\t\t/*\n\t\t\t * TODO: Make this more dynamic.\n\t\t\t * Currently, the RTE is the only section that modifies how merge tags work,\n\t\t\t * but another type of setting might need to do this in the future.\n\t\t\t */\n\n\t\t\tif( 'undefined' != typeof this.settingModel.get( 'settingModel' ) && 'calculations' == this.settingModel.get( 'settingModel' ).get( 'name' ) ) {\n\n\t\t\t\tconsole.log( tagModel );\n\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\n\n\t\t\t\tvar tag = ( 'undefined' != typeof tagModel.get( 'calcTag' ) ) ? tagModel.get( 'calcTag' ) : tagModel.get( 'tag' );\n\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tag + currentValue.substr( currentPos );\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\n\t\t\t} else if( 'rte' == this.settingModel.get( 'type' ) ) {\n\t\t\t\tjQuery( this.currentElement ).summernote( 'insertText', tagModel.get( 'tag' ) );\n\t\t\t} else {\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tagModel.get( 'tag' ) + currentValue.substr( currentPos );\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\n\t\t\t}\n\t\t},\n\n\t\taddFieldTags: function( fieldModel ) {\n\t\t\t// TODO: Make this dynamic\n\t\t\tif ( 'submit' !== fieldModel.get( 'type' ) ) {\n\t\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).add( {\n\t\t\t\t\tid: fieldModel.get( 'id' ),\n\t\t\t\t\tlabel: fieldModel.get( 'label' ),\n\t\t\t\t\ttag: this.getFieldKeyFormat( fieldModel.get( 'key' ) ),\n\t\t\t\t\tcalcTag: this.getFieldKeyFormatCalc( fieldModel.get( 'key' ) )\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tdeleteFieldTags: function( fieldModel ) {\n\t\t\tvar fieldID = fieldModel.get( 'id' );\n\t\t\tvar tagModel = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldID );\n\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).remove( tagModel );\n\t\t},\n\n\t\tupdateCalcTags: function( optionModel ) {\n\t\t\tvar calcTags = new mergeTagCollection();\n\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\n\n\t\t\t_.each( calcCollection.models, function( calc ) {\n\t\t\t\tcalcTags.add( {\n\t\t\t\t\tlabel: calc.get( 'name' ),\n\t\t\t\t\ttag: '{calc:' + calc.get( 'name' ) + '}'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\n\t\t},\n\n\t\topenMergeTags: function( e ) {\n\t\t\tif ( 'TEXTAREA' == jQuery( e.target )[0].tagName || 'INPUT' == jQuery( e.target )[0].tagName ) {\n\t\t\t\tjQuery( e.target ).parent().find( '.merge-tags' ).click();\n\t\t\t}\n\t\t},\n\n\t\treturnMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\n\t\t\t\tif ( currentModel ) {\n\t\t\t\t\tthis.clickMergeTag( e, currentModel );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.changeActiveTag( 'up' );\n\t\t\t}\n\t\t},\n\n\t\tdownMergeTags: function( e ) {\n\t\t\tif ( this.open ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.changeActiveTag( 'down' );\n\t\t\t}\n\t\t},\n\n\t\tchangeActiveTag: function( dir ) {\n\t\t\tif ( 'down' == dir ) {\n\t\t\t\tvar inc = 1;\n\t\t\t} else {\n\t\t\t\tvar inc = -1\n\t\t\t}\n\t\t\t// First, check to see if a field is currently active.\n\t\t\tif( 0 < this.fields.where( { 'active': true } ).length ) {\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\n\t\t\t\tvar currentIndex = this.fields.indexOf( currentModel );\n\t\t\t\tcurrentModel.set( 'active', false );\n\n\t\t\t\tvar nextModel = this.fields.models[ currentIndex + inc ];\n\t\t\t\tif ( nextModel ) {\n\t\t\t\t\tnextModel.set( 'active', true );\n\t\t\t\t} else {\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( 0 < this.fields.where( { 'active': true } ) ) { // There aren't any active fields. Check for active system tags.\n\t\t\t\tconsole.log( 'system' );\n\t\t\t} else if ( 0 < this.userInfo.where( { 'active': true } ) ) { // No active user info LIs.\n\t\t\t\tconsole.log( 'userinfo' );\n\t\t\t} else { // No active LIs. We haven't made any active yet, or we've gotten to the bottom of the list.\n\t\t\t\t// Make sure that we have fields\n\t\t\t\tif ( 0 < this.fields.models.length ) {\n\t\t\t\t\t// Set our first field to active.\n\t\t\t\t\tthis.fields.models[0].set( 'active', true );\n\t\t\t\t} else {\n\t\t\t\t\t// Set our first system model to active.\n\t\t\t\t\tthis.system.models[0].set( 'active', true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateCurrentElement: function( element ) {\n\t\t\tthis.currentElement = element;\n\t\t},\n\n\t\tupdateCurrentSetting: function( settingModel ) {\n\t\t\tthis.settingModel = settingModel;\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.tagSectionCollection;\n\t\t},\n\n\t\tgetSectionModel: function( id ) {\n\t\t\treturn this.tagSectionCollection.get( id );\n\t\t},\n\n\t\tupdateOpen: function( open ) {\n\t\t\tthis.open = open;\n\t\t\t_.each( this.tagSectionCollection.get( 'fields' ).models, function( model ) {\n\t\t\t\tmodel.set( 'active', false );\n\t\t\t} );\n\t\t},\n\n\t\tupdateKey: function( fieldModel ) {\n\t\t\tvar newKey = fieldModel.get( 'key' );\n\t\t\tvar oldTag = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldModel.get( 'id' ) );\n\t\t\tif ( 'undefined' != typeof oldTag ) {\n\t\t\t\toldTag.set( 'tag', this.getFieldKeyFormat( newKey ) );\t\t\t\t\n\t\t\t}\n\n\t\t},\n\n\t\tgetFieldKeyFormat: function( key ) {\n\t\t\treturn '{field:' + key + '}';\n\t\t},\n\n\t\tgetFieldKeyFormatCalc: function( key ) {\n\t\t\treturn '{field:' + key + ':calc}';\n\t\t},\n\n\t\treplaceFieldKey: function( dataModel, keyModel, settingModel ) {\n var oldKey = this.getFieldKeyFormat( keyModel._previousAttributes[ 'key' ] );\n\t\t\tvar newKey = this.getFieldKeyFormat( keyModel.get( 'key' ) );\n\t\t\tvar settingName = settingModel.get( 'name' );\n\t\t\tvar oldVal = dataModel.get( settingName );\n if(settingName == 'calculations' && 'undefined' != typeof(dataModel.get('calculations'))) {\n var calcModel = dataModel.get( 'calculations' );\n calcModel.each( function( model ) {\n var oldCalcKey = oldKey.slice( 0, (oldKey.length - 1) ) + ':calc}';\n var newCalcKey = newKey.slice( 0, (newKey.length - 1 ) ) + ':calc}';\n oldVal = model.get( 'eq' );\n if ( 'string' == typeof( oldVal ) ) {\n var re = new RegExp( oldCalcKey, 'g' );\n var newVal = oldVal.replace( re, newCalcKey );\n re = new RegExp( oldKey, 'g' );\n // TODO: We won't need this second replace when we no longer\n // have to append :calc to merge tags.\n newVal = newVal.replace( re, newKey );\n model.set( 'eq', newVal );\n }\n } );\n return false;\n }\n\t\t\tif ( 'string' == typeof oldVal ) {\n\t\t\t\tvar re = new RegExp( oldKey, 'g' );\n\t\t\t\tnewVal = oldVal.replace( re, newKey );\n\t\t\t\tdataModel.set( settingName, newVal );\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/mergeTagLookupCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\n var collection = Backbone.Collection.extend( {\n model: mergeTagModel\n } );\n return collection;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTag',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'li',\n template: '#tmpl-nf-merge-tag-box-tag',\n\n events: {\n \"click\": \"insertTag\"\n },\n\n insertTag: function() {\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', this.model.get( 'tag' ) );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagList',[ 'views/app/drawer/mergeTag' ], function( mergeTagView ) {\n var view = Marionette.CollectionView.extend({\n tagName: 'ul',\n childView: mergeTagView,\n\n initialize: function() {\n nfRadio.channel( 'merge-tags' ).reply( 'update:taglist', this.sectionFilter, this );\n nfRadio.channel( 'merge-tags' ).reply( 'filtersearch', this.searchFilter, this );\n },\n\n filter: function( child, index, collection ){\n return 'fields' == child.get( 'section' );\n },\n\n sectionFilter: function( section ){\n this.filter = function( child, index, collection ){\n return section == child.get( 'section' );\n }\n this.render();\n nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n },\n\n searchFilter: function( term ){\n this.filter = function( child, index, collection ){\n var label = child.get( 'label' ).toLowerCase().indexOf( term.toLowerCase().replace( ':', '' ) ) >= 0;\n var tag = child.get( 'tag' ).toLowerCase().indexOf( term.toLowerCase() ) >= 0;\n return label || tag;\n }\n this.render();\n nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagGroup',[], function() {\n var view = Marionette.ItemView.extend({\n tagName: 'li',\n template: '#tmpl-nf-merge-tag-box-section',\n events: {\n \"click\": \"onClick\"\n },\n\n initialize: function () {\n this.listenTo( nfRadio.channel( 'merge-tags' ), 'after:filtersearch', this.removeActive );\n },\n\n onClick: function(){\n this.updateTags();\n this.setActive();\n },\n\n updateTags: function() {\n nfRadio.channel( 'merge-tags' ).request( 'update:taglist', this.model.get( 'id' ) );\n },\n\n setActive: function(){\n this.$el.addClass( 'active' );\n this.$el.siblings().removeClass( 'active' );\n },\n\n removeActive: function(){\n this.$el.removeClass( 'active' );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagGroupList',[ 'views/app/drawer/mergeTagGroup' ], function( mergeTagGroupView ) {\n var view = Marionette.CollectionView.extend({\n tagName: 'ul',\n childView: mergeTagGroupView,\n\n initialize: function(){\n this.listenTo( nfRadio.channel( 'merge-tags' ), 'open', this.render, this );\n },\n\n // TODO: Update filter when a new tag is added. ie Calculations.\n filter: function( child, index, collection ){\n return 0 < child.get( 'tags' ).length;\n },\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagFilter',[], function() {\n var view = Marionette.ItemView.extend({\n template: '#tmpl-nf-merge-tag-box-filter',\n events: {\n \"keyup input\": \"updateFilter\",\n },\n updateFilter: function( event ) {\n\n if( /* ENTER */ 13 == event.keyCode ){ // Copied from Keyup Callback.\n // Get top listed merge tag.\n var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\n\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\n\n // COPIED FROM BELOW\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n return;\n }\n var value = this.$el.find( 'input' ).val();\n nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\n }\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/drawer/mergeTagBox',[], function() {\n var view = Marionette.LayoutView.extend({\n el: '#merge-tags-box',\n template: \"#tmpl-nf-merge-tag-box\",\n\n regions: {\n filter: '.merge-tag-filter',\n sections: '.merge-tag-sections',\n tags: '.merge-tag-list'\n },\n });\n\n return view;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Merge Tag Box\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1\n */\n\ndefine( 'controllers/app/mergeTagBox',[\n 'models/app/mergeTagModel',\n 'models/app/mergeTagLookupCollection',\n 'views/app/drawer/mergeTag',\n 'views/app/drawer/mergeTagList',\n 'views/app/drawer/mergeTagGroup',\n 'views/app/drawer/mergeTagGroupList',\n 'views/app/drawer/mergeTagFilter',\n 'views/app/drawer/mergeTagBox'\n], function(\n MergeTagModel,\n MergeTagLookupCollection,\n MergeTagView,\n MergeTagListView,\n MergeTagGroupView,\n MergeTagGroupListView,\n MergeTagFilterView,\n MergeTagBoxLayout\n) {\n var controller = Marionette.Object.extend( {\n\n caret: 0, // Track the caret position of the current setting's input.\n old: '', // THe old merge tag that will be replaced.\n\n initialize: function(){\n\n this.listenTo( nfRadio.channel( 'drawer' ), 'render:settingGroup', function(){\n jQuery( '.merge-tags' ).off( 'click' );\n jQuery( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n });\n\n this.listenTo( nfRadio.channel( 'app' ), 'after:appStart', this.afterAppStart );\n this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n this.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.beforeDrawerClose );\n\n var that = this;\n nfRadio.channel( 'mergeTags' ).reply( 'set:caret', function( position ){\n that.caret = position;\n });\n nfRadio.channel( 'mergeTags' ).reply( 'get:caret', function(){\n return that.caret;\n });\n\n var that = this;\n nfRadio.channel( 'mergeTags' ).reply( 'set:old', function( value ){\n that.old = value;\n });\n nfRadio.channel( 'mergeTags' ).reply( 'get:old', function(){\n return that.old;\n });\n\n nfRadio.channel( 'mergeTags' ).reply( 'insert:tag', this.insertTag.bind( this ) );\n\n /** OPTION REPEATER */\n this.listenTo( nfRadio.channel( 'option-repeater' ), 'add:option', function( model ){\n var selector = '#' + model.cid + ' .has-merge-tags input.setting';\n jQuery( selector ).on( 'focus', function( event ){\n that.focusCallback( event, selector, 'option-repeater' );\n });\n jQuery( selector ).on( 'keyup', function( event ){\n that.keyupCallback( event, selector, 'option-repeater' );\n });\n jQuery( selector ).siblings( '.nf-list-options .merge-tags' ).off( 'click' );\n jQuery( selector ).siblings( '.nf-list-options .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.nf-list-options .merge-tags' ).off( 'click' );\n jQuery( '.nf-list-options .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n /* CALCULATIONS */\n this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', this.renderSetting );\n // this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', function( settingModel, dataModel, view ){\n // view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n // } );\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.nf-list-options.calculations .merge-tags' ).off( 'click' );\n jQuery( '.nf-list-options.calculations .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n /* SUMMERNOTE */\n this.listenTo( nfRadio.channel( 'summernote' ), 'focus', function( e, selector ) {\n that.focusCallback( false, selector, 'rte' );\n } );\n this.listenTo( nfRadio.channel( 'summernote' ), 'keydown', function( e, selector ){\n jQuery( selector ).closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\n } );\n this.listenTo( nfRadio.channel( 'summernote' ), 'keyup', function( e, selector ){\n that.keyupCallback( e, selector, 'rte' );\n } );\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.note-editor .merge-tags' ).off( 'click' );\n jQuery( '.note-editor .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n jQuery( document ).on( 'keyup', function( event ){\n if( 27 == event.keyCode ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n // Copied from KeyupCallback.\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).blur();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n });\n },\n\n afterAppStart: function() {\n var mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n var mergeTags = [];\n mergeTagCollection.each( function( section ){\n section.get( 'tags' ).each( function( tag ){\n mergeTags.push({\n label: tag.get( 'label' ),\n tag: tag.get( 'tag' ),\n section: section.get( 'id' )\n });\n });\n });\n var layout = new MergeTagBoxLayout();\n layout.render();\n var tagCollection = new MergeTagLookupCollection( mergeTags );\n var mergeTagListView = new MergeTagListView({\n collection: tagCollection\n });\n var mergeTagGroupListView = new MergeTagGroupListView({\n collection: mergeTagCollection\n });\n\n layout.getRegion('tags').show(mergeTagListView);\n layout.getRegion('sections').show(mergeTagGroupListView);\n layout.getRegion('filter').show(new MergeTagFilterView);\n\n var that = this;\n this.listenTo( nfRadio.channel( 'mergeTags' ), 'open', function(){\n // layout.destroy();\n that.afterAppStart();\n });\n },\n\n beforeRenderSetting: function( settingModel, dataModel ){\n if( 'undefined' == typeof settingModel.get( 'use_merge_tags' ) ) return;\n if( ! settingModel.get( 'use_merge_tags' ) ) return;\n var name = settingModel.get( 'name' );\n this.listenTo( nfRadio.channel( 'setting-' + name ), 'render:setting', this.renderSetting );\n },\n\n renderSetting: function( settingModel, dataModel, view ){\n\n view.$el.find( '.merge-tags' ).off( 'click' );\n view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n\n if( 0 == jQuery( '#merge-tags-box' ).length ) this.afterAppStart();\n\n // Track Scrolling.\n jQuery( '#nf-drawer' ).on( 'scroll', function(){\n // COPIED AND MODIFIED FROM FOCUS\n if( 0 == jQuery( '.merge-tag-focus' ).length ) return;\n\n var rteEditor = jQuery( '.merge-tag-focus' ).closest( '.nf-setting' ).find( '.note-editor' );\n if( 0 != rteEditor.length ){\n var posY = rteEditor.offset().top - jQuery(window).scrollTop();\n var height = rteEditor.outerHeight();\n } else {\n var posY = jQuery('.merge-tag-focus').offset().top - jQuery(window).scrollTop();\n var height = jQuery('.merge-tag-focus').outerHeight();\n }\n jQuery( '#merge-tags-box' ).css( 'top', posY + height );\n\n var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\n\n var repeaterRow = jQuery( '.merge-tag-focus' ).closest( '.nf-list-options-tbody' );\n if( 0 != repeaterRow.length ){\n var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', left );\n } else {\n var posX = jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).width() );\n }\n });\n\n // On input focus, move the Merge Tag Box into position.\n jQuery( view.el ).find( '.setting' ).on( 'focus', this.focusCallback );\n\n // TODO: Maybe move to view events.\n // On input keyup, maybe show Merge Tag Box.\n jQuery( view.el ).find( '.setting' ).on( 'keyup', this.keyupCallback );\n },\n\n // TODO: Maybe move to view class.\n beforeDrawerClose: function(){\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n // jQuery( 'body' ).append( jQuery( '#merge-tags-box' ) );\n nfRadio.channel( 'mergeTags' ).trigger( 'open' );\n },\n\n insertTag: function( tag ) {\n\n var $input = jQuery( '.merge-tag-focus' );\n\n if( 0 != $input.closest( '.nf-setting' ).first().find( '.note-editable' ).length ){\n $input = $input.closest( '.nf-setting' ).first().find( '.note-editable' );\n }\n\n if( 1 < $input.length ){ $input = $input.first(); }\n\n if( $input.hasClass( 'note-editable' ) ){\n var str = $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code' );\n } else {\n var str = $input.val();\n }\n\n var find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\n var replace = tag;\n var caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\n\n var patt = /{([a-z0-9]|:|_||-})*/g;\n\n // Loop through matches to find insert/replace index range.\n // Reference: http://codepen.io/kjohnson/pen/36c3a782644dfff40fe3c1f05f8739d9?editors=0012\n while (match = patt.exec(str)) {\n if (find != match[0]) continue; // This isn't the match you are looking for...\n var string = str.slice(0, match.index) + replace + str.slice(patt.lastIndex); // Fancy replace for the specifc match, using the index/position.\n\n if( $input.hasClass( 'note-editable' ) ){\n $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code', string );\n\n // Reposition the caret. http://stackoverflow.com/a/6249440 TODO: Determine the appropriate childNode.\n var el = $input;\n var childNode = null; // Default to first childNode.\n _.each( el[0].childNodes, function( node, index ){\n if( childNode ) return;\n if( ! node.nodeValue && ! node.innerHTML ) return;\n if( node.nodeValue ) {\n var position = node.nodeValue.indexOf(replace) + find.length;\n } else if( node.innerHTML ){\n var position = node.innerHTML.indexOf(replace) + find.length;\n }\n if( caretPos == position ) childNode = el[0].childNodes[index];\n });\n if( ! childNode ) childNode = el[0].childNodes[0];\n var offset = caretPos - find.length + replace.length;\n var range = document.createRange();\n var sel = window.getSelection();\n if( 0 != childNode.childNodes.length ) {\n try{\n range.setStart(childNode.childNodes[0], offset); \n } catch( err ) {\n console.log( 'error' );\n }\n \n } else {\n try {\n range.setStart(childNode, offset);\n } catch( err ) {\n console.log( 'error' );\n }\n \n }\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n\n\n } else {\n $input.val(string); // Update input value with parsed string.\n $input.change(); // Trigger a change event after inserting the merge tag so that it saves to the model.\n $input.caret(caretPos - find.length + replace.length); // Update Carept Position.\n }\n\n }\n\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n $input.removeClass( 'merge-tag-focus' );\n $input.closest( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n },\n\n mergeTagsButtonClick: function( e ){\n\n var $this = jQuery( this );\n\n if( $this.siblings().hasClass( 'merge-tag-focus' ) ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n return;\n }\n\n if( 0 !== $this.closest( '.nf-setting, .nf-table-row' ).find( '.note-tools' ).length ){\n var $inputSetting = $this.closest( '.note-editor' ).siblings( '.setting' ).first();\n $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\n } else {\n var $inputSetting = $this.siblings( '.setting' ).first();\n var text = $inputSetting.val() || '';\n $inputSetting.val( text + '{' ).change();\n nfRadio.channel('mergeTags').request('set:caret', text.length + 1 );\n }\n\n if( $this.parent().hasClass( 'note-tools' ) ){\n // $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\n }\n\n nfRadio.channel('mergeTags').request('set:old', '{' );\n\n $inputSetting.addClass( 'merge-tag-focus' );\n\n // Disable browser autocomplete.\n var autocomplete = $this.attr( 'autocomplete' );\n $this.attr( 'autocomplete', 'off' );\n $this.data( 'autocomplete', autocomplete );\n\n var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\n if( 0 != $overlayElement.find( '.note-editor' ).length ){\n $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\n } else {\n $overlayElement.addClass('merge-tag-focus-overlay');\n }\n\n jQuery( '#merge-tags-box' ).css( 'display', 'block' );\n nfRadio.channel( 'drawer' ).request( 'prevent:close' );\n\n jQuery( '.merge-tag-focus-overlay' ).off( 'click' );\n jQuery( '.merge-tag-focus-overlay' ).on( 'click', function( e ) {\n if ( jQuery( e.target ).hasClass( 'note-editor' ) ) {\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n } );\n\n setTimeout(function(){\n jQuery( '#merge-tags-box' ).find( '.merge-tag-filter' ).find( 'input' ).focus();\n }, 500 );\n },\n\n focusCallback: function( e, target, type ){\n\n var type = type || 'setting';\n var $this = ( 'undefined' == typeof target ) ? jQuery( this ) : jQuery( target );\n\n jQuery( '.merge-tag-focus' ).each(function(index, el){\n if( this == el ) return;\n el.removeClass( 'merge-tag-focus' );\n });\n\n if( 'rte' == type ) {\n var posY = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().top - jQuery(window).scrollTop();\n var height = $this.closest( '.nf-setting' ).find( '.note-editor' ).outerHeight();\n } else {\n var posY = $this.offset().top - jQuery(window).scrollTop();\n var height = $this.outerHeight();\n }\n jQuery( '#merge-tags-box' ).css( 'top', posY + height );\n\n var repeaterRow = $this.closest( '.nf-list-options-tbody' );\n if( 0 != repeaterRow.length ) {\n var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', left );\n } else if( 'rte' == type ) {\n var posX = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-setting' ).find( '.note-editor' ).width() );\n }\n else\n {\n var posX = jQuery( this ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-settings' ).width() );\n }\n\n var dataID = jQuery( this ).data( 'id' );\n if( dataID && 'eq' != dataID ) return;\n\n // var offset = jQuery( view.el ).find( '.setting' ).parent().outerHeight();\n // jQuery( view.el ).find( '.setting' ).parent().append( jQuery( '#merge-tags-box' ) );\n // jQuery( '#merge-tags-box' ).css( 'top', offset );\n },\n\n keyupCallback: function( event, target, type ){\n\n var type = type || 'setting';\n\n if( /* ENTER */ 13 == event.keyCode ){\n\n // Get top listed merge tag.\n var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\n\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\n\n // COPIED FROM BELOW\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n\n return;\n }\n\n // Get the value.\n // var value = jQuery( summernote ).summernote( 'code' );\n // Update the value.\n // jQuery( summernote ).closest( '.nf-setting' ).find( '.note-editable' ).html( value );\n\n if( 'undefined' != typeof target ) {\n var $this = jQuery(target);\n } else {\n var $this = jQuery( this );\n }\n\n // TODO: Disable Browser Autocomplete\n // $this.attr()\n\n\n var dataID = jQuery( this ).data( 'id' );\n if( dataID && 'eq' != dataID ) return;\n\n // Store the current caret position.\n if( 'rte' == type ){\n var range = $this.summernote('createRange');\n if( range ) {\n var caretPos = range.so; // or .eo?\n } else {\n var caretPos = 0;\n }\n $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\n } else {\n var caretPos = $this.caret();\n }\n nfRadio.channel( 'mergeTags' ).request( 'set:caret', caretPos );\n\n // Find merge tags.\n if( 'rte' == type ) {\n var mergetags = $this.summernote( 'code' ).match(new RegExp(/{([a-z0-9]|:|_|-|})*/g));\n } else {\n var mergetags = $this.val().match(new RegExp(/{([a-z0-9]|:|_|-|})*/g));\n }\n\n // Filter out closed merge tags.\n mergetags = _.filter(mergetags, function(mergetag) {\n return -1 == mergetag.indexOf( '}' ); // Filter out \"closed\" merge tags.\n });\n\n // If an open merge tag is found, show the Merge Tag Box, else hide.\n if( 0 !== mergetags.length ) {\n\n nfRadio.channel( 'mergeTags' ).request( 'set:old', mergetags[0] );\n\n jQuery('#merge-tags-box').css( 'display', 'block' );\n nfRadio.channel( 'drawer' ).request( 'prevent:close' );\n $this.addClass('merge-tag-focus');\n\n var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\n\n // Disable browser autocomplete.\n var autocomplete = $this.attr( 'autocomplete' );\n $this.attr( 'autocomplete', 'off' );\n $this.data( 'autocomplete', autocomplete );\n\n var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\n if( 0 != $overlayElement.find( '.note-editor' ).length ){\n $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\n } else {\n $overlayElement.addClass('merge-tag-focus-overlay');\n }\n\n $overlayElement.off( 'click' );\n $overlayElement.on( 'click', function( event ){\n var elementClasses = jQuery( event.target ).attr( 'class' ) || [];\n if( -1 !== elementClasses.indexOf( 'merge-tag-focus-overlay' ) ){\n nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n });\n\n var value = mergetags[0].replace( '{', '' );\n nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\n } else {\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n jQuery( '#merge-tags-box' ).removeClass();\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n }\n }\n\n } );\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're about to render a setting model that's a select and has 'fields' as the 'fill' setting, add all our field models to its options.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/itemSettingFill',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel ) {\n\t\t\tif ( 'fields' == settingModel.get( 'fill' ) ) {\n\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Modify the user's browser history when they click on a domain\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/confirmPublish',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:confirmPublish', this.confirmPublish );\n\t\t},\n\n\t\tconfirmPublish: function() {\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t\t\t// Check to see if we need to add a submit button.\n\t\t\tif ( 1 == formModel.get( 'settings' ).get( 'add_submit' ) ) {\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add', { type: 'submit', label: 'Submit', order: 9999 } );\n\t\t\t}\n\t\t\tformModel.set( 'show_publish_options', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to settings that utilise the Rich Text Editor\n *\n * @package Ninja Forms builder\n * @subpackage App - Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/rte',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\n\t\t\tnfRadio.channel( 'setting-type-rte' ).reply( 'renderOnChange', function(){ return false } );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'rte' ), 'init:settingModel', this.initSettingModel );\n\n\t\t\t// When an RTE setting is shown, re-render RTE.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'render:setting', this.renderSetting );\n\n\t\t\t// When an RTE setting view is destroyed, remove our RTE.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'destroy:setting', this.destroySetting );\n\n\t\t\t// When an element within the RTE is clicked, check to see if we should insert a link.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), '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\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 this.currentContext = {};\n\t\t},\n\n\t\tinitSettingModel: function( settingModel ) {\n\t\t\tsettingModel.set( 'hide_merge_tags', true );\n\t\t},\n\n\t\tinitRTE: function( settingModel, dataModel, settingView ) {\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\t\t\tvar mergeTags = this.mergeTags();\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 [ 'tools', [ 'mediaButton', 'mergeTags', 'codeview' ] ]\n\t\t\t];\n\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( {\n\t\t\t\ttoolbar: toolbar,\n\t\t\t\tbuttons: {\n\t\t\t\t\tlinkButton: linkButton,\n\t\t\t\t\tmergeTags: mergeTags,\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 callbacks: {\n\t\t\t\t \tonBlur: function( editor ) {\n\t\t\t\t \t\tvar value = editor.getValue();\n\t\t\t\t \t\tthat.updateDataModel( settingModel, dataModel, value );\n\t\t\t\t \t}\n\t\t\t\t }\n\t\t\t\t},\n\t\t\t\tprettifyHtml: true,\n\t\t\t\tcallbacks: {\n\t\t\t\t\tonBlur: function( e, context ) {\n\t\t\t\t\t\tvar value = jQuery( this ).summernote( 'code' );\n\t\t\t\t\t\tthat.updateDataModel( settingModel, dataModel, value );\n nfRadio.channel( 'summernote' ).trigger( 'blur', settingModel, dataModel, value );\n\t\t\t\t\t},\n onFocus: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'focus', e, this, context );\n },\n onKeydown: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'keydown', e, this, context );\n },\n onKeyup: function( e, context ) {\n nfRadio.channel( 'summernote' ).trigger( 'keyup', e, this, context );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tupdateDataModel: function( settingModel, dataModel, value ) {\n\t\t\tvar name = settingModel.get( 'name' );\n\t\t\tvar before = dataModel.get( name );\n\t\t\tvar after = value;\n\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\n\n\t\t\tdataModel.set( settingModel.get( 'name' ), after );\n\t\t},\n\n\t\trenderSetting: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.initRTE( settingModel, dataModel,settingView );\n\t\t\tvar linkMenu = jQuery( settingView.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\tdestroySetting: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.removeRTE( settingModel, dataModel, settingView );\n\t\t},\n\n\t\tremoveRTE: function( settingModel, dataModel, settingView ) {\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( 'destroy' );\n\t\t},\n\n\t\tdrawerOpened: function( settingModel, dataModel, settingView ) {\n\t\t\tthis.initRTE( settingModel, dataModel, settingView );\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: 'Insert Link',\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\tmergeTags: function( context ) {\n\t\t\tvar ui = jQuery.summernote.ui;\n\t\t\tvar mergeTagsButton = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-rte-merge-tags-button' );\n\t\t\treturn ui.button({\n\t\t\t\tclassName: 'dropdown-toggle merge-tags',\n\t\t\t\tcontents: mergeTagsButton({}),\n\t\t\t\ttooltip: 'Merge Tags'\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: 'Insert Media',\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.createRange' );\n\t\t\tcontext.invoke( 'editor.saveRange' );\n\t\t\tthis.currentContext = context;\n\t\t\t\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: 'Select a file',\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, settingModel, dataModel, settingView ) {\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\tthis.currentContext.invoke( 'editor.restoreRange' );\n\t\t\tif ( 'image' == media.type ) {\n\t\t\t\tthis.currentContext.invoke( 'editor.insertImage', media.url );\n\t\t\t} else {\n\t\t\t\tthis.currentContext.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\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingFieldSelect',[], function() {\n var controller = Marionette.Object.extend( {\n\n initialize: function() {\n\n // Bind field key listener to field-select setting type.\n this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', this.trackKeyChanges );\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-field-select' ), 'before:renderSetting', this.beforeRender );\n\n // Add setting change listener only in drawers with a field-select setting.\n this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', function() {\n this.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.maybeSwitchToFieldsDomain );\n });\n\n this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.autoOpenDrawer );\n\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.filterDrawerContents );\n this.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.SwitchToFieldsDomain );\n },\n\n trackKeyChanges: function( settingModel ) {\n settingModel.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', settingModel.updateKey );\n\n // Update selected field if the selected field's key changes.\n this.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.updateFieldMap );\n },\n\n updateFieldMap: function( dataModel, keyModel, settingModel ) {\n\n var oldKey = keyModel._previousAttributes[ 'key' ];\n var newKey = keyModel.get( 'key' );\n\n if( 'field-select' == settingModel.get( 'type' ) && dataModel.get( settingModel.get( 'name' ) ) == oldKey ) {\n\n dataModel.set( settingModel.get( 'name' ), newKey );\n }\n },\n\n beforeRender: function( settingModel, dataModel ) {\n\n var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n var fieldTypes = settingModel.get( 'field_types' );\n\n var options = [\n {\n label: '--',\n value: 0\n }\n ];\n _.each( fieldCollection.models, function( field ){\n\n if( dataModel.cid == field.cid ) return;\n\n if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length && ! _.contains( fieldTypes, field.get( 'type' ) ) ) return;\n\n var fieldFilter = settingModel.get( 'field_filter' );\n if( fieldFilter && 'undefined' != typeof fieldFilter[ field.get( 'type' ) ] ) {\n var bail = false;\n _.each( fieldFilter[ field.get( 'type' ) ], function( value, setting ){\n console.log( value + \":\" + field.get( setting ) );\n if( value != field.get( setting ) ) bail = true;\n } );\n if( bail ) return;\n }\n\n var value = field.get( 'key' );\n switch ( settingModel.get( 'field_value_format' ) ) {\n case 'key':\n value = field.get( 'key' );\n break;\n case 'merge_tag':\n default:\n value = '{field:' + field.get( 'key' ) + '}';\n }\n\n options.push({\n label: field.get( 'label' ),\n value: value\n });\n });\n\n if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length ) {\n _.each( fieldTypes, function( fieldType ){\n\n var fieldTypeModel = nfRadio.channel( 'fields' ).request( 'get:type', fieldType );\n\n options.push({\n label: '-- Add ' + fieldTypeModel.get( 'nicename' ) + ' Field',\n value: 'addField:' + fieldType,\n });\n } );\n }\n\n settingModel.set( 'options', options );\n },\n\n maybeSwitchToFieldsDomain: function( e, model, dataModel ) {\n\n if( 'field-select' != model.get( 'type' ) ) return;\n\n var name = model.get( 'name' );\n var value = dataModel.get( name );\n\n if( ! value ) return;\n\n var rubble = value.split( ':' );\n\n if( 'addField' != rubble[0] ) return;\n\n this.openDrawer = 'addField';\n this.filterDrawer = rubble[1];\n\n dataModel.set( name, '' );\n\n this.switchDomain = true;\n nfRadio.channel( 'app' ).request( 'close:drawer' );\n },\n\n SwitchToFieldsDomain: function() {\n if( this.switchDomain ) {\n var fieldDomainModel = nfRadio.channel( 'app' ).request( 'get:domainModel', 'fields' );\n nfRadio.channel('app').request('change:currentDomain', null, fieldDomainModel);\n this.switchDomain = null;\n }\n },\n\n autoOpenDrawer: function() {\n if( this.openDrawer ) {\n nfRadio.channel( 'app' ).request( 'open:drawer', this.openDrawer );\n this.openDrawer = null;\n }\n },\n\n filterDrawerContents: function() {\n if( this.filterDrawer ) {\n nfRadio.channel('drawer-addField').trigger('change:filter', this.filterDrawer);\n this.filterDrawer = null;\n }\n }\n });\n\n return controller;\n} );\n","/**\n * The Field List setting is a container of settings (like the Fieldset setting), in which its children are instantiated.\n * Unlike the Fieldset setting, Field List settings are dynamically created based on the list of form fields.\n *\n * Note: Field references in the dynamic setting names are based on field keys, which may change.\n * Unlike regular field key tracking, a new setting needs to be created with the same value as the previous.\n *\n * @package Ninja Forms builder\n * @subpackage Action Settings\n * @copyright (c) 2016 WP Ninjas\n * @author Kyle B. Johnson\n * @since 3.0\n */\ndefine( 'controllers/app/settingFieldList',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\n return Marionette.Object.extend( {\n\n /**\n * A reference list of Field List setting models.\n */\n fieldListSettings: [],\n\n initialize: function() {\n this.listenTo( nfRadio.channel( 'field-list' ), 'init:settingModel', this.registerFieldListSettings );\n this.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateFieldListSettingKeys );\n nfRadio.channel( 'field-list' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n },\n\n /**\n * Build a reference list of Field List setting models for later reference.\n *\n * @param settingModel\n */\n registerFieldListSettings: function( settingModel ){\n this.fieldListSettings.push( settingModel.get( 'name' ) );\n },\n\n /**\n * Field List settings contain field keys in the setting names.\n * When a field key changes, so too must the Field List setting name.\n *\n * @param fieldModel\n */\n updateFieldListSettingKeys: function( fieldModel ){\n\n // We are only interested in field key changes.\n if( 'undefined' == typeof fieldModel.changed.key ) return;\n\n var oldKey = fieldModel._previousAttributes.key;\n var newKey = fieldModel.changed.key;\n\n /*\n * This is an absolute (functional) mess of nesting. I apologize to my future self, or Kenny.\n *\n * Each setting of each action model must be checked against each registered Field List setting.\n */\n var that = this;\n _.each( Backbone.Radio.channel( 'actions' ).request( 'get:collection' ).models, function( actionModel ) {\n _.each( actionModel.attributes, function( value, setting ) {\n var lastChanged = ''; // Used to avoid resetting the change with a duplicate call.\n _.each( that.fieldListSettings, function( prefix ) {\n if( setting != prefix + '-' + oldKey || lastChanged == oldKey ) return;\n var oldValue = actionModel.get( prefix + '-' + oldKey );\n actionModel.set( prefix + '-' + newKey, oldValue );\n actionModel.set( prefix + '-' + oldKey, 0 );\n lastChanged = oldKey;\n });\n });\n });\n },\n\n /**\n * Set the view for Field List sub-settings, just like the Fieldset setting.\n *\n * @param settingModel\n * @returns {*}\n */\n getSettingChildView: function( settingModel ) {\n\n /**\n * Dynamically build field-list settings as needed for the view.\n */\n\n // Filter fields based on the field_types setting property.\n var fields = _.filter( nfRadio.channel( 'fields' ).request( 'get:collection' ).models, function( field ) {\n return _.contains( settingModel.get( 'field_types' ), field.get( 'type' ) );\n });\n\n // Map fields into setting definitions.\n var settings = _.map( fields, function( field ) {\n return {\n name: settingModel.get( 'name' ) + '-' + field.get( 'key' ),\n type: 'toggle',\n label: field.get( 'label' ),\n width: 'full'\n };\n });\n\n settingModel.set( 'settings', new settingCollection( settings ) );\n\n // return the child view.\n return fieldsetView;\n },\n\n });\n} );\n\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n *\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingHTML',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-html' ), 'before:renderSetting', this.init );\n },\n\n init: function( settingModel, dataModel ) {\n\n if( 'undefined' == settingModel.get( 'mirror' ) ) return;\n\n // Listen to a setting change inside of the dataModel.\n dataModel.on( 'change:' + settingModel.get( 'mirror' ), this.update, settingModel );\n },\n\n update: function( dataModel, changedSettingValue ) {\n\n // Mirror the default value setting value.\n dataModel.set( this.get( 'name' ), changedSettingValue );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/settingColor',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n // We don't want to re-render this setting type when the data changes.\n nfRadio.channel( 'setting-type-color' ).reply( 'renderOnChange', this.setRenderFalse );\n // We want to close any color pickers before we close our styling tab or drawer.\n this.listenTo( nfRadio.channel( 'setting-type-color' ), 'destroy:setting', this.closeColorPickers );\n\n // The first time settingModel and the dataModel meet.\n this.listenTo( nfRadio.channel( 'setting-type-color' ), 'render:setting', this.initColorPicker );\n },\n\n initColorPicker: function( settingModel, dataModel, view ) {\n\n var name = settingModel.get( 'name' );\n var el = jQuery( view.el ).find( 'input' );\n\n jQuery( el ).wpColorPicker( {\n change: function( event, ui ){\n nfRadio.channel( 'app' ).request( 'change:setting', event, settingModel, dataModel, ui.color.toString() );\n }\n } );\n },\n\n setRenderFalse: function() {\n return false;\n },\n\n closeColorPickers: function( settingModel, dataModel, view ) {\n jQuery( view.el ).find( '.wp-color-picker' ).wpColorPicker( 'close' );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for the app to start.\n *\n * If the form is a new form, then highlight the Add New submenu item.\n * Otherwise, append an Edit Form submenu for context.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/changeMenu',[], function() {\n var controller = Marionette.Object.extend({\n\n editFormText: '',\n\n initialize: function () {\n this.editFormText = nfAdmin.editFormText || 'Edit Form';\n this.listenTo(nfRadio.channel('app'), 'after:appStart', this.changeMenu);\n this.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.formPublish );\n },\n\n changeMenu: function () {\n var form = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\n if ( this.isNewForm( form.id ) ) {\n this.highlightAddNew();\n } else {\n this.appendEditForm();\n }\n },\n\n isNewForm: function( form_id ) {\n return isNaN( form_id );\n },\n\n highlightAddNew: function() {\n jQuery( '.wp-submenu li' ).removeClass( 'current' );\n jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().addClass( 'current' );\n },\n\n appendEditForm: function() {\n var html = '<li class=\"current\"><a href=\"#\">' + this.editFormText + '</a></li>';\n if ( jQuery( 'li a:contains(\"' + this.editFormText + '\")' ).length == 0 ) {\n jQuery( '.wp-submenu li' ).removeClass( 'current' );\n jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().after( html );\n }\n },\n\n formPublish: function( response ) {\n if ( 'publish' !== response.action ) return false;\n this.changeMenu();\n }\n });\n\n return controller;\n});\n","/**\n * When we click on a domain link, close the mobile menu.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for clicks on our app menu.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.closeMobileMenu );\n\t\t},\n\n\t\tcloseMobileMenu: function() {\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\n\t\t\tjQuery( builderEl ).removeClass( 'nf-menu-expand' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Add a jBox notice to the screen.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'notices' ).reply( 'add', this.addNotice, this );\n\t\t\tnfRadio.channel( 'notices' ).reply( 'close', this.closeNotice, this );\n\t\t\tthis.notices = {};\n\t\t},\n\n\t\taddNotice: function( key, msg, options ) {\n\n\t\t\tvar appDefaults = {\n\t\t\t\tcontent: msg,\n\t\t\t\tcolor: 'green',\n\t\t\t\tzIndex:12000,\n\t\t\t\tconstructOnInit: true,\n\t\t\t\tstack: true,\n\t\t\t\tanimation: {\n\t\t\t\t\topen: 'flip',\n\t\t\t\t\tclose: 'flip'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar mobileDefaults = {\n\t\t\t\tposition: {\n\t\t\t\t\tx: 'center',\n\t\t\t\t\ty: 'top'\n\t\t\t\t},\n\t\t\t\tanimation: {\n\t\t\t\t\topen:'slide:top',\n\t\t\t\t\tclose:'slide:left'\n\t\t\t\t},\n\t\t\t\tautoClose: 2000,\n\t\t\t\toffset: {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 55\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar desktopDefaults = {\n\t\t\t\tattributes: {\n\t\t\t\t\tx: 'left',\n\t\t\t\t\ty: 'bottom'\n\t\t\t\t},\n\t\t\t\tautoClose: 4000\n\t\t\t};\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tvar defaults = mobileDefaults;\t\n\t\t\t} else {\n\t\t\t\tvar defaults = desktopDefaults;\n\t\t\t}\n\t\t\tdefaults = jQuery.extend( defaults, appDefaults );\n\n\t\t\tvar options = jQuery.extend( defaults, options );\n\t\t\t// console.log( options );\n\t\t\tthis.notices[ key ] = new jBox( 'Notice', options );\n\t\t},\n\n\t\tcloseNotice: function( key ) {\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\n\t\t\t\tthis.notices[ key ].close();\n\t\t\t}\n\t\t},\n\n\t\topenNotice: function( key ) {\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\n\t\t\t\tthis.notices[ key ].open();\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Prompt the user to save if they attempt to leave the page with unsaved changes.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/unloadCheck',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tjQuery( window ).bind( 'beforeunload', this.maybePrompt );\n\t\t},\n\n\t\tmaybePrompt: function( model ) {\n\t\t\t// If our app is clean, don't show a warning.\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\n\t\t\t\treturn 'You have unsaved changes.';\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Before we save data to the database (on preview update or publish), we check to see if we have anyone\n * that wants to update the 'formContent' form setting. This setting is used on the front-end to allow\n * for custom display of form fields. i.e. layout rows.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formContentFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our formContent view filter array.\n\t\t\t */\n\t\t\tthis.viewFilters = [];\n\t\t\tthis.saveFilters = [];\n\t\t\tthis.loadFilters = [];\n\n\t\t\t/*\n\t\t * Listen for requests to add formContent filters.\n\t\t\t */\n\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:saveFilter', this.addSaveFilter, 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:saveFilters', this.getSaveFilters, this );\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:loadFilters', this.getLoadFilters, this );\n\t\t\t\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\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:viewFilter', this.addViewFilter, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:saveFilter', this.addSaveFilter, 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 */\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:viewFilters', this.getViewFilters, this );\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:saveFilters', this.getSaveFilters, 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\taddSaveFilter: function( callback, priority ) {\n\t\t\tthis.saveFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetSaveFilters: function() {\n\t\t\treturn this.saveFilters;\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","/**\n * Handles filters for our main content gutter views.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/formContentGutterFilters',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Init our gutter view filter array.\n\t\t\t */\n\t\t\tthis.leftFilters = [];\n\t\t\tthis.rightFilters = [];\n\t\t\t/*\n\t\t * Listen for requests to add gutter filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:leftFilter', this.addLeftFilter, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:rightFilter', this.addRightFilter, this );\n\n\t\t\t/*\n\t\t\t * Listen for requests to get our content gutter filters.\n\t\t\t */\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:leftFilters', this.getLeftFilters, this );\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:rightFilters', this.getRightFilters, this );\n\t\t},\n\n\t\taddLeftFilter: function( callback, priority ) {\n\t\t\tthis.leftFilters[ priority ] = callback;\n\t\t},\n\n\t\taddRightFilter: function( callback, priority ) {\n\t\t\tthis.rightFilters[ priority ] = callback;\n\t\t},\n\n\t\tgetLeftFilters: function() {\n\t\t\treturn this.leftFilters;\n\t\t},\n\n\t\tgetRightFilters: function() {\n\t\t\treturn this.rightFilters;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Returns a clone of a backbone collection with all the models' attributes looped through so that collections contained within are propely cloned.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/cloneCollectionDeep',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:collectionDeep', this.cloneCollectionDeep, this );\n\t\t},\n\n\t\tcloneCollectionDeep: function( collection ) {\n\t\t\tvar models = [];\n\t\t\t// Loop through every model in our collection, clone it, and add it to our model array\n\t\t\t_.each( collection.models, function( model ) {\n\t\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\t\t\t\tmodels.push( newModel );\n\t\t\t} );\n\t\t\t// Create a new instance of our collection\n\t\t\treturn new collection.constructor( models, collection.options );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Tracks which keys have been pressed.\n * Currently only used by fields to see if they should duplicate or delete on click.\n * (Shift + D + click = delete) (Shift + C + click = duplicate)\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/trackKeyDown',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tkeys: [],\n\n\t\tinitialize: function() {\n\t\t\tvar that = this;\n\t\t\t/*\n\t\t\t * Track keydowns and store the keys pressed.\n\t\t\t */\n\t\t\t\n\t\t\tjQuery( document ).on( 'keydown', function( e ) {\n\t\t\t\tthat.keyDown( e, that );\n\t\t\t} );\n\n\t\t\tjQuery( document ).on( 'keyup', function( e ) {\n\t\t\t\tthat.keyUp( e, that );\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Get the keys currently being pressed, if any\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:keydown', this.getKeyDown, this );\n\t\t},\n\n\t\tkeyDown: function( e, context ) {\n\t\t\t/*\n\t\t\t * Add our keycode to our keys array.\n\t\t\t */\n\t\t\tcontext.keys[ e.keyCode ] = e.keyCode;\n\t\t},\n\n\t\tkeyUp: function( e, context ) {\n\t\t\t/*\n\t\t\t * Remove our keycode from our keys array.\n\t\t\t */\n\t\t\tif ( -1 != context.keys.indexOf( e.keyCode ) ) {\n\t\t\t\tdelete context.keys[ e.keyCode ];\n\t\t\t}\n\t\t},\n\n\t\tgetKeyDown: function() {\n\t\t\treturn this.keys;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Initialize the perfectscroll jQuery plugin\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/perfectScroll',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tmovedPos: false,\n\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When we init the main view, init our perfectscroll\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'show:main', this.initPerfectScroll );\n\n\t\t\t/*\n\t\t\t * When our drawer opens and closes, change the position of our scroll rail.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.moveRail );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:closeDrawer', this.resetRail );\n\t\t},\n\n\t\tinitPerfectScroll: function( view ) {\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).parent().perfectScrollbar( {\n\t\t\t\t\tsuppressScrollX: true\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tjQuery( 'head' ).append( '<style id=\"ps-scrollbar-css\" type=\"text/css\"></style>' );\n\t\t},\n\n\t\tmoveRail: function() {\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tvar movedPos = jQuery( drawerEl ).outerWidth();\n\n\t\t\tjQuery( '#ps-scrollbar-css' ).text( '.ps-scrollbar-moved { right: ' + movedPos + 'px !important; } ' );\n\t\t\tjQuery( '#nf-main .ps-scrollbar-y-rail' ).addClass( 'ps-scrollbar-moved ' );\n\t\t\t\n\t\t},\n\n\t\tresetRail: function() {\n\t\t\tjQuery( '.ps-scrollbar-y-rail' ).removeClass( 'ps-scrollbar-moved ' );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model that represents our type settings groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingGroupModel',[ 'models/app/settingCollection' ], function( SettingCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tdisplay: false\n\t\t},\n\n\t\tinitialize: function( options ) {\n\t\t\tif ( false == this.get( 'settings' ) instanceof Backbone.Collection ) {\n\t\t\t\tthis.set( 'settings', new SettingCollection( this.get( 'settings' ) ) );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection of our type settings groups.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/settingGroupCollection',['models/app/settingGroupModel'], function( settingGroupModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: settingGroupModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Returns a new setting group collection.\n * Used to settings drawers for custom data models (i.e. not fields, actions, or advanced)\n * \n * @package Ninja Forms builder\n * @subpackage App - Edit Settings Drawer\n * @copyright (c) 2016 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/getNewSettingGroupCollection',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for a new setting group collection\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingGroupCollectionDefinition', this.getNewSettingGroupCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a new instance of the setting group collection.\n\t\t *\n\t\t * @since 3.0\n\t\t * @return backbone.collection\n\t\t */\n\t\tgetNewSettingGroupCollection: function() {\n\t\t\treturn SettingGroupCollection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.0.30\n */\ndefine( 'controllers/app/settingMedia',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n // When the media button is clicked, open the media manager.\n this.listenTo( nfRadio.channel( 'setting-type-media' ), 'click:extra', this.clickExtra );\n },\n\n clickExtra: function( e, settingModel, dataModel, settingView ) {\n var textEl = jQuery( e.target ).parent().find( '.setting' );\n\n if ( jQuery( e.target ).hasClass( 'open-media-manager' ) ) {\n // If the frame already exists, re-open it.\n if ( this.meta_image_frame ) {\n this.meta_image_frame.open();\n return;\n }\n\n // Sets up the media library frame\n this.meta_image_frame = wp.media.frames.meta_image_frame = wp.media({\n title: 'Select a file',\n button: { text: 'insert' }\n });\n\n var that = this;\n\n // Runs when an image is selected.\n this.meta_image_frame.on('select', function(){\n // Grabs the attachment selection and creates a JSON representation of the model.\n var media_attachment = that.meta_image_frame.state().get('selection').first().toJSON();\n textEl.val( media_attachment.url ).change();\n });\n\n // Opens the media library frame.\n this.meta_image_frame.open();\n }\n },\n });\n\n return controller;\n} );\n","/**\n * Model for our field type\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/typeModel',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\n\tvar model = Backbone.Model.extend( {\n\t\tinitialize: function() {\n\t\t\tif ( false === this.get( 'settingGroups' ) instanceof Backbone.Collection ) {\n\t\t\t\tthis.set( 'settingGroups', new SettingGroupCollection( this.get( 'settingGroups' ) ) );\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'init:typeModel', this );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field type models. \n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/typeCollection',['models/app/typeModel'], function( typeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: typeModel,\n\t\ttype: false,\n\n\t\tinitialize: function( models, options ) {\n\t\t\t_.each( options, function( option, key ) {\n\t\t\t\tthis[ key ] = option;\n\t\t\t}, this );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Model that represents our field type section on the add new field drawer.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/typeSectionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tclasses: ''\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our field models.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/fields/typeSectionCollection',['models/fields/typeSectionModel'], function( typeSectionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: typeSectionModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Creates and stores a collection of field types. This includes all of the settings shown when editing a field.\n *\n * 1) Create our settings sections config\n * 2) Loops over our preloaded data and adds that to our field type collection\n *\n * Also responds to requests for data about field types\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/types',[\n\t\t'models/app/typeCollection',\n\t\t'models/fields/typeSectionCollection'\n\t],\n\tfunction(\n\t\tTypeCollection,\n\t\tSectionCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Config for our settings sections\n\t\t\tthis.sections = new SectionCollection( fieldTypeSections );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'init:typeModel', this.registerSection );\n\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( fieldTypeData, { type: 'fields' } );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:type', this.getFieldType, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeCollection', this.getTypeCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSections', this.getTypeSections, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:savedFields', this.getSavedFields, this );\n\n\t\t\t// Listen to clicks on field types\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:fieldType', this.addField );\n\t\t},\n\n\t\tregisterSection: function( typeModel ) {\n\t\t\tif ( 'fields' != typeModel.collection.type || ! typeModel.get( 'section' ) ) return;\n\n\t\t\tthis.sections.get( typeModel.get( 'section' ) ).get( 'fieldTypes' ).push( typeModel.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetFieldType: function( id ) {\n \treturn this.collection.get( id );\n },\n\n /**\n * Return the entire field type collection\n *\n * @since 3.0\n * @param string \t\t\t\tid \t[description]\n * @return backbone.collection \tfield type collection\n */\n\t\tgetTypeCollection: function( id ) {\n \treturn this.collection;\n },\n\n /**\n * Add a field type to our fields sortable when the field type button is clicked.\n *\n * @since 3.0\n * @param Object e event\n * @return void\n */\n addField: function( e ) {\n\t\t\tvar type = jQuery( e.target ).data( 'id' );\n\n\t\t\tif( e.shiftKey ){\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n\t\t\t\treturn;\n\t\t\t}\n\n \tvar fieldModel = nfRadio.channel( 'fields' ).request( 'add', {\n\t\t\t\ttype: type,\n\t\t\t\tlabel: nfRadio.channel( 'fields' ).request( 'get:type', type ).get( 'nicename' )\n\t\t\t});\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Field',\n\t\t\t\tlabel: fieldModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', fieldModel, null, label, data );\n\n\t\t\t// Re-Draw the Field Collection\n\t\t\tnfRadio.channel( 'fields' ).request( 'redraw:collection' );\n },\n\n /**\n * Return our field type settings sections\n *\n * @since 3.0\n * @return backbone.collection field type settings sections\n */\n getTypeSections: function() {\n return this.sections;\n },\n\n /**\n * Return our saved fields\n *\n * @since 3.0\n * @return backbone.collection\n */\n getSavedFields: function() {\n \tthis.sections.get( 'saved' );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Handles the logic for our field type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldTypeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our field type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addField' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the dragging of our field staging area\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/stagingDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start and stop of our field staging dragging\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.stopDrag );\n\t\t},\n\n\t\t/**\n\t\t * When the user starts dragging the staging area, we have to:\n\t\t * set the overflow property of the drawer to visible !important. If we don't, the button goes underneath the main section.\n\t\t * set the overflow proerty of the main to visible !important. If we don't, the dragged element goes underneath the drawer.\n\t\t * replace our helper with the stacked \"x fields\" template.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t context jQuery UI Draggable\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-staged-fields-drag' );\n\t\t\tjQuery( ui.helper ).html( html( { num: stagedFields.models.length } ) );\n\t\t\tjQuery( ui.helper ).prop( 'id', 'nf-staged-fields-drag' );\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.7' );\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging the staging area, we have to set the overflow property to hidden !important\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t context jQuery UI Draggable\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles most things related to our staging area:\n * 1) Creates a collection\n * 2) Listens for requests to CRUD items from the collection\n * 3) Adds our staged fields to the fields sortable when the drawer is closed\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/staging',['models/fields/stagingCollection'], function( stagingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our staged fields collection\n\t\t\tthis.collection = new stagingCollection();\n\t\t\t// Respond to requests related to our staging area.\n\t\t nfRadio.channel( 'fields' ).reply( 'add:stagedField', this.addStagedField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'remove:stagedField', this.removeStagedField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:staging', this.getStagingCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:staging', this.sortStagedFields, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:staging', this.clearStagedFields, this );\n\t\t\t// Listen to our remove staged field click event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'click:removeStagedField', this.removeStagedField );\n\t\t\t// Listen to our event that fires just before a drawer is closed.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'before:closeDrawer', this.beforeCloseDrawer );\n\t\t},\n\n\t\tgetStagingCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\t/**\n\t\t * Add a field to our staging area\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string type Type of field we're adding\n\t\t * @return tmpID\n\t\t */\n\t\taddStagedField: function( type, silent ) {\n\t\t\tvar silent = silent || false;\n\t\t\t// Get our type model from the string.\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t// Our tmp ID is a string with the time appended to make it unique.\n\t\t\tvar tmpID = 'nf-staged-field-' + jQuery.now();\n\t\t\t// Object that will be added to our staging collection.\n\t\t\tvar data = {\n\t\t\t\tid: tmpID,\n\t\t\t\t// i.e. firstname, textbox, etc.\n\t\t\t\tslug: fieldType.get( 'type' ),\n\t\t\t\t// i.e. First Name, Textbox, etc.\n\t\t\t\tnicename: fieldType.get( 'nicename' ),\n\t\t\t\t// i.e. calendar, envelope, etc.\n\t\t\t\ticon: fieldType.get( 'icon' )\n\t\t\t}\n\t\t\t// \n\t\t\tvar model = this.collection.add( data );\n\n\t\t\tif( ! silent ) nfRadio.channel( 'fields').trigger( 'add:stagedField', model );\n\n\t\t\treturn tmpID;\n\t\t},\n\n\t\t/**\n\t\t * Remove a field from staging\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \t\t\te \tEvent\n\t\t * @param Backbone.model \tmodel \tstaged field model to remove\n\t\t * @return void\n\t\t */\n\t\tremoveStagedField: function( e, model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'remove:stagedField', model );\n\t\t},\n\n\t\t/**\n\t\t * Adds our staged fields to the main fields sortable before the drawer is closed.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tbeforeCloseDrawer: function() {\n\t\t\tif ( 0 != this.collection.models.length ) { // Make sure that we have models\n\t\t\t\t// Get our field collection.\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n\t\t\t\tvar fields = [];\n\t\t\t\t// Loop through our staging collection\n\t\t\t\t_.each( this.collection.models, function( model ) {\n\t\t\t\t\t// Get a tmp ID for our new field.\n\t\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\n\t\t\t\t\t// Create an object that can be added as a model.\n\t\t\t\t\tvar tmpField = { id: tmpID, label: model.get( 'nicename' ), type: model.get( 'slug' ) };\n\t\t\t\t\t// Add our new field.\n\t\t\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add', tmpField, false );\n\t\t\t\t\t// Add our field addition to our change log.\n\t\t\t\t\tvar label = {\n\t\t\t\t\t\tobject: 'Field',\n\t\t\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\t\t\tchange: 'Added',\n\t\t\t\t\t\tdashicon: 'plus-alt'\n\t\t\t\t\t};\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\tcollection: fieldCollection\n\t\t\t\t\t}\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\t\n\t\t\t\t} );\n\t\t\t\t// Trigger a reset on our field collection so that our view re-renders\n\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t// Empty the staging collection\n\t\t\t\tthis.collection.reset();\n\t\t\t}\n\t\t\t// Sort our fields.\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', null, null, false );\n\t\t},\n\n\t\t/**\n\t\t * Sort our staging area by the 'order' attribute.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tsortStagedFields: function() {\n\t\t\t// Get our staged fields sortable.\n\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t// Get the current order using jQuery sortable. Will be an array of IDs: [tmp-blah, tmp-blah]\n\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t// Loop through our models\n\t\t\t_.each( this.collection.models, function( field ) {\n\t\t\t\t// Search our order array for this field.\n\t\t\t\tvar search = field.get( 'id' );\n\t\t\t\tvar pos = order.indexOf( search );\n\t\t\t\t// Update our staged field model with the new order.\n\t\t\t\tfield.set( 'order', pos );\n\t\t\t} );\n\t\t\t// Sort our staging collection.\n\t\t\tthis.collection.sort();\n\t\t},\n\n\t\tclearStagedFields: function() {\n\t\t\tthis.collection.reset();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to our staged fields sortable.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/stagingSortable',['models/fields/stagingCollection'], function( stagingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our field type draggables\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\n\t\t\t// Listen to our sortable events\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'receive:stagedFields', this.receiveStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'over:stagedFields', this.overStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'out:stagedFields', this.outStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'start:stagedFields', this.startStagedFields );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stop:stagedFields', this.stopStagedFields );\n\t\t},\n\n\t\t/**\n\t\t * Change our dropped field type helper so that it matches the other items in our sortable.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI item\n\t\t * @return void\n\t\t */\n\t\treceiveStagedFields: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drop:fieldType', type );\t\t\t\t\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add an active class to our sortable when a field type item is dragged\n\t\t * \n\t\t * @since 3.0\n\t\t */\n\t\taddActiveClass: function() {\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\tjQuery( stagedFieldsEl ).addClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * Remove the active class from our sortable when the field type item is dropped.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tremoveActiveClass: function() {\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\tjQuery( stagedFieldsEl ).removeClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * When the field type item is dragged over our sortable, we change the helper to match the sortable items.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \te event\n\t\t * @param Object \tui jQuery UI Element\n\t\t * @return void\n\t\t */\n\t\toverStagedFields: function( e, ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t\tvar nicename = fieldType.get( 'nicename' );\n\t\t\t\tthis.currentHelper = ui.helper \n\t\t\t\tjQuery( ui.helper ).html( nicename + '<span class=\"dashicons dashicons-dismiss\"></span>' );\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-item-dock' ).css( { 'opacity': '0.8', 'width': '', 'height': '' } );\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * When a field type item is moved away from our sortable, we change the helper to its previous appearance\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toutStagedFields: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\t\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-item-dock' ).addClass( 'nf-field-type-button' );\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t},\n\n\t\t/**\n\t\t * When a user starts to drag a sortable item, we need to set a few properties on the item and the helper.\n\t\t * These keep the original item in place while dragging and changes the opacity of the helper.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartStagedFields: function( ui ) {\n\t\t\tjQuery( ui.item ).show();\n\t\t\tjQuery( ui.item ).css( { 'display': 'inline', 'opacity': '0.7' } );\n\t\t\tjQuery( ui.helper ).css( 'opacity', '0.5' );\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging a sortable item, remove our opacity setting and remove the helper item.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopStagedFields: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Filters our field type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/filterTypes',['models/fields/typeSectionCollection'], function( fieldTypeSectionCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'change:filter', this.filterFieldTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our field types in the add new field drawer\n\t\t * \n\t\t * Takes a search string and finds any field types that match either the name or alias.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string\t search \tstring being searched for\n\t\t * @param object \t e \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterFieldTypes: function( search, e ) {\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != jQuery.trim( search ) ) {\n \t\tvar filtered = [];\n \t\t/**\n \t\t * Call the function that actually filters our collection,\n \t\t * and then loop through our collection, adding each model to our filtered array.\n \t\t */\n \t\t_.each( this.filterCollection( search ), function( model ) {\n \t\t\tfiltered.push( model.get( 'id' ) );\n \t\t} );\n\n \t\t// Create a new Field Type Section collection with the filtered array.\n \t\tvar filteredSectionCollection = new fieldTypeSectionCollection( [\n\t\t\t\t{ \n\t\t\t\t\tid: 'filtered',\n\t\t\t\t\tnicename: 'Filtered Fields',\n\t\t\t\t\tfieldTypes: filtered\n\t\t\t\t}\n\t\t\t\t] );\n\n \t\t// Request that our field types filter be applied, passing the collection we created above.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:fieldTypes', filteredSectionCollection );\n \t\t// If we've pressed the 'enter' key, add the field to staging and clear the filter.\n \t\tif ( 'undefined' != typeof e && e.addObject ) {\n \t\t\tif ( 0 < filtered.length ) {\n \t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', filtered[0] );\n \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n \t\t\t}\n \t\t}\n \t} else {\n \t\t// Clear our filter if the search text is empty.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n \t}\n },\n\n /**\n * Search our field type collection for the search string.\n * \n * @since 3.0\n * @param string\t search \tstring being searched for\n * @return backbone.collection\n */\n filterCollection: function( search ) {\n \tsearch = search.toLowerCase();\n \t// Get our list of field types\n \tvar collection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n \t/*\n \t * Backbone collections have a 'filter' method that loops through every model,\n \t * waiting for you to return true or false. If you return true, the model is kept.\n \t * If you return false, it's removed from the filtered result.\n \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'type' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles all the actions/functions related to our main field sortable.\n * All of the actual logic for our sortable is held here; the view just calls it using nfRadio.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/sortable',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When our field type buttons are dragged, we need to add or remove the active (blue) class.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\n\t\t\t// When our field staging is dragged, we need to add or remove the active (blue) class.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.addActiveClass );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.removeActiveClass );\n\t\t\t\n\t\t\t/*\n\t\t\t * Handles all the events fired by our sortable:\n\t\t\t * receive - dropped from type button or staging\n\t\t\t * over - dragging within or over the sortable\n\t\t\t * out - leaving the sortable\n\t\t\t * stop - stopped sorting/dragging\n\t\t\t * start - started sorting/dragging\n\t\t\t * update - stopped sorting/dragging and order has changed\n\t\t\t */\n\t\t\tnfRadio.channel( 'app' ).reply( 'receive:fieldsSortable', this.receiveFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'over:fieldsSortable', this.overfieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'out:fieldsSortable', this.outFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'stop:fieldsSortable', this.stopFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'start:fieldsSortable', this.startFieldsSortable, this );\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:fieldsSortable', this.updateFieldsSortable, this );\n\t\t},\n\n\t\t/**\n\t\t * Add the active class to our sortable so that its border is blue.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\taddActiveClass: function() {\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-active' );\t\n\t\t},\n\n\t\t/**\n\t\t * Remove the active class from our sortable\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tremoveActiveClass: function() {\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-active' );\n\t\t},\n\n\t\t/**\n\t\t * Fires when we drop a field type button or staging onto our sortable\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\treceiveFieldsSortable: function( ui ) {\n\t\t\t/*\n\t\t\t * We have to do different things if we're dealing with a field type button or staging area.\n\t\t\t */ \n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type Button\n\t\t\t\t// Get our type string\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\n\t\t\t\t// Add a field (returns the tmp ID )\n\t\t\t\tvar tmpID = this.addField( type, false );\n\t\t\t\t/*\n\t\t\t\t * Update our helper id to the tmpID.\n\t\t\t\t * We do this so that when we sort, we have the proper ID.\n\t\t\t\t */ \n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\n\t\t\t\t// Remove the helper. Gets rid of a weird type artifact.\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t\t// Trigger a drop field type event.\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'drop:fieldType', type, tmpID );\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// Later, we want to reference 'this' context, so we define it here.\n\t\t\t\tvar that = this;\n\t\t\t\t// Make sure that our staged fields are sorted properly.\t\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t\t// Grab our staged fields.\n\t\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\t\t\t\t// Get our current field order.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\t\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Sortable isn't empty\n\t\t\t\t\t// If we're dealing with a sortable that isn't empty, get the order.\n\t\t\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t\t} else { // Sortable is empty\n\t\t\t\t\t// Sortable is empty, all we care about is our staged field draggable.\n\t\t\t\t\tvar order = ['nf-staged-fields-drag'];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Get the index of our droped element.\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\n\t\t\t\t// Loop through each staged fields model and insert a field.\n\t\t\t\tvar tmpIDs = [];\n\t\t\t\t_.each( stagedFields.models, function( field, index ) {\n\t\t\t\t\t// Add our field.\n\t\t\t\t\tvar tmpID = that.addField( field.get( 'slug' ) );\n\t\t\t\t\t// Add this newly created field to our order array.\n\t\t\t\t\torder.splice( insertedAt + index, 0, tmpID );\n\t\t\t\t} );\n\n\t\t\t\t// Remove our dropped element from our order array.\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\t\t\t\torder.splice( insertedAt, 1 );\n\t\t\t\t// Sort our fields\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', order );\n\t\t\t\t// Clear our staging\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'clear:staging' );\n\t\t\t\t// Remove our helper. Fixes a weird artifact.\n\t\t\t\tjQuery( ui.helper ).remove();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a field.\n\t\t * Builds the object necessary to add a field to the field model collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \ttype field type\n\t\t * @param boolean \tsilent add silently\n\t\t * @return string \ttmpID\n\t\t */\n\t\taddField: function( type, silent ) {\n\t\t\t// Default to false\n\t\t\tsilent = silent || false;\n\t\t\t// Get our field type model\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type ); \n\t\t\t// Get our tmp ID\n\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\n\t\t\t// Add our field\n\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add', { id: tmpID, label: fieldType.get( 'nicename' ), type: type }, silent );\n\t\t\t// Add our field addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: 'Field',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\n\t\t\treturn tmpID;\n\t\t},\n\n\t\t/**\n\t\t * When the user drags a field type or staging over our sortable, we need to modify the helper.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toverfieldsSortable: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\n\t\t\t\t// String type\n\t\t\t\tvar type = jQuery( ui.helper ).data( 'id' );\n\t\t\t\t// Get our field type model.\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\t\t\t\t// Get our field type nicename.\n\t\t\t\tvar label = fieldType.get( 'nicename' );\n\t\t\t\t// Get our sortable element.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\t// Get our fieldwidth.\n\t\t\t\tvar fieldWidth = jQuery( sortableEl ).width();\n\t\t\t\t// Set our currentHelper to an object var so that we can access it later.\n\t\t\t\tthis.currentHelper = ui.helper;\n\t\t\t\t// Update our helper label.\n\t\t\t\tjQuery( ui.helper ).html( label );\n\t\t\t\t// Remove the field type draggable classes and add sortable classes.\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-field-wrap' ).css( { 'width': fieldWidth, 'height': '50px' } );\t\t\t\t\t\t\n\t\t\t\t// Add our hover class if our sortable has been initialized.\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// Get our sortable, and if it's initialized add our hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When the user moves a draggable outside of the sortable, we need to change the helper.\n\t\t * This returns the item to its pre-over state.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\toutFieldsSortable: function( ui ) {\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\n\t\t\t\t/*\n\t\t\t\t * Get our helper clone.\n\t\t\t\t * This will let us access the previous label and classes of our helper.\n\t\t\t\t */ \n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\n\t\t\t\t// Set our helper label, remove our sortable class, and add the type class back to the type draggable.\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-field-wrap' ).addClass( 'nf-field-type-button' ).css( { 'width': '', 'height': '' } );\n\t\t\t\t// Get our sortable and if it has been intialized, remove the droppable hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\n\t\t\t\t// If we've initialized our sortable, remove the droppable hover class.\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging in the sortable:\n\t\t * remove our opacity setting\n\t\t * remove our ui helper\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopFieldsSortable: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:stop', ui );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging in the sortable:\n\t\t * add an opacity setting of 0.5\n\t\t * show our item (jQuery hides the original item by default)\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartFieldsSortable: function( ui ) {\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \n\t\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\n\t\t\t}\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:start', ui );\n\t\t},\n\n\t\t/**\n\t\t * Sort our fields when we change the order.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tupdateFieldsSortable: function( ui, sortable ) {\n\t\t\t\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\n\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \n\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\tvar dragFieldID = jQuery( ui.item ).prop( 'id' ).replace( 'field-', '' );\n\t\t\t\tvar dragModel = fieldCollection.get( dragFieldID );\n\n\t\t\t\t// Add our change event to the change tracker.\n\t\t\t\tvar data = { fields: [] };\n\t\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\t\tvar oldPos = field._previousAttributes.order;\n\t\t\t\t\tvar newPos = field.get( 'order' );\n\t\t\t\t\t\n\t\t\t\t\tdata.fields.push( {\n\t\t\t\t\t\tmodel: field,\n\t\t\t\t\t\tattr: 'order',\n\t\t\t\t\t\tbefore: oldPos,\n\t\t\t\t\t\tafter: newPos\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t\tvar label = {\n\t\t\t\t\tobject: 'Field',\n\t\t\t\t\tlabel: dragModel.get( 'label' ),\n\t\t\t\t\tchange: 'Re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\n\t\t\t\t\tdashicon: 'sort'\n\t\t\t\t};\n\n\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortFields', dragModel, null, label, data );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles interactions with our field collection.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/data',['models/fields/fieldCollection', 'models/fields/fieldModel'], function( fieldCollection, fieldModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tadding: false,\n\t\tremoving: false,\n\t\t\n\t\tinitialize: function() {\n\t\t\t// Load our field collection from our localized form data\n\t\t\tthis.collection = new fieldCollection( preloadedFormData.fields );\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a field is removed so that we can add it to our 'deleted_fields' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about fields and to update/change/delete fields from our collection.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:collection', this.getFieldCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:field', this.getField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'redraw:collection', this.redrawFieldCollection, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:tmpID', this.getTmpFieldID, this );\n\n\t\t\tnfRadio.channel( 'fields' ).reply( 'add', this.addField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'delete', this.deleteField, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:fields', this.sortFields, this );\n\n\t\t\t/*\n\t\t\t * Respond to requests to set our 'adding' and 'removing' state. This state is used to track whether or not\n\t\t\t * we should run animations in our fields collection.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:adding', this.getAdding, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:adding', this.setAdding, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:removing', this.getRemoving, this );\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:removing', this.setRemoving, this );\n\t\t},\n\n\t\tgetFieldCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tredrawFieldCollection: function() {\n\t\t\tthis.collection.trigger( 'reset', this.collection );\n\t\t},\n\n\t\tgetField: function( id ) {\n\t\t\tif ( this.collection.findWhere( { key: id } ) ) {\n\t\t\t\t/*\n\t\t\t\t * First we check to see if a key matches what we were sent.\n\t\t\t\t */\t\t\t\t\n\t\t\t\treturn this.collection.findWhere( { key: id } );\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * If it doesn't, we try to return an ID that matches.\n\t\t\t\t */\n\t\t\t\treturn this.collection.get( id );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Add a field to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \t\t\tfield data to insert\n\t\t * @param bool \t\tsilent \t\t\tprevent events from firing as a result of adding\n\t\t * @param bool \trenderTrigger\tshould this cause the view to re-render?\n\t\t * @param string \taction\t\t\taction context - are we performing a higher level action? i.e. duplicate\n\t\t */\n\t\taddField: function( data, silent, renderTrigger, action ) {\n\n\t\t\t/*\n\t\t\t * Set our fields 'adding' value to true. This enables our add field animation.\n\t\t\t */\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', true );\n\n\t\t\tsilent = silent || false;\n\t\t\taction = action || '';\n\t\t\trenderTrigger = ( 'undefined' == typeof renderTrigger ) ? true : renderTrigger;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tif ( 'undefined' == typeof ( data.id ) ) {\n\t\t\t\t\tdata.id = this.getTmpFieldID();\n\t\t\t\t}\n\t\t\t\tvar model = new fieldModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\t// console.log( model );\n\n\t\t\t/*\n\t\t\t * TODO: Add an nfRadio message filter for the model variable.\n\t\t\t * Currently, we manually replace for saved fields; this should be moved to a separate controller.\n\t\t\t * \n\t\t\t * If we're adding a saved field, make sure that we set the type to the parentType.\n\t\t\t */\n\n\t\t\tif ( jQuery.isNumeric( model.get( 'type' ) ) ) {\n\t\t\t\tvar savedType = nfRadio.channel( 'fields' ).request( 'get:type', model.get( 'type' ) );\n\t\t\t\tmodel.set( 'type', savedType.get( 'parentType' ) );\n\t\t\t}\n\n\t\t\tvar newModel = this.collection.add( model, { silent: silent } );\n\t\t\t\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'add:field', model );\n\t\t\tif ( renderTrigger ) {\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'render:newField', newModel, action );\n\t\t\t}\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'after:addField', model );\n\t\t\t\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Update a field setting by ID\n\t\t * \n\t\t * @since 3.0\n\t\t * @param int \t\tid field id\n\t\t * @param string \tname setting name\n\t\t * @param mixed \tvalue setting value\n\t\t * @return void\n\t\t */\n\t\tupdateFieldSetting: function( id, name, value ) {\n\t\t\tvar fieldModel = this.collection.get( id );\n\t\t\tfieldModel.set( name, value );\n\t\t},\n\n\t\t/**\n\t\t * Get our fields sortable EL\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Array \torder optional order array like: [field-1, field-4, field-2]\n\t\t * @return void\n\t\t */\n\t\tsortFields: function( order, ui, updateDB ) {\n\t\t\tif ( null == updateDB ) {\n\t\t\t\tupdateDB = true;\n\t\t\t}\n\t\t\t// Get our sortable element\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\n\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Make sure that sortable is enabled\n\t\t\t\t// JS ternerary for setting our order\n\t\t\t\tvar order = order || jQuery( sortableEl ).sortable( 'toArray' );\n\n\t\t\t\t// Loop through all of our fields and update their order value\n\t\t\t\t_.each( this.collection.models, function( field ) {\n\t\t\t\t\t// Get our current position.\n\t\t\t\t\tvar oldPos = field.get( 'order' );\n\t\t\t\t\tvar id = field.get( 'id' );\n\t\t\t\t\tif ( jQuery.isNumeric( id ) ) {\n\t\t\t\t\t\tvar search = 'field-' + id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar search = id;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Get the index of our field inside our order array\n\t\t\t\t\tvar newPos = order.indexOf( search ) + 1;\n\t\t\t\t\tfield.set( 'order', newPos );\n\t\t\t\t} );\n\t\t\t\tthis.collection.sort();\n\n\t\t\t\tif ( updateDB ) {\n\t\t\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\t\t\t// Update our preview\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Delete a field from our collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tfield model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteField: function( model ) {\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'delete:field', model );\n\t\t\tthis.removing = true;\n\t\t\tthis.collection.remove( model );\n\t\t\t\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\t\t/**\n\t\t * Return a new tmp id for our fields.\n\t\t * Gets the field collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpFieldID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t},\n\n\t\tgetAdding: function() {\n\t\t\treturn this.adding;\n\t\t},\n\n\t\tsetAdding: function( val ) {\n\t\t\tthis.adding = val;\n\t\t},\n\n\t\tgetRemoving: function() {\n\t\t\treturn this.removing;\n\t\t},\n\n\t\tsetRemoving: function( val ) {\n\t\t\tthis.removing = val;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our repeater option.\n * \n * @package Ninja App builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/optionRepeaterModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\terrors: {},\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// When we add errors to the option row, run a function.\n\t\t\tthis.on( 'change:errors', this.changeErrors, this );\n\t\t},\n\n\t\t/**\n\t\t * When we change the errors on our model, check to see if we should add or remove \n\t\t * the error from the setting that this option is a part of.\n\t\t *\n\t\t * Adding an error to the setting model simply disables the drawer and other\n\t\t * navigation. As long as we have one option with an error, it should be set to true.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeErrors: function( model ) {\n\t\t\t/*\n\t\t\t * The errors attribute will be an object, so if we don't have any keys, it's empty.\n\t\t\t * If we have an empty object, check to see if we can remove the error from our setting model.\n\t\t\t */\n\n\t\t\tif ( 0 == _.size( model.get( 'errors' ) ) ) {\n\t\t\t\t/*\n\t\t\t\t * Loop through our collection to see if we have any other errors.\n\t\t\t\t */\n\t\t\t\tvar errorsFound = false;\n\t\t\t\t_.each( model.collection.models, function( opt ) {\n\t\t\t\t\tif ( 0 != _.size( opt.get( 'errors' ) ) ) {\n\t\t\t\t\t\terrorsFound = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( ! errorsFound ) {\n\t\t\t\t\tmodel.collection.settingModel.set( 'error', false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * We have errors, so make sure that the setting model has an error set.\n\t\t\t\t */\n\t\t\t\tmodel.collection.settingModel.set( 'error', true );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Model that represents our list options.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/app/optionRepeaterCollection',['models/app/optionRepeaterModel'], function( listOptionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: listOptionModel,\n\t\tcomparator: 'order',\n\n\t\tinitialize: function( models, options ) {\n\t\t\t// Listen to the 'sort' event\n\t\t\tthis.on( 'sort', this.changeCollection, this );\n\t\t\t// Listen to the 'add' event\n\t\t\tthis.on( 'add', this.addOption, this );\n\t\t\tthis.settingModel = options.settingModel;\n\t\t},\n\n\t\tchangeCollection: function() {\n\t\t\t// Trigger a 'sort:options' event so that our field model can update\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:options', this );\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'sort:options', this );\n\t\t},\n\n\t\taddOption: function( model, collection ) {\n\t\t\tmodel.set( 'settingModel', this.settingModel );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","define( 'views/app/drawer/optionRepeaterError',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'nf-error',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-error',\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\trenderErrors: function() {\n\t\t\t\t if ( 'undefined' != typeof that.errors ) {\n \t\t\t\t\treturn that.errors[ Object.keys( errors )[0] ];\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/optionRepeaterOption',['views/app/drawer/optionRepeaterError'], function( ErrorView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\tclassName: 'nf-table-row',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-default-row',\n\t\tid: function() {\n\t\t\treturn this.model.cid;\n\t\t},\n\n\t\tregions: {\n\t\t\terror: '.nf-option-error'\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.settingModel = data.settingModel;\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tthis.collection = data.collection;\n\t\t\tthis.columns = data.columns;\n\t\t\tthis.parentView = data.parentView;\n\t\t\tthis.model.on( 'change:errors', this.renderErrors, this );\n\n\t\t\t// Removed because the re-render was breaking tag insertion for merge tags.\n\t\t\t// this.model.on( 'change', this.render, this );\n\n\t\t\tif ( 'undefined' != typeof this.settingModel.get( 'tmpl_row' ) ) {\n\t\t\t\tthis.template = '#' + this.settingModel.get( 'tmpl_row' );\n\t\t\t}\n\n\t\t\tthis.hasErrors = false;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\t\n\t\t\tthis.model.off( 'change', this.render );\n\t\t\tthis.model.off( 'change:errors', this.renderErrors );\n\t\t},\n\n\t\tonBeforeRender: function() {\n\t\t\t/*\n\t\t\t * We want to escape any HTML being output for our label.\n\t\t\t */\n\t\t\tif ( this.model.get( 'label' ) ) {\n\t\t\t\tvar label = this.model.get( 'label' );\n\t\t\t\tthis.model.set( 'label', _.escape( label ), { silent: true } );\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.settingModel.get( 'name' ) + '-option' ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\t/*\n\t\t\t * We want to unescape any HTML being output for our label.\n\t\t\t */\n\t\t\tif ( this.model.get( 'label' ) ) {\n\t\t\t\tvar label = this.model.get( 'label' );\n\t\t\t\tthis.model.set( 'label', _.unescape( label ), { silent: true } );\n\t\t\t}\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( this.model.get( 'new' ) ) {\n\t\t\t\tjQuery( this.el ).find( 'input:first' ).focus();\n\t\t\t\tthis.model.set( 'new', false );\n\t\t\t}\n\t\t},\n\n\t\tevents: {\n\t\t\t'change .setting': 'changeOption',\n\t\t\t'click .nf-delete': 'deleteOption',\n\t\t\t'keyup': 'keyupOption'\n\t\t},\n\n\t\tchangeOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'change:option', e, this.model, this.dataModel, this.settingModel, this );\n\t\t},\n\n\t\tdeleteOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:deleteOption', this.model, this.collection, this.dataModel, this );\n\t\t},\n\n\t\tkeyupOption: function( e ) {\n\t\t\tthis.maybeAddOption( e );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n\t\t},\n\n\t\tmaybeAddOption: function( e ) {\n\t\t\tif ( 13 == e.keyCode ) {\n\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel, this );\n\t\t\t\tjQuery( this.parentView.children.findByIndex(this.parentView.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n\t\t\t}\n\t\t},\n\n\t\trenderErrors: function() {\n\t\t\t\n\t\t\t// if ( jQuery.isEmptyObject( this.model.get( 'errors' ) ) ) {\n\t\t\t// \treturn false;\n\t\t\t// }\n\n\t\t\t/*\n\t\t\t * We don't want to redraw the entire row, which would remove focus from the eq textarea,\n\t\t\t * so we add and remove error classes manually.\n\t\t\t */\n\t\t\tif ( 0 == Object.keys( this.model.get( 'errors' ) ) ) {\n if ( this.hasErrors ) {\n\t\t\t\t this.error.empty();\n\t\t\t\t jQuery( this.el ).removeClass( 'nf-error' );\n }\n\t\t\t} else {\n\t\t\t\tthis.hasErrors = true;\n\t\t\t\tthis.error.show( new ErrorView( { model: this.model } ) );\n\t\t\t\tjQuery( this.el ).addClass( 'nf-error' );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t\t\treturn {\n\t\t\t\tgetColumns: function() {\n\t\t\t\t\treturn that.columns;\n\t\t\t\t},\n\t\t\t\trenderFieldSelect: function( dataID, value ){\n\t\t\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tvar _return = '<label class=\"nf-select\"><select class=\"setting\" data-id=\"' + dataID + '\">';\n\t\t\t\t\tfields.each( function( field ){\n\t\t\t\t\t\tvar selected = ( value == field.get( 'key' ) ) ? ' selected' : '';\n\t\t\t\t\t\t_return += '<option value=\"' + field.get( 'key' ) + '\"' + selected + '>' + field.get( 'label' ) + '</option>';\n\t\t\t\t\t});\n\t\t\t\t\t_return += '</select><div></div></label>';\n\t\t\t\t\treturn _return;\n\t\t\t\t},\n\t\t\t\trenderOptions: function( column, value ) {\n\n\t\t\t\t\tif( 'undefined' == typeof that.options.columns[ column ] ) return;\n\n\t\t\t\t\tvar html = '';\n\t\t\t\t\t_.each( that.options.columns[ column ].options, function( option ){\n\t\t\t\t\t\tvar selected = ( value == option.value ) ? ' selected' : '';\n\t\t\t\t\t\thtml += '<option value=\"' + option.value + '\"' + selected + '>' + option.label + '</option>';\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\treturn html;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n\n","define( 'views/app/drawer/optionRepeaterEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'tr',\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-empty'\n\t});\n\n\treturn view;\n} );\n","define( 'views/app/drawer/optionRepeaterComposite',['views/app/drawer/optionRepeaterOption', 'views/app/drawer/optionRepeaterEmpty', 'models/app/optionRepeaterCollection'], function( listOptionView, listEmptyView, listOptionCollection ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-wrap',\n\t\tchildView: listOptionView,\n\t\temptyView: listEmptyView,\n\t\treorderOnSort: false,\n\n\t\tinitialize: function( data ) {\n\n\t\t\t/*\n\t\t\t * Our options are stored in our database as objects, not collections.\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n\t\t\t */ \n\t\t\tvar optionCollection = data.dataModel.get( this.model.get( 'name' ) );\n\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: this.model } );\n\t\t\t\toptionCollection.add( data.dataModel.get( this.model.get( 'name' ) ) );\n\t\t\t\tdata.dataModel.set( this.model.get( 'name' ), optionCollection, { silent: true } );\n\t\t\t}\n\n\t\t\tthis.collection = optionCollection;\n\t\t\tthis.dataModel = data.dataModel;\n\t\t\tthis.childViewOptions = { parentView: this, settingModel: this.model, collection: this.collection, dataModel: data.dataModel, columns: this.model.get( 'columns' ) };\n\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor ( var name in deps ) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tvar deps = this.model.get( 'deps' );\n\t\t\tif ( deps ) {\n\t\t\t\tfor (var name in deps) {\n\t\t\t\t if ( deps.hasOwnProperty( name ) ) {\n\t\t\t\t \tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t}\n\t\t},\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\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\t\tvar that = this;\n\t\t\tjQuery( this.el ).find( '.nf-list-options-tbody' ).sortable( {\n\t\t\t\thandle: '.handle',\n\t\t\t\thelper: 'clone',\n\t\t\t\tplaceholder: 'nf-list-options-sortable-placeholder',\n\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\topacity: 0.95,\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'start:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'stop:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'update:optionSortable', ui, this, that );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\n\t\t\n\t\t},\n\n\t\tonAttach: function() {\n \n\t\t\tvar importLink = jQuery( this.el ).find( '.nf-open-import-tooltip' );\n\t\t\tvar jBox = jQuery( importLink ).jBox( 'Tooltip', {\n title: '<h3>Please enter your options below:</h3>',\n content: jQuery( this.el ).find( '.nf-import-options' ),\n trigger: 'click',\n closeOnClick: 'body',\n closeButton: 'box',\n offset: { x: 20, y: 0 },\n addClass: 'import-options',\n\n onOpen: function() {\n \tvar that = this;\n \tsetTimeout( function() { jQuery( that.content ).find( 'textarea' ).focus(); }, 200 );\n }\n } );\n\n\t\t\tjQuery( this.el ).find( '.nf-import' ).on( 'click', { view: this, jBox: jBox }, this.clickImport );\n\n\t\t\t/*\n\t\t\t * Send out a radio message.\n\t\t\t */\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderHeaders: function() {\n\t \t\t\tvar columns = '<div> </div>';\n\t \t\t\t_.each( this.columns, function( col ) {\n\t \t\t\t\tcolumns += '<div>' + col.header + '</div>';\n\t \t\t\t} );\n\t \t\t\tcolumns += '<div> </div>';\n\t\t\t\t\treturn columns;\n\t\t\t\t},\n\n\t \t\trenderSetting: function() {\n\t \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-edit-setting-' + this.type );\n\t\t\t\t\treturn setting( this );\n\t\t\t\t},\n\n\t\t\t\trenderClasses: function() {\n\t\t\t\t\tvar classes = '';\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\n\t\t\t\t\t\tclasses += this.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclasses += ' one-half';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\tclasses += ' nf-error';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes;\n\t\t\t\t},\n\n\t\t\t\trenderVisible: function() {\n\t\t\t\t\tif ( this.deps ) {\n\t\t\t\t\t\tfor (var name in this.deps) {\n\t\t\t\t\t\t if ( this.deps.hasOwnProperty( name ) ) {\n\t\t\t\t\t\t if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\n\t\t\t\t\t\t \treturn 'style=\"display:none;\"';\n\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t \t\t\treturn '';\n\t \t\t},\n\n\t\t\t\trenderError: function() {\n\t\t\t\t\tif ( this.error ) {\n\t\t\t\t\t\treturn this.error;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\n\t\t\t\trenderFieldsetClasses: function() {\n\t\t\t\t\treturn that.model.get( 'name' );\n\t\t\t\t},\n\n\t\t\t\tcurrencySymbol: function() {\n\t\t\t\t\treturn nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' ) || nfi18n.currency_symbol;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tjQuery( collectionView.el ).find( '.nf-list-options-tbody' ).append( childView.el );\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\n\t\t},\n\n\t\tevents: {\n\t\t\t'click .nf-add-new': 'clickAddOption',\n\t\t\t'click .extra': 'clickExtra'\n\t\t},\n\n\t\tclickAddOption: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel );\n\t\t\tjQuery( this.children.findByIndex(this.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:extra', e, this.collection, this.dataModel );\n\t\t\tnfRadio.channel( 'option-repeater-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.collection, this.dataModel );\n\t\t},\n\n\t\tclickImport: function( e ) {\n\t\t\tvar textarea = jQuery( e.data.jBox.content ).find( 'textarea' );\n\t\t\tvar value = textarea.val().trimLeft().trimRight();\n\t\t\t/*\n\t\t\t * Return early if we have no strings.\n\t\t\t */\n\t\t\tif ( 0 == value.length ) {\n\t\t\t\te.data.jBox.close();\n\t\t\t\treturn false;\n\t\t\t}\t\t\t\n\t\t\t/*\n\t\t\t * Split our value based on new lines.\n\t\t\t */\n\n\t\t\tvar lines = value.split(/\\n/);\n\t\t\tif ( _.isArray( lines ) ) {\n\t\t\t\t/*\n\t\t\t\t * Loop over \n\t\t\t\t */\n\t\t\t\t_.each( lines, function( line ) {\n\t\t\t\t\tvar row = line.split( ',' );\n\t\t\t\t\tvar label = row[0];\n\t\t\t\t\tvar value = row[1] || jQuery.slugify( label, { separator: '-' } );\n\t\t\t\t\tvar calc = row[2] || '';\n\n\t\t\t\t\tlabel = label.trimLeft().trimRight();\n\t\t\t\t\tvalue = value.trimLeft().trimRight();\n\t\t\t\t\tcalc = calc.trimLeft().trimRight();\n\t\t\t\t\t/*\n\t\t\t\t\t * Add our row to the collection\n\t\t\t\t\t */\n\t\t\t\t\tvar model = e.data.view.collection.add( { label: row[0], value: value, calc: calc } );\n\t\t\t\t\t// Add our field addition to our change log.\n\t\t\t\t\tvar label = {\n\t\t\t\t\t\tobject: 'field',\n\t\t\t\t\t\tlabel: row[0],\n\t\t\t\t\t\tchange: 'Option Added',\n\t\t\t\t\t\tdashicon: 'plus-alt'\n\t\t\t\t\t};\n\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\n\t\t\t\t\tnfRadio.channel( 'option-repeater-' + e.data.view.model.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\n\t\t\t\t}, this );\n\t\t\t\t/*\n\t\t\t\t * Set our state to unclean so that the user can publish.\n\t\t\t\t */\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * TODO: Error Handling Here\n\t\t\t\t */\n\t\t\t}\n\t\t\ttextarea.val( '' );\n\t\t\te.data.jBox.close();\n\t\t},\n\t} );\n\n\treturn view;\n} );\n","/**\n * Handles tasks associated with our option-repeater.\n * \n * Return our repeater child view.\n *\n * Also listens for changes to the options settings.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/app/optionRepeater',['models/app/optionRepeaterModel', 'models/app/optionRepeaterCollection', 'views/app/drawer/optionRepeaterComposite'], function( listOptionModel, listOptionCollection, listCompositeView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for the childView for list type fields.\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'get:settingChildView', this.getSettingChildView, this );\n\t\t\t\n\t\t\t// Listen for changes to our list options.\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'change:option', this.changeOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:addOption', this.addOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:deleteOption', this.deleteOption );\n\n\t\t\t// Respond to requests related to our list options sortable.\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'update:optionSortable', this.updateOptionSortable, this );\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'stop:optionSortable', this.stopOptionSortable, this );\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'start:optionSortable', this.startOptionSortable, this );\n\t\t\n\t\t\t/**\n\t\t\t * When we init our setting model, we need to convert our array/objects into collections/models\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'init:dataModel', this.convertSettings );\n\t\t},\n\n\t\t/**\n\t\t * Update an option value in our model.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t\t\te event\n\t\t * @param backbone.model \tmodel option model\n\t\t * @param backbone.model \tdataModel\n\t\t * @return void\n\t\t */\n\t\tchangeOption: function( e, model, dataModel, settingModel, optionView ) {\n\t\t\tvar name = jQuery( e.target ).data( 'id' );\n\t\t\tif ( 'selected' == name ) {\n\t\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\n\t\t\t\t\tvar value = 1;\n\t\t\t\t} else {\n\t\t\t\t\tvar value = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t}\n\t\t\t\n\t\t\tvar before = model.get( name );\n\t\t\t\n\t\t\tmodel.set( name, value );\n\t\t\t// Trigger an update on our dataModel\n\t\t\tthis.triggerDataModel( model, dataModel );\n\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + model.get( 'label' ) + ' ' + name + ' changed from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', model, changes, label );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-option-' + name ).trigger( 'update:option', e, model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-' + settingModel.get( 'name' ) ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t},\n\n\t\t/**\n\t\t * Add an option to our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\taddOption: function( collection, dataModel ) {\n\t\t\tvar modelData = {\n\t\t\t\torder: collection.length,\n\t\t\t\tnew: true,\n\t\t\t\toptions: {}\n\t\t\t};\n\t\t\t_.each( collection.settingModel.get( 'columns' ), function( col, key ) {\n\t\t\t\tmodelData[ key ] = col.default;\n\n\t\t\t\tif( 'undefined' != typeof col.options ){\n\t\t\t\t\tmodelData.options[ key ] = col.options;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvar model = new listOptionModel( modelData );\n\t\t\tcollection.add( model );\n\n\t\t\t// Add our field addition to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\n\t\t\tthis.triggerDataModel( model, dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Delete an option from our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \t\tmodel list option model\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\tdeleteOption: function( model, collection, dataModel ) {\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\n\n\t\t\t// Add our field deletion to our change log.\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + newModel.get( 'label' ) + ' Removed',\n\t\t\t\tdashicon: 'dismiss'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: collection\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeListOption', newModel, null, label, data );\n\t\t\t\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\n\t\t\tvar results = changeCollection.where( { model: model } );\n\n\t\t\t_.each( results, function( changeModel ) {\n\t\t\t\tif ( 'object' == typeof changeModel.get( 'data' ) ) {\n\t\t\t\t\t_.each( changeModel.get( 'data' ), function( dataModel ) {\n\t\t\t\t\t\tif ( dataModel.model == dataModel ) {\n\t\t\t\t\t\t\tdataModel.model = newModel;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tchangeModel.set( 'model', newModel );\n\t\t\t\tchangeModel.set( 'disabled', true );\n\t\t\t} );\n\n\t\t\tcollection.remove( model );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'remove:option', model );\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'remove:option', model );\n\t\t\tthis.triggerDataModel( model, dataModel );\n\t\t},\n\n\t\t/**\n\t\t * Creates an arbitrary value on our collection, then clones and updates that collection.\n\t\t * This forces a change event to be fired on the dataModel where the list option collection data is stored.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\ttriggerDataModel: function( model, dataModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\t\n\t\t},\n\n\t\t/**\n\t\t * Return our list composite view to the setting collection view.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \tsettings model\n\t\t * @return void\n\t\t */\n\t\tgetSettingChildView: function( model ) {\n\t\t\treturn listCompositeView;\n\t\t},\n\n\t\t/**\n\t\t * When we sort our list options, change the order in our option model and trigger a change.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object\t \t\tsortable \tjQuery UI element\n\t\t * @param backbone.view \tsetting \tSetting view\n\t\t * @return void\n\t\t */\n\t\tupdateOptionSortable: function( ui, sortable, setting ) {\n\t\t\tvar newOrder = jQuery( sortable ).sortable( 'toArray' );\n\t\t\tvar dragModel = setting.collection.get( { cid: jQuery( ui.item ).prop( 'id' ) } );\n\t\t\tvar data = {\n\t\t\t\tcollection: setting.collection,\n\t\t\t\tobjModels: []\n\t\t\t};\n\n\t\t\t_.each( newOrder, function( cid, index ) {\n\t\t\t\tvar optionModel = setting.collection.get( { cid: cid } );\n\t\t\t\tvar oldPos = optionModel.get( 'order' );\n\t\t\t\toptionModel.set( 'order', index );\n\t\t\t\tvar newPos = index;\n\n\t\t\t\tdata.objModels.push( {\n\t\t\t\t\tmodel: optionModel,\n\t\t\t\t\tattr: 'order',\n\t\t\t\t\tbefore: oldPos,\n\t\t\t\t\tafter: newPos\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t\n\t\t\tsetting.collection.sort( { silent: true } );\n\t\t\t\n\t\t\tvar label = {\n\t\t\t\tobject: setting.dataModel.get( 'objectType' ),\n\t\t\t\tlabel: setting.dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + dragModel.get( 'label' ) + ' re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\n\t\t\t\tdashicon: 'sort'\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortListOptions', dragModel, null, label, data );\n\t\t\tthis.triggerDataModel( dragModel, setting.dataModel );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:option', dragModel, setting );\n\t\t\tnfRadio.channel( 'option-repeater-' + setting.model.get( 'name' ) ).trigger( 'sort:option', dragModel, setting );\n\t\t},\n\n\t\t/**\n\t\t * When we stop sorting our list options, reset our item opacity.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstopOptionSortable: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t},\n\n\t\t/**\n\t\t * When we start sorting our list options, remove containing divs and set our item opacity to 0.5\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Objects ui jQuery UI element\n\t\t * @return void\n\t\t */\n\t\tstartOptionSortable: function( ui ) {\n\t\t\tjQuery( ui.placeholder ).find( 'div' ).remove();\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\n\t\t},\n\n\t\t/**\n\t\t * Convert settings from an array/object to a collection/model\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Backbone.Model dataModel\n\t\t * @param Backbone.Model settingModel\n\t\t * @return void\n\t\t */\n\t\tconvertSettings: function( dataModel, settingModel ) {\n\t\t\t/*\n\t\t\t * Our options are stored in our database as objects, not collections.\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n\t\t\t */ \n\t\t\tvar optionCollection = dataModel.get( settingModel.get( 'name' ) );\n\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: settingModel } );\n\t\t\t\toptionCollection.add( dataModel.get( settingModel.get( 'name' ) ) );\n\t\t\t\tdataModel.set( settingModel.get( 'name' ), optionCollection, { silent: true } );\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a field currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n _.each( fieldCollection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( fieldSettings, { objectType: 'fields' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t\t\n\t\t\t// Responds to requests for our collection.\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingCollection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldCreditCard',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.dropCreditCardField );\n },\n\n dropCreditCardField: function( fieldModel ) {\n\n if( 'creditcard' == fieldModel.get( 'type' ) ) {\n\n var order = fieldModel.get( 'order' );\n\n nfRadio.channel( 'fields' ).request( 'delete', fieldModel );\n\n _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\n\n var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n var newField = {\n id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n type: type,\n label: fieldType.get( 'nicename' ),\n order: order\n };\n\n nfRadio.channel( 'fields' ).request( 'add', newField );\n });\n }\n\n },\n\n stageCreditCardField: function( model ) {\n\n if( 'creditcard' == model.get( 'slug' ) ) {\n\n nfRadio.channel( 'fields' ).request( 'remove:stagedField', '', model );\n\n _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\n nfRadio.channel('fields').request('add:stagedField', type );\n });\n }\n }\n\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel to add the individual List Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldList',[ 'models/app/optionRepeaterCollection' ], function( ListOptionCollection ) {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'option-repeater-option-label' ), 'update:option', this.updateOptionLabel );\n this.listenTo( nfRadio.channel( 'option-repeater-option-value' ), 'update:option', this.updateOptionValue );\n \n /*\n * When we init our model, convert our options from an array of objects to a collection of models.\n */\n this.listenTo( nfRadio.channel( 'fields-list' ), 'init:fieldModel', this.convertOptions );\n },\n\n updateOptionLabel: function( e, model, dataModel, settingModel, optionView ) {\n\n if( 'list' != _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } ).parentType ) return;\n\n if( model.get( 'manual_value' ) ) return;\n\n value = jQuery.slugify( model.get( 'label' ), { separator: '-' } );\n\n model.set( 'value', value );\n model.trigger( 'change', model );\n\n // Set focus on value input\n jQuery( optionView.el ).find( '[data-id=\"value\"]' ).focus().select();\n },\n\n updateOptionValue: function( e, model, dataModel, settingModel, optionView ) {\n\n var findWhere = _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } );\n if( 'undefined' == typeof findWhere ) return;\n if( 'list' != findWhere.parentType ) return;\n\n model.set( 'manual_value', true );\n \n // Set focus on calc input\n jQuery( optionView.el ).find( '[data-id=\"calc\"]' ).focus().select();\n },\n\n convertOptions: function( fieldModel ) {\n /*\n * Our options are stored in our database as objects, not collections.\n * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n */ \n var options = fieldModel.get( 'options' );\n\n var settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'options' );\n\n if ( false == options instanceof Backbone.Collection ) {\n options = new ListOptionCollection( [], { settingModel: settingModel } );\n options.add( fieldModel.get( 'options' ) );\n fieldModel.set( 'options', options, { silent: true } );\n }\n }\n\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldPassword',[], function() {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.addField );\n },\n\n addField: function( model ) {\n\n if( 'password' == model.get( 'type' ) ) {\n\n var order = model.get( 'order' );\n\n var confirm = this.insertField( 'passwordconfirm', order + 1 );\n\n confirm.set( 'confirm_field', model.get( 'key' ) );\n }\n },\n\n insertField: function( type, order ) {\n var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n var newField = {\n id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n type: type,\n label: fieldType.get( 'nicename' ),\n order: order\n };\n\n return nfRadio.channel('fields').request('add', newField );\n }\n });\n\n return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldQuantity',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\tif ( 'product_assignment' == settingModel.get( 'name' ) ) {\n\t\t\t\tvar productFields = this.getProductFields( settingModel );\n\t\t\t\tsettingModel.set( 'options', productFields );\n\t\t\t}\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldShipping',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options' ), 'render:setting', this.addMask );\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options-option' ), 'render:setting', this.addMask );\n\t\t},\n\n\t\taddMask: function( settingModel, dataModel, view ) {\n\t\t\tjQuery( view.el ).find( '[data-id=\"value\"]' ).each( function() {\n\t\t\t\tjQuery( this ).autoNumeric({\n\t\t\t\t\taSign: '$', // TODO: Use form setting\n\t\t\t\t\taSep: thousandsSeparator,\n\t\t\t\t\taDec: decimalPoint\n\t\t\t\t});\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * When we add a new field, update its key.\n *\n * When we change the key, update any refs to the key.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/key',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we add a field, update its key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.newFieldKey );\n\n\t\t\t// When we edit a label, update our key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-label' ), 'update:setting', this.updateLabel );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// When we type inside the admin key field, we need to save our manual_key setting.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-key' ), 'keyup:setting', this.keyUp );\n\t\t},\n\n\t\t/**\n\t\t * Add a key to our new field model.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model new field model\n\t\t * @return void\n\t\t */\n\t\tnewFieldKey: function( model ) {\n\t\t\tvar d = new Date();\n\t\t\tvar n = d.valueOf();\n\t\t\tvar key = this.slugify( model.get( 'type' ) + '_' + n );\n\n\t\t\tmodel.set( 'key', key, { silent: true } );\n\n\t\t\tif( 'undefined' == model.get( 'manual_key' ) ) {\n\t\t\t\tmodel.set('manual_key', false, {silent: true});\n\t\t\t}\n\t\t},\n\n\t\tupdateLabel: function( model ) {\n\n\t\t\t/*\n\t\t\t * If we haven't entered a key manually, update our key when our label changes.\n\t\t\t */\n\t\t\tif ( ! model.get( 'manual_key' ) && 0 != jQuery.trim( model.get( 'label' ) ).length ) {\n\t\t\t\t/*\n\t\t\t\t * When we're editing settings, we expect the edits to fire one at a time.\n\t\t\t\t * Since we're calling this in the middle of our label update, anything that inquires about what has changed after we set our key will see both label and key.\n\t\t\t\t * We need to remove the label from our model.changed property so that all that has changed is the key.\n\t\t\t\t *\n\t\t\t\t */\n\t\t\t\tdelete model.changed.label;\n\t\t\t\tvar d = new Date();\n\t\t\t\tvar n = d.valueOf();\n\t\t\t\tvar key = this.slugify( model.get( 'label' ) + '_' + n );\n\t\t\t\tmodel.set( 'key', key );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, find any merge tags using the key and update them.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model field model\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( dataModel ) {\n\t\t\tvar key = dataModel.get( 'key' );\n\t\t\tthis.settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'key' );\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tkeyUp: function( e, settingModel, dataModel ) {\n\t\t\tdataModel.set( 'manual_key', true );\n\t\t\tthis.settingModel = settingModel;\n\t\t\tvar key = jQuery( e.target ).val();\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tsetError: function( key, dataModel ) {\n\t\t\tvar error = false;\n\t\t\tif ( '' == jQuery.trim( key ) ) {\n\t\t\t\terror = 'Field keys can\\'t be empty. Please enter a key.';\n\t\t\t} else if ( key != key.toLowerCase() ) {\n\t\t\t\terror = 'Field keys must be lowercase.';\n\t\t\t} else if ( key != key.replace( ' ', '_' ) ) {\n\t\t\t\terror = 'Field keys must cannot use spaces. Separate with \"_\" instead.';\n\t\t\t} else if ( '_' == key.slice( -1 ) ) {\n\t\t\t\terror = 'Field keys cannot end with a \"_\"';\n\t\t\t} else if ( key != this.slugify( key ) ) {\n\t\t\t\terror = 'Invalid Format.';\n\t\t\t} else if ( key != this.keyExists( key, dataModel ) ) {\n\t\t\t\terror = 'Field keys must be unique. Please enter another key.'\n\t\t\t}\n\n\t\t\tif ( error ) {\n\t\t\t\tthis.settingModel.set( 'error', error );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:fieldKey', dataModel );\n\t\t\t\tthis.settingModel.set( 'error', false );\n\t\t\t}\n\t\t},\n\n\t\tkeyExists: function( key, dataModel ) {\n\t\t\tvar newKey = this.slugify( key );\n\t\t\tif ( 0 != newKey.length ) {\n\t\t\t\tkey = newKey;\n\t\t\t}\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar x = 1;\n\t\t\tvar testKey = key;\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\tif ( dataModel != field && testKey == field.get( 'key' ) ) {\n\t\t\t\t\ttestKey = key + '_' + x;\n\t\t\t\t\tx++;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tkey = testKey;\n\n\t\t\treturn key;\n\t\t},\n\n\t\tslugify: function( string ){\n\t\t\treturn jQuery.slugify( string, { separator: '_' } )\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Creates notices for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:stagedField', this.addStagedField );\n\t\t},\n\n\t\taddStagedField: function( model ) {\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addStagedField', model.get( 'nicename' ) + ' added to staging' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles mobile-specific JS for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start of our sorting.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'render:fieldsSortable', this.initWiggle );\n\t\t\t// Listen for when we start sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:start', this.startWiggle );\n\t\t\t// Listen for when we stop sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:stop', this.stopWiggle );\n\t\t},\n\n\t\tinitWiggle: function( view ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).find( '.nf-field-wrap' ).on( 'taphold', function() {\n\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tstartWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper' ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.helper ).css( 'opacity', '0.75' ).ClassyWiggle( 'start', { degrees: ['.5', '1', '.5', '0', '-.5', '-1', '-.5', '0'] } );\n\t\t\t}\n\t\t},\n\n\t\tstopWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.helper ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * If we add a saved field to our form and then update it, set the \"saved\" flag to false.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/savedFields',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tignoreAttributes: [\n\t\t\t'editActive',\n\t\t\t'order',\n\t\t\t'saved',\n\t\t\t'jBox'\n\t\t],\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateField );\n\t\t\t// Listen to clicks on our add saved field button.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:addSavedField', this.clickAddSavedField, this );\n\t\t},\n\n\t\tupdateField: function( dataModel ) {\n\t\t\tif ( dataModel.get( 'saved' ) ) {\n\t\t\t\t\n\t\t\t\tvar modified = false;\n\t\t\t\tvar changedAttributes = _.keys( dataModel.changedAttributes() );\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( changedAttributes, function( changed ) {\n\t\t\t\t\tif ( -1 == that.ignoreAttributes.indexOf( changed ) ) {\n\t\t\t\t\t\tmodified = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t\n\t\t\t\tif ( modified ) {\n\t\t\t\t\tdataModel.set( 'saved', false );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tclickAddSavedField: function( e, dataModel ) {\n\t\t\tvar modelClone = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\tvar fieldData = modelClone.attributes;\n\t\t\tfieldData.saved = true;\n\n\t\t\tdelete fieldData.jBox;\n\t\t\tdelete fieldData.editActive;\n\t\t\tdelete fieldData.created_at;\n\t\t\tdelete fieldData.order;\n\t\t\tdelete fieldData.id;\n\t\t\tdelete fieldData.formID;\n\t\t\tdelete fieldData.parent_id;\n\t\t\t\n\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', fieldData.type );\n\t\t\tvar newType = _.clone( type.attributes );\n\n\t\t\tvar nicename = jQuery( e.target ).parent().parent().find( 'input' ).val();\n\t\t\tconsole.log( nicename );\n\t\t\tnewType.nicename = nicename;\n\t\t\tfieldData.label = nicename;\n\t\t\tfieldData.nicename = nicename;\n\t\t\tdataModel.set( 'addSavedLoading', true );\n\t\t\tvar newTypeDefaults = JSON.stringify( fieldData );\n\n\t\t\tjQuery.post( ajaxurl, { action: 'nf_create_saved_field', field: newTypeDefaults, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\tnewType.id = response.data.id;\n\t\t\t\tnewType.nicename = nicename;\n\t\t\t\tnewType.settingDefaults = fieldData;\n\n\t\t\t\tvar typeCollection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n\t\t\t\tvar newModel = typeCollection.add( newType );\n\n\t\t\t\tvar typeSections = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\t\ttypeSections.get( 'saved' ).get( 'fieldTypes' ).push( newType.id );\n\n\t\t\t\t// dataModel.set( 'type', response.data.id );\n\t\t\t\tdataModel.set( 'addSavedLoading', false );\n\t\t\t\tdataModel.unset( 'addSavedLoading', { silent: true } );\n\t\t\t\tdataModel.get( 'jBox' ).close();\n\t\t\t\t// dataModel.set( 'saved', true );\n\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addSaved', 'Saved Field Added' );\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a datepicker setting, add our datepicker.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDatepicker',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-datepicker' ), 'render:setting', this.addDatepicker );\n\t\t},\n\n\t\taddDatepicker: function( settingModel, dataModel, view ) {\n\t\t\tvar dateObject = pikadayResponsive( jQuery( view.el ).find( '.setting' )[0] );\t\t\t\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDisplayCalc',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-calc_var' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\t// console.log( 'render!' );\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Creates and stores a collection of action types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our action type collection\n *\n * Also responds to requests for data about action types\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/types',[ 'models/app/typeCollection' ], function( TypeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\t/*\n\t\t\t * Instantiate \"installed\" actions collection.\n\t\t\t */\n\t\t\tthis.installedActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'installed';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'installed',\n\t\t\t\t\tnicename: nfi18n.installed\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.availableActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'available';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'available',\n\t\t\t\t\tnicename: nfi18n.available\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:installedActions', this.getInstalledActions, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:availableActions', this.getAvailableActions, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\t// Search our installed actions first\n\t\t\tvar type = this.installedActions.get( id );\n\t\t\tif ( ! type ) {\n\t\t\t\ttype = this.availableActions.get( id );\n\t\t\t}\n \treturn type;\n },\n\n /**\n * Return the installed action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetInstalledActions: function() {\n \treturn this.installedActions;\n },\n\n /**\n * Return the available action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetAvailableActions: function() {\n \treturn this.availableActions;\n },\n\n /**\n * Add a field type to our staging area when the field type button is clicked.\n *\n * @since 3.0\n * @param Object e event\n * @return void\n */\n addStagedField: function( e ) {\n \tvar type = jQuery( e.target ).data( 'id' );\n \tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n },\n\n /**\n * Return our field type settings sections\n *\n * @since 3.0\n * @return backbone.collection field type settings sections\n */\n getTypeSections: function() {\n return this.fieldTypeSections;\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form action.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Action',\n\t\t\tobjectDomain: 'actions',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar actionType = nfRadio.channel( 'actions' ).request( 'get:type', this.get( 'type' ) );\n\n\t\t\tif( 'undefined' == typeof actionType ) return;\n\n\t\t\t// Loop through our action type \"settingDefaults\" and add any default settings.\n\t\t\tvar that = this;\n\t\t\t_.each( actionType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( ! that.get( key ) ) {\n\t\t\t\t\tthat.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * actions\n\t\t\t * action-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( 'actions' ).trigger( 'init:actionModel', this );\n\t\t\tnfRadio.channel( 'actions-' + this.get( 'type' ) ).trigger( 'init:actionModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n nfRadio.channel( 'actionSetting-' + _.keys( this.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'actions').trigger( 'update:setting', this, options.settingModel );\n nfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action models. \n * This is the actual action data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new action or removed action property.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionCollection',['models/actions/actionModel'], function( actionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionModel,\n\t\tcomparator: 'order',\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addAction, this );\n\t\t\tthis.on( 'remove', this.removeAction, this );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new action property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddAction: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed action property.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveAction: function( model ) {\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles interactions with our actions collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/data',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.collection = new actionCollection( preloadedFormData.actions );\n\t\t\tthis.collection.tmpNum = 1;\n\n\t\t\tif ( 0 != this.collection.models.length ) {\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( this.collection.models, function( action ) {\n\t\t\t\t\tif ( ! jQuery.isNumeric( action.get( 'id' ) ) ) {\n\t\t\t\t\t\tthat.collection.tmpNum++;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a action is removed so that we can add it to our 'deleted_actions' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about actions and to update/change/delete actions from our collection.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:action', this.getAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:tmpID', this.getTmpID, this );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add', this.addAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'delete', this.deleteAction, this );\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetAction: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\t/**\n\t\t * Add a action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( data, silent ) {\n\t\t\tsilent = silent || false;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tvar model = new actionModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\tthis.collection.add( model, { silent: silent } );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Delete a action from our collection.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.model \tmodel \taction model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteAction: function( model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\n\t\t/**\n\t\t * Return a new tmp id for our actions.\n\t\t * Gets the action collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/actionSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( actionSettings, { objectType: 'actions' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a action currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - Edit Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our actions.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our actions collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n _.each( actionCollection.models, function( action ) {\n\t\t\t\taction.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Handles clicks and dragging for our action types.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/addActionTypes',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'actions' ), 'click:addAction', this.addAction );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add:actionType', this.addAction, this );\n\t\t},\n\n\t\t/**\n\t\t * Add an action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( type ) {\n\n\t\t\tvar data = {\n\t\t\t\tid: nfRadio.channel( 'actions' ).request( 'get:tmpID' ),\n\t\t\t\ttype: type.get( 'id' ),\n\t\t\t\tlabel: type.get( 'settingDefaults').label || type.get( 'nicename' )\n\t\t\t}\n\n\t\t\tvar newModel = nfRadio.channel( 'actions' ).request( 'add', data );\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Action',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'actions' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', {}, newModel );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/typeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our action type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addAction' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param object ui \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type droppable.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/droppable',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'app' ).reply( 'drop:actionType', this.dropActionType, this );\n\t\t},\n\n\t\tdropActionType: function( e, ui ) {\n\t\t\tvar type_slug = jQuery( ui.helper ).data( 'type' );\n\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', type_slug );\n\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', type );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our action type\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action type models. \n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeCollection',['models/actions/typeModel'], function( actionTypeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionTypeModel\n\t} );\n\treturn collection;\n} );\n","/**\n * Filters our action type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/filterTypes',['models/actions/typeCollection'], function( typeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'change:filter', this.filterActionTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our action types in the add new action drawer\n\t\t * \n\t\t * Takes a search string and finds any action types that match either the name or alias.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string\t search \tstring being searched for\n\t\t * @param object \t e \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterActionTypes: function( search, e ) {\n\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != jQuery.trim( search ) ) {\n\n \t\tvar filteredInstalled = [];\n \t\t/**\n \t\t * Call the function that actually filters our collection,\n \t\t * and then loop through our collection, adding each model to our filteredInstalled array.\n \t\t */\n\t\t\t\tvar installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n \t\t_.each( this.filterCollection( search, installedActions ), function( model ) {\n \t\t\tfilteredInstalled.push( model );\n \t\t} );\n\n \t\tvar filteredAvailable = [];\n \t\tvar availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n \t\t_.each( this.filterCollection( search, availableActions ), function( model ) {\n \t\t\tfilteredAvailable.push( model );\n \t\t} );\n\n \t\t// Create a new Action Type Section collection with the filtered array.\n \t\tvar newInstalled = new typeCollection( filteredInstalled );\n \t\tnewInstalled.slug = 'installed';\n \t\tnewInstalled.nicename = 'Installed';\n\n \t\tvar newAvailable = new typeCollection( filteredAvailable );\n \t\tnewAvailable.slug = 'available';\n \t\tnewAvailable.nicename = 'Available';\n\n \t\t// Request that our action types filter be applied, passing the collection we created above.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:actionTypes', newInstalled, newAvailable );\n \t\t// If we've pressed the 'enter' key, add the action to staging and clear the filter.\n \t\tif ( e.addObject ) {\n \t\t\tif ( 0 < newInstalled.length ) {\n \t\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', newInstalled.models[0] );\n \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n \t\t\t}\n \t\t}\n \t} else {\n \t\t// Clear our filter if the search text is empty.\n \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n \t}\n },\n\n /**\n * Search our action type collection for the search string.\n * \n * @since 3.0\n * @param string\t search \tstring being searched for\n * @return backbone.collection\n */\n filterCollection: function( search, collection ) {\n \tsearch = search.toLowerCase();\n \t/*\n \t * Backbone collections have a 'filter' method that loops through every model,\n \t * waiting for you to return true or false. If you return true, the model is kept.\n \t * If you return false, it's removed from the filtered result.\n \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'id' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n }\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/newsletterList',[], function( ) {\n var controller = Marionette.Object.extend( {\n initialize: function() {\n this.listenTo( nfRadio.channel( 'setting-newsletter_list' ), 'show:setting', this.defaultFields );\n this.listenTo( nfRadio.channel( 'setting-type-newsletter_list' ), 'click:extra', this.clickListUpdate );\n this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ), 'update:setting', this.maybeRenderFields );\n this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ), 'update:setting', this.maybeRenderGroups );\n this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_fields' ), 'init:settingModel', this.registerFieldsListener );\n this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_groups' ), 'init:settingModel', this.registerGroupsListener );\n },\n\n defaultFields: function( settingModel, dataModel ) {\n this.maybeRenderFields( dataModel, settingModel );\n this.maybeRenderGroups( dataModel, settingModel );\n },\n\n registerFieldsListener: function ( model ) {\n model.listenTo( nfRadio.channel( 'newsletter_list_fields' ), 'update:fieldMapping', this.updateFieldMapping, model );\n },\n\n registerGroupsListener: function ( model ) {\n model.listenTo( nfRadio.channel( 'newsletter_list_groups' ), 'update:interestGroups', this.updateInterestGroups, model );\n },\n\n clickListUpdate: function( e, settingModel, dataModel, settingView ) {\n\n var data = {\n action: 'nf_' + dataModel.attributes.type + '_get_lists',\n security: nfAdmin.ajaxNonce\n };\n\n var that = this;\n jQuery( e.srcElement ).addClass( 'spin' );\n jQuery.post( ajaxurl, data, function( response ){\n var response = JSON.parse( response );\n that.updateLists( settingModel, response.lists, settingView, dataModel );\n dataModel.set( 'newsletter_list', response.lists[0].value, { settingModel: settingModel } );\n }).always( function() {\n jQuery( e.srcElement ).removeClass( 'spin' );\n });\n },\n\n updateLists: function( settingModel, lists, settingView, dataModel ) {\n settingModel.set( 'options', lists );\n settingView.render();\n },\n\n maybeRenderFields: function( dataModel, settingModel ) {\n\n if( 'undefined' == typeof settingModel ) return;\n\n var selectedList = dataModel.get( 'newsletter_list' );\n var lists = settingModel.get( 'options' );\n _.each( lists, function( list ) {\n if ( selectedList == list.value ) {\n nfRadio.channel( 'newsletter_list_fields').trigger( 'update:fieldMapping', list.fields );\n }\n } );\n\n dataModel.set( 'newsletter_list_fields', 0 );\n },\n\n maybeRenderGroups: function( dataModel, settingModel ) {\n if( 'undefined' == typeof settingModel ) return;\n\n var selectedList = dataModel.get( 'newsletter_list' );\n var lists = settingModel.get( 'options' );\n _.each( lists, function( list ) {\n if ( selectedList == list.value ) {\n nfRadio.channel( 'newsletter_list_groups').trigger( 'update:interestGroups', list.groups );\n }\n } );\n\n dataModel.set( 'newsletter_list_fields', 0 );\n },\n\n updateFieldMapping: function( fields ) {\n var settings = this.get( 'settings' );\n settings.reset();\n _.each( fields, function( field ){\n\n settings.add({\n name: field.value,\n type: 'textbox',\n label: field.label,\n width: 'full',\n use_merge_tags: { exclude: [ 'user', 'post', 'system', 'querystrings' ] }\n });\n });\n this.set( 'settings', settings );\n },\n\n updateInterestGroups: function( groups ) {\n var settings = this.get( 'settings' );\n settings.reset();\n _.each( groups, function( group ){\n\n settings.add({\n name: group.value,\n type: 'toggle',\n label: group.label,\n width: 'full',\n });\n });\n this.set( 'settings', settings );\n },\n\n });\n\n return controller;\n} );\n\n","/**\n * Creates and stores a collection of form setting types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our form setting type collection\n *\n * Also responds to requests for data about form setting types\n *\n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/types',[\n\t\t'models/app/typeCollection'\n\t],\n\tfunction(\n\t\tTypeCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( formSettingTypeData );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:typeCollection', this.getCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\tid \tfield type\n\t\t * @return backbone.model \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\treturn this.collection.get( id );\n },\n\n /**\n * Return the installed action type collection\n *\n * @since 3.0\n * @return backbone.collection \tfield type collection\n */\n\t\tgetCollection: function() {\n \treturn this.collection;\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form settings.\n * \n * @package Ninja Forms builder\n * @subpackage Form Settings\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/advanced/settingsModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Form Setting',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.bind( 'change', this.changeSetting, this );\n\t\t\t/*\n\t\t\t * Check to see if we have any setting defaults to set.\n\t\t\t */\n\t\t\tvar formSettings = nfRadio.channel( 'settings' ).request( 'get:collection' );\n\t\t\t_.each( formSettings.models, function( settingModel ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( settingModel.get( 'name' ) ) ) {\n\t\t\t\t\tthis.set( settingModel.get( 'name' ), settingModel.get( 'value' ), { silent: true } );\n\t\t\t\t}\n\t\t\t\tnfRadio.channel( settingModel.get( 'type' ) ).trigger( 'init:dataModel', this, settingModel );\n\t\t\t}, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Handles interactions with our form settings collection.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/data',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.model = new settingsModel( preloadedFormData.settings );\n\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settings', this.getSettings, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'update:setting', this.updateSetting, this );\n\t\t},\n\n\t\tgetSettings: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tupdateSetting: function( name, value, silent ) {\n\t\t\tsilent = silent || false;\n\t\t\tthis.model.set( name, value, { silent: silent } );\n\t\t},\n\n\t\tgetSetting: function( name ) {\n\t\t\treturn this.model.get( name );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/formSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( formSettings, { objectType: 'settings' } );\n\t\t\t\t\t\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settingModel', this.getSettingModel, this );\n\n\t\t\t// Responds to requests for our setting collection\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:collection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from form settings currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return void\n\t\t */\n clearEditActive: function() {\n var collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n _.each( collection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n } );\n }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Listens for clicks on our form settings sections.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/clickEdit',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'settings' ), 'click:edit', this.clickEdit );\n\t\t},\n\n\t\tclickEdit: function( e, typeModel ) {\n\t\t\tvar model = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: typeModel.get( 'settingGroups' ), typeModel: typeModel } );\n\t\t\tvar preventClose = nfRadio.channel( 'drawer' ).request( 'get:preventClose' );\n\t\t\tif ( ! preventClose ) {\n\t\t\t\ttypeModel.set( 'editActive', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Makes sure that calculations don't reference calculations with a lower order.\n *\n * For example, our first caclulation can't reference the second, but the second can reference the first.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/calculations',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When someone types in the \"name\" or \"eq\" portion of our calculation, we need to make sure\n\t\t\t * that they haven't duplicated a name or made a bad EQ reference.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'keyup:option', this.keyUp );\n\t\t\t/*\n\t\t\t * Same thing for when our calculation option is updated\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalc );\n\t\t\t/*\n\t\t\t * When we sort our calcluations, we need to make sure that we don't get any bad EQ\n\t\t\t * references.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'sort:option', this.sortCalc );\n\t\t},\n\n\t\tkeyUp: function( e, optionModel ) {\n\t\t\t// Get our current value\n\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t// Check to see if we're editing a name or eq\n var id = jQuery( e.target ).data( 'id' );\n\t\t\tif( 'name' == id ) { // We are editing the name field\n\t\t\t\t// Check to see if our name already exists.\n\t\t\t\tthis.checkName( value, optionModel );\n\t\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\t} else if( 'eq' == id ) { // We're editing the eq\n\t\t\t\t// Check to see if there are any calcs referenced in our eq\n\t\t\t\tthis.checkEQ( value, optionModel );\n\t\t\t} else if( 'dec' == id ) { // We're editing the dec\n // Check to see that we have a non-negative integer\n this.checkDec( value, optionModel );\n }\n\t\t},\n\n\t\tupdateCalc: function( optionModel ) {\n\t\t\tthis.checkName( optionModel.get( 'name' ), optionModel, false );\n\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\tthis.checkDec( optionModel.get( 'dec' ), optionModel );\n\t\t},\n\n\t\tsortCalc: function( optionModel, setting ) {\n\t\t\tthis.checkAllCalcs( setting.collection );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if a calc name exists.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param string \t\t\tname calc name to check\n\t\t * @param backbone.model \toptionModel \n\t\t * @return void\n\t\t */\n\t\tcheckName: function( name, optionModel, silent ) {\n\t\t\tsilent = silent || true;\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t// Search our calc collection for our name\n\t\t\tvar found = optionModel.collection.where( { name: jQuery.trim( name ) } );\n\n\t\t\t// If the name that was passed is the same as our current name, return false.\n\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\tfound = [];\n\t\t\t}\n\n\t\t\t// If our name exists, add an errors to the option model\n\t\t\tif ( 0 != found.length ) {\n\t\t\t\terrors.nameExists = 'Calculation names must be unique. Please enter another name.';\n\t\t\t} else {\n\t\t\t\toptionModel.set( 'name', name, { silent: silent } );\n\t\t\t\tdelete errors.nameExists;\n\t\t\t}\n\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if an eq contains a reference to a calc at a lower priority.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param string \t\t\teq our equation\n\t\t * @param backbone.model \toptionModel\n\t\t * @return void\n\t\t */\n\t\tcheckEQ: function( eq, optionModel ) {\n\t\t\t// Get any current errors on our optionModel\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t/*\n\t\t\t * We're looking for two errors:\n\t\t\t * - Calculations that are below the current one can't be processed.\n\t\t\t * - Calculations can't refer to themselves.\n\t\t\t */ \n\t\t\tvar errorSelfRef = false;\n\t\t\tvar errorFutureCalc = false;\n\t\t\t// Regex that searches for {calc:key}\n\t\t\tvar calcs = eq.match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\t/*\n\t\t\t * Calcs will be an array like:\n\t\t\t * ['{calc:test}'], ['{calc:another}']\n\t\t\t * \n\t\t\t * If we have any calcs in the eq, loop through them and search for the errors.\n\t\t\t */\n\t\t\tif ( calcs ) {\n\t\t\t\tvar calculations = optionModel.collection;\n\t\t\t\t// Maps a function to each item in our calcs array.\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 optionModel from our calculations collection.\n\t\t\t\t\tvar targetCalc = calculations.findWhere( { name: name } );\n\t\t\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\t\t\t// If we already have a calc with this name, set an error.\n\t\t\t\t\t\terrors.selfRef = 'A calculation can\\'t reference itself!';\n\t\t\t\t\t\terrorSelfRef = true;\n\t\t\t\t\t} else if ( targetCalc && targetCalc.get( 'order' ) > optionModel.get( 'order' ) ) {\n\t\t\t\t\t\t// If the calc is after this one, set an error. \n\t\t\t\t\t\terrorFutureCalc = true;\n\t\t\t\t\t\terrors.futureCalc = 'Can\\'t reference a future calculation!';\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// If we didn't find any self ref errors, remove the key.\n\t\t\tif ( ! errorSelfRef ) {\n\t\t\t\tdelete errors.selfRef;\n\t\t\t}\n\n\t\t\t// If we didn't find any future calc errors, remove the key.\n\t\t\tif ( ! errorFutureCalc ) {\n\t\t\t\tdelete errors.futureCalc;\n\t\t\t}\n\n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\n\t\t},\n\n /**\n * Ceck to see if a dec is an integer value.\n * \n * @since 3.1\n * @param string dec our decimal value\n * @param backbone.model optionModel\n * @return void\n */\n checkDec: function( dec, optionModel ) {\n // If dec isn't defined, bail...\n if( 'undefined' === typeof(dec) ) return false;\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n /**\n * We're looking for one error:\n * - dec is not a non-negative integer.\n */\n var errorNonIntDec = false;\n \n // Get our target value and see if it matches what we got.\n var checked = Math.abs( parseInt( dec.trim() ) );\n if ( dec.trim() !== '' && checked.toString() !== dec.trim() ) {\n errorNonIntDec = true;\n errors.nonIntDec = 'Decimals must be a non-negative integer!';\n }\n \n // If our dec value is a non-negative integer.\n if ( ! errorNonIntDec ) {\n delete errors.nonIntDec;\n }\n \n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n \n },\n \n\t\tcheckAllCalcs: function( collection ) {\n\t\t\tvar that = this;\n\t\t\tcollection.models.map( function( opt ) {\n\t\t\t\tthat.checkName( opt.get( 'name' ), opt );\n\t\t\t\tthat.checkEQ( opt.get( 'eq' ), opt );\n that.checkDec( opt.get( 'dec' ), opt );\n\t\t\t} );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Loads all of our controllers using Require JS.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine(\n\t'controllers/loadControllers',[\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\t'controllers/app/remote',\n\t\t'controllers/app/drawer',\n\t\t'controllers/app/drawerConfig',\n\t\t'controllers/app/domainConfig',\n\t\t'controllers/app/data',\t\t\n\t\t'controllers/app/drawerToggleSettingGroup',\n\t\t'controllers/app/updateDB',\n\t\t'controllers/app/formData',\n\t\t'controllers/app/previewLink',\n\t\t'controllers/app/menuButtons',\n\t\t'controllers/app/trackChanges',\n\t\t'controllers/app/undoChanges',\n\t\t'controllers/app/publishResponse',\n\t\t'controllers/app/changeDomain',\n\t\t'controllers/app/pushstate',\n\t\t'controllers/app/hotkeys',\n\t\t'controllers/app/cleanState',\n\t\t'controllers/app/coreUndo',\n\t\t'controllers/app/cloneModelDeep',\n\t\t'controllers/app/getSettingChildView',\n\t\t'controllers/app/changeSettingDefault',\n\t\t'controllers/app/fieldset',\n\t\t'controllers/app/toggleSetting',\n\t\t'controllers/app/itemControls',\n\t\t'controllers/app/mergeTags',\n\t\t'controllers/app/mergeTagBox',\n\t\t'controllers/app/itemSettingFill',\n\t\t'controllers/app/confirmPublish',\n\t\t'controllers/app/rte',\n\t\t'controllers/app/settingFieldSelect',\n\t\t'controllers/app/settingFieldList',\n\t\t'controllers/app/settingHTML',\n\t\t'controllers/app/settingColor',\n\t\t'controllers/app/changeMenu',\n\t\t'controllers/app/mobile',\n\t\t'controllers/app/notices',\n\t\t'controllers/app/unloadCheck',\n\t\t'controllers/app/formContentFilters',\n\t\t'controllers/app/formContentGutterFilters',\n\t\t'controllers/app/cloneCollectionDeep',\n\t\t'controllers/app/trackKeyDown',\n\t\t'controllers/app/perfectScroll',\n\t\t'controllers/app/getNewSettingGroupCollection',\n\t\t'controllers/app/settingMedia',\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\t'controllers/fields/types',\n\t\t'controllers/fields/fieldTypeDrag',\n\t\t'controllers/fields/stagingDrag',\n\t\t'controllers/fields/staging',\n\t\t'controllers/fields/stagingSortable',\n\t\t'controllers/fields/filterTypes',\n\t\t'controllers/fields/sortable',\n\t\t'controllers/fields/data',\n\t\t'controllers/app/optionRepeater',\n\t\t'controllers/fields/editActive',\n\t\t'controllers/fields/fieldSettings',\n\t\t'controllers/fields/fieldCreditCard',\n\t\t'controllers/fields/fieldList',\n\t\t'controllers/fields/fieldPassword',\n\t\t'controllers/fields/fieldQuantity',\n\t\t'controllers/fields/fieldShipping',\n\t\t'controllers/fields/key',\n\t\t'controllers/fields/notices',\n\t\t'controllers/fields/mobile',\n\t\t'controllers/fields/savedFields',\n\t\t'controllers/fields/fieldDatepicker',\n\t\t'controllers/fields/fieldDisplayCalc',\n\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\t'controllers/actions/types',\n\t\t'controllers/actions/data',\n\t\t'controllers/actions/actionSettings',\n\t\t'controllers/actions/editActive',\n\t\t'controllers/actions/addActionTypes',\n\t\t'controllers/actions/typeDrag',\n\t\t'controllers/actions/droppable',\n\t\t'controllers/actions/filterTypes',\n\t\t'controllers/actions/newsletterList',\n\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\t'controllers/advanced/types',\n\t\t'controllers/advanced/data',\n\t\t'controllers/advanced/formSettings',\n\t\t'controllers/advanced/editActive',\n\t\t'controllers/advanced/clickEdit',\n\t\t'controllers/advanced/calculations'\n\t],\n\tfunction(\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\tRemote,\n\t\tDrawer,\n\t\tDrawerConfig,\n\t\tDomainConfig,\n\t\tAppData,\n\t\tDrawerToggleSettingGroup,\n\t\tUpdateDB,\n\t\tFormData,\n\t\tPreviewLink,\n\t\tAppMenuButtons,\n\t\tAppTrackChanges,\n\t\tAppUndoChanges,\n\t\tAppPublishResponse,\n\t\tAppChangeDomain,\n\t\tPushstate,\n\t\tHotkeys,\n\t\tCleanState,\n\t\tCoreUndo,\n\t\tCloneModelDeep,\n\t\tDrawerSettingChildView,\n\t\tChangeSettingDefault,\n\t\tFieldset,\n\t\tToggleSetting,\n\t\tItemControls,\n\t\tMergeTags,\n\t\tMergeTagsBox,\n\t\tItemSettingFill,\n\t\tConfirmPublish,\n\t\tRTE,\n\t\tSettingFieldSelect,\n\t\tSettingFieldList,\n\t\tSettingHTML,\n\t\tSettingColor,\n\t\tChangeMenu,\n\t\tAppMobile,\n\t\tAppNotices,\n\t\tAppUnloadCheck,\n\t\tFormContentFilters,\n\t\tFormContentGutterFilters,\n\t\tCloneCollectionDeep,\n\t\tTrackKeyDown,\n\t\tPerfectScroll,\n\t\tGetNewSettingGroupCollection,\n\t\tSettingMedia,\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\tFieldTypes,\n\t\tFieldTypeDrag,\n\t\tFieldStagingDrag,\n\t\tStagedFieldsData,\n\t\tStagedFieldsSortable,\n\t\tDrawerFilterFieldTypes,\n\t\tMainContentFieldsSortable,\n\t\tFieldData,\n\t\tOptionRepeater,\n\t\tFieldsEditActive,\n\t\tFieldSettings,\n\t\tFieldCreditCard,\n\t\tFieldList,\n\t\tFieldPassword,\n\t\tFieldQuantity,\n\t\tFieldShipping,\n\t\tFieldKey,\n\t\tNotices,\n\t\tFieldsMobile,\n\t\tSavedFields,\n\t\tFieldDatepicker,\n\t\tFieldDisplayCalc,\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\tActionTypes,\n\t\tActionData,\n\t\tActionSettings,\n\t\tActionEditActive,\n\t\tActionAddTypes,\n\t\tActionTypeDrag,\n\t\tActionDroppable,\n\t\tActionFilterTypes,\n\t\tActionNewsletterList,\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\tSettingTypes,\n\t\tSettingData,\n\t\tFormSettings,\n\t\tSettingsEditActive,\n\t\tSettingsClickEdit,\n\t\tAdvancedCalculations\n\t\t\n\t) {\n\t\tvar controller = Marionette.Object.extend( {\n\t\t\tinitialize: function() {\n\t\t\t\t/*\n\t\t\t\t * Application controllers\n\t\t\t\t */\n\t\t\t\tnew FormContentFilters();\n\t\t\t\tnew FormContentGutterFilters();\n\t\t\t\tnew Hotkeys();\n\t\t\t\tnew Remote();\n\t\t\t\tnew Drawer();\n\t\t\t\tnew DrawerConfig();\n\t\t\t\tnew DomainConfig();\n\t\t\t\tnew DrawerToggleSettingGroup();\n\t\t\t\tnew PreviewLink();\n\t\t\t\tnew AppMenuButtons();\n\t\t\t\tnew AppTrackChanges();\n\t\t\t\tnew AppUndoChanges();\n\t\t\t\tnew AppPublishResponse();\n\t\t\t\tnew AppChangeDomain();\n\t\t\t\tnew CleanState();\n\t\t\t\tnew CoreUndo();\n\t\t\t\tnew CloneModelDeep();\n\t\t\t\tnew ItemControls();\n\t\t\t\tnew ConfirmPublish();\n\t\t\t\tnew RTE();\n\t\t\t\tnew SettingFieldSelect();\n\t\t\t\tnew SettingFieldList();\n\t\t\t\tnew SettingHTML();\n\t\t\t\tnew SettingColor();\n\t\t\t\tnew SettingMedia();\n\t\t\t\tnew ChangeMenu();\n\t\t\t\tnew AppMobile();\n\t\t\t\tnew AppNotices();\n\t\t\t\tnew AppUnloadCheck();\n\t\t\t\tnew UpdateDB();\n\t\t\t\tnew CloneCollectionDeep();\n\t\t\t\tnew TrackKeyDown();\n\t\t\t\tnew PerfectScroll();\n\t\t\t\tnew GetNewSettingGroupCollection();\n\t\t\t\t// new Pushstate();\n\t\t\t\t/*\n\t\t\t\t * Fields domain controllers\n\t\t\t\t * \n\t\t\t\t * Field-specific controllers should be loaded before our field type controller.\n\t\t\t\t * This ensures that any 'init' hooks are properly registered.\n\t\t\t\t */\n\t\t\t\tnew Fieldset();\n\t\t\t\tnew OptionRepeater();\n\n\t\t\t\tnew FieldTypes();\n\t\t\t\tnew FieldTypeDrag();\n\t\t\t\tnew FieldStagingDrag();\n\t\t\t\tnew StagedFieldsData();\n\t\t\t\tnew StagedFieldsSortable();\n\t\t\t\tnew DrawerFilterFieldTypes();\n\t\t\t\tnew MainContentFieldsSortable();\n\t\t\t\tnew ChangeSettingDefault();\n\t\t\t\tnew ToggleSetting();\n\t\t\t\tnew DrawerSettingChildView();\n\t\t\t\tnew FieldsEditActive();\n\t\t\t\tnew FieldSettings();\n\t\t\t\tnew FieldCreditCard();\n\t\t\t\tnew FieldList();\n\t\t\t\tnew FieldPassword;\n\t\t\t\tnew FieldQuantity();\n\t\t\t\tnew FieldShipping();\n\t\t\t\tnew FieldKey();\n\t\t\t\tnew Notices();\n\t\t\t\tnew FieldsMobile();\n\t\t\t\tnew SavedFields();\n\t\t\t\tnew FieldDatepicker();\n\t\t\t\tnew FieldDisplayCalc();\n\t\t\t\t/*\n\t\t\t\t * TODO: Actions domain controllers\n\t\t\t\t */\n\t\t\t\tnew ActionNewsletterList();\n\t\t\t\tnew ActionTypes();\n\t\t\t\tnew ActionData();\n\t\t\t\tnew ActionSettings();\n\t\t\t\tnew ActionEditActive();\n\t\t\t\tnew ActionAddTypes();\n\t\t\t\tnew ActionTypeDrag();\n\t\t\t\tnew ActionDroppable();\n\t\t\t\tnew ActionFilterTypes();\n\t\t\t\t/*\n\t\t\t\t * TODO: Settings domain controllers\n\t\t\t\t */\n\t\t\t\tnew SettingTypes();\n\t\t\t\tnew FormSettings();\n\t\t\t\tnew AdvancedCalculations();\n\t\t\t\tnew SettingData();\n\t\t\t\tnew SettingsEditActive();\n\t\t\t\tnew SettingsClickEdit();\n\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Data controllers need to be set after every other controller has been setup, even if they aren't domain-specific.\n\t\t\t\t * AppData() was after FormData();\n\t\t\t\t */\n\t\t\t\tnew AppData();\n\t\t\t\tnew FieldData();\n\t\t\t\tnew FormData();\n\t\t\t\tnew MergeTags();\n\t\t\t\tnew MergeTagsBox();\n\t\t\t\tnew ItemSettingFill();\n\t\t\t}\n\t\t});\n\n\t\treturn controller;\n} );\n\n","define( 'views/fields/fieldItem',['views/app/itemControls'], function( itemControlsView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-field',\n\t\tdoingShortcut: false,\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:required', this.render, this );\n\t\t\tthis.model.on( 'change:id', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:required', this.render );\n\t\t\tthis.model.off( 'change:id', this.render );\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\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t\tjQuery( this.el ).disableSelection();\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).on( 'taphold', function( e, touch ) {\n\t\t\t\t\tif ( ! jQuery( e.target ).hasClass( 'nf-edit-settings' ) ) {\n\t\t\t\t\t\tjQuery( this ).addClass( 'ui-sortable-helper drag-selected' );\n\t\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t \treturn {\n\t \t\trenderClasses: function() {\n\t \t\t\tvar classes = 'nf-field-wrap';\n\t \t\t\tif ( this.editActive ) {\n\t \t\t\t\tclasses += ' active';\n\t \t\t\t}\n\t \t\t\treturn classes;\n\t \t\t},\n\t \t\trenderRequired: function() {\n\t \t\t\tif ( 1 == this.required ) {\n\t \t\t\t\treturn '<span class=\"required\">*</span>';\n\t \t\t\t} else {\n\t \t\t\t\treturn '';\n\t \t\t\t}\n\t \t\t},\n\t \t\tgetFieldID: function() {\n\t\t\t\t\tif ( jQuery.isNumeric( this.id ) ) {\n\t\t\t\t\t\treturn 'field-' + this.id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn this.id;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trenderIcon: function() {\n\t\t\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', this.type );\n\t\t\t\t\treturn '<span class=\"fa fa-' + type.get( 'icon' ) + '\"></span>';\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'mousedown': 'maybeShortcut',\n\t\t\t'click': 'maybeClickEdit',\n\t\t\t'singletap': 'maybeTapEdit',\n\t\t\t'swipeleft': 'swipeLeft',\n\t\t\t'swiperight': 'swipeRight',\n\t\t\t'tapend': 'tapend'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( this.doingShortcut ) {\n\t\t\t\tthis.doingShortcut = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) || jQuery( e.target ).parent().hasClass( 'nf-field-wrap' ) || jQuery( e.target ).hasClass( 'nf-field-wrap' ) ) && ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ':focus' ).blur();\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tmaybeShortcut: function( e ) {\n\t\t\tvar keys = nfRadio.channel( 'app' ).request( 'get:keydown' );\n\t\t\t/*\n\t\t\t * If the shift key isn't held down, return.\n\t\t\t */\n\t\t\tif ( -1 == keys.indexOf( 16 ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we are pressing D, delete this field.\n\t\t\t */\n\t\t\tif ( -1 != keys.indexOf( 68 ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\treturn false;\n\t\t\t} else if ( -1 != keys.indexOf( 67 ) ) {\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tmaybeTapEdit: function( e ) {\n\t\t\tif ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tswipeLeft: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).show();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).show();\n\t\t},\n\n\t\tswipeRight: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).hide();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).hide();\n\t\t},\n\n\t\ttapend: function( e, touch ) {\n\t\t\tjQuery( this.el ).ClassyWiggle( 'stop' );\n\t\t\tjQuery( this.el ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t},\n\n\t\tremove: function(){\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:removing' ) ) {\n\t\t\t\tthis.$el.hide( 'clip', function(){\n\t\t\t\t\tjQuery( this ).remove();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.$el.remove();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:removing', false );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tjQuery( this.el ).find( '.nf-item-control' ).css( 'display', '' );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-fields-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\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\tif ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t\tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t}\n\t\t\tjQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\tjQuery( this.el ).parent().droppable( {\n\t\t\t\taccept: function( draggable ) {\n\t\t\t\t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t},\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our form title.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/formTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-header-form-title',\n\n\t\tinitialize: function() {\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change:title', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since 3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t \treturn {\n\t \t\trenderTitle: function(){\n\t \t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t \t\t\treturn _.escape( formData.get( 'settings' ).get( 'title' ) );\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\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( 'views/loadViews',[ 'views/fields/fieldItem', 'views/fields/mainContentEmpty', 'views/app/formTitle' ], function( fieldItemView, mainContentEmptyView, FormTitleView ) {\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\t\t\n\t\t\t// Reply to requests for our empty content view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:mainContentEmpty', this.getMainContentEmpty );\n\t\t\n\t\t\t// Reply to requests for our form title view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:formTitle', this.getFormTitle );\n\t\t},\n\n\t\tgetFieldItem: function( model ) {\n\t\t\treturn fieldItemView;\n\t\t},\n\n\t\tgetMainContentEmpty: function() {\n\t\t\treturn mainContentEmptyView;\n\t\t},\n\n\t\tgetFormTitle: function() {\n\t\t\treturn FormTitleView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","var nfRadio = Backbone.Radio;\n\njQuery( document ).ready( function( $ ) {\n\trequire( ['views/app/builder', 'controllers/loadControllers', 'views/loadViews'], function( BuilderView, LoadControllers, LoadViews ) {\n\n\t\tvar NinjaForms = Marionette.Application.extend( {\n\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// Trigger an event before we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadControllers', this );\n\t\t\t\t// Load our controllers.\n\t\t\t\tvar loadControllers = new LoadControllers();\n\t\t\t\t// Trigger an event after we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadControllers', this );\n\n\t\t\t\t// Trigger an event before we load un-instantiated views\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadViews', this );\n\t\t\t\tvar loadViews = new LoadViews();\n\t\t\t\t// Trigger an event after we load un-instantiated views.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadViews', this );\n\n\t\t\t\tnfRadio.channel( 'app' ).reply( 'get:template', this.template );\n\t\t\t},\n\n\t\t\tonStart: function() {\n\t\t\t\tvar builderView = new BuilderView();\n\t\t\t\t// Trigger our after start event.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:appStart', this );\n\n\t\t\t\t/*\n\t\t\t\t * If we're on the new forms builder, open the add fields drawer.\n\t\t\t\t */\n\t\t\t\tif ( 0 == nfAdmin.formID ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\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();\n\t} );\n} );\ndefine(\"main\", function(){});\n\n"],"sourceRoot":"/source/"} -
ninja-forms/trunk/deprecated/ninja-forms.php
r1649765 r1649963 266 266 // Plugin version 267 267 if ( ! defined( 'NF_PLUGIN_VERSION' ) ) 268 define( 'NF_PLUGIN_VERSION', '3.1 ' );268 define( 'NF_PLUGIN_VERSION', '3.1.1' ); 269 269 270 270 // Plugin Folder Path -
ninja-forms/trunk/includes/Database/FormsController.php
r1649765 r1649963 10 10 global $wpdb; 11 11 $this->db = $wpdb; 12 $this->forms_data = $this->setFormsData();13 12 } 14 13 … … 30 29 public function getFormsData() 31 30 { 31 if( empty( $this->forms_data ) ) { 32 $this->forms_data = $this->setFormsData(); 33 } 32 34 return( array_values( $this->forms_data ) ); 33 35 } -
ninja-forms/trunk/ninja-forms.php
r1649765 r1649963 4 4 Plugin URI: http://ninjaforms.com/ 5 5 Description: Ninja Forms is a webform builder with unparalleled ease of use and features. 6 Version: 3.1 6 Version: 3.1.1 7 7 Author: The WP Ninjas 8 8 Author URI: http://ninjaforms.com … … 53 53 * @since 3.0 54 54 */ 55 const VERSION = '3.1 ';55 const VERSION = '3.1.1'; 56 56 57 57 /** -
ninja-forms/trunk/readme.txt
r1649765 r1649963 4 4 Requires at least: 4.5 5 5 Tested up to: 4.7 6 Stable tag: 3.1 6 Stable tag: 3.1.1 7 7 License: GPLv2 or later 8 8 … … 115 115 == Upgrade Notice == 116 116 117 = 3.1 (02 May 2017) = 118 119 *Changes:* 120 121 * Added a dashboard view for forms, removing the "All Forms" and "Add New" submenus. 122 * All new Merge Tag UI for inserting Merge Tags into forms and actions. 123 * Refactored calculations, as well as adding an option to set calculation rounding. 124 * Updated the WordPress.org readme file. 125 * Opening the "new form" page should automatically open the drawer to add new fields. 126 127 *Bugs:* 128 129 * Fixed several bugs with calculations and locales that use non-American thousands and decimal separators. 130 * Products with a price over 999 should now render and calculate properly. 131 * Editing a submission and using a single quote should not break the submission editor. 132 * Fixed several PHP notices. 133 * After successful submission, the page should only scroll to the success message if it is not fully visible. 134 * Inline email validation should work properly for longer email domains, i.e. @liverpool.ac.uk 117 = 3.1.1 (02 May 2017) = 118 119 *Bugs:* 120 121 * Fixed bugs in the new Merge Tag UI that prevented it from being opened properly via clicks. 135 122 136 123 == Changelog == 124 125 = 3.1.1 (02 May 2017) = 126 127 *Bugs:* 128 129 * Fixed bugs in the new Merge Tag UI that prevented it from being opened properly via clicks. 137 130 138 131 = 3.1 (02 May 2017) =
Note: See TracChangeset
for help on using the changeset viewer.