| 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/emailFromSetting.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/actions/deleteFieldListener.js","controllers/actions/collectPaymentFields.js","controllers/actions/collectPaymentCalculations.js","controllers/actions/collectPaymentFixed.js","controllers/actions/collectPayment.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","renderWarning","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-item-control","click .nf-item-delete","click .nf-item-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","fail","xhr","status","alert","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","updateID","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","targetTag","oldTag","fieldMergeTag","newKey","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","Radio","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","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","max_options","changeErrors","size","errorsFound","opt","listOptionModel","addOption","renderErrors","ErrorView","columns","parentView","hasErrors","click .nf-delete","keyup","changeOption","deleteOption","keyupOption","maybeAddOption","findByIndex","getColumns","renderFieldSelect","_return","selected","renderOptions","column","listOptionView","listEmptyView","listOptionCollection","optionCollection","maybeHideNew","handle","forcePlaceholderSize","importLink","closeButton","clickImport","renderHeaders","col","renderFieldsetClasses","currency_symbol","click .nf-add-new","limit","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","updateFromAddress","isValidEmail","home_url_host","errorInvalidEmailFromAddress","email","dropActionType","type_slug","actionTypeModel","filterActionTypes","newInstalled","newAvailable","defaultFields","clickListUpdate","maybeRenderFields","maybeRenderGroups","registerFieldsListener","registerGroupsListener","updateFieldMapping","updateInterestGroups","updateLists","lists","always","selectedList","list","groups","group","registerListener","maybeUpdateSettings","newObject","isString","isObject","mapObject","filteredCollection","every","getFields","field_key","returnFields","sortBy","calcModels","calcs","getCalcs","returnCalcs","isEmpty","initCollectPayment","maybeClearTotal","maybeUpdateTotal","maybeError","oldName","formSettingTypeData","settingsModel","getSettings","updateCalc","sortCalc","checkName","checkEQ","checkDec","checkAllCalcs","nameExists","eq","errorSelfRef","errorFutureCalc","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","ActionEmailFromSetting","ActionAddTypes","ActionTypeDrag","ActionDroppable","ActionFilterTypes","ActionNewsletterList","ActionDeleteFieldListener","ActionCollectPaymentFields","ActionCollectPaymentCalculations","ActionCollectPaymentFixed","ActionCollectPayment","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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AyG,OAAApP,IAAA,SAAAymC,GACAz/B,EAAAiqC,UAAAxK,EAAAvgC,IAAA,QAAAugC,GACAz/B,EAAAkqC,QAAAzK,EAAAvgC,IAAA,MAAAugC,GACAz/B,EAAAmqC,SAAA1K,EAAAvgC,IAAA,OAAAugC,OAMA,OAAA50B,KCnMApT,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,uCACA,qCACA,+BACA,gCACA,kCACA,qCACA,0CACA,2CACA,iDACA,0CACA,qCAKA,6BACA,4BACA,oCACA,kCACA,iCACA,qCAEA,SAIA0zC,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,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GA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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\t\t\t// ... or Domain Change.\n this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', function(){\n // @todo Using a timeout feels like a hack, but there may be a timing issue here.\n \tsetTimeout(function(){\n nfRadio.channel( 'app' ).request( 'update:gutters' );\n\t\t\t\t}, 300, this );\n\t\t\t}, this );\n\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","/**\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\tjQuery( this.el ).parent().perfectScrollbar();\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 if ( ! currentDrawer || this.maybePreventClose() ) {\n return false;\n }\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// 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\t\t\tthis.model.on( 'change:warning', this.renderWarning, 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 renderWarning: function() {\n if ( this.model.get( 'warning' ) ) {\n jQuery( this.el ).find( '.nf-setting' ).addClass( 'nf-warning' );\n this.error.show( new settingErrorView( { model: this.model } ) );\n } else {\n jQuery( this.el ).find( '.nf-setting' ).removeClass( 'nf-warning' );\n this.error.empty();\n }\n },\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-item-control': 'singleTapEdit',\n\t\t\t'click .nf-item-delete': 'clickDelete',\n\t\t\t'click .nf-item-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} ).fail( function( xhr, status, error ) {\n\t\t\t\tconsole.log( action );\n\t\t\t\t// For previews, only log to the console.\n if( 'preview' == action ) {\n console.log( error );\n return;\n }\n // @todo Convert alert to jBox Modal.\n\t\t\t\talert(xhr.status + ' ' + error + '\\r\\n' + 'An error on the server caused your form not to publish.\\r\\nPlease contact Ninja Forms Support with your PHP Error Logs.\\r\\nhttps://ninjaforms.com/contact');\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","/**\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\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 a field's ID is changed (ie from a tmpID), update the merge tag.\n this.listenTo( nfRadio.channel( 'fieldSetting-id' ), 'update:setting', this.updateID );\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\t// When a field is published, update the merge tag with the newly assigned ID (as opposed to the tmpID).\n updateID: function( fieldModel ) {\n\n\t\t\t// Get the formatted merge tag for comparison.\n\t\t\tvar targetTag = this.getFieldKeyFormat( fieldModel.get( 'key' ) );\n\n\t\t\t// Search the field tags for the matching merge tag to be updated.\n\t\t\tvar oldTag = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).find( function( fieldMergeTag ){\n return targetTag == fieldMergeTag.get( 'tag' );\n });\n\n\t\t\t// If no matching tag is found, return early.\n\t\t\tif( 'undefined' == typeof oldTag ) return;\n\n\t\t\t// Update the merge tag with the \"published\" field ID.\n\t\t\toldTag.set( 'id', fieldModel.get( 'id' ) );\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","/**\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 * Listen to the Field Changes (add, delete, update) and update the Merge Tags.\n */\n this.listenTo( Backbone.Radio.channel( 'fields' ), 'add:field', this.afterAppStart );\n this.listenTo( Backbone.Radio.channel( 'fields' ), 'delete:field', this.afterAppStart );\n this.listenTo( Backbone.Radio.channel( 'fieldSetting-key' ), 'update:setting', this.afterAppStart );\n\n /** ... and Calc updates. */\n this.listenTo( Backbone.Radio.channel( 'calcs' ), 'update:calc', this.afterAppStart );\n\n this.listenTo( Backbone.Radio.channel( 'app' ), 'change:currentDomain', this.afterAppStart );\n },\n\n afterAppStart: function() {\n\n var currentDomain = Backbone.Radio.channel( 'app' ).request( 'get:currentDomain' );\n\n var mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\n var mergeTags = [];\n mergeTagCollection.each( function( section ){\n\n section.get( 'tags' ).each( function( tag ){\n\n if( 'fields' == currentDomain.get( 'id' ) && '{submission:sequence}' == tag.get( 'tag' ) ) return;\n\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\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 },\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-zA-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 value = node.nodeValue;\n } else if( node.innerHTML ){\n var value = node.innerHTML;\n }\n\n if( -1 == value.indexOf(replace) ) return; // Replace not found in this node.\n\n value = value.replace( / /g, ' ' );\n var position = value.indexOf(replace) + find.length;\n\n /*\n * If no caretPos, determine based on the node. ie Merge Tag Button context.\n * Note: We can't just check for '{', because they could just be inserting the first tag.\n */\n if( -1 == caretPos ){\n caretPos = value.indexOf( replace ) + 1;\n }\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( childNode );\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 // Since we haven't determined the caretPos, set to -1 as a flag to determine later.\n nfRadio.channel('mergeTags').request( 'set:caret', -1 );\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-zA-Z0-9]|:|_|-|})*/g));\n } else {\n var mergetags = $this.val().match(new RegExp(/{([a-zA-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","/**\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', {\n\t\t\t\t\ttext: media.title || media.filename,\n\t\t\t\t\turl: media.url\n\t\t\t\t} );\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\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\n\t\t\t\tlabel: nfRadio.channel( 'fields' ).request( 'get:type', type ).get( 'nicename' )\n\t\t\t});\n\n\t\t\tconsole.log( fieldModel );\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\tif( 'duplicate' == action ){\n nfRadio.channel( 'fields' ).trigger( 'render:duplicateField', 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 max_options: 0,\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 && 'calculations' != this.settingModel.get( 'name' ) ) {\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 _return += '<option value=\"\" >--</option>';\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 this.listenTo( nfRadio.channel( 'option-repeater' ), 'added:option', this.maybeHideNew );\n this.listenTo( nfRadio.channel( 'option-repeater' ), 'removed:option', this.maybeHideNew );\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 that.maybeHideNew( that.collection );\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 maybeHideNew: function( collection ) {\n\t\t\tif( 'undefined' == typeof collection.settingModel ) return false;\n var limit = collection.settingModel.get( 'max_options' );\n if( 0 !== limit && collection.models.length >= ( limit ) ) {\n jQuery(this.el).find('.nf-add-new').addClass('disabled');\n } else {\n jQuery(this.el).find('.nf-add-new').removeClass('disabled');\n }\n },\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 var limit = collection.settingModel.get( 'max_options' );\n if( 0 !== limit && collection.models.length >= limit ) {\n return;\n }\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\tnfRadio.channel( 'option-repeater' ).trigger( 'added:option', collection );\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' ).trigger( 'removed:option', collection );\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 control |