403Webshell
Server IP : 172.24.0.40  /  Your IP : 216.73.216.239
Web Server : Apache
System : Linux dbweb26.ust.edu.ph 4.18.0-513.5.1.el8_9.x86_64 #1 SMP Fri Sep 29 05:21:10 EDT 2023 x86_64
User : apache ( 48)
PHP Version : 8.2.18
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /proc/self/root/home/ajels/public_html/wp-content/plugins/ninja-forms/assets/js/min/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /proc/self/root/home/ajels/public_html/wp-content/plugins/ninja-forms/assets/js/min/builder.js.map
{"version":3,"sources":["../../../config-wrap-start-default.js","../../../node_modules/almond/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","models/app/settingModel.js","models/app/settingCollection.js","models/app/settingGroupModel.js","models/app/settingGroupCollection.js","models/app/typeModel.js","models/app/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/contentPublicLink.js","views/app/drawer/headerPublicLink.js","views/app/drawer/contentNewForm.js","views/app/drawer/headerNewForm.js","controllers/app/drawerConfig.js","views/app/drawer/defaultSettingsTitle.js","views/actions/drawer/settingsTitle.js","views/advanced/drawer/calculationsTitle.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","controllers/app/fieldset.js","controllers/app/textboxSetting.js","controllers/app/toggleSetting.js","controllers/app/buttonToggleSetting.js","controllers/app/numberSetting.js","controllers/app/radioSetting.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","controllers/app/getNewSettingGroupCollection.js","controllers/app/settingMedia.js","controllers/app/publicLink.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","views/fields/preview/element.js","views/fields/preview/repeaterElementEmpty.js","views/fields/preview/repeaterElementCollection.js","views/fields/preview/repeaterElementLayout.js","views/fields/preview/label.js","views/fields/fieldItem.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","views/app/drawer/imageOptionRepeaterOption.js","views/app/drawer/imageOptionRepeaterComposite.js","controllers/app/imageOptionRepeater.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/fields/fieldRepeater.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/actions/save.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/mainContentEmpty.js","views/app/formTitle.js","views/loadViews.js","main.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","Marionette","ItemView","extend","tagName","template","initialize","this","listenTo","nfRadio","channel","render","model","on","onRender","$el","children","unwrap","setElement","events","clickAppMenu","trigger","templateHelpers","renderDashicons","dashicons","icon","document","createElement","classList","add","outerHTML","renderClasses","classes","request","get","renderUrl","url","formModel","renderTarget","renderDisabled","disabled","appMenuItemView","CollectionView","childView","onShow","el","find","bounceIcon","that","renderPublish","publishWidth","maybeDisabled","maybeRenderCancel","renderPublicLink","Backbone","Radio","isNaN","publicLink","clickPublish","clickViewChanges","clickPublicLink","changeModel","effect","times","clickMobileMenu","builderEl","toggleClass","appMenuCollectionView","appMenuButtonsView","mobileMenuButtonView","LayoutView","regions","menu","buttons","mobileMenuButton","appDomainCollection","show","collection","clickLogo","appHeaderView","appSubHeaderView","app","formTitle","appSub","changeSubHeader","formSettings","formTitleView","currentDomain","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","height","topLeft","leftLeft","left","css","position","topRight","leftRight","scrollTop","right","mobileDashicon","mobileMenuItemView","CompositeView","attachHtml","collectionView","append","drawerEmptyView","header","content","footer","getEl","loadContent","emptyContent","perfectScrollbar","drawerID","drawer","contentView","headerView","footerView","empty","clickToggleDrawer","clickTag","active","mergeTagItemView","updateFields","fieldCollection","set","Model","defaults","exclude","mergeTagModel","Collection","mergeTagsSectionView","MergeTagCollection","getMergeTagsView","reRender","settingModel","mergeTagCollection","defaultGroups","where","default_group","calcMergeTagGroup","useMergeTags","_","each","remove","include","models","sectionModel","mainView","mobileMenuView","drawerView","mergeTagsContentView","menuDrawer","mergeTagsContent","getBuilderEl","getBuilderView","mergeTagsClone","clone","openDrawer","closeDrawer","changeDomain","addListener","dataModel","listen","updateSetting","clickExtra","getRemote","settingView","srcElement","addClass","remote","parentValue","action","security","nfAdmin","ajaxNonce","post","ajaxurl","response","JSON","parse","options","clickOpenDrawer","toggleDrawerSize","getClosedDrawerPos","preventClose","enableClose","maybePreventClose","objPreventClose","filterFocused","currentDrawer","removeClass","rightClosed","drawerEl","checkCloseDrawerPos","setInterval","clearInterval","target","currentDomainID","hasFocus","checkOpenDrawerPos","focusFilter","filterEl","focus","width","keys","key","getPreventClose","clearFilter","blurFilter","changeFilter","maybeChangeFilter","keyCode","addObject","String","val","trim","blur","getFocus","drawerDisabled","defaultHeaderView","defaultFooterView","getHeaderView","getFooterView","drawerModel","removeStagedField","stagedFieldView","stagedFieldsEmptyView","emptyView","activeClass","getStagedFieldsEl","sortable","placeholder","helper","tolerance","over","ui","out","receive","update","start","stop","draggable","opacity","connectToSortable","appendTo","refreshPositions","grid","element","onAddChild","onRemoveChild","hasStagedFields","stagingModel","comparator","bindAll","getTypeSection","dragging","drag","disableSelection","clickFieldType","contains","modalContent","jBox","zIndex","closeButton","overlay","repositionOnOpen","reposition","open","mousedownFieldType","maybeClickFieldType","renderFieldTypes","html","fieldTypes","type","nicename","escape","templateHTML","renderType","savedField","availableField","htmlFragments","createRange","createContextualFragment","appendChild","innerHTML","fieldTypeSectionView","drawerStagingView","StagingCollection","fieldTypeSectionCollectionView","staging","primary","secondary","filterFieldTypes","removeFieldTypeFilter","savedCollection","primaryCollection","fieldTypeSectionCollection","secondaryCollection","stagingCollection","filteredSectionCollection","reset","childViewOptions","getChildView","itemSettingCollectionView","settings","devMode","visibleSettings","setting","style","display","hide","clickToggleGroup","renderLabel","label","groupLabel","renderArrowDir","itemSettingGroupView","itemSettingGroupCollectionView","settingTitle","settingGroups","groupCollection","typeModel","titleView","maybeRenderTitle","title","renderTypeNicename","domainID","scroll","clickAddAction","section","actionTypeButtonView","hasContents","renderNicename","slug","hide_merge_tags","error","maybePreventUI","objectType","updateKey","keyModel","SettingCollection","settingGroupModel","SettingGroupCollection","option","actionTypeCollectionView","actionTypeCollection","core","management","payments","automation","marketing","crms","notifications","filteractionTypes","removeactionTypeFilter","installedActions","updateInstalledActionGroups","availableActions","updateAvailableActionGroups","coreCollection","paymentsCollection","marketingCollection","managementCollection","crmCollection","notificationsCollection","automationCollection","filteredInstalled","filteredAvailable","group","sort","undoSingle","viewChangesItem","clickUndoChanges","settingErrorView","renderError","renderWarning","dep","match","labelText","updateIcon","updateLink","labelWrapper","refresh","createTextNode","drawerOpened","drawerClosed","unescape","silent","onBeforeRender","next","maxWidth","theme","closeOnClick","mask","input","attr","autoNumericOptions","digitGroupSeparator","nfi18n","thousands_sep","decimalCharacter","decimal_point","AutoNumeric","currencySymbol","format","console","log","errorRegion","getRegion","renderVisible","renderSetting","renderLabelClasses","use_merge_tags","renderTooltip","help","helpText","helpTextContainer","helpIcon","helpIconLink","setAttribute","helpTextWrapper","renderEmailFieldOptions","fields","initialOption","select","field","emptyContainer","renderMergeTags","renderMinMax","minMaxStr","min_val","isNumeric","max_val","step","renderMinMaxHelper","minMaxHelperStr","minVal","maxVal","changeSetting","keyUpSetting","clickSetting","itemSettingView","embedForm","enablePublicLink","copyPublicLink","formSettingsDataModel","allowPublicLinkSettingModel","embedFormSettingModel","public_link_key","publicLinkStructure","publicLinkSettingModel","copyFormEmbedHandler","getElementById","execCommand","copyPublicLinkHandler","confirmResetPublicLinkHandler","parentNode","node","resetPublicLinkHandler","cancelResetPublicLinkHandler","formName","formSubmit","titleSettingModel","addSubmitSettingModel","findWhere","drawerCollection","addFieldView","editSettingsView","editSettingsHeaderView","addActionView","viewChangesView","viewChangesHeaderView","publicLinkView","publicLinkHeaderView","newFormView","newFormHeaderView","mobileItemControlsView","getContentView","view","getDrawerCollection","getDrawer","renderDocLink","DefaultSettingsTitleView","ActionsSettingsTitleView","CalculationsTitleView","EmptyView","hotkeys","getSettingsTitleView","getDefaultSettingsTitleView","getGutterLeftView","getGutterRightView","domainModel","reorderOnSort","getEmptyView","getSortableEl","initSortable","destroySortable","containment","cancel","scrollSensitivity","item","dropping","hasClass","renderAddButton","button","clickAddSavedField","addSavedFieldView","renderjBoxContent","addSaved","addSavedjBox","destroy","unset","x","y","outside","onCreated","setContent","attach","displayName","saved","renderSavedStar","star","actionCollection","clickEdit","singleTapEdit","clickDelete","clickDuplicateField","mouseoverItemControl","itemControlsView","itemControls","maybeDeactivate","click","maybeClickEdit","changeToggle","renderToggle","settingName","actionLabel","actionView","droppable","accept","hoverClass","drop","updateActiveClass","editActive","settingItem","objectDomain","order","idAttribute","fieldType","parentType","listimageGet","listimageSet","updateFieldKey","attributes","changedAttributes","formatLabel","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","domainFormFields","Esc","up","down","getSubHeaderView","getMainContentView","formContentData","formContentLoadFilters","sortedArray","without","first","formContentViewFilters","formContentView","gutterFilters","gutterView","domainActions","domainAdvanced","previewurl","getDomainCollection","getDomainModel","fieldModels","loading","changeStatus","appModel","clean","mobile","isMobile","getData","getSetting","getCurrentDomain","getCurrentDrawer","updateCurrentDomain","updateCurrentDrawer","checkDeps","deps_settings","currentDrawerID","toggleSettingGroup","errors","updateDB","defaultSaveFilter","jsAction","formContentSaveDataFilters","formData","stringify","parent_id","deleted_fields","actions","deleted_actions","autoClose","chunk_size","data_chunks","RegExp","saveChunkedForm","responseData","form","handleFinalResponse","fail","xhr","status","handleFinalFailure","chunks","currentChunk","formId","new_publish","total_chunks","postObj","batch_type","chunk_total","chunk_current","chunk","form_id","batchNonce","then","res","last_request","batch_complete","requesting","exception","alert","pluck","preloadedFormData","getFormModel","disablePreview","enablePreview","changePreviewNicename","publish","viewChanges","changeCollection","cid","ChangeModel","registerChange","getCollection","maybeResetCollection","changes","dashicon","undoChanges","change","dispatchClick","undoAll","cookie","includes","d","Date","setTime","getTime","expires","toUTCString","cname","publishResponse","new_ids","newID","oldID","forms","history","replaceState","changeAppDomain","preventChange","enableChange","objPreventChange","maybePreventChange","mainEl","changePushState","pushState","location","href","newUrl","toString","changeHotkeys","addNewAction","changeDomainFields","changeDomainActions","changeDomainSettings","hotkey","msg","fieldsDomain","actionsDomain","settingsDomain","ignoreAttributes","setAppClean","undoChangeSetting","undoAddObject","undoRemoveObject","undoDuplicateObject","undoSortFields","undoAddListOption","undoRemoveListOption","undoSortListOptions","before","maybeRemoveChange","objectModel","results","objectCollection","objModels","cloneModelDeep","clonedCollection","newModel","getSettingChildView","after","object","setupTooltip","renderInfo","info","fieldsetView","settingCollection","createSettingsCollection","validateSetting","endsWith","regexp","search","htmlDetectedError","isActionNameLabel","foundIndex","foundChar","titleLabelsErrorMessage","settingTypeModel","startValue","getAttribute","endValue","deleting","maybeDelete","clickDuplicate","modelID","toLowerCase","inArray","formID","fieldKey","fieldID","done","Array","isArray","forEach","field_has_data","doDeleteFieldModal","modalData","closeOnEsc","fieldDataDeleteMsg","btnPrimary","text","delete","deleteModal","toggleModal","btnSecondary","NinjaModal","tmpID","tagSectionCollection","mergeTags","tagSection","tags","fieldTags","tag","getFieldKeyFormat","calcTags","calcCollection","calcModel","currentElement","clickMergeTag","addFieldTags","deleteFieldTags","updateCalcTags","updateCurrentElement","updateCurrentSetting","getSectionModel","updateID","replaceFieldKey","initMergeTags","mergeTagsView","jBoxes","maxHeight","onOpen","prev","onClose","tagModel","currentValue","newPos","currentPos","caret","substr","summernote","calcTag","getFieldKeyFormatCalc","optionModel","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","newVal","insertTag","mergeTagView","sectionFilter","searchFilter","filter","child","fieldsToRemove","excludeFromCalcs","term","blacklist","updateActive","onClick","updateTags","setActive","siblings","mergeTagGroupView","updateFilter","event","firstFilteredTag","sections","MergeTagModel","MergeTagLookupCollection","MergeTagView","MergeTagListView","MergeTagGroupView","MergeTagGroupListView","MergeTagFilterView","MergeTagBoxLayout","old","mergeTagsButtonClick","afterAppStart","beforeRenderSetting","beforeDrawerClose","bind","selector","focusCallback","keyupCallback","closest","layout","tagCollection","mergeTagListView","mergeTagGroupListView","rteEditor","posY","outerHeight","tagBoxY","windowHeight","innerHeight","tagBoxHeight","boxHeight","repeaterRow","scrollLeft","posX","$input","str","caretPos","patt","exec","string","childNode","childNodes","nodeValue","range","sel","getSelection","setStart","err","collapse","removeAllRanges","addRange","$this","$inputSetting","autocomplete","$overlayElement","dataID","so","mergetags","mergetag","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","toolbar","linkButton","mediaButton","codemirror","lineNumbers","lineWrapping","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","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","editFormLinkText","editFormLink","editFormListItem","closeMobileMenu","addNotice","closeNotice","notices","appDefaults","constructOnInit","stack","animation","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","getNewSettingGroupCollection","validatePublicLink","newPublicLinkKey","Math","random","typeSectionModel","TypeCollection","SectionCollection","fieldTypeSections","registerSection","fieldTypeData","getFieldType","getTypeCollection","getTypeSections","getSavedFields","shiftKey","startDrag","stopDrag","getCurrentDraggableHelperClone","setProperty","draggableHelperClone","stagedFields","num","addStagedField","getStagingCollection","sortStagedFields","clearStagedFields","beforeCloseDrawer","now","tmpField","sortableEl","pos","receiveStagedFields","overStagedFields","outStagedFields","startStagedFields","stopStagedFields","addActiveClass","stagedFieldsEl","removeActiveClass","currentHelper","helperClone","hiddenFields","addHiddenFieldTypes","filtered","filterCollection","found","alias","convertDateFormat","dateFormat","original","moment","locale","locales","defineLocale","months","monthsShort","weekdays","weekdaysShort","weekdaysMin","maybeFilterHTML","filter_esc_status","renderPlaceholder","disable_input","maybeRequired","maybeInputLimit","maybeDisableAutocomplete","maybeChecked","default_value","renderOptions","optionLabel","taxonomy","taxonomyTerms","typeData","settingGroup","enabledTaxonomyTerms","attribute","reduce","enabledTaxonomyTerm","terms","checked","defaultValue","default","defaultOption","renderOtherAttributes","multi_size","renderProduct","renderNumberDefault","renderCurrencyFormatting","renderRatings","ratingOutput","number_of_stars","renderHourOptions","hours","hours_24","renderMinuteOptions","minute_increment","maybeRenderAMPM","maybeRenderTime","date_mode","repeaterFieldModel","emptyViewOptions","getRepeaterFieldsCollection","droppedFieldID","droppedFieldModel","previewRepeaterElementCollectionView","renderDescText","maybeRenderHelp","previewElementView","previewRepeaterElementView","previewLabelView","doingShortcut","previewLabel","previewElement","isFieldTypeTemplateAvailable","itemView","touch","ClassyWiggle","degrees","delay","renderRequired","required","getFieldID","renderIcon","labelPosition","label_pos","renderDescriptionText","desc_text","mousedown","singletap","swipeleft","swiperight","tapend","maybeShortcut","maybeTapEdit","swipeLeft","startEvnt","swipeRight","FieldModel","FieldItemView","receiveFieldsSortable","overfieldsSortable","outFieldsSortable","stopFieldsSortable","startFieldsSortable","updateFieldsSortable","receiveRepeaterField","insertedAt","fieldTypeEl","newHelper","$parentHelper","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","keyup","changeOption","deleteOption","keyupOption","maybeAddOption","findByIndex","getColumns","renderFieldSelect","bottom","renderNonSaveFieldSelect","removeFieldsLookup","column","optionNode","innerText","listOptionView","listEmptyView","listOptionCollection","optionCollection","maybeHideNew","handle","forcePlaceholderSize","importLink","clickImport","renderHeaders","beforeColumns","afterColumns","valueChars","isValue","isCalc","replaceChildren","calcValueChars","col","headerText","headerContainer","renderFieldsetClasses","currency_symbol","limit","clickAddOption","textarea","trimLeft","trimRight","lines","line","row","slugify","separator","listCompositeView","updateOptionSortable","stopOptionSortable","startOptionSortable","convertSettings","optionView","Number","triggerDataModel","modelData","new","newOrder","image","optionContainerDiv","valueEl","imageIdEl","labelEl","img_container","$imgs","new_img","src","image_id","clearEditActive","fieldSettings","getSettingModel","getSettingCollection","dropCreditCardField","newField","stageCreditCardField","ListOptionCollection","updateOptionLabel","updateOptionValue","convertOptions","insertField","productFields","getProductFields","addMask","newFieldKey","updateLabel","valueOf","setError","keyExists","testKey","startWiggle","stopWiggle","initWiggle","updateField","modified","fieldData","created_at","newType","newTypeDefaults","settingDefaults","addDatepicker","datePickerSettings","filteredDatePickerSettings","dateObject","flatpickr","setupCollection","addChildField","receiveFields","getChildField","processStagedFields","sortRepeaterField","overRepeaterField","outRepeaterField","stopRepeaterField","startRepeaterField","updateRepeaterField","maybeDeleteField","elId","repeaterField","sortableElArray","childFieldID","parentFieldModel","childFieldModel","parentID","actionTypeData","installed","available","getType","getInstalledActions","getAvailableActions","actionType","addAction","removeAction","getAction","getTmpID","deleteAction","actionSettings","updateFromAddress","isValidEmail","home_url_host","errorInvalidEmailFromAddress","email","dropActionType","type_slug","actionTypeModel","typeCollection","filterActionTypes","newInstalled","newAvailable","defaultFields","clickListUpdate","maybeRenderFields","maybeRenderGroups","registerFieldsListener","registerGroupsListener","updateFieldMapping","updateInterestGroups","updateLists","lists","always","selectedList","list","groups","registerListener","maybeUpdateSettings","isString","isObject","mapObject","filteredCollection","every","getFields","field_key","returnFields","allowed","sortBy","calcModels","calcs","getCalcs","returnCalcs","isEmpty","initCollectPayment","maybeClearTotal","maybeUpdateTotal","maybeError","oldName","initSave","checkFieldAdded","checkFieldDeleted","newFieldModel","formSettingTypeData","settingsModel","getSettings","updateCalc","sortCalc","checkName","checkEQ","checkDec","checkAllCalcs","nameExists","eq","errorSelfRef","errorFutureCalc","calculations","targetCalc","selfRef","futureCalc","dec","errorNonIntDec","abs","nonIntDec","Remote","Drawer","DrawerConfig","DomainConfig","AppData","DrawerToggleSettingGroup","UpdateDB","FormData","PreviewLink","AppMenuButtons","AppTrackChanges","AppUndoChanges","AppPublishResponse","AppChangeDomain","Pushstate","Hotkeys","CleanState","CoreUndo","CloneModelDeep","DrawerSettingChildView","ChangeSettingDefault","Fieldset","TextboxSetting","ToggleSetting","ButtonToggleSetting","NumberSetting","RadioSetting","ItemControls","MergeTags","MergeTagsBox","ItemSettingFill","ConfirmPublish","RTE","SettingFieldSelect","SettingFieldList","SettingHTML","SettingColor","ChangeMenu","AppMobile","AppNotices","AppUnloadCheck","FormContentFilters","FormContentGutterFilters","CloneCollectionDeep","TrackKeyDown","PerfectScroll","GetNewSettingGroupCollection","SettingMedia","PublicLink","FieldTypes","FieldTypeDrag","FieldStagingDrag","StagedFieldsData","StagedFieldsSortable","DrawerFilterFieldTypes","MainContentFieldsSortable","FieldData","OptionRepeater","imageOptionRepeater","FieldsEditActive","FieldSettings","FieldCreditCard","FieldList","FieldPassword","FieldQuantity","FieldShipping","FieldKey","Notices","FieldsMobile","SavedFields","FieldDatepicker","FieldDisplayCalc","FieldRepeater","ActionTypes","ActionData","ActionSettings","ActionEditActive","ActionEmailFromSetting","ActionAddTypes","ActionTypeDrag","ActionDroppable","ActionFilterTypes","ActionNewsletterList","ActionDeleteFieldListener","ActionCollectPaymentFields","ActionCollectPaymentCalculations","ActionCollectPaymentFixed","ActionCollectPayment","ActionSave","SettingTypes","SettingData","FormSettings","SettingsEditActive","SettingsClickEdit","AdvancedCalculations","renderTitle","fieldItemView","mainContentEmptyView","FormTitleView","getFieldItem","getMainContentEmpty","getFormTitle","nfDashInlineVars","addEventListener","BuilderView","LoadControllers","LoadViews","Application","Renderer","onStart","nfOB","NinjaOnboarding","onboardingStep","isClean","cleanChanged","startsWith","evaluate","interpolate","variable"],"mappings":"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B,UAIA9nB,EAAAzrB,IAAA,SAAA8e,GACA2M,EAAAh0B,QAAA,gBAAAg0B,EAEA,EAEAknB,cAAA,SAAA13C,GACA,IAAA7B,EAAAzC,KACAsE,EAAAoG,OAAAxO,KAAA,SAAAmzC,GACA5sC,EAAAo5C,UAAAxM,EAAA1tC,IAAA,QAAA0tC,GACA5sC,EAAAq5C,QAAAzM,EAAA1tC,IAAA,MAAA0tC,GACA5sC,EAAAs5C,SAAA1M,EAAA1tC,IAAA,OAAA0tC,EACA,GACA,GAKA,ICpMAx1C,EACA,8BAAA,CAIA,yBACA,yBACA,+BACA,+BACA,uBACA,2CACA,2BACA,2BACA,8BACA,8BACA,+BACA,8BACA,kCACA,+BACA,4BACA,0BACA,6BACA,2BACA,iCACA,sCACA,uCACA,2BACA,iCACA,gCACA,sCACA,gCACA,+BACA,+BACA,4BACA,8BACA,kCACA,iCACA,sBACA,qCACA,mCACA,8BACA,+BACA,6BACA,yBACA,0BACA,8BACA,qCACA,2CACA,sCACA,+BACA,gCACA,+CACA,+BACA,6BAIA,2BACA,mCACA,iCACA,6BACA,qCACA,iCACA,8BACA,0BACA,iCACA,sCACA,gCACA,mCACA,qCACA,+BACA,mCACA,mCACA,mCACA,yBACA,6BACA,4BACA,iCACA,qCACA,sCACA,mCAKA,4BACA,2BACA,qCACA,iCACA,uCACA,qCACA,+BACA,gCACA,kCACA,qCACA,0CACA,2CACA,iDACA,0CACA,qCACA,2BAKA,6BACA,4BACA,oCACA,kCACA,iCACA,sCAEA,SAIAgjD,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,EACAC,EACAC,EACAC,EACAC,EACAC,EAIAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,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,GACAC,GAKAC,GACAC,GACAC,GACAC,GACAC,GACAC,IA4HA,OAzHAjjD,WAAAlF,OAAAoF,OAAA,CACAG,WAAA,WAIA,IAAAu/C,EACA,IAAAC,EACA,IAAA3B,EACA,IAAAf,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAE,EACA,IAAAG,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAG,EACA,IAAAC,EACA,IAAAC,EACA,IAAAS,EACA,IAAAI,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAW,EACA,IAAAV,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAlC,EACA,IAAAqC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAE,EAQA,IAAA3B,EACA,IAAAoC,GACA,IAAAC,GACA,IAAAT,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,GACA,IAAAC,GACA,IAAAnC,EACA,IAAAE,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAP,EACA,IAAAwC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GAIA,IAAAU,GACA,IAAAC,GACA,IAAAE,GACA,IAAAE,GACA,IAAAC,GACA,IAAAf,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAG,GAC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","file":"builder.js","sourcesContent":["(function () {\n","/**\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\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, normalizedBaseParts,\n            baseParts = baseName && baseName.split(\"/\"),\n            map = config.map,\n            starMap = (map && map['*']) || {};\n\n        //Adjust any relative paths.\n        if (name) {\n            name = name.split('/');\n            lastIndex = name.length - 1;\n\n            // If wanting node ID compatibility, strip .js from end\n            // of IDs. Have to do this here, and not in nameToUrl\n            // because node allows either .js or non .js to map\n            // to same file.\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n            }\n\n            // Starts with a '.' so need the baseName\n            if (name[0].charAt(0) === '.' && baseParts) {\n                //Convert baseName to array, and lop off the last part,\n                //so that . matches that 'directory' and not name of the baseName's\n                //module. For instance, baseName of 'one/two/three', maps to\n                //'one/two/three.js', but we want the directory, 'one/two' for\n                //this normalization.\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n                name = normalizedBaseParts.concat(name);\n            }\n\n            //start trimDots\n            for (i = 0; i < name.length; i++) {\n                part = name[i];\n                if (part === '.') {\n                    name.splice(i, 1);\n                    i -= 1;\n                } else if (part === '..') {\n                    // If at the start, or previous value is still ..,\n                    // keep them so that when converted to a path it may\n                    // still work when converted to a path, even though\n                    // as an ID it is less than ideal. In larger point\n                    // releases, may be better to just kick out an error.\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\n                        continue;\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        }\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    //Creates a parts array for a relName where first part is plugin ID,\n    //second part is resource ID. Assumes relName has already been normalized.\n    function makeRelParts(relName) {\n        return relName ? splitPrefix(relName) : [];\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, relParts) {\n        var plugin,\n            parts = splitPrefix(name),\n            prefix = parts[0],\n            relResourceName = relParts[1];\n\n        name = parts[1];\n\n        if (prefix) {\n            prefix = normalize(prefix, relResourceName);\n            plugin = callDep(prefix);\n        }\n\n        //Normalize according\n        if (prefix) {\n            if (plugin && plugin.normalize) {\n                name = plugin.normalize(name, makeNormalize(relResourceName));\n            } else {\n                name = normalize(name, relResourceName);\n            }\n        } else {\n            name = normalize(name, relResourceName);\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, relParts,\n            args = [],\n            callbackType = typeof callback,\n            usingExports;\n\n        //Use name if no relName\n        relName = relName || name;\n        relParts = makeRelParts(relName);\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], relParts);\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, makeRelParts(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(\"../../../node_modules/almond/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 ) return '';\n\n\t\t\t\t\tvar icon = document.createElement( 'span' );\n\t\t\t\t\ticon.classList.add( 'dashicons' );\n\t\t\t\t\ticon.classList.add( this.dashicons );\n\n\t\t\t\t\treturn icon.outerHTML;\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","/**\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 = that.publishWidth + 'px';\n\t    \t\t\t} else {\n\t    \t\t\t\tthis.publishWidth = 'auto';\n\t    \t\t\t}\n\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 * [DEPRECATED] 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\t\treturn '';\n\t\t\t\t},\n\n\t    \t\trenderPublicLink: function() {\n\t\t\t\t\t\t// Don't show public link if the form has a temp ID\n\t\t\t\t\t\tvar formModel = Backbone.Radio.channel('app').request('get:formModel');\n\t\t\t\t\t\tif (isNaN(formModel.get('id'))) { return };\n\t\t\t\t\t\t// Otherwise, display normally\n\t    \t\t\tvar publicLink = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-app-header-public-link' );\n\t    \t\t\t\treturn publicLink( this );\n\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\t'click .publicLink': 'clickPublicLink',\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\tclickPublicLink: function( e ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publicLink', 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","/**\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 ) return '';\n\n                    var icon = document.createElement( 'span' );\n                    icon.classList.add( 'dashicons' );\n                    icon.classList.add( this.mobileDashicon );\n\n                    return icon.outerHTML;\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","/**\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\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.\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\tjQuery( '.nf-secondary-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\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\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\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\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\t\t\tjQuery( '.nf-secondary-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}\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 );\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 ( '' != String(filterEl.val()).trim() ) {\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 ).css( 'z-index', 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 ).css( 'z-index', 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( e.target.classList.contains('available') ) {\n\t\t\t\tvar id = jQuery( e.target ).data( 'id' );\n\t\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', id );\n\t\t\t\tvar modalContent = type.get( 'modal_content' );\n\n\t\t\t\tvar fieldModal = new jBox( 'Modal', {\n\t\t\t\t  content: modalContent,\n\t\t\t\t  zIndex:99999999,\n\t\t\t\t  closeButton: 'box',\n\t\t\t\t  overlay: true,\n\t\t\t\t  width: 600,\n\t\t\t\t  repositionOnOpen: true,\n\t\t\t\t  reposition: true\n\t\t\t\t});\n\n\t\t\t\tfieldModal.open();\n\t\t\t} else if ( ! 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 = document.createElement( 'span' );\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 = _.escape(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            var templateHTML = renderType( { id: id, nicename: nicename, icon: icon, type: type, savedField: that.savedField, availableField: that.availableField } );\n                        var htmlFragments = document.createRange().createContextualFragment( templateHTML );\n                        html.appendChild( htmlFragments );\n\t\t\t        } );\n\t\t\t        return html.innerHTML;\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\n\t\t\t\tavailableField: function() {\n\t\t\t\t\tif('undefined' !== typeof(this.type.get('modal_content'))) {\n\t\t\t\t\t\treturn 'available';\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\n\t\t\tthis.settings.show( new itemSettingCollectionView( { collection: this.model.get( 'settings' ), dataModel: this.dataModel } ) );\n\n\t\t\tif(!nfAdmin.devMode) {\n\t\t\t\t// Only check if not for calculations.\n\t\t\t\tif(0 == this.$el.find('.calculations').length){\n\t\t\t\t\tvar visibleSettings = false;\n\t\t\t\t\tthis.$el.find('.nf-setting').each(function(index, setting) {\n\t\t\t\t\t\tif( 'none' !== setting.style.display ){\n\t\t\t\t\t\t\tvisibleSettings = true;\n\t\t\t\t\t\t\treturn false; //Exit jQuery each loop.\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif(!visibleSettings) {\n\t\t\t\t\t\tthis.$el.hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( this.model.get( 'display' ) ) {\n\t\t\t\t// ...\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\tif( 'undefined' != typeof this.options.typeModel && 'undefined' != typeof this.options.typeModel.id ) {\n\t\t\t\t// Set the object domain for advanced settings groups.\n\t\t\t\tthis.model.set( 'objectDomain', this.options.typeModel.id );\n\t\t\t}\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\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\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\t\t\t}\n\t\t}\n\t});\n\n\treturn view;\n} );\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\thasContents: function() {\n\t\t\t\t\treturn that.collection.length > 0;\n\t\t\t\t},\n\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 * 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 * 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 * 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 * 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', 'models/app/typeCollection'], function( actionTypeCollectionView, actionTypeCollection ) {\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\tcore: '#nf-drawer-primary-core',\n\n\t\t\tmanagement: '#nf-drawer-secondary-management',\n\t\t\tpayments: '#nf-drawer-secondary-payments',\n\t\t\tautomation: '#nf-drawer-secondary-automation',\n\t\t\tmarketing: '#nf-drawer-secondary-marketing',\n\t\t\tcrms: '#nf-drawer-secondary-crms',\n\t\t\tnotifications: '#nf-drawer-secondary-notifications',\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.updateInstalledActionGroups();\n\n\t\t\tthis.availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n\t\t\tthis.updateAvailableActionGroups();\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.core.show( new actionTypeCollectionView( { collection: this.coreCollection } ) );\n\n\t\t\tthis.payments.show( new actionTypeCollectionView( { collection: this.paymentsCollection } ) );\n\t\t\tthis.marketing.show( new actionTypeCollectionView( { collection: this.marketingCollection } ) );\n\t\t\tthis.management.show( new actionTypeCollectionView( { collection: this.managementCollection } ) );\n\t\t\tthis.crms.show( new actionTypeCollectionView( { collection: this.crmCollection } ) );\n\t\t\tthis.notifications.show( new actionTypeCollectionView( { collection: this.notificationsCollection } ) );\n\t\t\tthis.automation.show( new actionTypeCollectionView( { collection: this.automationCollection } ) );\t\t\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.installedActions = filteredInstalled;\n\t\t\tthis.updateInstalledActionGroups();\n\t\t\tthis.primary.reset().show( new actionTypeCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.core.reset().show( new actionTypeCollectionView( { collection: this.coreCollection } ) );\n\n\t\t\tthis.availableActions = filteredAvailable;\n\t\t\tthis.updateAvailableActionGroups();\n\t\t\tthis.payments.reset().show( new actionTypeCollectionView( { collection: this.paymentsCollection } ) );\n\t\t\tthis.marketing.reset().show( new actionTypeCollectionView( { collection: this.marketingCollection } ) );\n\t\t\tthis.management.reset().show( new actionTypeCollectionView( { collection: this.managementCollection } ) );\n\t\t\tthis.crms.reset().show( new actionTypeCollectionView( { collection: this.crmCollection } ) );\n\t\t\tthis.notifications.reset().show( new actionTypeCollectionView( { collection: this.notificationsCollection } ) );\n\t\t\tthis.automation.reset().show( new actionTypeCollectionView( { collection: this.automationCollection } ) );\t\n\t\t\t\n\t\t},\n\n\t\tremoveactionTypeFilter: function () {\n\t\t\tthis.installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n\t\t\tthis.updateInstalledActionGroups();\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.primaryCollection } ) );\n\t\t\tthis.core.show( new actionTypeCollectionView( { collection: this.coreCollection } ) );\n\n\t\t\tthis.availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n\t\t\tthis.updateAvailableActionGroups();\n\t\t\tthis.payments.show( new actionTypeCollectionView( { collection: this.paymentsCollection } ) );\n\t\t\tthis.marketing.show( new actionTypeCollectionView( { collection: this.marketingCollection } ) );\n\t\t\tthis.management.show( new actionTypeCollectionView( { collection: this.managementCollection } ) );\n\t\t\tthis.crms.show( new actionTypeCollectionView( { collection: this.crmCollection } ) );\n\t\t\tthis.notifications.show( new actionTypeCollectionView( { collection: this.notificationsCollection } ) );\n\t\t\tthis.automation.show( new actionTypeCollectionView( { collection: this.automationCollection } ) );\n\t\t},\n\n\t\tupdateInstalledActionGroups: function() {\n\t\t\tthis.primaryCollection = new actionTypeCollection(\n\t\t\t\tthis.installedActions.where({group: ''}),\n\t\t\t\t{\n\t\t\t\t\tslug: 'installed',\n\t\t\t\t\tnicename: 'Installed Add-on Actions'\n\t\t\t\t} \n\t\t\t);\n\t\t\tthis.primaryCollection.comparator = 'nicename';\n\t\t\tthis.primaryCollection.sort();\n\n\t\t\tthis.coreCollection = new actionTypeCollection(\n\t\t\t\tthis.installedActions.where({group: 'core'}),\n\t\t\t\t{\n\t\t\t\t\tslug: 'core',\n\t\t\t\t\tnicename: 'Core Actions'\n\t\t\t\t} \n\t\t\t);\n\t\t},\n\n\t\tupdateAvailableActionGroups: function() {\n\t\t\tthis.paymentsCollection = new actionTypeCollection(\n\t\t\t\tthis.availableActions.where({group: 'payments'}),\n\t\t\t\t{\n\t\t\t\t\tslug: 'payments',\n\t\t\t\t\tnicename: 'Accept Payments & Donations'\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.marketingCollection = new actionTypeCollection(\n\t\t\t\tthis.availableActions.where({group: 'marketing'}),\n\t\t\t\t{\n\t\t\t\t\tslug: 'marketing',\n\t\t\t\t\tnicename: 'Email Marketing'\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.managementCollection = new actionTypeCollection(\n\t\t\t\tthis.availableActions.where({group: 'management'}),\n\t\t\t\t{\n\t\t\t\t\tslug: 'management',\n\t\t\t\t\tnicename: 'User & Submission Management'\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.crmCollection = new actionTypeCollection(\n\t\t\t\tthis.availableActions.where({group: 'crms'}),\n\t\t\t\t{\n\t\t\t\t\tslug: 'crms',\n\t\t\t\t\tnicename: 'CRMs'\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.notificationsCollection = new actionTypeCollection(\n\t\t\t\tthis.availableActions.where({group: 'notifications'}),\n\t\t\t\t{\n\t\t\t\t\tslug: 'notifications',\n\t\t\t\t\tnicename: 'Notifications & Workflow'\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.automationCollection = new actionTypeCollection(\n\t\t\t\tthis.availableActions.where({group: 'automation'}),\n\t\t\t\t{\n\t\t\t\t\tslug: 'automation',\n\t\t\t\t\tnicename: 'Automation'\n\t\t\t\t} \n\t\t\t);\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\t// If we don't have a 'settings' property, this is a legacy depdency setup.\n\t\t\t\tif ( 'undefined' == typeof deps.settings ) {\n\t\t\t\t\tdeps.settings = [];\n\t\t\t\t\t_.each(deps, function(dep, name){\n\t\t\t\t\t\tif( 'settings' !== name ) {\n\t\t\t\t\t\t\tdeps.settings.push( { name: name, value: dep } );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tdeps.match = 'all';\n\t\t\t\t}\n\n\t\t\t\tfor (var i = deps.settings.length - 1; i >= 0; i--) {\n\t\t\t\t\tlet name = deps.settings[i].name;\n\t\t\t\t\tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t}\n\t\t\t}\n\n            /**\n\t\t\t * For settings that require a remote refresh\n\t\t\t *   add an \"update\"/refresh icon to the label.\n             */\n            var remote = this.model.get( 'remote' );\n\t\t\tif( remote ) {\n                if( 'undefined' != typeof remote.refresh || remote.refresh ) {\n\t\t\t\t\tvar labelText, updateIcon, updateLink, labelWrapper;\n\n                    labelText = document.createTextNode( this.model.get('label') );\n\n                    updateIcon = document.createElement( 'span' );\n                    updateIcon.classList.add( 'dashicons', 'dashicons-update' );\n\n                    updateLink = document.createElement( 'a' );\n                    updateLink.classList.add( 'extra' );\n                    updateLink.appendChild( updateIcon );\n\n                    // Wrap the label text and icon/link in a parent element.\n                    labelWrapper = document.createElement( 'span' );\n                    labelWrapper.appendChild( labelText );\n                    labelWrapper.appendChild( updateLink );\n\n                    // The model expects a string value.\n                    this.model.set('label', labelWrapper.innerHTML );\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 i = deps.settings.length - 1; i >= 0; i--) {\n\t\t\t\t\tlet name = deps.settings[i].name;\n\t\t\t\t\tthis.dataModel.off( 'change:' + name, this.render );\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\t\t\t\tjQuery( input ).attr( 'contentEditable', true );\n\t\t\t\tswitch( mask.type ){\n\t\t\t\t\tcase 'numeric':\n\t\t\t\t\t\tvar autoNumericOptions = {\n\t\t\t\t\t\t\tdigitGroupSeparator: nfi18n.thousands_sep,\n\t\t\t\t\t\t\tdecimalCharacter: nfi18n.decimal_point\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnew AutoNumeric( input[0], autoNumericOptions );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'currency':\n\t\t\t\t\t\tvar autoNumericOptions = {\n\t\t\t\t\t\t\tdigitGroupSeparator: nfi18n.thousands_sep,\n\t\t\t\t\t\t\tdecimalCharacter: nfi18n.decimal_point,\n\t\t\t\t\t\t\tcurrencySymbol: nfi18n.currencySymbol\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnew AutoNumeric( input[0], autoNumericOptions );\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\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\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            const errorRegion = this.getRegion('error');\n            if (errorRegion && errorRegion.$el && errorRegion.$el.length > 0) {\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                    errorRegion.empty();\n                }\n            }\n        },\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t    \treturn {\n\n\t    \t\trenderVisible: function() {\n\n\t\t\t\t\tif(!nfAdmin.devMode){\n\t\t\t\t\t\tif('Action' == that.dataModel.get('objectType') && 'email' == that.dataModel.get('type')){\n\t\t\t\t\t\t\tif('cc' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t\tif('bcc' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t\tif('from_name' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t\tif('from_address' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t\tif('email_format' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif('Action' == that.dataModel.get('objectType') && 'save' == that.dataModel.get('type')){\n\t\t\t\t\t\t\tif('submitter_email' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif('label_pos' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('input_limit' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('input_limit_type' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('input_limit_msg' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t\n\t\t\t\t\t\tif('disable_input' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('disable_browser_autocomplete' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('mask' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('custom_mask' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('custom_name_attribute' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t// if('personally_identifiable' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t\n\t\t\t\t\t\t// \"administration\" settings\n\t\t\t\t\t\tif('key' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('admin_label' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('num_sort' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('user_state' == this.name) return 'style=\"display:none;\"';\n\n\t\t\t\t\t\t\n\t\t\t\t\t\tif('checkbox' == that.dataModel.get('type')){\n\t\t\t\t\t\t\tif('checked_value' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t\tif('unchecked_value' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif('starrating' == that.dataModel.get('type')){\n\t\t\t\t\t\t\tif('default' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// @TODO: This isn't actually working.\n\t\t\t\t\t\t// 'multi_size' is the correct type of datamodel.\n\t\t\t\t\t\tif('listmultiselect' == that.dataModel.get('type')){\n\t\t\t\t\t\t\tif('box_size' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif('date' == that.dataModel.get('type')){\n\t\t\t\t\t\t\tif('year_range_start' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t\tif('year_range_end' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn nfRadio.channel( 'settings' ).request( 'check:deps', this, that );\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 ) return '';\n\t\t\t\t\tvar helpText, helpTextContainer, helpIcon, helpIconLink, helpTextWrapper;\n\n\t\t\t\t\thelpText = document.createElement( 'div' );\n\t\t\t\t\thelpText.innerHTML = this.help;\n\t\t\t\t\t\n\t\t\t\t\thelpTextContainer = document.createElement( 'div' );\n\t\t\t\t\thelpTextContainer.classList.add( 'nf-help-text' );\n\t\t\t\t\thelpTextContainer.appendChild( helpText );\n\n\t\t\t\t\thelpIcon = document.createElement( 'span' );\n\t\t\t\t\thelpIcon.classList.add( 'dashicons', 'dashicons-admin-comments' );\n                    helpIconLink = document.createElement( 'a' );\n                    helpIconLink.classList.add( 'nf-help' );\n                    helpIconLink.setAttribute( 'href', '#' );\n                    helpIconLink.setAttribute( 'tabindex', '-1' );\n                    helpIconLink.appendChild( helpIcon );\n\n                    helpTextWrapper = document.createElement( 'span' );\n                    helpTextWrapper.appendChild( helpIconLink );\n                    helpTextWrapper.appendChild( helpTextContainer );\n\n                    // The template expects a string value.\n\t\t\t\t\treturn helpTextWrapper.innerHTML;\n\t\t\t\t},\n\n\t\t\t    /*\n\t\t\t     * Render a select element with only the email fields on the\n\t\t\t      * form\n\t\t\t     */\n\t\t\t    renderEmailFieldOptions: function() {\n\t\t\t\t    var fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n\t\t\t\t    initialOption = document.createElement( 'option' );\n\t\t\t\t    initialOption.value = '';\n\t\t\t\t    initialOption.label = '--';\n\t\t\t\t    initialOption.innerHTML = '--';\n\n\t\t\t\t    var select_value = '';\n\t\t\t\t    var select = document.createElement( 'select' );\n\t\t\t\t    select.classList.add( 'setting' );\n\t\t\t\t    select.setAttribute( 'data-id', 'my_seledt' );\n\t\t\t\t    select.appendChild( initialOption );\n\n\t\t\t\t    var index = 0;\n\t\t\t\t    var that = this;\n\t\t\t\t    fields.each( function( field ) {\n\t\t\t\t\t    // Check for the field type in our lookup array and...\n\t\t\t\t\t    if( 'email' != field.get( 'type' ) ) {\n\t\t\t\t\t\t    // Return if the type is in our lookup array.\n\t\t\t\t\t\t    return '';\n\t\t\t\t\t    }\n\n\t\t\t\t\t    var option = document.createElement( 'option' );\n\n\t\t\t\t\t    option.value = field.get( 'key' );\n\t\t\t\t\t    option.innerHTML = field.get( 'label' );\n\t\t\t\t\t    option.label = field.get( 'label' );\n\t\t\t\t\t    \n\t\t\t\t\t    if( that.value === field.get( 'key' ) ) {\n\t\t\t\t\t\t    option.setAttribute( 'selected', 'selected' );\n\t\t\t\t\t    }\n\t\t\t\t\t    select.appendChild( option );\n\t\t\t\t\t    index = index + 1;\n\t\t\t\t    });\n\n\t\t\t\t    label = document.createElement( 'label' );\n\t\t\t\t    label.classList.add( 'nf-select' );\n\n\t\t\t\t    label.appendChild( select );\n\n\t\t\t\t    // Select Lists need an empty '<div></div>' for styling purposes.\n\t\t\t\t    emptyContainer = document.createElement( 'div' );\n\t\t\t\t    label.appendChild( emptyContainer );\n\n\t\t\t\t    // The template requires a string.\n\t\t\t\t    return label.innerHTML;\n\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    /**\n\t\t\t     * Renders min and/or max attributes for the number input\n\t\t\t     *\n\t\t\t     * @returns {string}\n\t\t\t     */\n\t\t\t    renderMinMax: function() {\n\t\t\t\t\tvar minMaxStr = '';\n\t\t\t\t\t// if we have a min value set, then output it\n\t\t\t\t\tif( 'undefined' != typeof this.min_val && null != this.min_val && jQuery.isNumeric( this.min_val ) ) {\n\t\t\t\t\t\tminMaxStr = minMaxStr + \"min='\" + this.min_val + \"'\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// if we have a max value set, then output it\n\t\t\t\t    if( 'undefined' != typeof this.max_val && '' != this.max_val && jQuery.isNumeric( this.max_val ) ) {\n\t\t\t\t\t    minMaxStr = minMaxStr + \" max='\" + this.max_val + \"'\";\n\t\t\t\t    }\n\n\t\t\t\t    // if we have a step size set, then output it\n\t\t\t\t    if( 'undefined' != typeof this.step && '' != this.step && jQuery.isNumeric( this.step ) ) {\n\t\t\t\t\t    minMaxStr = minMaxStr + \" step='\" + this.step + \"'\";\n\t\t\t\t    }\n\n\t\t\t\t    return minMaxStr;\n\t\t\t    },\n\n\t\t\t    /**\n\t\t\t     * Returns a string to let the user know the min and/or max\n\t\t\t     * value for the field\n\t\t\t     *\n\t\t\t     * @returns {string}\n\t\t\t     */\n\t\t\t    renderMinMaxHelper: function() {\n\t\t\t\t    var minMaxHelperStr = '';\n\t\t\t\t    // if we have a min value output it to the helper text\n\t\t\t\t    if( 'undefined' != typeof this.min_val && null != this.min_val && jQuery.isNumeric( this.min_val ) ) {\n\t\t\t\t    \t// empty string? then add '('\n\t\t\t\t    \tif( 0 == minMaxHelperStr.length ) {\n\t\t\t\t    \t\tminMaxHelperStr = \"(\";\n\t\t\t\t\t    }\n\t\t\t\t\t    minMaxHelperStr = minMaxHelperStr +  nfi18n.minVal + \": \" + this.min_val;\n\t\t\t\t    }\n\n\t\t\t\t    // if we have a max value output it to the helper text\n\t\t\t\t    if( 'undefined' != typeof this.max_val && '' != this.max_val && jQuery.isNumeric( this.max_val ) ) {\n\t\t\t\t\t    // empty string? then add '('\n\t\t\t\t\t    if( 0 == minMaxHelperStr.length ) {\n\t\t\t\t\t\t    minMaxHelperStr = \"(\";\n\t\t\t\t\t    } else {\n\t\t\t\t\t    \t// else, we know we have a min so add a comma\n\t\t\t\t\t    \tminMaxHelperStr = minMaxHelperStr + \", \";\n\t\t\t\t\t    }\n\t\t\t\t\t    minMaxHelperStr = minMaxHelperStr + nfi18n.maxVal + \": \" + this.max_val;\n\t\t\t\t    }\n\n\t\t\t\t    // if not an empty string, then add ')'\n\t\t\t\t    if( 0 < minMaxHelperStr.length ) {\n\t\t\t\t\t    minMaxHelperStr = minMaxHelperStr + \")\";\n\t\t\t\t    }\n\n\t\t\t\t    return minMaxHelperStr;\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\n\t\t\tnfRadio.channel( this.model.get( 'type' ) ).request( 'validate:updateSetting', e, this.model, this.dataModel );\n\t\t\t\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/contentPublicLink',['views/app/drawer/itemSetting'], function( itemSettingView) {\n\tvar view = Marionette.LayoutView.extend( {\n\t\ttagName: 'div',\n        template: '#tmpl-nf-drawer-content-public-link',\n        \n\t\tregions: {\n            embedForm: '.embed-form',\n\t\t\tenablePublicLink: '.enable-public-link',\n            copyPublicLink: '.copy-public-link',\n        },\n\n\t\tonRender: function() {\n            var formModel = Backbone.Radio.channel('app').request('get:formModel');\n            var formSettingsDataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\n            var allowPublicLinkSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'allow_public_link' );\n            this.enablePublicLink.show( new itemSettingView( { model: allowPublicLinkSettingModel, dataModel: formSettingsDataModel } ) );\n            \n            var embedForm = \"[ninja_form id='{FORM_ID}']\".replace('{FORM_ID}', formModel.get('id'));\n            formSettingsDataModel.set('embed_form', embedForm);\n\n            var embedFormSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'embed_form' );\n            this.embedForm.show( new itemSettingView( { model: embedFormSettingModel, dataModel: formSettingsDataModel } ) );\n\n            var public_link_key = formSettingsDataModel.get('public_link_key');\n            \n            /**\n             * Generate a public link key which is follows the format:\n             * Form Id + 4 consecutive base 36 numbers\n             */\n            if (!public_link_key) {\n                public_link_key = nfRadio.channel('app').request('generate:publicLinkKey');\n            }\n\n            // apply public link url to settings (ending with key)\n            var publicLink = nfAdmin.publicLinkStructure.replace('[FORM_ID]', public_link_key);\n            formSettingsDataModel.set('public_link', publicLink);\n            \n            // Display public link\n            var publicLinkSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'public_link' );\n            this.copyPublicLink.show(new itemSettingView( { model: publicLinkSettingModel, dataModel: formSettingsDataModel } ));\n        },\n\n\t\tevents: {\n\t\t\t'click #embed_form + .js-click-copytext': 'copyFormEmbedHandler',\n\t\t\t'click #public_link + div > .js-click-copytext': 'copyPublicLinkHandler',\n\t\t\t'click #public_link + div > .js-click-resettext': 'confirmResetPublicLinkHandler',\n\t\t\t'click #public_link + div > .js-click-confirm': 'resetPublicLinkHandler',\n\t\t\t'click #public_link + div > .js-click-cancel': 'cancelResetPublicLinkHandler'\n\t\t},\n\n\t\tcopyFormEmbedHandler: function( e ) {\n\n            document.getElementById('embed_form').select();\n            document.execCommand('copy');\n\n            e.target.innerHTML = 'Copied!';\n            setTimeout(function(){ e.target.innerHTML = 'Copy'; }, 1500);\n\t\t},\n\n\t\tcopyPublicLinkHandler: function( e ) {\n\n            document.getElementById('public_link').select();\n            document.execCommand('copy');\n\n            e.target.innerHTML = 'Copied!';\n            setTimeout(function(){ e.target.innerHTML = 'Copy'; }, 1500);\n        },\n        \n        confirmResetPublicLinkHandler: function( e ) {\n            _.each( e.target.parentNode.children, function( node ) {\n                if ( node.classList.contains( 'js-click-copytext' ) || node.classList.contains( 'js-click-resettext' ) ) {\n                    node.style.display = 'none';\n                } else {\n                    node.style.display = 'inline-block';\n                }\n            } );\n        },\n\n        resetPublicLinkHandler: function ( e ) {\n            // Generate a new link.\n            var public_link_key = nfRadio.channel('app').request('generate:publicLinkKey');\n            var publicLink = nfAdmin.publicLinkStructure.replace('[FORM_ID]', public_link_key);\n            var formSettingsDataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\n            formSettingsDataModel.set('public_link', publicLink);\n            // Reset the buttons.\n            this.cancelResetPublicLinkHandler( e );\n            _.each( e.target.parentNode.children, function( node ) {\n                if ( node.classList.contains( 'js-click-resettext' ) ) {\n                    node.style.display = 'inline-block';\n                    node.classList.add('primary');\n                    node.classList.remove('secondary');\n                    node.innerHTML = 'Link Reset!';\n                    setTimeout(function(){\n                        node.classList.add('secondary');\n                        node.classList.remove('primary');\n                        node.innerHTML = 'Reset';\n                    }, 1500);\n                } else {\n                    node.style.display = 'none';\n                }\n                if ( node.classList.contains( 'js-click-copytext' ) ) {\n                    setTimeout(function(){\n                        node.style.display = 'inline-block';\n                    }, 1500);\n                }\n            } );\n            // Update the visible public link.\n            jQuery('#public_link').val( publicLink );\n        },\n\n        cancelResetPublicLinkHandler: function ( e ) {\n            _.each( e.target.parentNode.children, function( node ) {\n                if ( node.classList.contains( 'js-click-cancel' ) || node.classList.contains( 'js-click-confirm' ) ) {\n                    node.style.display = 'none';\n                } else {\n                    node.style.display = 'inline-block';\n                }\n            } );\n        }\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/headerPublicLink',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-header-public-link'\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/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/contentPublicLink',\n\t'views/app/drawer/headerPublicLink',\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\tpublicLinkView,\n\t\tpublicLinkHeaderView,\t\t\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: 'publicLink',\n\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the publicLink drawer.\n\t\t\t\t\tgetHeaderView: function( data ) {\n\t\t\t\t\t\treturn new publicLinkHeaderView( data );\n\t\t\t\t\t},\n\n\t\t\t\t\tgetContentView: function( data ) {\n\t\t\t\t\t\treturn new publicLinkView( 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 * Action settings title view.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2024 WP Ninjas\n * @since 3.8\n */\ndefine( 'views/actions/drawer/settingsTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-actions',\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\n\t\t\t\trenderDocLink: 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\t\tvar response = '';\n\t    \t\t\tif ( 'undefined' != typeof type ) {\n\t\t\t\t\t\tif( 'undefined' != typeof type.get('docUrl') && '' != type.get('docUrl') ) {\n\t\t\t\t\t\t\tresponse = '<a class=\"nf-external-info\" href=\"' + type.get('docUrl') + '\" target=\"_blank\"></a>';\n\t\t\t\t\t\t}\n\t    \t\t\t}\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t});\n\n\treturn view;\n} );\n","/**\n * Calculations title view.\n * \n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2024 WP Ninjas\n * @since 3.8\n */\ndefine( 'views/advanced/drawer/calculationsTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-calculations',\n\n\t\ttemplateHelpers: function () {\n\t    \treturn {\n\t\t\t\trenderDocLink: 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\t\treturn '<a class=\"nf-external-info\" href=\"https://ninjaforms.com/docs/calculations/\" target=\"_blank\"></a>';\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',[\n\t'views/app/drawer/defaultSettingsTitle',\n\t'views/actions/drawer/settingsTitle',\n\t'views/advanced/drawer/calculationsTitle',\n\t'views/app/empty'\n\t],\n\tfunction(\n\t\tDefaultSettingsTitleView,\n\t\tActionsSettingsTitleView,\n\t\tCalculationsTitleView,\n\t\tEmptyView\n\t) {\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\tif ( 'actions' == data.model.get( 'objectDomain' ) ) {\n\t\t\t\t\treturn new ActionsSettingsTitleView( data );\n\t\t\t\t} else if ( 'calculations' == data.model.get( 'objectDomain' ) ) {\n\t\t\t\t\treturn new CalculationsTitleView( data );\n\t\t\t\t} else {\n\t\t\t\t\treturn new DefaultSettingsTitleView( data );\n\t\t\t\t}\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\tcontainment: 'parent',\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\t\t\t\t//connectWith would allow drag and drop between fields already in the builder and the repeatable fieldset ( this is currently an issue until we deal with existing data stored)\n\t\t\t\t//connectWith: '.nf-fields-sortable', \n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tif ( ui.item.dropping || jQuery(ui.item).hasClass(\"nf-over-repeater\") ) 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 Favorite 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\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                /**\n\t\t\t\t * [Deprecated] Tooltips are not currently implemented in the context of the action list.\n\t\t\t\t *   However, the template uses a nested template which requires the helper method.\n                 * @returns {string}\n                 */\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\treturn '';\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\tif('undefined' !== typeof this.model.get('modal_content')) {\n\t\t\t\tvar modalContent = this.model.get( 'modal_content' );\n\n\t\t\t\tvar settingsModal = new jBox( 'Modal', {\n\t\t\t\t  content: modalContent,\n\t\t\t\t  zIndex:99999999,\n\t\t\t\t  closeButton: 'box',\n\t\t\t\t  overlay: true,\n\t\t\t\t  width: 600,\n\t\t\t\t  repositionOnOpen: true,\n\t\t\t\t  reposition: true\n\t\t\t\t});\n\n\t\t\t\tsettingsModal.open();\n\t\t\t} else{\n\t\t\t\tnfRadio.channel( 'settings' ).trigger( 'click:edit', e, this.model );\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-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.CompositeView.extend({\n\t\tchildView: settingItem,\n\t\ttemplate: '#tmpl-nf-advanced-main-content',\n\n\t\tattachHtml: function( collectionView, childView ) {\n\t\t\tif('undefined' != typeof childView.model.get('modal_content')) {\n\t\t\t\tjQuery( collectionView.el ).find( '.available' ).append( childView.el );\n\t\t\t\tjQuery( collectionView.el ).find( '.sub-section-header' ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( collectionView.el ).find( '.installed' ).append( childView.el );\n\t\t\t}\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\tidAttribute: 'id'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tvar type = this.get('type');\n\t\t\tif ( 'undefined' == typeof 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\tif (type === 'listimage') {\n\t\t\t\tthis.get = this.listimageGet;\n\t\t\t\tthis.set = this.listimageSet;\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\tlistimageGet: function(attr) {\n            if(attr === 'options') {\n\t\t\t\t\tattr = 'image_options';\n\t\t\t}\n\n            return Backbone.Model.prototype.get.call(this, attr);\n\t\t},\n\t\t\n\t\tlistimageSet: function(attributes, options) {\n\t\t\tif ('options' === attributes) {\n\t\t\t\tattributes = 'image_options';\n\t\t\t}\n\t\t\treturn Backbone.Model.prototype.set.call(this, attributes, options);\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        \n        /**\n         * Function used to get the formatted lable of the fieldModel.\n         * \n         * @since 3.3.3\n         * @return String\n         */\n        formatLabel: function() {\n            // Try to use admin label.\n            var label = this.get( 'admin_label' );\n            // If our admin label is empty...\n            if ( '' == label ) {\n                // Use the field label instead.\n                label = this.get( 'label' );\n            }\n            return label;\n        }\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\tnfRadio.channel( 'settings' ).reply( 'check:deps', this.checkDeps, this );\n\n\t\t},\n\t\t\n\t\t/**\n\t\t * A more robust settings dependency system.\n\t\t * This allows you to have a setting only show when X AND Y are met or when X OR Y are met.\n\t\t * \n\t\t * @since  \n\t\t * @param  {object} setting Setting object\n\t\t * @param  {object} context Object context for where this is being called.\n\t\t * @return {bool}/{string}\n\t\t */\n\t\tcheckDeps: function( setting, context ) {\n\t\t\tif ( ! setting.deps ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// If we do have a \"settings\" property, then this is a new dependency format.\n\t\t\tlet deps_settings = setting.deps.settings;\n\t\t\tlet match = setting.deps.match;\n\t\t\t\n\t\t\tlet hide = false;\n\t\t\t\n\t\t\tfor (var i = deps_settings.length - 1; i >= 0; i--) {\n\t\t\t\tlet name = deps_settings[i].name;\n\t\t\t\tlet value = deps_settings[i].value;\n\n\t\t\t\t// Use == here instead of === in order to avoid string => int comparison.\n\t\t\t    if ( context.dataModel.get( name ) == value ) {\n\t\t        \t// If we're looking for \"any\" match, we can go ahead and return here. \n\t\t        \tif ( 'any' == match ) {\n\t\t        \t\thide = false;\n\t\t        \t\tbreak;\n\t\t        \t}\n\t\t        } else {\n\t        \t\thide = true;\n\t\t        }\n\t\t\t}\n\n\t\t\tif ( hide ) {\n\t\t\t\treturn 'style=\"display:none;\"';\n\t\t\t}\n\t\t\t\n\t\t\treturn '';\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\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\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\t// now using a different ajax action\n\t\t\t\t// var jsAction = 'nf_batch_process';\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\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// If our field property isn't null, then...\n                        if ( null !== field[ prop ] ) {\n                            // Set our settings.prop value.\n                            settings[prop] = field[prop];\n                        }\n                        // Delete the property from the field.\n                        delete field[ prop ];\n                    }\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//Removing null values\n\t\t\t\t\t    if( null !== action[ prop ] ) {\n\t\t\t\t\t\t    // Set our settings.prop value.\n\t\t\t\t\t\t    settings[ prop ] = action[ prop ];\n\t\t\t\t\t    }\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\tfor ( var setting in data.settings ) {\n\t\t\t\tif ( null === data.settings[ setting ] ) {\n\t\t\t\t\tdelete data.settings[ setting ];\n\t\t\t\t}\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\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\tif ( 'nf_save_form' === jsAction ) {\n\t\t\t\t// if the form string is long than this, chunk it\n\t\t\t\tvar chunk_size = 100000;\n\t\t\t\tvar data_chunks = [];\n\n\t\t\t\t// Let's chunk this\n\t\t\t\tif( chunk_size < data.length ) {\n\t\t\t\t\tdata_chunks = data.match(new RegExp('.{1,' + chunk_size + '}', 'g'));\n\t\t\t\t}\n\t\t\t\t// if we have chunks send them via the step processor\n\t\t\t\tif( 1 < data_chunks.length ) {\n\t\t\t\t\t// this function will make the ajax call for chunks\n\t\t\t\t\tthis.saveChunkedForm(\n\t\t\t\t\t\tdata_chunks,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t'nf_batch_process',\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tformModel.get('id'),\n\t\t\t\t\t\ttrue\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// otherwise send it the regular way.\n\t\t\t\t\tvar context = this;\n\t\t\t\t\tvar responseData = null;\n\n\t\t\t\t\tjQuery.post( ajaxurl,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taction: jsAction,\n\t\t\t\t\t\t\tform: data,\n\t\t\t\t\t\t\tsecurity: nfAdmin.ajaxNonce\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfunction( response ) {\n\t\t\t\t\t\t\tresponseData = response;\n\t\t\t\t\t\t\tcontext.handleFinalResponse( responseData, action );\n\t\t\t\t\t\t}\n\t\t\t\t\t).fail( function( xhr, status, error ) {\n\t\t\t\t\t\tcontext.handleFinalFailure( xhr, status, error, action )\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else if ( 'nf_preview_update' === jsAction ) {\n\t\t\t\tvar context = this;\n\t\t\t\tvar responseData = null;\n\t\t\t\tjQuery.post( ajaxurl,\n\t\t\t\t\t{\n\t\t\t\t\t\taction: jsAction,\n\t\t\t\t\t\tform: data,\n\t\t\t\t\t\tsecurity: nfAdmin.ajaxNonce\n\t\t\t\t\t},\n\t\t\t\t\tfunction( response ) {\n\t\t\t\t\t\tresponseData = response;\n\t\t\t\t\t\tcontext.handleFinalResponse( responseData, action );\n\t\t\t\t\t}\n\t\t\t\t).fail( function( xhr, status, error ) {\n\t\t\t\t\tcontext.handleFinalFailure( xhr, status, error, action )\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Function to recursively send chunks until all chunks have been sent\n\t\t *\n\t\t * @param chunks\n\t\t * @param currentIndex\n\t\t * @param currentChunk\n\t\t * @param jsAction\n\t\t * @param action\n\t\t */\n\t\tsaveChunkedForm: function( chunks, currentChunk, jsAction, action, formId, new_publish ) {\n\t\t\tvar total_chunks = chunks.length;\n\t\t\tvar postObj = {\n\t\t\t\taction: jsAction,\n\t\t\t\tbatch_type: 'chunked_publish',\n\t\t\t\tdata: {\n\t\t\t\t\tnew_publish: new_publish,\n\t\t\t\t\tchunk_total: total_chunks,\n\t\t\t\t\tchunk_current: currentChunk,\n\t\t\t\t\tchunk: chunks[ currentChunk ],\n\t\t\t\t\tform_id: formId\n\t\t\t\t},\n\t\t\t\tsecurity: nfAdmin.batchNonce\n\t\t\t};\n\n\t\t\tvar that = this;\n\t\t\tjQuery.post( ajaxurl, postObj )\n\t\t\t\t.then( function ( response ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar res = JSON.parse(response);\n\t\t\t\t\t\tif ( 'success' === res.last_request && ! res.batch_complete) {\n\t\t\t\t\t\t\tconsole.log('Chunk ' + currentChunk + ' processed');\n\n\t\t\t\t\t\t\t// send the next chunk\n\t\t\t\t\t\t\tthat.saveChunkedForm(chunks, res.requesting, jsAction, action, formId, false);\n\t\t\t\t\t\t} else if ( res.batch_complete ) {\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * We need to respond with data to make the\n\t\t\t\t\t\t\t * publish button return to gray\n                             */\n\t\t\t\t\t\t\tthat.handleFinalResponse(response, action);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch ( exception ) {\n\t\t\t\t\t\tconsole.log( 'There was an error in parsing the' +\n\t\t\t\t\t\t\t' response');\n\t\t\t\t\t\tconsole.log( exception );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t).fail( function( xhr, status, error ) {\n\t\t\t\t\tconsole.log( 'There was an error sending form data' );\n\t\t\t\t\tconsole.log( error );\n\t\t\t\t\tthat.handleFinalFailure( xhr, status, error, action );\n\t\t\t\t});\n\t\t},\n\n\t\thandleFinalResponse: function( response, action ) {\n\t\t\ttry {\n\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\tresponse.action = action;\n\n\t\t\t\t// Run anything that needs to happen after we update.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'response:updateDB', response );\n\t\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) && 'preview' == action ) {\n\t\t\t\t\t// nfRadio.channel( 'notices' ).request( 'add', 'previewUpdate', 'Preview Updated'\t);\n\t\t\t\t}\n\t\t\t} catch( exception ) {\n\t\t\t\tconsole.log( 'Something went wrong!' );\n\t\t\t\tconsole.log( exception );\n\t\t\t}\n\t\t},\n\n\t\thandleFinalFailure: function( xhr, status, error, action ) {\n\t\t\t// For previews, only log to the console.\n\t\t\tif( 'preview' == action ) {\n\t\t\t\tconsole.log( error );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// @todo Convert alert to jBox Modal.\n\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},\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\tthis.listenTo( nfRadio.channel( 'app' ), 'click:publicLink', this.publicLink );\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\tpublicLink: function() {\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'publicLink' );\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\n\t\t\t//loop through repeater fields to reset active state if needed\n\t\t\tnfRadio.channel( 'fields-repeater' ).trigger( 'clearEditActive', model );\n\t\t\t\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            this.dispatchClick();\n\t\t},\n\n\t\tundoSingle: function( change, undoAll ) {\n\t\t\tnfRadio.channel( 'changes' ).request( 'undo:' + change.get( 'action' ), change, undoAll );\n            this.dispatchClick();\n\t\t},\n        \n        dispatchClick: function() {\n            // If we already have a cookie, exit.\n            if ( document.cookie.includes( 'nf_undo' ) ) return;\n            // Otherwise, prepare our cookie.\n            var cname = \"nf_undo\";\n            var d = new Date();\n            // Set expiration at 1 week.\n            d.setTime( d.getTime() + ( 7*24*60*60*1000 ) );\n            var expires = \"expires=\"+ d.toUTCString();\n            // Bake the cookie.\n            document.cookie = cname + \"=1;\" + expires + \";path=/\";\n            var data = {\n                action: 'nf_undo_click',\n                security: nfAdmin.ajaxNonce\n            }\n            // Make our AJAX call.\n            jQuery.post( ajaxurl, data );\n        }\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} else {\n\t\t\t\t\t\t\tfield = nfRadio.channel( 'fields-repeater' ).request( 'get:childField', oldID, null, newID );\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\n\t\t\t//loop through repeater fields to reset active state if needed\n\t\t\tnfRadio.channel( 'fields-repeater' ).trigger( 'clearEditActive', model );\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\t// If we don't have a 'settings' property, this is a legacy depdency setup.\n\t\t\t\tif ( 'undefined' == typeof deps.settings ) {\n\t\t\t\t\tdeps.settings = [];\n\t\t\t\t\t_.each(deps, function(dep, name){\n\t\t\t\t\t\tif( 'settings' !== name ) {\n\t\t\t\t\t\t\tdeps.settings.push( { name: name, value: dep } );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tdeps.match = 'all';\n\t\t\t\t}\n\n\t\t\t\tfor (var i = deps.settings.length - 1; i >= 0; i--) {\n\t\t\t\t\tlet name = deps.settings[i].name;\n\t\t\t\t\tthis.dataModel.on( 'change:' + name, this.render, this );\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 i = deps.settings.length - 1; i >= 0; i--) {\n\t\t\t\t\tname = deps.settings[i].name;\n\t\t\t\t\tthis.dataModel.off( 'change:' + name, this.render );\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\tthis.setupTooltip();\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        /**\n         * Function to append jBox modals to each tooltip element in the option repeater.\n         */\n        setupTooltip: function() {\n            // For each .nf-help in the option repeater...\n            jQuery( this.el ).find( '.nf-help' ).each(function() {\n                // Get the content.\n                var content = jQuery(this).next('.nf-help-text');\n                // Declare the modal.\n                jQuery( this ).jBox( 'Tooltip', {\n                    content: content,\n                    maxWidth: 200,\n                    theme: 'TooltipBorder',\n                    trigger: 'click',\n                    closeOnClick: true\n                })\n            });\n        },\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\t    \treturn {\n\t    \t\trenderVisible: function() {\n\n\t\t\t\t\tif(!nfAdmin.devMode){\n\t\t\t\t\t\tif('help' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('classes' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\tif('input_limit_set' == this.name) return 'style=\"display:none;\"';\n\n\t\t\t\t\t\tif('checkbox' == that.dataModel.get('type')){\n\t\t\t\t\t\t\tif('checkbox_values' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif('date' == that.dataModel.get('type')){\n\t\t\t\t\t\t\tif('year_range' == this.name) return 'style=\"display:none;\"';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn nfRadio.channel( 'settings' ).request( 'check:deps', this, that );\n\t    \t\t},\n\n\t\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\trenderInfo: function() {\n\t\t\t\t\tif ( ! this.info ) return '';\n\t\t\t\t\treturn '<a href=\"' + this.info + '\" target=\"_blank\" class=\"nf-external-info\"></a>';\n\t\t\t\t},\n\n\t\t\t\trenderTooltip: function() {\n\t\t\t\t\tif ( ! this.help ) return '';\n\t\t\t\t\tvar helpText, helpTextContainer, helpIcon, helpIconLink, helpTextWrapper;\n\n\t\t\t\t\thelpText = document.createElement( 'div' );\n\t\t\t\t\thelpText.innerHTML = this.help;\n\t\t\t\t\t\n\t\t\t\t\thelpTextContainer = document.createElement( 'div' );\n\t\t\t\t\thelpTextContainer.classList.add( 'nf-help-text' );\n\t\t\t\t\thelpTextContainer.appendChild( helpText );\n\n\t\t\t\t\thelpIcon = document.createElement( 'span' );\n\t\t\t\t\thelpIcon.classList.add( 'dashicons', 'dashicons-admin-comments' );\n                    helpIconLink = document.createElement( 'a' );\n                    helpIconLink.classList.add( 'nf-help' );\n                    helpIconLink.setAttribute( 'href', '#' );\n                    helpIconLink.setAttribute( 'tabindex', '-1' );\n                    helpIconLink.appendChild( helpIcon );\n\n                    helpTextWrapper = document.createElement( 'span' );\n                    helpTextWrapper.appendChild( helpIconLink );\n                    helpTextWrapper.appendChild( helpTextContainer );\n\n                    // The template expects a string value.\n\t\t\t\t\treturn helpTextWrapper.innerHTML;\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 * 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 textbox type of field settings\n * \n * We want to prevent script usage in the Advanced section labels\n * \n * @package Ninja Forms builder\n * @subpackage Fields - Edit Field Drawer\n * @copyright (c) 2024 Saturday Drive\n * @since 3.8\n */\ndefine( 'controllers/app/textboxSetting',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\t// Respond to requests for field setting filtering.\n\t\t\tnfRadio.channel( 'textbox' ).reply( 'validate:updateSetting', this.validateSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * Sanitize field as needed to prevent xss\n\t\t * \n\t\t * @since  3.8\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 escaped data after error triggered\n\t\t */\n\t\tvalidateSetting: function( e, fieldModel, dataModel ) {\n            //Check characters set in custom classes match sanitize_html_class\n\t\t\tif ( fieldModel.get('name').endsWith(\"_class\" )) {\n\t\t\t\tconst regexp = /^[a-zA-Z 0-9-_]+$/;\n\t\t\t\tif(e.target.value.search(regexp) === -1 &&  '' !== e.target.value){\n\t\t\t\t\tfieldModel.set('error', nfi18n.htmlDetectedError );\n\t\t\t\t} else if(e.target.value.search(regexp) === 0 || '' === e.target.value){\n\t\t\t\t\tfieldModel.unset('error');\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n            //Prevent xss from title and labels\n\t\t\tconst isActionNameLabel = fieldModel.get('name') === \"label\" && fieldModel.get('label') === \"Action Name\";\n            const checkedElements = [\"title\", \"processing_label\", \"changeEmailErrorMsg\", \"changeDateErrorMsg\", \"confirmFieldErrorMsg\", \"fieldNumberNumMinError\", \"fieldNumberNumMaxError\", \"fieldNumberIncrementBy\", \"formErrorsCorrectErrors\", \"validateRequiredField\", \"honeypotHoneypotError\", \"fieldsMarkedRequired\"];\n            if( checkedElements.includes(fieldModel.get('name')) || isActionNameLabel ){\n\t\t\t\tconst regexp = /[/\"<>`]/;\n\t\t\t\tif(e.target.value.search(regexp) !== -1 &&  '' !== e.target.value){\n\t\t\t\t\tconst foundIndex = e.target.value.search(regexp);\n\t\t\t\t\tconst foundChar = e.target.value.charAt(foundIndex);\n\t\t\t\t\tfieldModel.set('error', foundChar + \" \" + nfi18n.titleLabelsErrorMessage);\n\t\t\t\t} else if(e.target.value.search(regexp) === -1 || '' === e.target.value){\n\t\t\t\t\tfieldModel.unset('error');\n\t\t\t\t}\n\t\t\t}\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 ).prop( '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 * 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/buttonToggleSetting',[], 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-button-toggle' ).reply( 'renderOnChange', function(){ return false; } );\n\n\t\t\t// Respond to requests for field setting filtering.\n\t\t\tnfRadio.channel( 'button-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\treturn e.target.value;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles actions related to number field settings.\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/numberSetting',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests for field setting filtering.\n\t\t\tnfRadio.channel( 'number' ).reply( 'before:updateSetting', this.updateSetting, this );\n\t\t\tnfRadio.channel( 'number' ).reply( 'validate:updateSetting', this.validateSetting, this );\n\t\t},\n\n\t\t/**\n\t\t * Resets value if user enters value below min value or above max value\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\tvar minVal = settingTypeModel.get( 'min_val' );\n\t\t\tvar maxVal = settingTypeModel.get( 'max_val' );\n\n\t\t\t/*\n\t\t\t * if we gave a min value set, revert to that if the user enters\n\t\t\t * a lower number\n\t\t\t*/\n\t\t\tif( 'undefined' != typeof minVal && null !== minVal ){\n\t\t\t\tif ( e.target.value < minVal ) {\n\t\t\t\t\tfieldModel.set('value', minVal);\n\t\t\t\t\te.target.value = minVal;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/*\n\t\t\t * if we gave a max value set, revert to that if the user enters\n\t\t\t * a higher number\n\t\t\t*/\n\t\t\tif( 'undefined' != typeof maxVal && null !== maxVal ){\n\t\t\t\tif ( e.target.value > maxVal ) {\n\t\t\t\t\tfieldModel.set('value', maxVal);\n\t\t\t\t\te.target.value = maxVal;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn e.target.value;\n\t\t},\n\n\t\tvalidateSetting: function( e, fieldModel ){\n\t\t\t//Check end and start years in Date field\n\t\t\tif( [\"year_range_start\", \"year_range_end\"].includes( fieldModel.get('name') ) ) {\n\t\t\t\t//Determine start and end value and consider current value being changed\n\t\t\t\tconst startValue = fieldModel.get('name') === \"year_range_start\" ? e.target.value : document.getElementById(\"year_range_start\").getAttribute('value'),\n\t\t\t\tendValue = fieldModel.get('name') === \"year_range_end\" ? e.target.value : document.getElementById(\"year_range_end\").getAttribute('value');\n\t\t\t\t//Proceed to check that if both values are set, start must be smaller than end\n\t\t\t\tif(startValue.length > 0 && endValue.length > 0){\n\t\t\t\t\tif(startValue >= endValue){\n\t\t\t\t\t\tfieldModel.set('error', \"Start year must be smaller than end year\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfieldModel.unset('error');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","\ndefine( 'controllers/app/radioSetting',[], function() {\n    var controller = Marionette.Object.extend({\n        initialize: function () {\n            // Respond to requests for field setting filtering.\n\n            console.log( nfRadio.channel( 'radio' ) );\n            nfRadio.channel('radio').reply( 'before:updateSetting', this.updateSetting, this);\n        },\n\n\n        updateSetting: function( e, fieldModel, name, settingTypeModel ) {\n            console.log( 'test' );\n        }\n    });\n    return 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\n\t\tdeleting: false, // block edit functionality while deleting field\n\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.maybeDelete );\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\t// if we are deleting a field, we don't want to the edit drawer to open\n\t\t\tif( ! this.deleting ) {\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\tvar type = nfRadio.channel(currentDomainID).request('get:type', model.get('type'));\n\t\t\t\tnfRadio.channel('app').request('open:drawer', 'editSettings', {\n\t\t\t\t\tmodel: model,\n\t\t\t\t\tgroupCollection: type.get('settingGroups')\n\t\t\t\t});\n\t\t\t\t//loop through repeater fields to reset active state if needed\n\t\t\t\tnfRadio.channel( 'fields-repeater' ).trigger( 'clearEditActive', model );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Let user know that all data will be lost before actually deleting\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\tmaybeDelete: function( e, dataModel ) {\n\t\t\t// we set deleting to true, so the edit event doesn't open drawer\n\t\t\tthis.deleting = true;\n\t\t\tvar modelID = dataModel.get( 'id' );\n\t\t\tvar modelType = dataModel.get( 'objectType' );\n\n\t\t\t// Build a lookup table for fields that we don't save\n\t\t\tvar nonSaveFields = [ 'html', 'submit', 'hr',\n\t\t\t\t'recaptcha', 'spam', 'creditcard', 'creditcardcvc',\n\t\t\t\t'creditcardexpiration', 'creditcardfullname',\n\t\t\t\t'creditcardnumber', 'creditcardzip' ];\n\n\t\t\t/*\n\t\t\t* If this is a new field that hasn't been saved, then we don't\n\t\t\t * need to check for data\n\t\t\t */\n\t\t\tif( 'field' != modelType.toLowerCase() ) {\n\t\t\t\tthis.clickDelete( e, dataModel );\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t* If the field has been saved, then we need to check for\n\t\t\t\t * submission data for this field\n\t\t\t\t */\n\t\t\t\tif( 'tmp' === modelID.toString().substring( 0, 3 )\n\t\t\t\t\t|| -1 != jQuery.inArray( dataModel.get( 'type' ), nonSaveFields ) ) {\n\t\t\t\t\t// not a saved field so proceed as normal\n\t\t\t\t\tthis.clickDelete( e, dataModel );\n\t\t\t\t} else {\n\t\t\t\t\t// need the form id\n\t\t\t\t\tvar formModel = Backbone.Radio.channel('app').request('get:formModel');\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\t'action': 'nf_maybe_delete_field',\n\t\t\t\t\t\t'security': nfAdmin.ajaxNonce,\n\t\t\t\t\t\t'formID': formModel.get('id'),\n\t\t\t\t\t\t'fieldKey': dataModel.get('key'),\n\t\t\t\t\t\t'fieldID': modelID\n\t\t\t\t\t};\n\t\t\t\t\tvar that = this;\n\n\t\t\t\t\t// make call to see if field has submission data\n\t\t\t\t\tjQuery.post(ajaxurl, data)\n\t\t\t\t\t\t.done(function (response) {\n\t\t\t\t\t\t\tvar res = JSON.parse(response);\n\n\t\t\t\t\t\t\tif (res.data.hasOwnProperty('errors')) {\n\t\t\t\t\t\t\t\tvar errors = res.data.errors;\n\t\t\t\t\t\t\t\tvar errorMsg = '';\n\n\t\t\t\t\t\t\t\tif (Array.isArray(errors)) {\n\t\t\t\t\t\t\t\t\terrors.forEach(function(error) {\n\t\t\t\t\t\t\t\t\t\terrors += error + \"\\n\";\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\terrors = errors;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconsole.log('Maybe Delete Field  Errors: ', errors);\n\t\t\t\t\t\t\t\talert(errors);\n\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (res.data.field_has_data) {\n\t\t\t\t\t\t\t\t// if it does, show warning modal\n\t\t\t\t\t\t\t\tthat.doDeleteFieldModal(e, dataModel);\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// if not, proceed like normal\n\t\t\t\t\t\t\t\tthat.clickDelete(e, dataModel);\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Create the field delete warning modal\n\t\t *\n\t\t * @param e\n\t\t * @param dataModel\n\t\t */\n\t\tdoDeleteFieldModal: function( e, dataModel ) {\n\t\t\t// Build warning modal to warn user a losing all data related to field\n            var that = this;\n            var modalData = {\n                width: 400,\n                closeOnClick: false,\n                closeOnEsc: true,\n                content: nfi18n.fieldDataDeleteMsg,\n                btnPrimary: {\n                    text: nfi18n.delete,\n                    callback: function() {\n                        // close and destory modal.\n                        deleteModal.toggleModal( false );\n                        deleteModal.destroy();\n                        // proceed as normal, data will be deleted in backend on publish\n                        that.clickDelete( e, dataModel );\n                    }\n                },\n                btnSecondary: {\n                    text: nfi18n.cancel,\n                    callback: function() {\n                        // close and destory modal\n                        deleteModal.toggleModal( false );\n                        deleteModal.destroy();\n                        // set deleting to false so edit can work as normal\n                        that.deleting = false;\n                    }\n                }\n            };\n            var deleteModal = new NinjaModal( modalData );\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\tthis.deleting = false;\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\t// Make sure this update is silent to avoid triggering key change events down the waterfall.\n\t\t\tnewModel.set( 'label', newModel.get( 'label' ) + ' Copy', {silent: true} );\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\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        calc: false,\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, calc ){\n            this.filter = function( child, index, collection ){\n                return section == child.get( 'section' );\n            }\n\n            if ( calc ) {\n                this.calc = true;\n            }\n\n            if ( this.calc ) {\n                var fieldsToRemove = this.excludeFromCalcs();\n\n                /**\n                 * Filters our merge tags.\n                 * Make sure that we're in the right section, and then check to see if the merge tag is in our remove tracker.\n                 */\n                this.filter = function( child, index, collection ) {\n                    return section == child.get( 'section' ) && -1 == fieldsToRemove.indexOf( child.get( 'tag' ) );\n                }\n            }\n\n            this.render();\n            nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch', section );\n        },\n\n        searchFilter: function( term ){\n            if ( this.calc ) {\n                var fieldsToRemove = this.excludeFromCalcs();\n            }\n\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                // If we are in a calculation setting and this tag is in our remove tracker, early return false.\n                if ( this.calc && -1 != fieldsToRemove.indexOf( child.get( 'tag' ) ) ) {\n                    return false;\n                }\n                return label || tag;\n            }\n\n            this.render();\n            nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\n\n        },\n\n        /**\n         * TODO: This is a wonky fix for removing Product and Quantity fields from calcuation merge tags.\n         * Merge tags don't respect the \"exclude\" merge tag settings.\n         * Ultimately, the fix might include updating merge tags to respect those settings.\n         */\n        excludeFromCalcs: function(){\n            /**\n             * Remove any unwanted fields if we are in a calculation.\n             * Get a list of all fields, then filter out unwanted fields.\n             */\n            var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n            // Stores the keys of unwanted fields.\n            var fieldsToRemove = [];\n            // Declare blacklisted field types.\n            var blacklist = ['product', 'quantity', 'total', 'shipping', 'date'];\n            // Remove them from the merge tag selection box.\n            _.each( fieldCollection.models, function( model ) {\n                if ( -1 != blacklist.indexOf( model.get('type') ) ) {\n                    fieldsToRemove.push( '{field:' + model.get( 'key' ) + '}' );\n                }\n            });\n            return fieldsToRemove;\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.updateActive );\n        },\n\n        onClick: function(){\n          this.updateTags();\n        },\n\n        updateTags: function() {\n            nfRadio.channel( 'merge-tags' ).request( 'update:taglist', this.model.get( 'id' ) );\n        },\n\n        updateActive: function( section ) {\n            this.$el.removeClass( 'active' );\n\n            if ( section == this.model.get( 'id' ) ) {\n                this.$el.addClass( 'active' );\n            }\n        },\n\n        setActive: function(){\n            this.$el.addClass( 'active' );\n            this.$el.siblings().removeClass( 'active' );\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/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\n            // When an RTE setting is shown, make sure merge tags are hooked up.\n            this.listenTo( nfRadio.channel( 'setting-type-rte' ), 'render:setting', function(){\n                jQuery( '.note-editor .merge-tags' ).off( 'click' );\n                jQuery( '.note-editor .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n            } );\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\n\t            // Find out if merge tag box will go below bottom of the page.\n\t            var tagBoxY = posY + height;\n\t            var windowHeight = window.innerHeight;\n\t            var tagBoxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n\n\t            // If merge tag box will render below the bottom of the page,\n\t            // change it to render above the field\n\n\t            if ( ( tagBoxY + tagBoxHeight ) > windowHeight ) {\n                    tagBoxY = posY - tagBoxHeight;\n                }\n\n                if ( 0 > tagBoxY ) {\n                    tagBoxY = posY;\n                }\n\n                jQuery( '#merge-tags-box' ).css( 'top', tagBoxY );\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( /&nbsp;/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            var $this = jQuery( this );\n\n            if ($this.hasClass('open-media-manager')) {\n                return;\n            }\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            /**\n             * TODO: This is a wonky work around for removing Product and Quantity fields from calculation merge tags.\n             * The merge tag system doesn't currently respect \"exclude\" merge tag settings.\n             *\n             * If 'eq' is the textarea next to the merge tag icon, then we're in a calculation setting.\n             */\n            if ( 'eq' == jQuery( e.target ).prev( 'textarea' ).data( 'id' ) ) {\n                var calc = true;\n            } else {\n                var calc = false;\n            }\n\n            // Request that our merge tag box update its tag list, passing whether or not we're in a calculation setting.\n            nfRadio.channel( 'merge-tags' ).request( 'update:taglist', 'fields', calc );\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\n            // Find out if merge tag box will go below bottom of the page.\n\t        var tagBoxY = posY + height;\n\t        var windowHeight = window.innerHeight;\n\t        var tagBoxHeight = jQuery( '#merge-tags-box' ).outerHeight();\n\n\t        // If merge tag box will render below the bottom of the page,\n            // change it to render above the field\n\n\t        if ( ( tagBoxY + tagBoxHeight ) > windowHeight ) {\n\t\t        tagBoxY = posY - tagBoxHeight;\n\t        }\n\n            if ( 0 > tagBoxY ) {\n                tagBoxY = posY;\n            }\n\n            jQuery( '#merge-tags-box' ).css( 'top', tagBoxY );\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            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            } 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                    lineWrapping: 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        /**\n         * Append 'Edit Form'\n         * When editing a form, add an 'Edit Form' submenu item to\n         *   the WordPress Admin Dashboard menu, specifically under\n         *   the Ninja Forms Menu Item and after the 'Add New' item.\n         */\n        appendEditForm: function() {\n            // Singleton check. Only add this menu item one time.\n            if ( jQuery( 'li a:contains(\"' + this.editFormText + '\")' ).length > 0 ) return;\n\n            var editFormLinkText, editFormLink, editFormListItem;\n\n            // Create the 'Edit Form' submenu item.\n            editFormLinkText = document.createTextNode(this.editFormText);\n            editFormLink = document.createElement(\"a\");\n            editFormLink.appendChild(editFormLinkText);\n\n            editFormListItem = document.createElement(\"li\");\n            editFormListItem.appendChild(editFormLink);\n            editFormListItem.classList.add(\"current\");\n\n            // Remove the `current` class from any existing list items.\n            jQuery( '.wp-submenu li' ).removeClass( 'current' );\n\n            // Insert the 'Edit Form' item after the 'Add New' item;\n            jQuery( 'a[href=\"admin.php?page=ninja-forms#new-form\"]' ).parent().after( editFormListItem );\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","/**\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:10000000,\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 * 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 * Handles changing our public link when we request a new one or when it's set improperly.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2019 WP Ninjas\n * @since UPDATE_VERSION_ON_MERGE\n */\ndefine( 'controllers/app/publicLink',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'after:appStart', this.validatePublicLink, this );\n            nfRadio.channel( 'app' ).reply( 'generate:publicLinkKey', this.newPublicLinkKey, this );\n        },\n        \n        newPublicLinkKey: function() {\n            var formSettingsDataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\n            var public_link_key = nfRadio.channel('app').request('get:formModel').get('id');\n            for (var i = 0; i < 4; i++) {\n                var char = Math.random().toString(36).slice(-1);\n                public_link_key += char;\n            };\n            // Apply the public link key to form settings\n            formSettingsDataModel.set('public_link_key', public_link_key);\n            return public_link_key;\n        },\n\n        validatePublicLink: function() {\n            var formID = nfRadio.channel('app').request('get:formModel').get('id');\n            var formSettingsDataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\n            if ( 'undefined' === typeof formSettingsDataModel.get('public_link_key') ) return false;\n            if ( 0 === formSettingsDataModel.get( 'public_link_key' ).indexOf( formID ) ) return false;\n            var public_link_key = this.newPublicLinkKey();\n            var publicLink = nfAdmin.publicLinkStructure.replace('[FORM_ID]', public_link_key);\n            formSettingsDataModel.set('public_link', publicLink);\n        }\n\n\t});\n\n\treturn controller;\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// If this isn't an installed field, don't add it.\n\t\t\tif('undefined' !== typeof fieldType.get('modal_content')) return false;\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// Define default values to be hidden from filtering.\n\t\t\tthis.hiddenFields = [\n\t\t\t\t'product',\n\t\t\t\t'quantity',\n\t\t\t\t'shipping',\n\t\t\t\t'total',\n\t\t\t\t'button'\n\t\t\t];\n\t\t\t// Listen for requests to hide fields.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'add:hiddenFields', this.addHiddenFieldTypes );\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\t// Poll for additional fields to hide from the filter.\n\t\t\tnfRadio.channel( 'app' ).trigger( 'request:hiddenFields', this );\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 ( '' != String(search).trim() ) {\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                // Search our results of hidden fields.\n                for ( var i = filteredSectionCollection.models[ 0 ].get( 'fieldTypes' ).length -1; i >= 0; i-- ) {\n                    var target = this.hiddenFields.indexOf( filteredSectionCollection.models[ 0 ].get( 'fieldTypes' )[ i ] );\n                    // If we find any...\n                    if ( -1 < target ) {\n                        // Remove them from the collection.\n                        filteredSectionCollection.models[ 0 ].get( 'fieldTypes' ).splice( i, 1 );\n                    }\n                }\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\t\t/**\n\t\t * Add requested fields to be hidden from the filter.\n\t\t * \n\t\t * @param array  fields  the list of fields to be hidden from the filter\n\t\t * @return false or void\n\t\t */\n\t\taddHiddenFieldTypes: function( fields ) {\n\t\t\tvar that = this;\n\t\t\t// Ensure we have an array.\n\t\t\tif( fields.constructor !== Array ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t_.each( fields, function( field ){\n\t\t\t\tif( ! that.hiddenFields.includes( field ) ) {\n\t\t\t\t\tthat.hiddenFields.push( field );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\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","define( 'views/fields/preview/element',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-field-input',\n\n\t\tinitialize: function() {\n\t\t\t\n\t\t\tvar type = this.model.get('type');\n\n\t\t\tthis.model.set('value', this.model.get('default'));\n\t\t\t\n\t\t\tif('date' == type && this.model.get('date_default')){\n\t\t\t\tvar format = this.model.get('date_format');\n\t\t\t\tif('default' == format || '' == format) format = this.convertDateFormat(nfAdmin.dateFormat);\n\t\t\t\tvar original = moment.locale();\n\t\t\t\tif( ! moment.locales().includes( 'ninja-forms' ) ) {\n\t\t\t\t\tmoment.defineLocale('ninja-forms', {\n\t\t\t\t\t\tmonths: nfi18n.months,\n\t\t\t\t\t\tmonthsShort: nfi18n.monthsShort,\n\t\t\t\t\t\tweekdays: nfi18n.weekdays,\n\t\t\t\t\t\tweekdaysShort: nfi18n.weekdaysShort,\n\t\t\t\t\t\tweekdaysMin: nfi18n.weekdaysMin\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tthis.model.set('value', moment().format(format) );\n\t\t\t\tmoment.locale(original);\n\t\t\t}\n\n\t\t\tif('phone' == type) type = 'tel';\n\t\t\tif('spam' == type) type = 'input';\n\t\t\t// if('date' == type) type = 'input';\n\t\t\tif('confirm' == type) type = 'input';\n\t\t\tif('password' == type) type = 'input';\n\t\t\tif('passwordconfirm' == type) type = 'input';\n\t\t\tif('quantity' == type) type = 'number';\n\t\t\tif('terms' == type) type = 'listcheckbox';\n\t\t\tif('liststate' == type) type = 'listselect';\n\t\t\tif('listcountry' == type) type = 'listselect';\n\t\t\tif('listmultiselect' == type) type = 'listselect';\n\t\t\tif('save' == type) type = 'submit';\n\n\t\t\t// If a builder-specific template exists for this type, use that.\n\t\t\tif ( 1 == jQuery( '#tmpl-nf-builder-field-' + type ).length ) {\n\t\t\t\tthis.template = '#tmpl-nf-builder-field-' + type;\n\t\t\t} else {\n\t\t\t\tthis.template = '#tmpl-nf-field-' + type;\n\t\t\t}\t\t\t\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tif(this.model.get('container_class').includes('two-col-list')) {\n\t\t\t\tjQuery(this.el).find('> ul').css('display', 'grid');\n\t\t\t\tjQuery(this.el).find('> ul').css('grid-template-columns', 'repeat(2, 1fr)');\n\t\t\t}\n\t\t\tif(this.model.get('container_class').includes('three-col-list')) {\n\t\t\t\tjQuery(this.el).find('> ul').css('display', 'grid');\n\t\t\t\tjQuery(this.el).find('> ul').css('grid-template-columns', 'repeat(3, 1fr)');\n\t\t\t}\n\t\t\tif(this.model.get('container_class').includes('four-col-list')) {\n\t\t\t\tjQuery(this.el).find('> ul').css('display', 'grid');\n\t\t\t\tjQuery(this.el).find('> ul').css('grid-template-columns', 'repeat(4, 1fr)');\n\t\t\t}\n\t\t},\n        \n\t\ttemplateHelpers: function () {\n\t    \treturn {\n\t    \t\trenderClasses: function() {\n\t    \t\t\t// ...\n                },\n\t\t\t\tmaybeFilterHTML: function()  {\n\t\t\t\t\treturn typeof nfAdmin.filter_esc_status !== \"undefined\" ? nfAdmin.filter_esc_status : \"false\";\n\t\t\t\t},\n                renderPlaceholder: function() {\n                    if('undefined' == typeof this.placeholder) return;\n\t\t\t\t\treturn 'placeholder=\"' + String( _.escape( this.placeholder ) ).trim() + '\"';\n                },\n                maybeDisabled: function() {\n                    if('undefined' == typeof this.disable_input) return;\n                    if(!this.disable_input) return;\n                    return 'disabled=\"disabled\"';\n                },\n                maybeRequired: function() {\n\t\t\t\t\t// ...\n\t\t\t\t},\n\t\t\t\tmaybeInputLimit: function() {\n\t\t\t\t\t// ...\n\t\t\t\t},\n\t\t\t\tmaybeDisableAutocomplete: function() {\n\t\t\t\t\t// ..\n\t\t\t\t},\n\t\t\t\tmaybeChecked: function() {\n\t\t\t\t\tif('checked' == this.default_value) return ' checked=\"checked\"';\n\t\t\t\t},\n\t\t\t\trenderOptions: function() {\n\t\t\t\t\tlet optionLabel;\n\t\t\t\t\tswitch(this.type) {\n\t\t\t\t\t\tcase 'terms':\n\n\t\t\t\t\t\t\tif( ! this.taxonomy ){\n\t\t\t\t\t\t\t\treturn '(No taxonomy selected)';\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar taxonomyTerms = fieldTypeData.find(function(typeData){\n\t\t\t\t\t\t\t\treturn 'terms' == typeData.id;\n\t\t\t\t\t\t\t}).settingGroups.find(function(settingGroup){\n\t\t\t\t\t\t\t\treturn 'primary' == settingGroup.id;\n\t\t\t\t\t\t\t}).settings.find(function(setting){\n\t\t\t\t\t\t\t\treturn 'taxonomy_terms' == setting.name;\n\t\t\t\t\t\t\t}).settings;\n\n\t\t\t\t\t\t\tvar attributes = Object.keys(this);\n\t\t\t\t\t\t\tvar enabledTaxonomyTerms = attributes.filter(function(attribute){\n\t\t\t\t\t\t\t\treturn 0 == attribute.indexOf('taxonomy_term_') && this[attribute];\n\t\t\t\t\t\t\t}.bind(this));\n\n\t\t\t\t\t\t\tif(0 == enabledTaxonomyTerms.length) {\n\t\t\t\t\t\t\t\treturn '(No available terms selected)';\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn enabledTaxonomyTerms.reduce(function(html, enabledTaxonomyTerm) {\n\t\t\t\t\t\t\t\tvar term = taxonomyTerms.find(function(terms){\n\t\t\t\t\t\t\t\t\treturn enabledTaxonomyTerm == terms.name;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif( 'undefined' == typeof term ) return html;\n\t\t\t\t\t\t\t\treturn html += '<li><input type=\"checkbox\"><div>' + term.label  + '</div></li>';\n\t\t\t\t\t\t\t}.bind(this), '');\n\t\t\t\t\t\tcase 'liststate':\n\t\t\t\t\t\tcase 'listselect':\n\n\t\t\t\t\t\t\t// Check if there are any options.\n\t\t\t\t\t\t\tif(0 == this.options.models.length) return '';\n\n\t\t\t\t\t\t\t// Filter by :selected\" options.\n\t\t\t\t\t\t\tvar options = this.options.models.filter(function(option){\n\t\t\t\t\t\t\t\treturn option.get('selected');\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// If no option set as \"selected\", then reset the previous filter.\n\t\t\t\t\t\t\tif(0 == options.length) options = this.options.models;\n\n\t\t\t\t\t\t\t// Set the first option to display in the field preview.\n\t\t\t\t\t\t\toptionLabel = (typeof nfAdmin.filter_esc_status !== \"undefined\" && nfAdmin.filter_esc_status === \"true\") ? _.escape(options[0].get('label')) : options[0].get('label'); \n\t\t\t\t\t\t\treturn '<option>' + optionLabel + '</option>';\n\t\t\t\t\t\tcase 'listmultiselect':\n\t\t\t\t\t\t\treturn this.options.models.reduce(function(html, option) {\n\t\t\t\t\t\t\t\toptionLabel = (typeof nfAdmin.filter_esc_status !== \"undefined\" && nfAdmin.filter_esc_status === \"true\") ? _.escape(option.get('label')) : option.get('label'); \n\t\t\t\t\t\t\t\tvar selected = (option.get('selected')) ? ' selected=\"selected\"' : '';\n\t\t\t\t\t\t\t\treturn html += '<option' + selected + '>' + optionLabel + '</option>';\n\t\t\t\t\t\t\t}, '');\n\t\t\t\t\t\tcase 'listcheckbox':\n\t\t\t\t\t\t\treturn this.options.models.reduce(function(html, option) {\n\t\t\t\t\t\t\t\toptionLabel = (typeof nfAdmin.filter_esc_status !== \"undefined\" && nfAdmin.filter_esc_status === \"true\") ? _.escape(option.get('label')) : option.get('label'); \n\t\t\t\t\t\t\t\tvar checked = (option.get('selected')) ? ' checked=\"checked\"' : '';\n\t\t\t\t\t\t\t\treturn html += '<li><input type=\"checkbox\"' + checked + '><div>' + optionLabel + '</div></li>';\n\t\t\t\t\t\t\t}, '');\n\t\t\t\t\t\tcase 'listradio':\n\t\t\t\t\t\t\tvar checked = false; // External flag to only select one radio item.\n\t\t\t\t\t\t\treturn this.options.models.reduce(function(html, option) {\n\t\t\t\t\t\t\t\toptionLabel = (typeof nfAdmin.filter_esc_status !== \"undefined\" && nfAdmin.filter_esc_status === \"true\") ? _.escape(option.get('label')) : option.get('label'); \n\t\t\t\t\t\t\t\tchecked = (option.get('selected') && !checked) ? ' checked=\"checked\"' : '';\n\t\t\t\t\t\t\t\treturn html += '<li><input type=\"radio\"' + checked + '><div>' + optionLabel   + '</div></li>';\n\t\t\t\t\t\t\t}, '');\n\t\t\t\t\t\tcase 'listcountry':\n\t\t\t\t\t\t\tvar defaultValue = this.default;\n\t\t\t\t\t\t\tvar defaultOption = fieldTypeData.find(function(data) {\n\t\t\t\t\t\t\t\treturn 'listcountry' == data.id;\n\t\t\t\t\t\t\t}).settingGroups.find(function(group){\n\t\t\t\t\t\t\t\treturn 'primary' == group.id;\n\t\t\t\t\t\t\t}).settings.find(function(setting){\n\t\t\t\t\t\t\t\treturn 'default' == setting.name;\n\t\t\t\t\t\t\t}).options.find(function(option) {\n\t\t\t\t\t\t\t\treturn defaultValue == option.value;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\toptionLabel = ('undefined' !== typeof defaultOption ) ? defaultOption.label : '--';\n\t\t\t\t\t\t\toptionLabel = (typeof nfAdmin.filter_esc_status !== \"undefined\" && nfAdmin.filter_esc_status === \"true\") ? _.escape(optionLabel ) : optionLabel; \n\t\t\t\t\t\t\treturn '<option>' + optionLabel + '</option>';\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trenderOtherAttributes: function() {\n\t\t\t\t\tvar attributes = [];\n\t\t\t\t\tif('listmultiselect' == this.type) {\n\t\t\t\t\t\tattributes.push('multiple');\n\n\t\t\t\t\t\tvar multi_size = this.multi_size || '5';\n\t\t\t\t\t\tattributes.push('size=\"' + multi_size + '\"');\n\t\t\t\t\t}\n\n\t\t\t\t\treturn attributes.join(' ');\n\t\t\t\t},\n\t\t\t\trenderProduct: function() {\n\t\t\t\t\t// ...\n\t\t\t\t},\n\t\t\t\trenderNumberDefault: function() {\n\t\t\t\t\treturn this.value;\n\t\t\t\t},\n\t\t\t\trenderCurrencyFormatting: function() {\n\t\t\t\t\t// ...\n\t\t\t\t},\n\t\t\t\trenderRatings: function() {\n\t\t\t\t\tvar ratingOutput = '';\n\t\t\t\t\tfor (var i = 0; i < this.number_of_stars; i++) {\n\t\t\t\t\t\tratingOutput += '<i class=\"fa fa-star\" aria-hidden=\"true\"></i>&nbsp;';\n\t\t\t\t\t  }\n\t\t\t\t\treturn ratingOutput;\n\t\t\t\t},\n\t\t\t\trenderHourOptions: function() {\n            html = '';\n            let hours = 12;\n\n            if ( 'undefined' != typeof this.hours_24 && 1 == this.hours_24 ) {\n                hours = 24;\n            }\n\n            for (var i = 0; i < hours; i++) {\n                let value = label = i;\n\n                if ( i < 10 ) {\n                    value = label = '0' + i;\n                }\n                html += '<option value=\"' + value + '\">' + label + '</option>';\n                i = i++;\n            }\n\n            return html;\n        },\n\n        renderMinuteOptions: function() {\n            var html = '';\n            let minute_increment = 5;\n\n            if ( 'undefined' != typeof this.minute_increment ) {\n                minute_increment = this.minute_increment;\n            }\n\n            let i = 0;\n\t\t\t\n            while( i.toString().length <= 2 && i < 60 ) {\n                let value = label = i;\n\n                if ( i < 10 ) {\n                    value = label = '0' + i;\n                }\n                html += '<option value=\"' + value + '\">' + label + '</option>';\n                i = i + minute_increment;\n            }\n\n            return html;\n        },\n\n        maybeRenderAMPM: function() {\n            if ( 'undefined' == typeof this.hours_24 || 1 == this.hours_24 ) {\n                return;\n            }\n\n            return '<div style=\"float:left;\"><select class=\"ampm\" style=\"float:left;\"><option value=\"am\">AM</option><option value=\"pm\">PM</option></select></div>'\n        },\n        \t\t\t\tmaybeRenderTime: function() {\n\t\t\t\t\tif ( 'time_only' == this.date_mode || 'date_and_time' == this.date_mode ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\n            }\n\t\t},\n\t\t\n        convertDateFormat: function( dateFormat ) {\n            // http://php.net/manual/en/function.date.php\n            // https://github.com/dbushell/Pikaday/blob/master/README.md#formatting\n            // Note: Be careful not to add overriding replacements. Order is important here.\n\n            /** Day */\n            dateFormat = dateFormat.replace( 'D', 'ddd' ); // @todo Ordering issue?\n            dateFormat = dateFormat.replace( 'd', 'DD' );\n            dateFormat = dateFormat.replace( 'l', 'dddd' );\n            dateFormat = dateFormat.replace( 'j', 'D' );\n            dateFormat = dateFormat.replace( 'N', '' ); // Not Supported\n            dateFormat = dateFormat.replace( 'S', '' ); // Not Supported\n            dateFormat = dateFormat.replace( 'w', 'd' );\n            dateFormat = dateFormat.replace( 'z', '' ); // Not Supported\n\n            /** Week */\n            dateFormat = dateFormat.replace( 'W', 'W' );\n\n            /** Month */\n            dateFormat = dateFormat.replace( 'M', 'MMM' ); // \"M\" before \"F\" or \"m\" to avoid overriding.\n            dateFormat = dateFormat.replace( 'F', 'MMMM' );\n            dateFormat = dateFormat.replace( 'm', 'MM' );\n            dateFormat = dateFormat.replace( 'n', 'M' );\n            dateFormat = dateFormat.replace( 't', '' );  // Not Supported\n\n            // Year\n            dateFormat = dateFormat.replace( 'L', '' ); // Not Supported\n            dateFormat = dateFormat.replace( 'o', 'YYYY' );\n            dateFormat = dateFormat.replace( 'Y', 'YYYY' );\n            dateFormat = dateFormat.replace( 'y', 'YY' );\n\n            // Time - Not supported\n            dateFormat = dateFormat.replace( 'a', '' );\n            dateFormat = dateFormat.replace( 'A', '' );\n            dateFormat = dateFormat.replace( 'B', '' );\n            dateFormat = dateFormat.replace( 'g', '' );\n            dateFormat = dateFormat.replace( 'G', '' );\n            dateFormat = dateFormat.replace( 'h', '' );\n            dateFormat = dateFormat.replace( 'H', '' );\n            dateFormat = dateFormat.replace( 'i', '' );\n            dateFormat = dateFormat.replace( 's', '' );\n            dateFormat = dateFormat.replace( 'u', '' );\n            dateFormat = dateFormat.replace( 'v', '' );\n\n            // Timezone - Not supported\n            dateFormat = dateFormat.replace( 'e', '' );\n            dateFormat = dateFormat.replace( 'I', '' );\n            dateFormat = dateFormat.replace( 'O', '' );\n            dateFormat = dateFormat.replace( 'P', '' );\n            dateFormat = dateFormat.replace( 'T', '' );\n            dateFormat = dateFormat.replace( 'Z', '' );\n\n            // Full Date/Time - Not Supported\n            dateFormat = dateFormat.replace( 'c', '' );\n            dateFormat = dateFormat.replace( 'r', '' );\n            dateFormat = dateFormat.replace( 'u', '' );\n\n            return dateFormat;\n        }\n\n\t});\n\n\treturn view;\n} );\n","/**\n * This is a copy of the 'views/fields/mainContentEmpty.js' file.\n * It is also the file that handles dropping new field types on our repeater field.\n * \n */\n\ndefine( 'views/fields/preview/repeaterElementEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-repeater-content-fields-empty',\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.repeaterFieldModel = data.repeaterFieldModel;\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t\tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t}\n\t\t\tjQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\tlet that = this;\n\t\t\tjQuery( this.el ).parent().droppable( {\n\t\t\t\taccept: function( draggable ) {\n\t\t\t\t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\tover: function( e, ui ) {\t\n\t\t\t\t\t\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tjQuery(ui.item).addClass(\"nf-over-repeater\");\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\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tjQuery(ui.item).removeClass(\"nf-over-repeater\");\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * Handles the dropping of items into our EMPTY repeater field.\n\t\t\t\t * \n\t\t\t\t */\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tui.item = null != ui.item ? ui.item : ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'fields-repeater' ).request( 'add:childField', ui, that, e );\n\t\t\t\t},\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Collection View that outputs our repeater field collection to the screen.\n */\ndefine( 'views/fields/preview/repeaterElementCollection',[ 'views/fields/preview/repeaterElementEmpty' ], function( emptyView ) {\n\tvar view = Marionette.CollectionView.extend( {\n\t\ttagName: 'div',\n\t\temptyView: emptyView,\n\n\t\tgetChildView: function() {\n\t\t\tlet view = nfRadio.channel( 'views' ).request( 'get:fieldItem' );\n\t\t\treturn view;\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.emptyViewOptions = {\n\t\t\t\trepeaterFieldModel: data.repeaterFieldModel,\n\t\t\t};\n\t\t\tthis.repeaterFieldModel = data.repeaterFieldModel;\n\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'init:sortable', this.initSortable, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'get:sortableEl', this.getSortableEl, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'get:repeaterFieldsCollection', this.getRepeaterFieldsCollection, 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' );\n\t\t\t\tvar that = this;\n\t\t\t\tthis.initSortable();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * This sortable is a copy with modifications of the main field list sortable.\n\t\t * \n\t\t * @since  version\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tinitSortable: function() {\n\t\t\t// If the sortable has already been instantiated, return early.\n\t\t\tif ( 'undefined' != typeof jQuery( this.el ).sortable( 'instance' ) ) return false;\n\n\t\t\tjQuery( this.el ).addClass( 'nf-field-type-droppable' ).addClass( 'nf-fields-sortable' );\n\n\t\t\tlet that = this;\n\t\t\tjQuery( this.el ).sortable( {\n\t\t\t\tcontainment: 'parent',\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\tappendTo: '#nf-main',\n\t\t\t\tscrollSensitivity: 10,\n\t\t\t\t//connectWith would allow drag and drop between fields already in the builder and the repeatable fieldset ( this is currently an issue until we deal with existing data stored)\n\t\t\t\t//connectWith: '.nf-fields-sortable', \n\n\t\t\t\treceive: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'fields-repeater' ).request( 'receive:fields', ui, that, e );\n\t\t\t\t},\n\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tjQuery(ui.item).addClass(\"nf-over-repeater\");\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'fields-repeater' ).request( 'over:repeaterField', ui, that, e );\n\t\t\t\t},\n\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tjQuery(ui.item).removeClass(\"nf-over-repeater\");\n\t\t\t\t\tif ( ui.item.dropping ) return;\n\t\t\t\t\tnfRadio.channel( 'fields-repeater' ).request( 'out:repeaterField', ui, that, e );\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( 'fields-repeater' ).request( 'start:repeaterField', ui, that, e );\n\t\t\t\t},\n\n\t\t\t\tremove: function( e, ui ) {\n\t\t\t\t\t// The field is removed from repeater Fields collection and a new one is created for main Fields collection from controllers/fields/sortable/js\n\t\t\t\t\tlet droppedFieldID = jQuery( ui.item ).data( 'id' );\n\t\t\t\t\tlet collection = that.repeaterFieldModel.get( 'fields' );\n\t\t\t\t\tlet droppedFieldModel = collection.get( droppedFieldID );\n\t\t\t\t\t\n\t\t\t\t\t// Remove the field from the repeater field collection making sure we alert the user the field data is being deleted\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, droppedFieldModel );\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\t// When we update the sort order of our repeater field children, run our sort function.\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'fields-repeater' ).request( 'update:repeaterField', ui, that, e );\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( 'fields-repeater' ).request( 'stop:repeaterField', ui, that, e );\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\t/**\n\t\t * When we add our first child, we need to init the sortable.\n\t\t * \n\t\t * @since  version\n\t\t * @param  {[type]} childView [description]\n\t\t * @return {[type]}           [description]\n\t\t */\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\n\t\t/**\n\t\t * Get Element holding child fields\n\t\t */\n\t\tgetSortableEl: function() {\n\t\t\treturn this.el;\n\t\t},\n\n\t\t/**\n\t\t * Getter for the repeater Fields collection\n\t\t */\n\t\tgetRepeaterFieldsCollection: function() {\n\t\t\treturn this.repeaterFieldModel.get( 'fields' );\n\t\t}\n\t\t\n\t} );\n\n\treturn view;\n} );\n\n","define( 'views/fields/preview/repeaterElementLayout',[ 'views/fields/preview/repeaterElementCollection' ], function( previewRepeaterElementCollectionView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-field-repeater',\n\n\t\tregions: {\n\t\t\tfields: '.nf-repeater-fieldsets',\n\t\t},\n\n\t\tinitialize: function( data ) {\n\t\t\tthis.collection = data.collection;\n\t\t\tthis.model = data.model;\n\t\t},\n\n\t\tonRender: function() {\n\t\t\t// Populate the fields region with our collection view.\n\t\t\tthis.fields.show( new previewRepeaterElementCollectionView( { collection: this.collection, repeaterFieldModel: this.model } ) );\n\t\t},\n\n\t\ttemplateHelpers: function() {\n\t\t\treturn {\n\t\t\t\tmaybeFilterHTML: function()  {\n\t\t\t\t\treturn typeof nfAdmin.filter_esc_status !== \"undefined\" ? nfAdmin.filter_esc_status : \"false\";\n\t\t\t\t},\n\t\t\t\trenderDescText: function() {\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/fields/preview/label',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-field-label',\n\n\t\tinitialize: function( data ) {\n\t\t\t// this.$el = jQuery( data.itemView.el ).find( '.nf-realistic-field--label' );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\t// ...\n\t\t\t// console.log( jQuery( this.$el ) );\n\t\t},\n        \n\t\ttemplateHelpers: function () {\n\t    \treturn {\n\t    \t\trenderLabelClasses: function() {\n                    // ...\n                },\n\t\t\t\tmaybeFilterHTML: function()  {\n\t\t\t\t\treturn typeof nfAdmin.filter_esc_status !== \"undefined\" ? nfAdmin.filter_esc_status : \"false\";\n\t\t\t\t},\n                maybeRenderHelp: function() {\n                    // ...\n                }\n            }\n        }\n\n\t});\n\n\treturn view;\n} );\n","define( 'views/fields/fieldItem',['views/app/itemControls', 'views/fields/preview/element', 'views/fields/preview/repeaterElementLayout', 'views/fields/preview/label'], function( itemControlsView, previewElementView, previewRepeaterElementView, previewLabelView ) {\n\tvar view = Marionette.LayoutView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-field',\n\t\tdoingShortcut: false,\n\n\t\tregions: {\n\t\t\titemControls: '.nf-item-controls',\n\t\t\tpreviewLabel: '.nf-realistic-field--label',\n\t\t\tpreviewElement: '.nf-realistic-field--element',\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\n\t\t\tthis.model.on( 'change:label', this.render, this );\n\t\t\tthis.model.on( 'change:required', this.render, this );\n\t\t\tthis.model.on( 'change:id', this.render, this );\n\t\t},\n\n\t\tonBeforeDestroy: function() {\n\t\t\tthis.model.off( 'change:editActive', this.render );\n\t\t\tthis.model.off( 'change:label', this.render );\n\t\t\tthis.model.off( 'change:required', this.render );\n\t\t\tthis.model.off( 'change:id', this.render );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\n\t\t\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\n\t\t\tjQuery( this.el ).disableSelection();\n\n\t\t\tvar type = this.model.get('type');\n\t\t\tif('phone' == type) type = 'tel';\n\t\t\tif('spam' == type) type = 'input';\n\t\t\t// if('date' == type) type = 'input';\n\t\t\tif('confirm' == type) type = 'input';\n\t\t\tif('password' == type) type = 'input';\n\t\t\tif('passwordconfirm' == type) type = 'input';\n\t\t\tif('quantity' == type) type = 'number';\n\t\t\tif('terms' == type) type = 'listcheckbox';\n\t\t\tif('liststate' == type) type = 'listselect';\n\t\t\tif('listcountry' == type) type = 'listselect';\n\t\t\tif('listmultiselect' == type) type = 'listselect';\n\t\t\tif('save' == type) type = 'submit';\n\n\t\t\t// Only show preview / realisitic fields when not `html`, `hidden`, `note`, or `recaptcha`.\n\t\t\tvar previewFieldTypeBlacklist = ['html', 'hidden', 'note', 'recaptcha'];\n\t\t\tvar isFieldTypeTemplateAvailable = jQuery('#tmpl-nf-field-' + type).length;\n\t\t\tif(-1 == previewFieldTypeBlacklist.indexOf(this.model.get('type')) && isFieldTypeTemplateAvailable) {\n\t\t\t\t\n\t\t\t\t// If we have a repeater field, then we have to load a specific collection view.\n\t\t\t\tif ( 'repeater' == type ) {\n\t\t\t\t\tthis.previewElement.show( new previewRepeaterElementView( { collection: this.model.get( 'fields' ), model: this.model } ) );\n\t\t\t\t} else {\n\t\t\t\t\tthis.previewElement.show( new previewElementView( { model: this.model } ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Only show the preview label when not `submit`, or `hr`.\n\t\t\t\tvar showLabelFieldTypeBlacklist = ['submit', 'save', 'hr'];\n\t\t\t\tif(-1 == showLabelFieldTypeBlacklist.indexOf(this.model.get('type'))) {\n\t\t\t\t\tthis.previewLabel.show( new previewLabelView( { model: this.model, itemView: this } ) );\n\t\t\t\t}\n\n\t\t\t\tjQuery( this.el ).find('.nf-placeholder-label').hide();\n\t\t\t}\n\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( this.el ).on( 'taphold', function( e, touch ) {\n\t\t\t\t\tif ( ! jQuery( e.target ).hasClass( 'nf-edit-settings' ) ) {\n\t\t\t\t\t\tjQuery( this ).addClass( 'ui-sortable-helper drag-selected' );\n\t\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'fields-' + type ).trigger( 'render:itemView', this );\n\t\t},\n\n\t\ttemplateHelpers: function () {\n\t    \treturn {\n\t    \t\trenderClasses: function() {\n\t    \t\t\tvar classes = 'nf-field-wrap ' + this.type;\n\t    \t\t\tif ( this.editActive ) {\n\t    \t\t\t\tclasses += ' active';\n\t    \t\t\t}\n\t    \t\t\treturn classes;\n\t    \t\t},\n\t\t\t\tmaybeFilterHTML: function()  {\n\t\t\t\t\treturn typeof nfAdmin.filter_esc_status !== \"undefined\" ? nfAdmin.filter_esc_status : \"false\";\n\t\t\t\t},\n\t    \t\trenderRequired: function() {\n\t    \t\t\tif ( 1 == this.required ) {\n\t    \t\t\t\treturn '<span class=\"required\">*</span>';\n\t    \t\t\t} else {\n\t    \t\t\t\treturn '';\n\t    \t\t\t}\n\t    \t\t},\n\t    \t\tgetFieldID: function() {\n\t\t\t\t\tif ( jQuery.isNumeric( this.id ) ) {\n\t\t\t\t\t\treturn 'field-' + this.id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn this.id;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trenderIcon: function() {\n\t    \t\t\tvar type, icon;\n\n\t\t\t\t\ttype = nfRadio.channel( 'fields' ).request( 'get:type', this.type );\n\n\t\t\t\t\ticon = document.createElement( 'span' );\n\t\t\t\t\ticon.classList.add( 'fa', 'fa-' + type.get( 'icon' ) );\n\n\t\t\t\t\treturn icon.outerHTML;\n\t\t\t\t},\n\t\t\t\tlabelPosition: function() {\n\t\t\t\t\treturn this.label_pos;\n\t\t\t\t},\n\t\t\t\trenderDescriptionText: function() {\n\t\t\t\t\treturn typeof this.desc_text === \"undefined\" || this.desc_text === null ? \"\" : String(this.desc_text).trim();\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tevents: {\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\n\t\t\t'mousedown': 'maybeShortcut',\n\t\t\t'click': 'maybeClickEdit',\n\t\t\t'singletap': 'maybeTapEdit',\n\t\t\t'swipeleft': 'swipeLeft',\n\t\t\t'swiperight': 'swipeRight',\n\t\t\t'tapend': 'tapend'\n\t\t},\n\n\t\tmaybeClickEdit: function( e ) {\n\t\t\tif ( this.doingShortcut ) {\n\t\t\t\tthis.doingShortcut = false;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) || jQuery( e.target ).parent().hasClass( 'nf-field-wrap' ) || jQuery( e.target ).hasClass( 'nf-field-wrap' ) ) && ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ':focus' ).blur();\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tmaybeShortcut: function( e ) {\n\t\t\tvar keys = nfRadio.channel( 'app' ).request( 'get:keydown' );\n\t\t\t/*\n\t\t\t * If the shift key isn't held down, return.\n\t\t\t */\n\t\t\tif ( -1 == keys.indexOf( 16 ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t/*\n\t\t\t * If we are pressing D, delete this field.\n\t\t\t */\n\t\t\tif ( -1 != keys.indexOf( 68 ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\treturn false;\n\t\t\t} else if ( -1 != keys.indexOf( 67 ) ) {\n\t\t\t\tthis.doingShortcut = true;\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tmaybeTapEdit: function( e ) {\n\t\t\tif ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) ) {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\n\t\t\t}\n\t\t},\n\n\t\tswipeLeft: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).show();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).show();\n\t\t},\n\n\t\tswipeRight: function( e, touch ) {\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).hide();\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).hide();\n\t\t},\n\n\t\ttapend: function( e, touch ) {\n\t\t\tjQuery( this.el ).ClassyWiggle( 'stop' );\n\t\t\tjQuery( this.el ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t},\n\n\t\tremove: function(){\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:removing' ) ) {\n\t\t\t\tthis.$el.hide( 'clip', function(){\n\t\t\t\t\tjQuery( this ).remove();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.$el.remove();\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:removing', false );\n\t\t},\n\n\t\tmouseoverItemControl: function( e ) {\n\t\t\tjQuery( this.el ).find( '.nf-item-control' ).css( 'display', '' );\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\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',['models/fields/fieldModel', 'views/fields/fieldItem'], function(FieldModel, FieldItemView) {\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\tnfRadio.channel( 'app' ).reply( 'receive:repeaterField', this.receiveRepeaterField, 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//Check for fields coming from a repeater field\n\t\t\tui = this.receiveRepeaterField(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\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\n\t\t\t\t// Render a fieldItemView using a mock fieldModel.\n\t\t\t\tvar fieldModel = new FieldModel({ label: fieldType.get( 'nicename' ), type: type });\n\t\t\t\tvar fieldItemView = new FieldItemView({model:fieldModel});\n\t\t\t\tvar renderedFieldItemView = fieldItemView.render();\n\t\t\t\tvar fieldTypeEl = renderedFieldItemView.$el[0];\n\t\t\t\tjQuery( ui.helper ).html( fieldTypeEl.outerHTML );\n\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\t\n\t\t\t\t// Maintain origional visibility during drag/sort.\n\t\t\t\tjQuery( ui.item ).show();\n\n\t\t\t\t// Determine helper based on builder/layout type.\n\t\t\t\tif(jQuery(ui.item).hasClass('nf-field-wrap')){\n\t\t\t\t\tvar newHelper = jQuery(ui.item).clone();\n\t\t\t\t} else if(jQuery(ui.item).parent().hasClass('layouts-cell')) {\n\t\t\t\t\tvar newHelper = $parentHelper.clone();\n\t\t\t\t} else {\n\t\t\t\t\tvar newHelper = jQuery(ui.item).clone();\n\t\t\t\t}\n\n\t\t\t\t// Remove unecessary item controls from helper.\n\t\t\t\tnewHelper.find('.nf-item-controls').remove();\n\n\t\t\t\t// Update helper with clone's content.\n\t\t\t\tjQuery( ui.helper ).html( newHelper.html() );\n\n\t\t\t\tjQuery( ui.helper ).css( 'opacity', '0.5' );\n\t\t\t\t\n\t\t\t\t// Add de-emphasize origional.\n\t\t\t\tjQuery( ui.item ).css( 'opacity', '0.25' );\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\n\t\t},\n\n\t\treceiveRepeaterField: function( ui ){\n\t\t\t//If the field was already saved as a Repeater child field we'll delete it and create a new one for the main collection\n\t\t\tif( String( jQuery( ui.item ).data('id') ).indexOf('.') !== -1){\n\t\t\t\tjQuery( ui.item ).removeClass('nf-field-wrap');\n\t\t\t\tlet type = jQuery( ui.item ).attr('class');\n\t\t\t\tjQuery( ui.item ).data('id', type);\n\t\t\t\tjQuery( ui.item ).addClass('nf-field-type-draggable');\n\t\t\t}\n\n\t\t\treturn ui;\n\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/*\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\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: function( model ){\n\t\t\treturn parseInt( model.get( 'order' ) );\n\t\t},\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\n\t\t\tif ('undefined' !== typeof this.settingModel ) {\n\t\t\t\tnfRadio.channel('option-repeater-' + this.settingModel.get('name')).trigger('sort:options', this);\n\t\t\t}\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    var view = Marionette.LayoutView.extend({\n        tagName: 'div',\n        className: 'nf-table-row',\n        template: '#tmpl-nf-edit-setting-option-repeater-default-row',\n        id: function() {\n            return this.model.cid;\n        },\n\n        regions: {\n            error: '.nf-option-error'\n        },\n\n        initialize: function( data ) {\n            this.settingModel = data.settingModel;\n            this.dataModel = data.dataModel;\n            this.collection = data.collection;\n            this.columns = data.columns;\n            this.parentView = data.parentView;\n            this.model.on( 'change:errors', this.renderErrors, this );\n\n            // Removed because the re-render was breaking tag insertion for merge tags.\n            // this.model.on( 'change', this.render, this );\n\n            if ( 'undefined' != typeof this.settingModel.get( 'tmpl_row' ) ) {\n                this.template = '#' + this.settingModel.get( 'tmpl_row' );\n            }\n\n            this.hasErrors = false;\n        },\n\n        onBeforeDestroy: function() {    \n            this.model.off( 'change', this.render );\n            this.model.off( 'change:errors', this.renderErrors );\n        },\n\n        onBeforeRender: function() {\n            /*\n             * We want to escape any HTML being output for our label.\n             */\n            if ( this.model.get( 'label' ) ) {\n                var label = this.model.get( 'label' );\n                this.model.set( 'label', _.escape( label ), { silent: true } );\n            }\n            \n        },\n\n        onRender: function() {\n            nfRadio.channel( 'mergeTags' ).request( 'init', this );\n            /*\n             * Send out a radio message.\n             */\n            nfRadio.channel( 'setting-' + this.settingModel.get( 'name' ) + '-option' ).trigger( 'render:setting', this.model, this.dataModel, this );\n            /*\n             * We want to unescape any HTML being output for our label.\n             */\n            if ( this.model.get( 'label' ) ) {\n                var label = this.model.get( 'label' );\n                this.model.set( 'label', _.unescape( label ), { silent: true } );\n            }\n        },\n\n        onShow: function() {\n            if ( this.model.get( 'new' ) ) {\n                jQuery( this.el ).find( 'input:first' ).focus();\n                this.model.set( 'new', false );\n            }\n        },\n\n        events: {\n            'change .setting': 'changeOption',\n            'click .nf-delete': 'deleteOption',\n            'keyup': 'keyupOption'\n        },\n\n        changeOption: function( e ) {\n            nfRadio.channel( 'option-repeater' ).trigger( 'change:option', e, this.model, this.dataModel, this.settingModel, this );\n        },\n\n        deleteOption: function( e ) {\n            nfRadio.channel( 'option-repeater' ).trigger( 'click:deleteOption', this.model, this.collection, this.dataModel, this );\n        },\n\n        keyupOption: function( e ) {\n            this.maybeAddOption( e );\n            nfRadio.channel( 'option-repeater' ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n            nfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n        },\n\n        maybeAddOption: function( e ) {\n            if ( 13 == e.keyCode && 'calculations' != this.settingModel.get( 'name' ) ) {\n                nfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel, this );\n                jQuery( this.parentView.children.findByIndex(this.parentView.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\n            }\n        },\n\n        renderErrors: function() {\n            \n            // if ( jQuery.isEmptyObject( this.model.get( 'errors' ) ) ) {\n            //     return false;\n            // }\n\n            /*\n             * We don't want to redraw the entire row, which would remove focus from the eq textarea,\n             * so we add and remove error classes manually.\n             */\n            if ( 0 == Object.keys( this.model.get( 'errors' ) ) ) {\n                if ( this.hasErrors ) {\n                    this.error.empty();\n                    jQuery( this.el ).removeClass( 'nf-error' );\n                }\n            } else {\n                this.hasErrors = true;\n                this.error.show( new ErrorView( { model: this.model } ) );\n                jQuery( this.el ).addClass( 'nf-error' );\n            }\n        },\n\n        templateHelpers: function() {\n            var that = this;\n            return {\n                getColumns: function() {\n                    var columns = that.columns;\n                    if(!nfAdmin.devMode){\n                        delete columns.value;\n                    }\n                    return columns;\n                },\n                renderFieldSelect: function( dataID, value ){\n                    var initialOption, select, emptyContainer, label;\n\n                    var fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n                    initialOption = document.createElement( 'option' );\n                    initialOption.value = '';\n                    initialOption.label = '--';\n                    initialOption.innerHTML = '--';\n\n                    select = document.createElement( 'select' );\n                    select.classList.add( 'setting' );\n                    select.setAttribute( 'data-id', dataID );\n                    select.appendChild( initialOption );\n\n                    fields.each( function( field ){\n                        var option = document.createElement( 'option' );\n                        if ( value == field.get( 'key' ) ) {\n                            option.setAttribute( 'selected', 'selected' );\n                        }\n                        option.value = field.get( 'key' );\n                        option.innerHTML = field.formatLabel();\n                        option.label = field.formatLabel();\n                        select.appendChild( option );\n                    });\n\n                    label = document.createElement( 'label' );\n                    label.classList.add( 'nf-select' );\n                    label.appendChild( select );\n\n                    // Select Lists need an empty '<div></div>' for styling purposes.\n                    emptyContainer = document.createElement( 'div' );\n                    emptyContainer.style.bottom = '6px';\n                    label.appendChild( emptyContainer );\n\n                    // The template requires a string.\n                    return label.innerHTML;\n                },\n                renderNonSaveFieldSelect: function( dataID, value ){\n                    var initialOption, select, emptyContainer, label;\n\n                    var fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n                    initialOption = document.createElement( 'option' );\n                    initialOption.value = '';\n                    initialOption.label = '--';\n                    initialOption.innerHTML = '--';\n\n                    select = document.createElement( 'select' );\n                    select.classList.add( 'setting' );\n                    select.setAttribute( 'data-id', dataID );\n                    select.appendChild( initialOption );\n\n                    // Build a lookup table for fields we want to remove from our fields list.\n                    var removeFieldsLookup = [ 'html', 'submit', 'hr',\n                        'recaptcha', 'spam', 'creditcard', 'creditcardcvc',\n                        'creditcardexpiration', 'creditcardfullname',\n                        'creditcardnumber', 'creditcardzip' ];\n\n                    fields.each( function( field ){\n                        // Check for the field type in our lookup array and...\n                        if( jQuery.inArray( field.get( 'type' ), removeFieldsLookup ) !== -1 ) {\n                            // Return if the type is in our lookup array.\n                            return '';\n                        }\n\n                        var option = document.createElement( 'option' );\n                        if ( value == field.get( 'key' ) ) {\n                            option.setAttribute( 'selected', 'selected' );\n                        }\n                        option.value = field.get( 'key' );\n                        option.innerHTML = field.formatLabel();\n                        option.label = field.formatLabel();\n                        select.appendChild( option );\n                    });\n\n                    label = document.createElement( 'label' );\n                    label.classList.add( 'nf-select' );\n                    label.appendChild( select );\n\n                    // Select Lists need an empty '<div></div>' for styling purposes.\n                    emptyContainer = document.createElement( 'div' );\n                    emptyContainer.style.bottom = '6px';\n                    label.appendChild( emptyContainer );\n\n                    // The template requires a string.\n                    return label.innerHTML;\n                },\n                renderOptions: function( column, value ) {\n\n                    if( 'undefined' == typeof that.options.columns[ column ] ) return;\n\n                    var select = document.createElement( 'select' );\n                    \n                    _.each( that.options.columns[ column ].options, function( option ){\n                        var optionNode = document.createElement( 'option' );\n                        if ( value === option.value ) {\n                            optionNode.setAttribute( 'selected', 'selected' );\n                        }\n                        optionNode.setAttribute( 'value', option.value );\n                        optionNode.setAttribute( 'label', option.label );\n                        optionNode.innerText = option.label;\n                        select.appendChild( optionNode );\n                    });\n\n                    // The template only needs the options.\n                    return select.innerHTML;\n                }\n\n            }\n        }\n\n    });\n\n    return 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\t// If we don't have a 'settings' property, this is a legacy depdency setup.\n\t\t\t\tif ( 'undefined' == typeof deps.settings ) {\n\t\t\t\t\tdeps.settings = [];\n\t\t\t\t\t_.each(deps, function(dep, name){\n\t\t\t\t\t\tif( 'settings' !== name ) {\n\t\t\t\t\t\t\tdeps.settings.push( { name: name, value: dep } );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tdeps.match = 'all';\n\t\t\t\t}\n\n\t\t\t\tfor (var i = deps.settings.length - 1; i >= 0; i--) {\n\t\t\t\t\tlet name = deps.settings[i].name;\n\t\t\t\t\tthis.dataModel.on( 'change:' + name, this.render, this );\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 i = deps.settings.length - 1; i >= 0; i--) {\n\t\t\t\t\tname = deps.settings[i].name;\n\t\t\t\t\tthis.dataModel.off( 'change:' + name, this.render );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonRender: function() {\t\t\n\t\t\tvar that = this;\n\t\t\tjQuery( this.el ).find( '.nf-list-options-tbody' ).sortable( {\n\t\t\t\thandle: '.handle',\n\t\t\t\thelper: 'clone',\n\t\t\t\tplaceholder: 'nf-list-options-sortable-placeholder',\n\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\topacity: 0.95,\n\t\t\t\ttolerance: 'pointer',\n\n\t\t\t\tstart: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'start:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tstop: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'stop:optionSortable', ui );\n\t\t\t\t},\n\n\t\t\t\tupdate: function( e, ui ) {\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'update:optionSortable', ui, this, that );\n\t\t\t\t}\n\t\t\t} );\n\n            that.setupTooltip();\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: ( \"1\" == nfAdmin.devMode ? jQuery( this.el ).find( '.nf-dev-import-options' ) : 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        /**\n         * Function to append jBox modals to each tooltip element in the option repeater.\n         */\n        setupTooltip: function() {\n            // For each .nf-help in the option repeater...\n            jQuery( this.el ).find( '.nf-list-options' ).find( '.nf-help' ).each(function() {\n                // Get the content.\n                var content = jQuery(this).next('.nf-help-text');\n                // Declare the modal.\n                jQuery( this ).jBox( 'Tooltip', {\n                    content: content,\n                    maxWidth: 200,\n                    theme: 'TooltipBorder',\n                    trigger: 'click',\n                    closeOnClick: true\n                })\n            });\n        },\n\n        templateHelpers: function () {\n            var that = this;\n\n            return {\n                renderHeaders: function() {\n                    // If this is a Field...\n                    // AND If the type includes 'list'...\n                    if ( 'Field' == that.dataModel.get( 'objectType' ) && -1 !== that.dataModel.get( 'type' ).indexOf( 'list' ) ) {\n                        // Declare help text.\n                        var helpText, helpTextContainer, helpIcon, helpIconLink, helpTextWrapper;\n\n                        helpText = document.createTextNode( nfi18n.valueChars );\n                        helpTextContainer = document.createElement( 'div' );\n                        helpTextContainer.classList.add( 'nf-help-text' );\n                        helpTextContainer.appendChild( helpText );\n\n                        helpIcon = document.createElement( 'span' );\n                        helpIcon.classList.add( 'dashicons', 'dashicons-admin-comments' );\n                        helpIconLink = document.createElement( 'a' );\n                        helpIconLink.classList.add( 'nf-help' );\n                        helpIconLink.setAttribute( 'href', '#' );\n                        helpIconLink.setAttribute( 'tabindex', '-1' );\n                        helpIconLink.appendChild( helpIcon );\n\n                        helpTextWrapper = document.createElement( 'span' );\n                        helpTextWrapper.appendChild( helpIconLink );\n                        helpTextWrapper.appendChild( helpTextContainer );\n\n                        // Append the help text to the 'value' header.\n                        if('undefined' !== typeof that.model.get('columns') ){\n                            if('undefined' !== typeof that.model.get('columns').value ){\n                                if ( -1 == that.model.get('columns').value.header.indexOf( helpTextWrapper.innerHTML ) ) {\n                                    that.model.get('columns').value.header += helpTextWrapper.innerHTML;\n                                }\n                            }\n                    \n                        }\n                    }\n                   \t// If this is a Field and If the type includes 'list'...\n\t\t\t\t\tif ( 'Field' == that.dataModel.get( 'objectType' ) && -1 !== that.dataModel.get( 'type' ).indexOf( 'list' ) ) {\n\t\t\t\t\t\t// Declare help text elements.\n\t\t\t\t\t\tlet helpTextContainer, helpIcon, helpIconLink, helpTextWrapper;\n\t\t\t\t\t\t\n\t\t\t\t\t\thelpTextContainer = document.createElement( 'div' );\n\t\t\t\t\t\thelpTextContainer.classList.add( 'nf-help-text' );\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\thelpIcon = document.createElement( 'span' );\n\t\t\t\t\t\thelpIcon.classList.add( 'dashicons', 'dashicons-admin-comments' );\n\t\t\t\t\t\thelpIconLink = document.createElement( 'a' );\n\t\t\t\t\t\thelpIconLink.classList.add( 'nf-help' );\n\t\t\t\t\t\thelpIconLink.setAttribute( 'href', '#' );\n\t\t\t\t\t\thelpIconLink.setAttribute( 'tabindex', '-1' );\n\t\t\t\t\t\thelpIconLink.appendChild( helpIcon );\n\t\t\t\t\t\thelpTextWrapper = document.createElement( 'span' );\n\t\t\t\t\t\thelpTextWrapper.appendChild( helpIconLink );\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t// Conditionals for setting a Value or CalcValue header\n\t\t\t\t\t\tconst isValue = 'undefined' !== typeof that.model.get('columns') && 'undefined' !== typeof that.model.get('columns').value;\n\t\t\t\t\t\tconst isCalc = 'undefined' !== typeof that.model.get('columns') && 'undefined' !== typeof that.model.get('columns').calc;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t// Append the help text to the 'value' column\n\t\t\t\t\t\tif( isValue && -1 == that.model.get('columns').value.header.indexOf( helpTextWrapper.innerHTML ) ){\n\t\t\t\t\t\t\tconst helpText = document.createTextNode( nfi18n.valueChars );\n\t\t\t\t\t\t\thelpTextContainer.replaceChildren( helpText );\n\t\t\t\t\t\t\thelpTextWrapper.appendChild( helpTextContainer );\n\t\t\t\t\t\t\tthat.model.get('columns').value.header += helpTextWrapper.innerHTML;\n\t\t\t\t\t\t} \n\t\t\t\t\t\t// Append the help text to the 'calcValue' column\n\t\t\t\t\t\tif ( isCalc && -1 == that.model.get('columns').calc.header.indexOf( helpTextWrapper.innerHTML ) ) {\n\t\t\t\t\t\t\tconst helpText = document.createTextNode( nfi18n.calcValueChars );\n\t\t\t\t\t\t\thelpTextContainer.replaceChildren( helpText );\n\t\t\t\t\t\t\thelpTextWrapper.appendChild( helpTextContainer );\n\t\t\t\t\t\t\tthat.model.get('columns').calc.header += helpTextWrapper.innerHTML;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t    \t\t\tvar columns, beforeColumns, afterColumns;\n\n\t    \t\t\tbeforeColumns = document.createElement( 'div' );\n\n\t    \t\t\tcolumns = document.createElement( 'span' );\n\t    \t\t\tcolumns.appendChild( beforeColumns );\n\n\t\t\t\t\tif(!nfAdmin.devMode){\n\t\t\t\t\t\tdelete this.columns.value;\n\t\t\t\t\t}\n\n\t    \t\t\t_.each( this.columns, function( col ) {\n\t    \t\t\t\tvar headerText, headerContainer;\n\n\t    \t\t\t\t// Use a fragment to support HTML in the col.header property, ie Dashicons.\n                        headerText = document.createRange().createContextualFragment( col.header );\n\t    \t\t\t\theaderContainer = document.createElement( 'div' );\n\t    \t\t\t\theaderContainer.appendChild( headerText );\n\n\t    \t\t\t\tcolumns.appendChild( headerContainer );\n\t    \t\t\t} );\n\n                    afterColumns = document.createElement( 'div' );\n                    columns.appendChild( afterColumns );\n\n\t\t\t\t\treturn columns.innerHTML;\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\treturn nfRadio.channel( 'settings' ).request( 'check:deps', this, that );\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","/**\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 ).prop( '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 if ('calc' == name) {\n\t\t\t\tvar value = Number(jQuery(e.target).val());\n\t\t\t\tif( isNaN(value) ) {\n\t\t\t\t\tvalue = 0;\n\t\t\t\t\tjQuery(e.target).val(0);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t}\n\t\t\t\n\t\t\tvar before = model.get( name );\n\t\t\t\n\t\t\tmodel.set( name, value );\n\t\t\t// Trigger an update on our dataModel\n\t\t\tthis.triggerDataModel( model, dataModel );\n\n\t\t\tvar after = value;\n\t\t\t\n\t\t\tvar changes = {\n\t\t\t\tattr: name,\n\t\t\t\tbefore: before,\n\t\t\t\tafter: after\n\t\t\t}\n\n\t\t\tvar label = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\tlabel: dataModel.get( 'label' ),\n\t\t\t\tchange: 'Option ' + model.get( 'label' ) + ' ' + name + ' changed from ' + before + ' to ' + after\n\t\t\t};\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', model, changes, label );\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-option-' + name  ).trigger( 'update:option', e, model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'option-repeater-' + settingModel.get( 'name' ) ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t},\n\n\t\t/**\n\t\t * Add an option to our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\taddOption: function( collection, dataModel ) {\n\t\t\tvar modelData = {\n\t\t\t\torder: collection.length,\n\t\t\t\tnew: true,\n\t\t\t\toptions: {}\n\t\t\t};\n\t\t\t/**\n\t\t\t * If we don't actually have a 'settingModel' duplicated fields\n\t\t\t * can't add options until publish and the builder is reloaded.\n\t\t\t * If we ignore the code if we don't have settingsModel, then it\n\t\t\t * works.\n\t\t\t */\n\t\t\tif  ( 'undefined' !== typeof collection.settingModel ) {\n\t\t\t\tvar limit = collection.settingModel.get( 'max_options' );\n\t\t\t\tif ( 0 !== limit && collection.models.length >= limit ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t_.each( collection.settingModel.get( 'columns' ), function ( col, key ) {\n\t\t\t\t\tmodelData[ key ] = col.default;\n\n\t\t\t\t\tif ( 'undefined' != typeof col.options ) {\n\t\t\t\t\t\tmodelData.options[ key ] = col.options;\n\t\t\t\t\t}\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\n\t\t\tif ( 'undefined' !== typeof collection.settingModel ) {\n\t\t\t\tnfRadio.channel('option-repeater-' + collection.settingModel.get('name')).trigger('add:option', model);\n\t\t\t}\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","define( 'views/app/drawer/imageOptionRepeaterOption',['views/app/drawer/optionRepeaterError'], function( ErrorView ) {\n    var view = Marionette.LayoutView.extend({\n        tagName: 'div',\n        className: 'nf-table-row',\n        template: '#tmpl-nf-edit-setting-image-option-repeater-default-row',\n        id: function() {\n            return this.model.cid;\n        },\n\n        regions: {\n            error: '.nf-option-error'\n        },\n\n        initialize: function( data ) {\n            this.settingModel = data.settingModel;\n            this.dataModel = data.dataModel;\n            this.collection = data.collection;\n            this.columns = data.columns;\n            this.parentView = data.parentView;\n            this.model.on( 'change:errors', this.renderErrors, this );\n\n            // Removed because the re-render was breaking tag insertion for merge tags.\n            // this.model.on( 'change', this.render, this );\n\n            if ( 'undefined' != typeof this.settingModel.get( 'tmpl_row' ) ) {\n                this.template = '#' + this.settingModel.get( 'tmpl_row' );\n            }\n\n            this.listenTo( nfRadio.channel( 'image-option-repeater' ), 'click:extra', this.clickExtra );\n\n            this.hasErrors = false;\n        },\n\n        onBeforeDestroy: function() {    \n            this.model.off( 'change', this.render );\n            this.model.off( 'change:errors', this.renderErrors );\n        },\n\n        onBeforeRender: function() {\n            /*\n             * We want to escape any HTML being output for our image.\n             */\n            if ( this.model.get( 'image' ) ) {\n                var image = this.model.get( 'image' );\n                this.model.set( 'image', _.escape( image ), { silent: true } );\n            }\n            \n        },\n\n        onRender: function() {\n            nfRadio.channel( 'mergeTags' ).request( 'init', this );\n            /*\n             * Send out a radio message.\n             */\n            nfRadio.channel( 'setting-' + this.settingModel.get( 'name' ) + '-option' ).trigger( 'render:setting', this.model, this.dataModel, this );\n            /*\n             * We want to unescape any HTML being output for our image.\n             */\n            if ( this.model.get( 'image' ) ) {\n                var image = this.model.get( 'image' );\n                this.model.set( 'image', _.unescape( image ), { silent: true } );\n            }\n        },\n\n        onShow: function() {\n            if ( this.model.get( 'new' ) ) {\n                jQuery( this.el ).find( 'input:first' ).focus();\n                this.model.set( 'new', false );\n            }\n        },\n\n        events: {\n            'change .setting': 'changeOption',\n            'click .nf-delete': 'deleteOption',\n            'keyup': 'keyupOption',\n            // 'click .open-media-manager': 'openMediaModal'\n        },\n\n        changeOption: function( e ) {\n            nfRadio.channel( 'image-option-repeater' ).trigger( 'change:option', e, this.model, this.dataModel, this.settingModel, this );\n        },\n\n        deleteOption: function( e ) {\n            nfRadio.channel( 'image-option-repeater' ).trigger( 'click:deleteOption', this.model, this.collection, this.dataModel, this );\n        },\n\n        keyupOption: function( e ) {\n            this.maybeAddOption( e );\n            nfRadio.channel( 'image-option-repeater' ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n            nfRadio.channel( 'image-option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\n        },\n\n        maybeAddOption: function( e ) {\n            if ( 13 == e.keyCode && 'calculations' != this.settingModel.get( 'name' ) ) {\n                nfRadio.channel( 'image-option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel, this );\n                jQuery( this.parentView.children.findByIndex(this.parentView.children.length - 1).el ).find( '[data-id=\"image\"]' ).focus();\n            }\n        },\n\n        clickExtra: function(e, settingModel, dataModel, settingView) {\n            \n            var textEl = jQuery(e.target).parent().find('.setting');\n            var optionContainerDiv = jQuery(e.target).parent().parent().parent();\n\n            var valueEl = jQuery(optionContainerDiv[0]).find('[data-id=\"value\"]');\n\n            var imageIdEl = jQuery(optionContainerDiv[0]).find('[data-id=\"image_id\"]');\n\n            var labelEl = jQuery(optionContainerDiv[0]).find('[data-id=\"label\"]');\n            \n            if ( jQuery( e.target ).hasClass( 'open-media-manager' )\n                && this.el.id === optionContainerDiv[0].id) {\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                    \n                    textEl.val(media_attachment.url).change();\n                    valueEl.val(media_attachment.filename).change();\n                    labelEl.val(media_attachment.title).change();\n                    imageIdEl.val(media_attachment.id).change();\n                    var img_container = optionContainerDiv.find('.option-image-container');\n\n                    if(img_container) {\n                        $imgs = jQuery(img_container).find('img');\n                        if($imgs.length > 0) {\n                            jQuery($imgs[0]).attr('src', media_attachment.url);\n                        } else {\n                            var new_img = document.createElement('img');\n                            new_img.style=\"max-width:100px;display:inline-block;\";\n                            new_img.src = media_attachment.url;\n                            jQuery(img_container).append(new_img);\n                        }\n                    }\n                });\n\n                // Opens the media library frame.\n                this.meta_image_frame.open();\n            }\n        },\n\n        renderErrors: function() {\n            \n            // if ( jQuery.isEmptyObject( this.model.get( 'errors' ) ) ) {\n            //     return false;\n            // }\n\n            /*\n             * We don't want to redraw the entire row, which would remove focus from the eq textarea,\n             * so we add and remove error classes manually.\n             */\n            if ( 0 == Object.keys( this.model.get( 'errors' ) ) ) {\n                if ( this.hasErrors ) {\n                    this.error.empty();\n                    jQuery( this.el ).removeClass( 'nf-error' );\n                }\n            } else {\n                this.hasErrors = true;\n                this.error.show( new ErrorView( { model: this.model } ) );\n                jQuery( this.el ).addClass( 'nf-error' );\n            }\n        },\n\n        templateHelpers: function() {\n            var that = this;\n            return {\n                getColumns: function() {\n                    var columns = that.columns;\n                    if(!nfAdmin.devMode){\n                        delete columns.value;\n                    }\n                    return columns;\n                },\n                renderFieldSelect: function( dataID, value ){\n                    var initialOption, select, emptyContainer, image;\n\n                    var fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n                    initialOption = document.createElement( 'option' );\n                    initialOption.value = '';\n                    initialOption.image = '';\n                    initialOption.innerHTML = '--';\n\n                    select = document.createElement( 'select' );\n                    select.classList.add( 'setting' );\n                    select.setAttribute( 'data-id', dataID );\n                    select.appendChild( initialOption );\n\n                    fields.each( function( field ){\n                        var option = document.createElement( 'option' );\n                        if ( value == field.get( 'key' ) ) {\n                            option.setAttribute( 'selected', 'selected' );\n                        }\n                        option.value = field.get( 'key' );\n                        option.innerHTML = field.formatLabel();\n                        option.image = field.formatLabel();\n                        select.appendChild( option );\n                    });\n\n                    image = document.createElement( 'image' );\n                    image.classList.add( 'nf-select' );\n                    image.appendChild( select );\n\n                    // Select Lists need an empty '<div></div>' for styling purposes.\n                    emptyContainer = document.createElement( 'div' );\n                    emptyContainer.style.bottom = '6px';\n                    image.appendChild( emptyContainer );\n\n                    // The template requires a string.\n                    return image.innerHTML;\n                },\n                renderNonSaveFieldSelect: function( dataID, value ){\n                    var initialOption, select, emptyContainer, image;\n\n                    var fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\n                    initialOption = document.createElement( 'option' );\n                    initialOption.value = '';\n                    initialOption.image = '';\n                    initialOption.innerHTML = '--';\n\n                    select = document.createElement( 'select' );\n                    select.classList.add( 'setting' );\n                    select.setAttribute( 'data-id', dataID );\n                    select.appendChild( initialOption );\n\n                    // Build a lookup table for fields we want to remove from our fields list.\n                    var removeFieldsLookup = [ 'html', 'submit', 'hr',\n                        'recaptcha', 'spam', 'creditcard', 'creditcardcvc',\n                        'creditcardexpiration', 'creditcardfullname',\n                        'creditcardnumber', 'creditcardzip' ];\n\n                    fields.each( function( field ){\n                        // Check for the field type in our lookup array and...\n                        if( jQuery.inArray( field.get( 'type' ), removeFieldsLookup ) !== -1 ) {\n                            // Return if the type is in our lookup array.\n                            return '';\n                        }\n\n                        var option = document.createElement( 'option' );\n                        if ( value == field.get( 'key' ) ) {\n                            option.setAttribute( 'selected', 'selected' );\n                        }\n                        option.value = field.get( 'key' );\n                        option.innerHTML = field.formatLabel();\n                        option.image = field.formatLabel();\n                        select.appendChild( option );\n                    });\n\n                    image = document.createElement( 'image' );\n                    image.classList.add( 'nf-select' );\n                    image.appendChild( select );\n\n                    // Select Lists need an empty '<div></div>' for styling purposes.\n                    emptyContainer = document.createElement( 'div' );\n                    emptyContainer.style.bottom = '6px';\n                    image.appendChild( emptyContainer );\n\n                    // The template requires a string.\n                    return image.innerHTML;\n                },\n                renderOptions: function( column, value ) {\n\n                    if( 'undefined' == typeof that.options.columns[ column ] ) return;\n\n                    var select = document.createElement( 'select' );\n                    \n                    _.each( that.options.columns[ column ].options, function( option ){\n                        var optionNode = document.createElement( 'option' );\n                        if ( value === option.value ) {\n                            optionNode.setAttribute( 'selected', 'selected' );\n                        }\n                        optionNode.setAttribute( 'value', option.value );\n                        optionNode.setAttribute( 'image_id', option.image_id);\n                        optionNode.setAttribute( 'image', option.image );\n                        optionNode.innerText = option.image;\n                        select.appendChild( optionNode );\n                    });\n\n                    // The template only needs the options.\n                    return select.innerHTML;\n                }\n\n            }\n        }\n\n    });\n\n    return view;\n} );\n\n","define( 'views/app/drawer/imageOptionRepeaterComposite',['views/app/drawer/imageOptionRepeaterOption', 'views/app/drawer/optionRepeaterEmpty', 'models/app/optionRepeaterCollection'], function( listOptionView, listEmptyView, listOptionCollection ) {\n\tvar view = Marionette.CompositeView.extend( {\n\t\ttemplate: '#tmpl-nf-edit-setting-image-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\t// If we don't have a 'settings' property, this is a legacy depdency setup.\n\t\t\t\tif ( 'undefined' == typeof deps.settings ) {\n\t\t\t\t\tdeps.settings = [];\n\t\t\t\t\t_.each(deps, function(dep, name){\n\t\t\t\t\t\tif( 'settings' !== name ) {\n\t\t\t\t\t\t\tdeps.settings.push( { name: name, value: dep } );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tdeps.match = 'all';\n\t\t\t\t}\n\n\t\t\t\tfor (var i = deps.settings.length - 1; i >= 0; i--) {\n\t\t\t\t\tlet name = deps.settings[i].name;\n\t\t\t\t\tthis.dataModel.on( 'change:' + name, this.render, this );\n\t\t\t\t}\n\t\t\t}\n            this.listenTo( nfRadio.channel( 'image-option-repeater' ), 'added:option', this.maybeHideNew );\n            this.listenTo( nfRadio.channel( 'image-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 i = deps.settings.length - 1; i >= 0; i--) {\n\t\t\t\t\tlet name = deps.settings[i].name;\n\t\t\t\t\tthis.dataModel.off( 'change:' + name, this.render );\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-listimage-options-tbody' ).sortable( {\n\t\t\t\thandle: '.handle',\n\t\t\t\thelper: 'clone',\n\t\t\t\tplaceholder: 'nf-listimage-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( 'image-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( 'image-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( 'image-option-repeater' ).request( 'update:optionSortable', ui, this, that );\n\t\t\t\t}\n\t\t\t} );\n\n            that.setupTooltip();\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},\n        \n        /**\n         * Function to append jBox modals to each tooltip element in the option repeater.\n         */\n        setupTooltip: function() {\n            // For each .nf-help in the option repeater...\n            jQuery( this.el ).find( '.nf-listimage-options' ).find( '.nf-help' ).each(function() {\n                // Get the content.\n                var content = jQuery(this).next('.nf-help-text');\n                // Declare the modal.\n                jQuery( this ).jBox( 'Tooltip', {\n                    content: content,\n                    maxWidth: 200,\n                    theme: 'TooltipBorder',\n                    trigger: 'click',\n                    closeOnClick: true\n                })\n            });\n        },\n\n\t\ttemplateHelpers: function () {\n\t\t\tvar that = this;\n\n\t    \treturn {\n\t    \t\trenderHeaders: function() {\n                    // If this is a Field...\n                    // AND If the type includes 'list'...\n                    if ( 'Field' == that.dataModel.get( 'objectType' ) && -1 !== that.dataModel.get( 'type' ).indexOf( 'list' ) ) {\n                        // Declare help text.\n                        var helpText, helpTextContainer, helpIcon, helpIconLink, helpTextWrapper;\n\n                        helpText = document.createTextNode( nfi18n.valueChars );\n                        helpTextContainer = document.createElement( 'div' );\n                        helpTextContainer.classList.add( 'nf-help-text' );\n                        helpTextContainer.appendChild( helpText );\n\n                        helpIcon = document.createElement( 'span' );\n                        helpIcon.classList.add( 'dashicons', 'dashicons-admin-comments' );\n                        helpIconLink = document.createElement( 'a' );\n                        helpIconLink.classList.add( 'nf-help' );\n                        helpIconLink.setAttribute( 'href', '#' );\n                        helpIconLink.setAttribute( 'tabindex', '-1' );\n                        helpIconLink.appendChild( helpIcon );\n\n                        helpTextWrapper = document.createElement( 'span' );\n                        helpTextWrapper.appendChild( helpIconLink );\n                        helpTextWrapper.appendChild( helpTextContainer );\n\n\t\t\t\t\t\t// Append the help text to the 'value' header.\n\t\t\t\t\t\tif('undefined' !== typeof that.model.get('columns') ){\n\t\t\t\t\t\t\tif('undefined' !== typeof that.model.get('columns').value ){\n\t\t\t\t\t\t\t\tif ( -1 == that.model.get('columns').value.header.indexOf( helpTextWrapper.innerHTML ) ) {\n\t\t\t\t\t\t\t\t\tthat.model.get('columns').value.header += helpTextWrapper.innerHTML;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n                    }\n\t\t\t\t\t// If this is a Field and If the type includes 'list'...\n\t\t\t\t\tif ( 'Field' == that.dataModel.get( 'objectType' ) && -1 !== that.dataModel.get( 'type' ).indexOf( 'list' ) ) {\n\t\t\t\t\t\t// Declare help text elements.\n\t\t\t\t\t\tlet helpTextContainer, helpIcon, helpIconLink, helpTextWrapper;\n\t\t\t\t\t\t\n\t\t\t\t\t\thelpTextContainer = document.createElement( 'div' );\n\t\t\t\t\t\thelpTextContainer.classList.add( 'nf-help-text' );\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\thelpIcon = document.createElement( 'span' );\n\t\t\t\t\t\thelpIcon.classList.add( 'dashicons', 'dashicons-admin-comments' );\n\t\t\t\t\t\thelpIconLink = document.createElement( 'a' );\n\t\t\t\t\t\thelpIconLink.classList.add( 'nf-help' );\n\t\t\t\t\t\thelpIconLink.setAttribute( 'href', '#' );\n\t\t\t\t\t\thelpIconLink.setAttribute( 'tabindex', '-1' );\n\t\t\t\t\t\thelpIconLink.appendChild( helpIcon );\n\t\t\t\t\t\thelpTextWrapper = document.createElement( 'span' );\n\t\t\t\t\t\thelpTextWrapper.appendChild( helpIconLink );\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t// Conditionals for setting a Value or CalcValue header\n\t\t\t\t\t\tconst isValue = 'undefined' !== typeof that.model.get('columns') && 'undefined' !== typeof that.model.get('columns').value;\n\t\t\t\t\t\tconst isCalc = 'undefined' !== typeof that.model.get('columns') && 'undefined' !== typeof that.model.get('columns').calc;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t// Append the help text to the 'value' column\n\t\t\t\t\t\tif( isValue && -1 == that.model.get('columns').value.header.indexOf( helpTextWrapper.innerHTML ) ){\n\t\t\t\t\t\t\tconst helpText = document.createTextNode( nfi18n.valueChars );\n\t\t\t\t\t\t\thelpTextContainer.replaceChildren( helpText );\n\t\t\t\t\t\t\thelpTextWrapper.appendChild( helpTextContainer );\n\t\t\t\t\t\t\tthat.model.get('columns').value.header += helpTextWrapper.innerHTML;\n\t\t\t\t\t\t} \n\t\t\t\t\t\t// Append the help text to the 'calcValue' column\n\t\t\t\t\t\tif ( isCalc && -1 == that.model.get('columns').calc.header.indexOf( helpTextWrapper.innerHTML ) ) {\n\t\t\t\t\t\t\tconst helpText = document.createTextNode( nfi18n.calcValueChars );\n\t\t\t\t\t\t\thelpTextContainer.replaceChildren( helpText );\n\t\t\t\t\t\t\thelpTextWrapper.appendChild( helpTextContainer );\n\t\t\t\t\t\t\tthat.model.get('columns').calc.header += helpTextWrapper.innerHTML;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t    \t\t\tvar columns, beforeColumns, afterColumns;\n\n\t    \t\t\tbeforeColumns = document.createElement( 'div' );\n\n\t    \t\t\tcolumns = document.createElement( 'span' );\n\t    \t\t\tcolumns.appendChild( beforeColumns );\n\n\t\t\t\t\tif(!nfAdmin.devMode){\n\t\t\t\t\t\tdelete this.columns.value;\n\t\t\t\t\t}\n\n\t    \t\t\t_.each( this.columns, function( col ) {\n\t    \t\t\t\tvar headerText, headerContainer;\n\n\t    \t\t\t\t// Use a fragment to support HTML in the col.header property, ie Dashicons.\n                        headerText = document.createRange().createContextualFragment( col.header );\n\t    \t\t\t\theaderContainer = document.createElement( 'div' );\n\t    \t\t\t\theaderContainer.appendChild( headerText );\n\n\t    \t\t\t\tcolumns.appendChild( headerContainer );\n\t    \t\t\t} );\n\n                    afterColumns = document.createElement( 'div' );\n                    columns.appendChild( afterColumns );\n\n\t\t\t\t\treturn columns.innerHTML;\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\treturn nfRadio.channel( 'settings' ).request( 'check:deps', this, that );\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-listimage-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( 'image-option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel );\n\t\t\tjQuery( this.children.findByIndex(this.children.length - 1).el ).find( '[data-id=\"image\"]' ).focus();\n\t\t},\n\n\t\tclickExtra: function( e ) {\n\t\t\tnfRadio.channel( 'image-option-repeater' ).trigger( 'click:extra', e, this.collection, this.dataModel );\n\t\t\tnfRadio.channel( 'image-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 image = row[0];\n\t\t\t\t\tvar value = row[1] || jQuery.slugify( image, { separator: '-' } );\n\t\t\t\t\tvar calc = row[2] || '';\n\n\t\t\t\t\timage = image.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( { image: 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 image = {\n\t\t\t\t\t\tobject: 'field',\n\t\t\t\t\t\timage: 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, image );\n\t\t\t\t\tnfRadio.channel( 'image-option-repeater-' + e.data.view.model.get( 'name' ) ).trigger( 'add:option', model );\n\t\t\t\t\tnfRadio.channel( 'image-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","/**\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/imageOptionRepeater',['models/app/optionRepeaterModel', 'models/app/optionRepeaterCollection', 'views/app/drawer/imageOptionRepeaterComposite'], 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( 'image-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( 'image-option-repeater' ), 'change:option', this.changeOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'image-option-repeater' ), 'click:addOption', this.addOption );\n\t\t\tthis.listenTo( nfRadio.channel( 'image-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( 'image-option-repeater' ).reply( 'update:optionSortable', this.updateOptionSortable, this );\n\t\t\tnfRadio.channel( 'image-option-repeater' ).reply( 'stop:optionSortable', this.stopOptionSortable, this );\n\t\t\tnfRadio.channel( 'image-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( 'image-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 ).prop( '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 if ('calc' == name) {\n\t\t\t\tvar value = Number(jQuery(e.target).val());\n\t\t\t\tif( isNaN(value) ) {\n\t\t\t\t\tvalue = 0;\n\t\t\t\t\tjQuery(e.target).val(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\t\t\t\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( 'image-option-repeater' ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'image-option-repeater-option-' + name  ).trigger( 'update:option', e, model, dataModel, settingModel, optionView );\n\t\t\tnfRadio.channel( 'image-option-repeater-' + settingModel.get( 'name' ) ).trigger( 'update:option', model, dataModel, settingModel, optionView );\n\t\t},\n\n\t\t/**\n\t\t * Add an option to our list\n\t\t * \n\t\t * @since 3.0\n\t\t * @param backbone.collection \tcollection \tlist option collection\n\t\t * @param backbone.model \t\tdataModel\n\t\t * @return void\n\t\t */\n\t\taddOption: function( collection, dataModel ) {\n\t\t\tvar modelData = {\n\t\t\t\torder: collection.length,\n\t\t\t\tnew: true,\n\t\t\t\toptions: {}\n\t\t\t};\n\t\t\t/**\n\t\t\t * If we don't actually have a 'settingModel' duplicated fields\n\t\t\t * can't add options until publish and the builder is reloaded.\n\t\t\t * If we ignore the code if we don't have settingsModel, then it\n\t\t\t * works.\n\t\t\t */\n\t\t\tif  ( 'undefined' !== typeof collection.settingModel ) {\n\t\t\t\tvar limit = collection.settingModel.get( 'max_options' );\n\t\t\t\tif ( 0 !== limit && collection.models.length >= limit ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t_.each( collection.settingModel.get( 'columns' ), function ( col, key ) {\n\t\t\t\t\tmodelData[ key ] = col.default;\n\n\t\t\t\t\tif ( 'undefined' != typeof col.options ) {\n\t\t\t\t\t\tmodelData.options[ key ] = col.options;\n\t\t\t\t\t}\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 image = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\timage: dataModel.get( 'image' ),\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, image );\n\n\t\t\tif ( 'undefined' !== typeof collection.settingModel ) {\n\t\t\t\tnfRadio.channel('image-option-repeater-' + collection.settingModel.get('name')).trigger('add:option', model);\n\t\t\t}\n\t\t\tnfRadio.channel( 'image-option-repeater' ).trigger( 'add:option', model );\n\t\t\tnfRadio.channel( 'image-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 image = {\n\t\t\t\tobject: dataModel.get( 'objectType' ),\n\t\t\t\timage: dataModel.get( 'image' ),\n\t\t\t\tchange: 'Option ' + newModel.get( 'image' ) + ' 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, image, 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( 'image-option-repeater' ).trigger( 'remove:option', model );\n\t\t\tnfRadio.channel( 'image-option-repeater' ).trigger( 'removed:option', collection );\n\t\t\tnfRadio.channel( 'image-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 image = {\n\t\t\t\tobject: setting.dataModel.get( 'objectType' ),\n\t\t\t\timage: setting.dataModel.get( 'image' ),\n\t\t\t\tchange: 'Option ' + dragModel.get( 'image' ) + ' 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, image, data );\n\t\t\tthis.triggerDataModel( dragModel, setting.dataModel );\n\t\t\tnfRadio.channel( 'image-option-repeater' ).trigger( 'sort:option', dragModel, setting );\n\t\t\tnfRadio.channel( 'image-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            if ( 'Field' == dataModel.get( 'objectType' ) ) {\n                var newVal = model.get( 'value' );\n                // Sanitize any unwanted special characters.\n                // TODO: This assumes English is the standard language.\n                //       We might want to allow other language characters through this check later.\n                var pattern = /[^0-9a-zA-Z _@.-]/g;\n                newVal = newVal.replace( pattern, '' );\n                model.set( 'value', newVal );\n                // Re-render the value.\n                optionView.render();\n            }\n            \n            var findWhere = _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } );\n            if( 'undefined' == typeof findWhere ) return;\n            if( 'list' != findWhere.parentType ) return;\n\n            model.set( 'manual_value', true );\n            \n            // Set focus on calc input\n            jQuery( optionView.el ).find( '[data-id=\"calc\"]' ).focus().select();\n        },\n\n        convertOptions: function( fieldModel ) {\n            /*\n             * Our options are stored in our database as objects, not collections.\n             * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\n             */ \n            var options = fieldModel.get( 'options' );\n\n            var settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'options' );\n\n            if ( false == options instanceof Backbone.Collection ) {\n                options = new ListOptionCollection( [], { settingModel: settingModel } );\n                options.add( fieldModel.get( 'options' ) );\n                fieldModel.set( 'options', options, { silent: true } );\n            }\n        }\n\n    });\n\n    return controller;\n} );\n","/**\n * Listens to our app channel to add the individual Credit Card Fields.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldPassword',[], function() {\n    var controller = Marionette.Object.extend( {\n        initialize: function() {\n            this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.addField );\n        },\n\n        addField: function( model ) {\n\n            if( 'password' == model.get( 'type' ) ) {\n\n                var order = model.get( 'order' );\n\n                var confirm = this.insertField( 'passwordconfirm', order + 1 );\n\n                confirm.set( 'confirm_field', model.get( 'key' ) );\n            }\n        },\n\n        insertField: function( type, order ) {\n            var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n            var newField = {\n                id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\n                type: type,\n                label: fieldType.get( 'nicename' ),\n                order: order\n            };\n\n            return nfRadio.channel('fields').request('add', newField );\n        }\n    });\n\n    return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldQuantity',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\tif ( 'product_assignment' == settingModel.get( 'name' ) ) {\n\t\t\t\tvar productFields = this.getProductFields( settingModel );\n\t\t\t\tsettingModel.set( 'options', productFields );\n\t\t\t}\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldShipping',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options' ), 'render:setting', this.addMask );\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options-option' ), 'render:setting', this.addMask );\n\t\t},\n\n\t\taddMask: function( settingModel, dataModel, view ) {\n\t\t\tjQuery( view.el ).find( '[data-id=\"value\"]' ).each( function() {\n\t\t\t\tvar autoNumericOptions = {\n\t\t\t\t\tdigitGroupSeparator: nfi18n.thousands_sep,\n\t\t\t\t\tdecimalCharacter: nfi18n.decimal_point,\n\t\t\t\t\tcurrencySymbol: nfi18n.currencySymbol\n\t\t\t\t};\n\t\t\t\tnew AutoNumeric( this, autoNumericOptions );\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * When we add a new field, update its key.\n *\n * When we change the key, update any refs to the key.\n *\n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/key',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// When we add a field, update its key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.newFieldKey );\n\n\t\t\t// When we edit a label, update our key.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-label' ), 'update:setting', this.updateLabel );\n\n\t\t\t// When we edit a key, check for places that key might be used.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\n\n\t\t\t// When we type inside the admin key field, we need to save our manual_key setting.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-key' ), 'keyup:setting', this.keyUp );\n\t\t},\n\n\t\t/**\n\t\t * Add a key to our new field model.\n\t\t *\n\t\t * @since 3.0\n\t\t * @param backbone.model model new field model\n\t\t * @return void\n\t\t */\n\t\tnewFieldKey: function( model ) {\n\t\t\tvar d = new Date();\n\t\t\tvar n = d.valueOf();\n\t\t\tvar key = this.slugify( model.get( 'type' ) + '_' + n );\n\n\t\t\tmodel.set( 'key', key, { silent: true } );\n\n\t\t\tif( 'undefined' == model.get( 'manual_key' ) ) {\n\t\t\t\tmodel.set('manual_key', false, {silent: true});\n\t\t\t}\n\t\t},\n\n\t\tupdateLabel: function( model ) {\n\n\t\t\t/*\n\t\t\t * If we haven't entered a key manually, update our key when our label changes.\n\t\t\t */\n\t\t\tif ( ! model.get( 'manual_key' ) && 0 != String(model.get( 'label' )).trim().length ) {\n\t\t\t\t/*\n\t\t\t\t * When we're editing settings, we expect the edits to fire one at a time.\n\t\t\t\t * Since we're calling this in the middle of our label update, anything that inquires about what has changed after we set our key will see both label and key.\n\t\t\t\t * We need to remove the label from our model.changed property so that all that has changed is the key.\n\t\t\t\t *\n\t\t\t\t */\n\t\t\t\tdelete model.changed.label;\n\t\t\t\tvar d = new Date();\n\t\t\t\tvar n = d.valueOf();\n\t\t\t\tvar key = this.slugify( model.get( 'label' ) + '_' + n );\n                // If our slug didn't setup correctly...\n                // Force a valid entry.\n                if ( -1 == key.indexOf( '_' ) ) key = 'field_' + key;\n\t\t\t\tmodel.set( 'key', key );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a field key is updated, find any merge tags using the key and update them.\n\t\t *\n\t\t * @since  3.0\n\t\t * @param  backbone.model model field model\n\t\t * @return void\n\t\t */\n\t\tupdateKey: function( dataModel ) {\n\t\t\tvar key = dataModel.get( 'key' );\n\t\t\tthis.settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'key' );\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tkeyUp: function( e, settingModel, dataModel ) {\n\t\t\tdataModel.set( 'manual_key', true );\n\t\t\tthis.settingModel = settingModel;\n\t\t\tvar key = jQuery( e.target ).val();\n\t\t\tthis.setError( key, dataModel );\n\t\t},\n\n\t\tsetError: function( key, dataModel ) {\n\t\t\tvar error = false;\n\t\t\tif ( '' == String(key).trim() ) {\n\t\t\t\terror = 'Field keys can\\'t be empty. Please enter a key.';\n\t\t\t} else if ( key != key.toLowerCase() ) {\n\t\t\t\terror = 'Field keys must be lowercase.';\n\t\t\t} else if ( key != key.replace( ' ', '_' ) ) {\n\t\t\t\terror = 'Field keys must cannot use spaces. Separate with \"_\" instead.';\n\t\t\t} else if ( '_' == key.slice( -1 ) ) {\n\t\t\t\terror = 'Field keys cannot end with a \"_\"';\n\t\t\t} else if ( key != this.slugify( key ) ) {\n\t\t\t\terror = 'Invalid Format.';\n\t\t\t} else if ( key != this.keyExists( key, dataModel ) ) {\n\t\t\t\terror = 'Field keys must be unique. Please enter another key.'\n\t\t\t}\n\n\t\t\tif ( error ) {\n\t\t\t\tthis.settingModel.set( 'error', error );\n\t\t\t} else {\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:fieldKey', dataModel );\n\t\t\t\tthis.settingModel.set( 'error', false );\n\t\t\t}\n\t\t},\n\n\t\tkeyExists: function( key, dataModel ) {\n\t\t\tvar newKey = this.slugify( key );\n\t\t\tif ( 0 != newKey.length ) {\n\t\t\t\tkey = newKey;\n\t\t\t}\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar x = 1;\n\t\t\tvar testKey = key;\n\t\t\t_.each( fieldCollection.models, function( field ) {\n\t\t\t\tif ( dataModel != field && testKey == field.get( 'key' ) ) {\n\t\t\t\t\ttestKey = key + '_' + x;\n\t\t\t\t\tx++;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tkey = testKey;\n\n\t\t\treturn key;\n\t\t},\n\n\t\tslugify: function( string ){\n\t\t\treturn jQuery.slugify( string, { separator: '_' } )\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Creates notices for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/notices',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:stagedField', this.addStagedField );\n\t\t},\n\n\t\taddStagedField: function( model ) {\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addStagedField', model.get( 'nicename' ) + ' added to staging' );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles mobile-specific JS for our fields domain.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/mobile',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for the start of our sorting.\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'render:fieldsSortable', this.initWiggle );\n\t\t\t// Listen for when we start sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:start', this.startWiggle );\n\t\t\t// Listen for when we stop sorting.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:stop', this.stopWiggle );\n\t\t},\n\n\t\tinitWiggle: function( view ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( view.el ).find( '.nf-field-wrap' ).on( 'taphold', function() {\n\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\tstartWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper' ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.helper ).css( 'opacity', '0.75' ).ClassyWiggle( 'start', { degrees: ['.5', '1', '.5', '0', '-.5', '-1', '-.5', '0'] } );\n\t\t\t}\n\t\t},\n\n\t\tstopWiggle: function( ui ) {\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\n\t\t\t\tjQuery( ui.helper ).ClassyWiggle( 'stop' );\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper drag-selected' );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * If we add a saved field to our form and then update it, set the \"saved\" flag to false.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/savedFields',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tignoreAttributes: [\n\t\t\t'editActive',\n\t\t\t'order',\n\t\t\t'saved',\n\t\t\t'jBox'\n\t\t],\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateField );\n\t\t\t// Listen to clicks on our add saved field button.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:addSavedField', this.clickAddSavedField, this );\n\t\t},\n\n\t\tupdateField: function( dataModel ) {\n\t\t\tif ( dataModel.get( 'saved' ) ) {\n\t\t\t\t\n\t\t\t\tvar modified = false;\n\t\t\t\tvar changedAttributes = _.keys( dataModel.changedAttributes() );\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( changedAttributes, function( changed ) {\n\t\t\t\t\tif ( -1 == that.ignoreAttributes.indexOf( changed ) ) {\n\t\t\t\t\t\tmodified = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t\n\t\t\t\tif ( modified ) {\n\t\t\t\t\tdataModel.set( 'saved', false );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tclickAddSavedField: function( e, dataModel ) {\n\t\t\tvar modelClone = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\n\n\t\t\tvar fieldData = modelClone.attributes;\n\t\t\tfieldData.saved = true;\n\n\t\t\tdelete fieldData.jBox;\n\t\t\tdelete fieldData.editActive;\n\t\t\tdelete fieldData.created_at;\n\t\t\tdelete fieldData.order;\n\t\t\tdelete fieldData.id;\n\t\t\tdelete fieldData.formID;\n\t\t\tdelete fieldData.parent_id;\n\t\t\t\n\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', fieldData.type );\n\t\t\tvar newType = _.clone( type.attributes );\n\n\t\t\tvar nicename = _.escape(jQuery( e.target ).parent().parent().find( 'input' ).val());\n\t\t\tconsole.log( nicename );\n\t\t\tnewType.nicename = nicename;\n\t\t\tfieldData.label = nicename;\n\t\t\tfieldData.nicename = nicename;\n\t\t\tdataModel.set( 'addSavedLoading', true );\n\t\t\tvar newTypeDefaults = JSON.stringify( fieldData );\n\n\t\t\tjQuery.post( ajaxurl, { action: 'nf_create_saved_field', field: newTypeDefaults, security: nfAdmin.ajaxNonce }, function( response ) {\n\t\t\t\tresponse = JSON.parse( response );\n\t\t\t\tnewType.id = response.data.id;\n\t\t\t\tnewType.nicename = nicename;\n\t\t\t\tnewType.settingDefaults = fieldData;\n\n\t\t\t\tvar typeCollection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\n\t\t\t\tvar newModel = typeCollection.add( newType );\n\n\t\t\t\tvar typeSections = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\n\t\t\t\ttypeSections.get( 'saved' ).get( 'fieldTypes' ).push( newType.id );\n\n\t\t\t\t// dataModel.set( 'type', response.data.id );\n\t\t\t\tdataModel.set( 'addSavedLoading', false );\n\t\t\t\tdataModel.unset( 'addSavedLoading', { silent: true } );\n\t\t\t\tdataModel.get( 'jBox' ).close();\n\t\t\t\t// dataModel.set( 'saved', true );\n\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addSaved', 'Saved Field Added' );\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a datepicker setting, add our datepicker.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDatepicker',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-datepicker' ), 'render:setting', this.addDatepicker );\n\t\t},\n\n\t\taddDatepicker: function( settingModel, dataModel, view ) {\n\t\t\t//Switch to flatpickr from pikaday\n\t\t\tlet el = jQuery( view.el ).find( '.setting' )[0];\n\t\t\tlet datePickerSettings = {};\n\t\t\tnfRadio.channel( 'setting-type-datepicker' ).reply('get:options', () => { return dataModel.attributes });\n\t\t\t// Allow fields to add settings to the datepicker.\n\t\t\tlet filteredDatePickerSettings = nfRadio.channel( 'setting-type-datepicker' ).request( 'filter:settings', datePickerSettings, settingModel, el );\n\t\t\tif ( 'undefined' != typeof filteredDatePickerSettings ) {\n\t\t\t\tdatePickerSettings = filteredDatePickerSettings;\n\t\t\t}\n\n\t\t\tvar dateObject = flatpickr( el, datePickerSettings );\n\n\t\t\tnfRadio.channel( 'setting-type-datepicker' ).trigger( 'loadComplete', dateObject, settingModel, dataModel, view );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a product_assignment setting, add our products to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/fields/fieldDisplayCalc',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-calc_var' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\t// console.log( 'render!' );\n\t\t},\n\n\t\tgetProductFields: function( settingModel ) {\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn productFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles specifics for our repeater field types.\n *\n */\ndefine( 'controllers/fields/fieldRepeater',[ 'models/fields/fieldCollection' ], function( fieldCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\n\t\tinitialize: function() {\n\t\t\t// Listen for repeater field models.\n\t\t\tthis.listenTo( nfRadio.channel( 'fields-repeater' ), 'init:fieldModel', this.setupCollection, this );\n\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'add:childField', this.addChildField, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'receive:fields', this.receiveFields, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'get:childField', this.getChildField, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'process:stagedField', this.processStagedFields, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'sort:repeaterField', this.sortRepeaterField, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'over:repeaterField', this.overRepeaterField, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'out:repeaterField', this.outRepeaterField, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'stop:repeaterField', this.stopRepeaterField, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'start:repeaterField', this.startRepeaterField, this );\n\t\t\tnfRadio.channel( 'fields-repeater' ).reply( 'update:repeaterField', this.updateRepeaterField, this );\n\t\t},\n\n\t\t/**\n\t\t * When we save repeater fields, their 'fields' content will be saved as an array of objects.\n\t\t * When a repeater field model is created, we need to hyrdate the 'fields' settings and turn it into a Backbone Collection.\n\t\t * \n\t\t * @since  version\n\t\t * @param  {[type]} fieldModel [description]\n\t\t * @return {[type]}            [description]\n\t\t */\n\t\tsetupCollection: function( fieldModel ) {\n\t\t\t// The fields var will be an array of field model data.\n\t\t\tlet fields = fieldModel.get( 'fields' );\n\n\t\t\t// Only turn it into a collection if we haven't already.\n\t\t\tif ( false === fields instanceof Backbone.Collection ) {\n\t\t\t\tlet collection =  new fieldCollection( fields );\n\t\t\t\tfieldModel.set( 'fields', collection );\n\n\t\t\t\t//Allows to loop through Repeater fields to reset correct state\n\t\t\t\tcollection.listenTo( nfRadio.channel( 'fields-repeater' ), 'clearEditActive', this.clearEditActive, collection );\n\t\t\t\tcollection.listenTo( nfRadio.channel( 'app' ), 'after:appStart', this.clearEditActive, collection );\n\t\t\t\t\n\t\t\t\t// Listen for radio messages that a field was deleted.\n\t\t\t\tcollection.listenTo( nfRadio.channel( 'fields' ), 'delete:field', this.maybeDeleteField, collection );\n\t\t\t}\t\n\t\t},\n\n\t\t/**\n\t\t * In order to delete items from within a repeater field without creating a new convention, we listen to radio messages for field deletion.\n\t\t * We just have to make sure that these fields weren't just added to our repeater field collection.\n\t\t * \n\t\t * @since  version\n\t\t * @param  {[type]} fieldModel [description]\n\t\t * @return {[type]}            [description]\n\t\t */\n\t\tmaybeDeleteField: function( fieldModel ) {\n\t\t\t// Make sure that we didn't just add this field to our repeater.\n\t\t\tif ( ! fieldModel.get( 'droppedInRepeater' ) ) {\n\t\t\t\tthis.remove( fieldModel );\n\t\t\t}\n\t\t\t// We're done dropping now.\n\t\t\tfieldModel.set( 'droppedInRepeater', false );\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 * @param  {[type]} fieldModel field that was clicked\n\t\t * @return void\n\t\t */\n        clearEditActive: function( model ) {\n            _.each( this.models, function( field ) {\n\t\t\t\tif( model.cid !== field.cid ){\n\t\t\t\t\tfield.set( 'editActive', true );\n\t\t\t\t\tfield.set( 'editActive', false );\n\t\t\t\t}\n            } );\n\t\t},\n\n\n\t\t/**\n\t\t * Receive fields in the repeater field sortable zone\n\t\t * \n\t\t */\n\t\treceiveFields: function( ui, that, e ) {\n\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-stage' ) ) {\n\t\t\t\tthis.processStagedFields( ui, that, e );\n\t\t\t} else {\n\t\t\t\tthis.addChildField(ui, that, e);\n\t\t\t}\n\n\t\t},\t\n\t\t\n\t\t/**\n\t\t * Add a field in the repeater fields collection\n\t\t * \n\t\t * @since  3.0\n\t\t * @return void\n\t\t */\n\t\taddChildField: function( ui, that, e ) {\n\n\t\t\tlet type = typeof ui.item !== \"undefined\" ? jQuery( ui.item ).data( 'id' ) : ui.get('slug'),\n\t\t\tdroppedFieldModel = nfRadio.channel( 'fields' ).request( 'get:field', type ),\n\t\t\tcollection = that.repeaterFieldModel.get( 'fields' ),\n\t\t\tfieldModel;\n\t\t\t\n\t\t\t\n\t\t\t//Don't process another repeater field\n\t\t\tif(type === \"repeater\") return;\n\t\t\t\n\t\t\t//If a field Model exists and comes from the builder get the field Type and delete Field Model from main collection\n\t\t\tif(droppedFieldModel != null){\n\t\t\t\t//Reset type based on the model\n\t\t\t\ttype = droppedFieldModel.attributes.type;\n\t\t\t\t// Remove the field from the main field collection.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, droppedFieldModel );\n\t\t\t}\n\n\t\t\t// Get our field type model\n\t\t\tfieldModel = nfRadio.channel( 'fields' ).request( 'get:type', type );\n\n\t\t\t// Get our tmp ID\n\t\t\tlet elId = nfRadio.channel( 'fields' ).request( 'get:tmpID' ) != null ? nfRadio.channel( 'fields' ).request( 'get:tmpID' ) : \"tmp\";\n\t\t\t//Add field to collection\n\t\t\tnewField = collection.add(  { id: elId , label: fieldModel.get( 'nicename' ), type: type, repeaterField: true} );\n\n\t\t\t//Sort fields\n\t\t\tlet sortableEl = nfRadio.channel( 'fields-repeater' ).request( 'get:sortableEl' );\n\t\t\tif(! jQuery(sortableEl).hasClass('ui-sortable')){\n\t\t\t\tnfRadio.channel( 'fields-repeater' ).request( 'init:sortable' );\n\t\t\t}\n\t\t\tlet sortableElArray = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t_.each( sortableElArray, function( element, index ) {\n\t\t\t\tif(false === element.length > 0){\n\t\t\t\t\tsortableElArray[index] = elId;\n\t\t\t\t} else if (element === elId) {\n\t\t\t\t\tsortableElArray.splice( index, 1);\n\t\t\t\t}\n\t\t\t});\n\t\t\tnfRadio.channel( 'fields-repeater' ).request( 'sort:repeaterField', sortableElArray);\n\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: newField.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: collection\n\t\t\t}\n\t\t\t\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newField, null, label, data );\n\n\t\t\t\n\t\t\tif( typeof elId !== \"undefined\" && typeof ui.helper !== \"undefined\" ){\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', elId );\n\t\t\t\t//Sort fields in repeater\n\t\t\t\tnfRadio.channel( 'app' ).request( 'stop:fieldsSortable', ui );\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, elId );\n\t\t\t}\n\n\t\t\treturn elId;\n\n\t\t},\n\n\t\t/**\n\t\t * Get a field from a repeater field collection\n\t\t * \n\t\t * @return fieldModel\n\t\t */\n\t\tgetChildField: function( childFieldID, parentFieldModel, newID ) {\n\n\t\t\tif( typeof childFieldID === \"undefined\") return;\n\t\t\t//Prepare retuned variable\n\t\t\tlet childFieldModel;\n\t\t\t//Allow to retrieve parentFieldModel by the newID that contains the parent Field ID ( USed to update a field ID after saving the form )\n\t\t\tif( parentFieldModel == null && typeof newID !== \"undefined\" ){\n\t\t\t\tconst parentID = newID.split('.')[0];\n\t\t\t\tparentFieldModel = nfRadio.channel( 'fields' ).request( 'get:field', parentID );\n\t\t\t}\n\t\t\t\n\t\t\t//Check we have the Repeater Field Model\n\t\t\tif( parentFieldModel ) {\n\t\t\t\t//Get the fields collection in the repeater Field model\n\t\t\t\tlet repeaterFieldsCollection = parentFieldModel.get( 'fields' );\n\t\t\t\t//Get the Child Field Model\n\t\t\t\tchildFieldModel = repeaterFieldsCollection.get( childFieldID );\n\t\t\t}\n\t\t\t\n\t\t\treturn childFieldModel;\n\t\t},\n\n\t\t/**\n\t\t * Add Staged fields to repeater fieldset\n\t\t * \n\t\t * @paran object event dropped\n\t\t * @param object ui dropped element\n\t\t */\n\t\tprocessStagedFields( ui, that, e) {\n\n\t\t\t// Make sure that our staged fields are sorted properly.\t\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\n\t\t\t// Grab our staged fields.\n\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\n\n\t\t\t// Get our current field order.\n\t\t\tvar sortableEl = nfRadio.channel( 'fields-repeater' ).request( 'get:sortableEl' );\n\n\t\t\tlet order = [];\n\t\t\tif ( jQuery( sortableEl ).hasClass( 'repeater' ) ) { // Sortable isn't empty\n\t\t\t\t// If we're dealing with a sortable that isn't empty, get the order.\n\t\t\t\torder = jQuery( sortableEl ).sortable( 'toArray' );\n\t\t\t} else { // Sortable is empty\n\t\t\t\t// Sortable is empty, all we care about is our staged field draggable.\n\t\t\t\torder = ['nf-staged-fields-drag'];\n\t\t\t}    \n\t\t\t\n\t\t\t// Get the index of our droped element.\n\t\t\tlet insertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\n\t\t\t// Loop through each staged fields model and insert a field.\n\t\t\t_.each( stagedFields.models, function( field, index ) {\n\t\t\t\t// Add our field.\n\t\t\t\tvar tmpID = nfRadio.channel( 'fields-repeater' ).request( 'add:childField', field, that, e );\n\t\t\t\t// Add this newly created field to our order array.\n\t\t\t\torder.splice( insertedAt + index, 0, tmpID );\n\t\t\t\t\n\t\t\t} );\n\n\t\t\t// Remove our dropped element from our order array.\n\t\t\tinsertedAt = order.indexOf( 'nf-staged-fields-drag' );\n\t\t\torder.splice( insertedAt, 1 );\n\n\t\t\t// Sort our fields\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', order );\n\t\t\t// Clear our staging\n\t\t\tnfRadio.channel( 'fields' ).request( 'clear:staging' );\n\t\t\t// Remove our helper. Fixes a weird artifact.\n\t\t\tjQuery( ui.helper ).remove();\n\n\t\t},\n\n\t\t/**\n\t\t * Sort the fields in a repeater Field\n\t\t * \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\tsortRepeaterField: function( order, ui, updateDB ) {\n\t\t\t// Add the field to this repeatable collection.\n\t\t\tlet collection = nfRadio.channel( 'fields-repeater' ).request( 'get:repeaterFieldsCollection' );\n\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-repeater' ).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\t\t\t\t// Loop through all of our fields and update their order value\n\t\t\t\t_.each( 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\n\t\t\t\tcollection.sort();\n\t\t\t\t\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 * 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\toverRepeaterField: 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-repeater' ).request( 'get:sortableEl' );\n\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\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-repeater' ).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\toutRepeaterField: 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-repeater' ).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-repeater' ).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\tstopRepeaterField: function( ui ) {\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\n\t\t\tjQuery( ui.helper ).remove();\n\t\t\t//nfRadio.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\tstartRepeaterField: 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\t\n\t\t\t\t// Maintain origional visibility during drag/sort.\n\t\t\t\tjQuery( ui.item ).show();\n\n\t\t\t\t// Determine helper based on builder/layout type.\n\t\t\t\tif(jQuery(ui.item).hasClass('nf-field-wrap')){\n\t\t\t\t\tvar newHelper = jQuery(ui.item).clone();\n\t\t\t\t} else if(jQuery(ui.item).parent().hasClass('layouts-cell')) {\n\t\t\t\t\tvar newHelper = $parentHelper.clone();\n\t\t\t\t} else {\n\t\t\t\t\tvar newHelper = jQuery(ui.item).clone();\n\t\t\t\t}\n\n\t\t\t\t// Remove unecessary item controls from helper.\n\t\t\t\tnewHelper.find('.nf-item-controls').remove();\n\n\t\t\t\t// Update helper with clone's content.\n\t\t\t\tjQuery( ui.helper ).html( newHelper.html() );\n\n\t\t\t\tjQuery( ui.helper ).css( 'opacity', '0.5' );\n\t\t\t\t\n\t\t\t\t// Add de-emphasize origional.\n\t\t\t\tjQuery( ui.item ).css( 'opacity', '0.25' );\n\t\t\t}\n\t\t\t//nfRadio.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\tupdateRepeaterField: function( ui, sortable ) {\n\n\t\t\tnfRadio.channel( 'fields-repeater' ).request( 'sort:repeaterField' );\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-repeater' ).request( 'get:repeaterFieldsCollection' );\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\t//nfRadio.channel( 'changes' ).request( 'register:change', 'sortFields', dragModel, null, label, data );\n\t\t\t}\n\n\t\t},\n\n\t});\n\n\t\n\t\n\treturn controller;\n} );\n","/**\n * Creates and stores a collection of action types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our action type collection\n *\n * Also responds to requests for data about action types\n *\n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/types',[ 'models/app/typeCollection' ], function( TypeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\n\t\t\t/*\n\t\t\t * Instantiate \"installed\" actions collection.\n\t\t\t */\n\t\t\tthis.installedActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'installed';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'installed',\n\t\t\t\t\tnicename: nfi18n.installed\n\t\t\t\t} \n\t\t\t);\n\n\t\t\tthis.availableActions = new TypeCollection(\n\t\t\t\t_.filter( actionTypeData, function( type ) {\n\t\t\t\t\treturn type.section == 'available';\n\t\t\t\t\t} \n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tslug: 'available',\n\t\t\t\t\tnicename: nfi18n.available\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:installedActions', this.getInstalledActions, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:availableActions', this.getAvailableActions, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since  3.0\n\t\t * @param  string \t\t\tid \tfield type\n\t\t * @return backbone.model    \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\t// Search our installed actions first\n\t\t\tvar type = this.installedActions.get( id );\n\t\t\tif ( ! type ) {\n\t\t\t\ttype = this.availableActions.get( id );\n\t\t\t}\n        \treturn type;\n        },\n\n        /**\n         * Return the installed action type collection\n         *\n         * @since  3.0\n         * @return backbone.collection    \tfield type collection\n         */\n\t\tgetInstalledActions: function() {\n        \treturn this.installedActions;\n        },\n\n        /**\n         * Return the available action type collection\n         *\n         * @since  3.0\n         * @return backbone.collection    \tfield type collection\n         */\n\t\tgetAvailableActions: function() {\n        \treturn this.availableActions;\n        },\n\n        /**\n         * Add a field type to our staging area when the field type button is clicked.\n         *\n         * @since 3.0\n         * @param Object e event\n         * @return void\n         */\n        addStagedField: function( e ) {\n        \tvar type = jQuery( e.target ).data( 'id' );\n        \tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\n        },\n\n        /**\n         * Return our field type settings sections\n         *\n         * @since  3.0\n         * @return backbone.collection field type settings sections\n         */\n        getTypeSections: function() {\n            return this.fieldTypeSections;\n        }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form action.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Action',\n\t\t\tobjectDomain: 'actions',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.on( 'change', this.changeSetting, this );\n\n\t\t\t// Get our parent field type.\n\t\t\tvar actionType = nfRadio.channel( 'actions' ).request( 'get:type', this.get( 'type' ) );\n\n\t\t\tif( 'undefined' == typeof actionType ) return;\n\n\t\t\t// Loop through our action type \"settingDefaults\" and add any default settings.\n\t\t\tvar that = this;\n\t\t\t_.each( actionType.get( 'settingDefaults' ), function( val, key ) {\n\t\t\t\tif ( ! that.get( key ) ) {\n\t\t\t\t\tthat.set( key, val, { silent: true } );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t\n\t\t\t/*\n\t\t\t * Trigger an init event on three channels:\n\t\t\t * \n\t\t\t * actions\n\t\t\t * action-type\n\t\t\t *\n\t\t\t * This lets specific field types modify model attributes before anything uses them.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'actions' ).trigger( 'init:actionModel', this );\n\t\t\tnfRadio.channel( 'actions-' + this.get( 'type' ) ).trigger( 'init:actionModel', this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since  3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options ) {\n            nfRadio.channel( 'actionSetting-' + _.keys( this.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\n\t\t\tnfRadio.channel( 'actions').trigger( 'update:setting', this, options.settingModel );\n            nfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action models. \n * This is the actual action data created by the user.\n *\n * We listen to the add and remove events so that we can push the new id to either the new action or removed action property.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/actionCollection',['models/actions/actionModel'], function( actionModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionModel,\n\t\tcomparator: 'order',\n\t\ttmpNum: 1,\n\n\t\tinitialize: function() {\n\t\t\tthis.on( 'add', this.addAction, this );\n\t\t\tthis.on( 'remove', this.removeAction, this );\n\t\t\tthis.newIDs = [];\n\t\t},\n\n\t\t/**\n\t\t * When we add a field, push the id onto our new action property.\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\taddAction: function( model ) {\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\n\t\t},\n\n\t\t/**\n\t\t * When we remove a field, push the id onto our removed action property.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param void\n\t\t */\n\t\tremoveAction: function( model ) {\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\n\t\t}\n\t} );\n\treturn collection;\n} );\n","/**\n * Handles interactions with our actions collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/data',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.collection = new actionCollection( preloadedFormData.actions );\n\t\t\tthis.collection.tmpNum = 1;\n\n\t\t\tif ( 0 != this.collection.models.length ) {\n\t\t\t\tvar that = this;\n\t\t\t\t_.each( this.collection.models, function( action ) {\n\t\t\t\t\tif ( ! jQuery.isNumeric( action.get( 'id' ) ) ) {\n\t\t\t\t\t\tthat.collection.tmpNum++;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a action is removed so that we can add it to our 'deleted_actions' object.\n\t\t\tthis.collection.removedIDs = {};\n\n\t\t\t// Respond to requests for data about actions and to update/change/delete actions from our collection.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:collection', this.getCollection, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:action', this.getAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:tmpID', this.getTmpID, this );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add', this.addAction, this );\n\t\t\tnfRadio.channel( 'actions' ).reply( 'delete', this.deleteAction, this );\n\t\t},\n\n\t\tgetCollection: function() {\n\t\t\treturn this.collection;\n\t\t},\n\n\t\tgetAction: function( id ) {\n\t\t\treturn this.collection.get( id );\n\t\t},\n\n\t\t/**\n\t\t * Add a action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( data, silent ) {\n\t\t\tsilent = silent || false;\n\n\t\t\tif ( false === data instanceof Backbone.Model ) {\n\t\t\t\tvar model = new actionModel( data );\n\t\t\t} else {\n\t\t\t\tvar model = data;\n\t\t\t}\n\n\t\t\tthis.collection.add( model, { silent: silent } );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\n\t\t\treturn model;\n\t\t},\n\n\t\t/**\n\t\t * Delete a action from our collection.\n\t\t * \n\t\t * @since  3.0\n\t\t * @param  backbone.model \tmodel \taction model to be deleted\n\t\t * @return void\n\t\t */\n\t\tdeleteAction: function( model ) {\n\t\t\tthis.collection.remove( model );\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\n\n\t\t},\n\n\n\t\t/**\n\t\t * Return a new tmp id for our actions.\n\t\t * Gets the action collection length, adds 1, then returns that prepended with 'tmp-'.\n\t\t * \n\t\t * @since  3.0\n\t\t * @return string\n\t\t */\n\t\tgetTmpID: function() {\n\t\t\tvar tmpNum = this.collection.tmpNum;\n\t\t\tthis.collection.tmpNum++;\n\t\t\treturn 'tmp-' + tmpNum;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/actionSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( actionSettings, { objectType: 'actions' } );\n\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:settingModel', this.getSettingModel, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from a action currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - Edit Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our actions.\n\t\t\tnfRadio.channel( 'actions' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our actions collection and sets editActive to false.\n\t\t * \n\t\t * @since  3.0\n\t\t * @return void\n\t\t */\n        clearEditActive: function() {\n            var actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\n            _.each( actionCollection.models, function( action ) {\n\t\t\t\taction.set( 'editActive', false );\n            } );\n        }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * @package Ninja Forms builder\n * @subpackage Actions - Action Settings Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/emailFromSetting',[], function( ) {\n    var controller = Marionette.Object.extend( {\n        initialize: function() {\n            this.listenTo( nfRadio.channel( 'actionSetting-from_address' ), 'update:setting', this.updateFromAddress );\n        },\n\n        updateFromAddress: function( dataModel, settingModel ) {\n            if( 'undefined' == typeof settingModel ) return;\n\n            var value = String( dataModel.get( 'from_address' ) ).trim();\n\n            if( '{wp:admin_email}' == value ) {\n                return settingModel.set( 'warning', false );\n            }\n\n            if( value && ( ! this.isValidEmail( value ) ) || nfAdmin.home_url_host != value.replace(/.*@/, \"\") ){\n                return settingModel.set( 'warning', nfi18n.errorInvalidEmailFromAddress );\n            }\n\n            return settingModel.set( 'warning', false );\n        },\n\n        isValidEmail: function(email) {\n            return /^.+@.+\\..+$/.test(email);\n        }\n    });\n    return controller;\n} );\n","/**\n * Handles clicks and dragging for our action types.\n * \n * @package Ninja Forms builder\n * @subpackage Fields - New Field Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/addActionTypes',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'actions' ), 'click:addAction', this.addAction );\n\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add:actionType', this.addAction, this );\n\t\t},\n\n\t\t/**\n\t\t * Add an action to our collection. If silent is passed as true, no events will trigger.\n\t\t * \n\t\t * @since 3.0\n\t\t * @param Object \tdata \taction data to insert\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\n\t\t */\n\t\taddAction: function( type ) {\n\n\t\t\tvar data = {\n\t\t\t\tid: nfRadio.channel( 'actions' ).request( 'get:tmpID' ),\n\t\t\t\ttype: type.get( 'id' ),\n\t\t\t\tlabel: type.get( 'settingDefaults').label || type.get( 'nicename' )\n\t\t\t}\n\n\t\t\tvar newModel = nfRadio.channel( 'actions' ).request( 'add', data );\n\n\t\t\tvar label = {\n\t\t\t\tobject: 'Action',\n\t\t\t\tlabel: newModel.get( 'label' ),\n\t\t\t\tchange: 'Added',\n\t\t\t\tdashicon: 'plus-alt'\n\t\t\t};\n\n\t\t\tvar data = {\n\t\t\t\tcollection: nfRadio.channel( 'actions' ).request( 'get:collection' )\n\t\t\t}\n\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', {}, newModel );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type draggables.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/typeDrag',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our action type draggables and run the appropriate function.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'startDrag:type', this.startDrag );\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'stopDrag:type', this.stopDrag );\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'drawer-addAction' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\n\t\t},\n\n\t\t/**\n\t\t * When we start dragging:\n\t\t * get our drawer element\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\n\t\t * get our main element\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\n\t\t * set our dragging helper clone\n\t\t * \n\t\t * @since  3.0\n\t\t * @param  object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param  object ui      \tObject sent by jQuery UI draggable.\n\t\t * @return void\n\t\t */\n\t\tstartDrag: function( context, ui ) {\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\n\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\n\n\t\t},\n\n\t\t/**\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\n\t\t * \n\t\t * @since  3.0\n\t\t * @param  object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\n\t\t * @param  object ui      \tObject sent by jQuery UI draggable.\n\t\t * @return {[type]}         [description]\n\t\t */\n\t\tstopDrag: function( context, ui ) {\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\n\t\t},\n\n\t\tgetCurrentDraggableHelperClone: function() {\n\t\t\treturn this.draggableHelperClone;\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles the logic for our action type droppable.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/droppable',[], function( ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * Respond to requests for our helper clone.\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\n\t\t\t */ \n\t\t\tnfRadio.channel( 'app' ).reply( 'drop:actionType', this.dropActionType, this );\n\t\t},\n\n\t\tdropActionType: function( e, ui ) {\n\t\t\tvar type_slug = jQuery( ui.helper ).data( 'type' );\n\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', type_slug );\n\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', type );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Model for our action type\n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Collection that holds our action type models. \n * \n * @package Ninja Forms builder\n * @subpackage Actions\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/actions/typeCollection',['models/actions/typeModel'], function( actionTypeModel ) {\n\tvar collection = Backbone.Collection.extend( {\n\t\tmodel: actionTypeModel,\n\t} );\n\treturn collection;\n} );\n","/**\n * Filters our action type collection.\n * \n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/filterTypes',['models/actions/typeCollection'], function( typeCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen to our change filter event.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'change:filter', this.filterActionTypes );\n\t\t},\n\n\t\t/**\n\t\t * Filter our action types in the add new action drawer\n\t\t * \n\t\t * Takes a search string and finds any action types that match either the name or alias.\n\t\t * \n\t\t * @since  3.0\n\t\t * @param  string\t search \tstring being searched for\n\t\t * @param  object \t e      \tKeyup event\n\t\t * @return void\n\t\t */\n\t\tfilterActionTypes: function( search, e ) {\n\n\t\t\t// Make sure that we aren't dealing with an empty string.\n\t\t\tif ( '' != String(  search ).trim() ) {\n\n        \t\tvar filteredInstalled = [];\n        \t\t/**\n        \t\t * Call the function that actually filters our collection,\n        \t\t * and then loop through our collection, adding each model to our filteredInstalled array.\n        \t\t */\n\t\t\t\tvar installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\n        \t\t_.each( this.filterCollection( search, installedActions ), function( model ) {\n        \t\t\tfilteredInstalled.push( model );\n        \t\t} );\n\n        \t\tvar filteredAvailable = [];\n        \t\tvar availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\n        \t\t_.each( this.filterCollection( search, availableActions ), function( model ) {\n        \t\t\tfilteredAvailable.push( model );\n        \t\t} );\n\n        \t\t// Create a new Action Type Section collection with the filtered array.\n        \t\tvar newInstalled = new typeCollection( filteredInstalled );\n        \t\tnewInstalled.slug = 'installed';\n        \t\tnewInstalled.nicename = 'Installed';\n\n        \t\tvar newAvailable = new typeCollection( filteredAvailable );\n        \t\tnewAvailable.slug = 'available';\n\t\t\t\tnewAvailable.nicename = 'Available';\n\n        \t\t// Request that our action types filter be applied, passing the collection we created above.\n        \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:actionTypes', newInstalled, newAvailable );\n        \t\t// If we've pressed the 'enter' key, add the action to staging and clear the filter.\n        \t\tif ( e.addObject ) {\n        \t\t\tif ( 0 < newInstalled.length ) {\n        \t\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', newInstalled.models[0] );\n        \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\n        \t\t\t}\n        \t\t}\n        \t} else {\n        \t\t// Clear our filter if the search text is empty.\n        \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\n        \t}\n        },\n\n        /**\n         * Search our action type collection for the search string.\n         * \n         * @since  3.0\n         * @param  string\t search \tstring being searched for\n         * @return backbone.collection\n         */\n        filterCollection: function( search, collection ) {\n        \tsearch = search.toLowerCase();\n        \t/*\n        \t * Backbone collections have a 'filter' method that loops through every model,\n        \t * waiting for you to return true or false. If you return true, the model is kept.\n        \t * If you return false, it's removed from the filtered result.\n        \t */\n\t\t\tvar filtered = collection.filter( function( model ) {\n\t\t\t\tvar found = false;\n\t\t\t\t\n\t\t\t\t// If we match either the ID or nicename, return true.\n\t\t\t\tif ( model.get( 'id' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\n\t\t\t\t */\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// If we match any of the aliases, return true.\n\t\t\t\tif ( model.get( 'alias' ) ) {\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t} );\n\n\t\t\t// Return our filtered collection.\n\t\t\treturn filtered;\n        }\n\t});\n\n\treturn controller;\n} );\n","/**\n * @package Ninja Forms builder\n * @subpackage Actions - New Action Drawer\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/actions/newsletterList',[], function( ) {\n    var controller = Marionette.Object.extend( {\n        initialize: function() {\n            this.listenTo( nfRadio.channel( 'setting-newsletter_list' ),             'show:setting',      this.defaultFields );\n            this.listenTo( nfRadio.channel( 'setting-type-newsletter_list' ),        'click:extra',       this.clickListUpdate );\n            this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ),       'update:setting',    this.maybeRenderFields );\n            this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ),       'update:setting',    this.maybeRenderGroups );\n            this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_fields' ), 'init:settingModel', this.registerFieldsListener );\n            this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_groups' ), 'init:settingModel', this.registerGroupsListener );\n        },\n\n        defaultFields: function( settingModel, dataModel ) {\n            this.maybeRenderFields( dataModel, settingModel );\n            this.maybeRenderGroups( dataModel, settingModel );\n        },\n\n        registerFieldsListener: function ( model ) {\n            model.listenTo( nfRadio.channel( 'newsletter_list_fields' ), 'update:fieldMapping', this.updateFieldMapping, model );\n        },\n\n        registerGroupsListener: function ( model ) {\n            model.listenTo( nfRadio.channel( 'newsletter_list_groups' ), 'update:interestGroups', this.updateInterestGroups, model );\n        },\n\n        clickListUpdate: function( e, settingModel, dataModel, settingView ) {\n\n            var data = {\n                action: 'nf_' + dataModel.attributes.type + '_get_lists',\n                security: nfAdmin.ajaxNonce\n            };\n\n            var that = this;\n            jQuery( e.srcElement ).addClass( 'spin' );\n            jQuery.post( ajaxurl, data, function( response ){\n                var response = JSON.parse( response );\n                that.updateLists( settingModel, response.lists, settingView, dataModel );\n                dataModel.set( 'newsletter_list', response.lists[0].value, { settingModel: settingModel } );\n            }).always( function() {\n                jQuery( e.srcElement ).removeClass( 'spin' );\n            });\n        },\n\n        updateLists: function( settingModel, lists, settingView, dataModel ) {\n            settingModel.set( 'options', lists );\n            settingView.render();\n        },\n\n        maybeRenderFields: function( dataModel, settingModel ) {\n\n            if( 'undefined' == typeof settingModel ) return;\n\n            var selectedList = dataModel.get( 'newsletter_list' );\n            var lists = settingModel.get( 'options' );\n            _.each( lists, function( list ) {\n                if ( selectedList == list.value ) {\n                    nfRadio.channel( 'newsletter_list_fields').trigger( 'update:fieldMapping', list.fields );\n                }\n            } );\n\n            dataModel.set( 'newsletter_list_fields', 0 );\n        },\n\n        maybeRenderGroups: function( dataModel, settingModel ) {\n            if( 'undefined' == typeof settingModel ) return;\n\n            var selectedList = dataModel.get( 'newsletter_list' );\n            var lists = settingModel.get( 'options' );\n            _.each( lists, function( list ) {\n                if ( selectedList == list.value ) {\n                    nfRadio.channel( 'newsletter_list_groups').trigger( 'update:interestGroups', list.groups );\n                }\n            } );\n\n            dataModel.set( 'newsletter_list_fields', 0 );\n        },\n\n        updateFieldMapping: function( fields ) {\n           var settings = this.get( 'settings' );\n            settings.reset();\n            _.each( fields, function( field ){\n\n                settings.add({\n                    name: field.value,\n                    type: 'textbox',\n                    label: field.label,\n                    width: 'full',\n                    use_merge_tags: { exclude: [ 'user', 'post', 'system', 'querystrings' ] }\n                });\n            });\n            this.set( 'settings', settings );\n        },\n\n        updateInterestGroups: function( groups ) {\n            var settings = this.get( 'settings' );\n            settings.reset();\n            _.each( groups, function( group ){\n\n                settings.add({\n                    name: group.value,\n                    type: 'toggle',\n                    label: group.label,\n                    width: 'full',\n                });\n            });\n            this.set( 'settings', settings );\n        },\n\n    });\n\n    return controller;\n} );\n\n","/**\n * Listens to field deletion, removing any merge tags that reference the field.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1.7\n */\ndefine( 'controllers/actions/deleteFieldListener',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When we init an action model, register a listener for field deletion.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'actions' ), 'init:actionModel', this.registerListener );\n\t\t},\n\n\t\tregisterListener: function( actionModel ) {\n\t\t\tactionModel.listenTo( nfRadio.channel( 'fields' ), 'delete:field', this.maybeUpdateSettings );\n\t\t},\n\n\t\tmaybeUpdateSettings: function( fieldModel ) {\n\t\t\tvar newObject, filteredCollection,\n\t\t\t\tfieldMergeTag = '{field:' + fieldModel.get( 'key' ) + '}';\n\t\t\t\n\t\t\t/*\n\t\t\t * Loop through our action attributes to see if the field mergetag exists in our action.\n\t\t\t *\n\t\t\t * If it does:\n\t\t\t * \t- Replace the field mergetag in strings with ''.\n\t\t\t * \t- Remove any items with the field merge tag if they are in an array.\n\t\t\t */\n\t\t\t_.each( this.attributes, function( attr, key ) {\n\t\t\t\tif ( _.isString( attr ) ) {\n\t\t\t\t\t// If our attribute is a string, replace any instances of the field merge tag with an empty string.\n\t\t\t\t\tthis.set( key, attr.replace( fieldMergeTag, '' ) );\n\t\t\t\t} else if ( _.isArray( attr ) ) {\n\t\t\t\t\t// If our attribute is an array, search the contents for field merge tag and remove items that match.\n\t\t\t\t\t_.each( attr, function( val, index ) {\n\t\t\t\t\t\tif ( _.isString( val ) ) {\n\t\t\t\t\t\t\t// If val is a string, search it for the field mergetag.\n\t\t\t\t\t\t\tconsole.log( 'string replace' );\n\t\t\t\t\t\t} else if ( _.isArray( val ) ) {\n\t\t\t\t\t\t\t// If val is an array, search it for the field mergetag.\n\t\t\t\t\t\t\tconsole.log( 'array search' );\n\t\t\t\t\t\t} else if ( _.isObject( val ) ) {\n\t\t\t\t\t\t\t// If val is a object, search it for the field mergetag.\n\t\t\t\t\t\t\tnewObject = _.mapObject( val, function( value, key ) {\n\t\t\t\t\t\t\t\tif ( _.isString( value ) ) {\n\t\t\t\t\t\t\t\t\tif ( -1 != value.indexOf( fieldMergeTag ) ) {\n\t\t\t\t\t\t\t\t\t\tattr.splice( index, 1 );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\tthis.set( key, attr );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this );\n\t\t\t\t} else if ( attr instanceof Backbone.Collection ) {\n\t\t\t\t\t// This is a Backbone Collection, so we need to loop through the models and remove any that have an attribute containing the field merge tag.\n\t\t\t\t\tvar filteredCollection = attr.filter( function ( model ) {\n\t\t\t\t\t\t// Make sure that EVERY model attribute does NOT reference the field merge tag.\n\t\t\t\t\t    return _.every( model.attributes, function( val ) {\n\t\t\t\t\t    \t/*\n\t\t\t\t\t    \t * Currently only handles items that are one-level deep.\n\t\t\t\t\t    \t * TODO: Add support for further nesting of values.\n\t\t\t\t\t    \t */\n\t\t\t\t\t    \tif ( _.isString( val ) ) {\n\t\t\t\t\t    \t\tif ( -1 != val.indexOf( fieldMergeTag ) ) {\n\t\t\t\t\t    \t\t\treturn false;\n\t\t\t\t\t    \t\t}\n\t\t\t\t\t    \t}\n\t\t\t\t\t    \treturn true;\n\t\t\t\t\t    });;\n\t\t\t\t\t});\n\t\t\t\t\t// Update our key with the filtered collection value.\n\t\t\t\t\tthis.set( key, filteredCollection );\n\t\t\t\t}\n\t\t\t}, this );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a collect payment setting, add our number fields and total fields to the data model.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1.7\n */\ndefine( 'controllers/actions/collectPaymentFields',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n\t\t},\n\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\n\t\t\tif ( 'field' != settingModel.get( 'total_type' ) ) return false;\n\n\t\t\tvar fields = this.getFields( settingModel );\n\n\t\t\t/*\n\t\t\t * If the field in the payment total isn't in our field list, add it.\n\t\t\t *\n\t\t\t * Remove the merge tag stuff to get the field key.\n\t\t\t */\n\t\t\t\n\t\t\tvar field_key = dataModel.get( 'payment_total' );\n\t\t\tfield_key = field_key.replace( '{field:', '' );\n\t\t\tfield_key = field_key.replace( '}', '' );\n\t\t\tvar fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', field_key );\n\n\t\t\tif ( 'undefined' != typeof fieldModel ) {\n\t\t\t\tif ( 'undefined' == typeof _.findWhere( fields, { value: dataModel.get( 'payment_total' ) } ) ) {\n\t\t\t\t\tfields.push( { label: fieldModel.get( 'label' ), value: '{field:' + fieldModel.get( 'key' ) + '}' } );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Update our fields options.\n\t\t\t */\n\t\t\tsettingModel.set( 'options', fields );\n\t\t\t\n\t\t},\n\n\t\tgetFields: function( settingModel ) {\n\t\t\tvar returnFields = [ settingModel.get( 'default_options' ) ];\n\t\t\t// Update our dataModel with all of our product fields.\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\tvar allowed = [\n\t\t\t\t'number',\n\t\t\t\t'checkbox',\n\t\t\t\t'total', // Deprecated\n\t\t\t\t'listcheckbox',\n\t\t\t\t'listimage',\n\t\t\t\t'listmultiselect',\n\t\t\t\t'listradio',\n\t\t\t\t'listselect'\n\t\t\t];\n\t\t\t_.each( fields.models, function( field ) {\n\t\t\t\tif ( allowed.includes( field.get( 'type' ) ) ) {\n\t\t\t\t\treturnFields.push( { label: field.get( 'label' ), value: '{field:' + field.get( 'key' ) + '}' } );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturnFields = _.sortBy( returnFields, function( field ) { return field.label } );\n\n\t\t\treturn returnFields;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we're rendering a collect payment setting, add our calculations to the data model.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1.7\n */\ndefine( 'controllers/actions/collectPaymentCalculations',[], function() {\n    var controller = Marionette.Object.extend( {\n        initialize: function() {\n            // Listen for messages that are fired before a setting view is rendered.\n            this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n        },\n\n        beforeRenderSetting: function( settingModel, dataModel, view ) {\n            if ( 'calc' == settingModel.get( 'total_type' ) ) {\n                var calcModels = nfRadio.channel( 'app' ).request( 'get:formModel' );\n                var calcs = this.getCalcs( calcModels, settingModel );\n\n                settingModel.set( 'options', calcs );\n            }\n        },\n\n        getCalcs: function( calcModels, settingModel ) {\n            var returnCalcs = [ settingModel.get( 'default_options' ) ];\n\n            // Update our dataModel with all of our product fields.\n            var calcs = calcModels.get( 'settings' ).get( 'calculations' );\n\n            _.each( calcs.models, function( calc ) {\n                returnCalcs.push( { label: calc.get( 'name' ), value: '{calc:' + calc.get( 'name' ) + '}' } );\n            } );\n\n            returnCalcs = _.sortBy( returnCalcs, function( calc ) { return calc.label } );\n\n            return returnCalcs;\n        }\n\n    });\n\n    return controller;\n} );\n","/**\n * Listens to our app channel for settings views being rendered.\n *\n * If we haven't set a total_type, then set the total_type to fixed.\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1.7\n */\ndefine( 'controllers/actions/collectPaymentFixed',[], function() {\n    var controller = Marionette.Object.extend( {\n        initialize: function() {\n            // Listen for messages that are fired before a setting view is rendered.\n            this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\n        },\n\n        beforeRenderSetting: function( settingModel, dataModel, view ) {\n\n            if ( 'payment_total_type' != settingModel.get( 'name' ) || _.isEmpty( dataModel.get( 'payment_total' ) ) ) return false;\n\n            /*\n             * If we don't have a payment total type and we have a payment total, set our total type to the appropriate total type.\n             */\n            if ( ( 'undefined' == dataModel.get( 'payment_total_type' ) || _.isEmpty( dataModel.get( 'payment_total_type' ) ) ) ) {\n                /*\n                 * If payment_total is a field merge tag, set payment_total_type to \"field\"\n                 */\n\n                if ( -1 != dataModel.get( 'payment_total' ).indexOf( '{field' ) ) {\n                    dataModel.set( 'payment_total_type', 'field' );\n                } else if ( -1 != dataModel.get( 'payment_total' ).indexOf( '{calc' ) ) {\n                    dataModel.set( 'payment_total_type', 'calc' );\n                } else {\n                    dataModel.set( 'payment_total_type', 'fixed' );\n                }   \n            }\n        },\n\n    });\n\n    return controller;\n} );\n","/**\n * When we init a collect payment action, listen for calc changes\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1.7\n */\ndefine( 'controllers/actions/collectPayment',[], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When we init a collect payment action model, register a listener for calc changes.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'actions-collectpayment' ), 'init:actionModel', this.initCollectPayment );\n\t\t\t\n\t\t\t/*\n\t\t\t * Before we render our total field, we may want to update its value.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.maybeClearTotal );\n\t\t},\n\n\t\t/**\n\t\t * When a collect payment action is init'd, register a listener for calc changes and update our data appropriately.\n\t\t * @since  3.1.7\n\t\t * @param  {backbone.model} actionModel \n\t\t * @return {void}\n\t\t */\n\t\tinitCollectPayment: function( actionModel )  {\n\t\t\tactionModel.listenTo( nfRadio.channel( 'calcs' ), 'update:calcName', this.maybeUpdateTotal );\n        },\n\n\t\t//TODO: Add in an error that will not allow drawer to close until total type and total value is selected.\n\t\tmaybeError: function(){},\n\n\t\tmaybeUpdateTotal: function( optionModel, oldName ) {\n\t\t\t/*\n\t\t\t * We have changed a calculation. Make sure that 'calc' is our payment total type.\n\t\t\t */\n\t\t\tif ( 'calc' != this.get( 'payment_total_type' ) ) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Check our payment_total setting for the old merge tag and replace it with the new one.\n\t\t\t */\n\t\t\tvar newVal = this.get( 'payment_total' ).replace( '{calc:' + oldName + '}', '{calc:' + optionModel.get( 'name' ) + '}' );\n\t\t\tthis.set( 'payment_total', newVal );\n\t\t},\n\n\t\tmaybeClearTotal: function( settingModel, dataModel, view ) {\n            /*\n             * If our payment_total is a merge tag, clear it when we select the \"fixed\" option.\n             */\n            if ( 'fixed' == dataModel.get( 'payment_total_type' ) ) {\n                if ( -1 != dataModel.get( 'payment_total' ).indexOf( '{field' ) || -1 != dataModel.get( 'payment_total' ).indexOf( '{calc' ) ) {\n                    dataModel.set( 'payment_total', '' );\n                }\n            }\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * When we init a save action, listen for form changes\n *\n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2017 WP Ninjas\n * @since 3.1.7\n */\ndefine( 'controllers/actions/save',[], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'actions-save' ), 'init:actionModel', this.initSave );\n\t\t},\n\n\t\t/**\n\t\t * Set listeners up to listen for add/delete fields for Save action\n\t\t */\n\t\tinitSave: function( actionModel ) {\n\n\t\t\tthis.model = actionModel;\n\n\t\t\t/*\n\t\t\t * When we init a save action model, register a listener for new\n\t\t\t  * fields\n\t\t\t */\n\t\t\tthis.listenTo( Backbone.Radio.channel( 'fields' ), 'add:field',\n\t\t\t\tthis.checkFieldAdded );\n\n\t\t\t/*\n\t\t\t * When we init a save action model, register a listener for deleted\n\t\t\t  * fields\n\t\t\t */\n\t\t\tthis.listenTo( Backbone.Radio.channel( 'fields' ), 'delete:field',\n\t\t\t\tthis.checkFieldDeleted );\n\t\t},\n\n\t\t/**\n\t\t * When a save action is init'd, check to see if a new field added\n\t\t * is an email and decide if it needs to be the 'submitter_email'\n\t\t * for privacy regulation functionality\n\t\t *\n\t\t * @param  {backbone.model} actionModel\n\t\t * @return {void}\n\t\t */\n\t\tcheckFieldAdded: function( newFieldModel ) {\n\t\t\tif( 'email' == newFieldModel.get( 'type' ) ) {\n\t\t\t\tvar submitter_email = this.model.get('submitter_email');\n\n\t\t\t\tif( '' === submitter_email ) {\n\t\t\t\t\tthis.model.set( 'submitter_email', newFieldModel.get( 'key' ) );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * When a save action is init'd, check to see if a field that has been\n\t\t * deleted is an email and rearrance the submitter email setting\n\t\t * for privacy regulation functionality\n\t\t *\n\t\t * @param  {backbone.model} actionModel\n\t\t * @return {void}\n\t\t */\n\t\tcheckFieldDeleted: function( fieldModel ) {\n\t\t\tvar submitter_email = this.model.get( 'submitter_email' );\n\t\t\t\n\t\t\tif( submitter_email == fieldModel.get( 'key' ) ) {\n\t\t\t\tthis.model.set( 'submitter_email', '' );\n\t\t\t}\n\t\t},\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Creates and stores a collection of form setting types. This includes all of the settings shown when editing a field.\n *\n * Loops over our preloaded data and adds that to our form setting type collection\n *\n * Also responds to requests for data about form setting types\n *\n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/types',[\n\t\t'models/app/typeCollection'\n\t],\n\tfunction(\n\t\tTypeCollection\n\t) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Create our field type collection\n\t\t\tthis.collection = new TypeCollection( formSettingTypeData );\n\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:type', this.getType, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:typeCollection', this.getCollection, this );\n\t\t},\n\n\t\t/**\n\t\t * Return a field type by id\n\t\t *\n\t\t * @since  3.0\n\t\t * @param  string \t\t\tid \tfield type\n\t\t * @return backbone.model    \tfield type model\n\t\t */\n\t\tgetType: function( id ) {\n\t\t\treturn this.collection.get( id );\n        },\n\n        /**\n         * Return the installed action type collection\n         *\n         * @since  3.0\n         * @return backbone.collection    \tfield type collection\n         */\n\t\tgetCollection: function() {\n        \treturn this.collection;\n        }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Model that represents our form settings.\n * \n * @package Ninja Forms builder\n * @subpackage Form Settings\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'models/advanced/settingsModel',[], function() {\n\tvar model = Backbone.Model.extend( {\n\t\tdefaults: {\n\t\t\tobjectType: 'Form Setting',\n\t\t\teditActive: false\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t// Listen for model attribute changes\n\t\t\tthis.bind( 'change', this.changeSetting, this );\n\t\t\t/*\n\t\t\t * Check to see if we have any setting defaults to set.\n\t\t\t */\n\t\t\tvar formSettings = nfRadio.channel( 'settings' ).request( 'get:collection' );\n\t\t\t_.each( formSettings.models, function( settingModel ) {\n\t\t\t\tif ( 'undefined' == typeof this.get( settingModel.get( 'name' ) ) ) {\n\t\t\t\t\tthis.set( settingModel.get( 'name' ), settingModel.get( 'value' ), { silent: true } );\n\t\t\t\t}\n\t\t\t\tnfRadio.channel( settingModel.get( 'type' ) ).trigger( 'init:dataModel', this, settingModel );\n\t\t\t}, this );\n\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\n\t\t},\n\n\t\t/**\n\t\t * When we change the model attributes, fire an event saying we've changed something.\n\t\t * \n\t\t * @since  3.0\n\t\t * @return void\n\t\t */\n\t\tchangeSetting: function( model, options) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\n\t\t},\n\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\n\t\t}\n\t} );\n\t\n\treturn model;\n} );\n","/**\n * Handles interactions with our form settings collection.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/data',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Load our action collection from our localized form data\n\t\t\tthis.model = new settingsModel( preloadedFormData.settings );\n\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settings', this.getSettings, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:setting', this.getSetting, this );\n\t\t\tnfRadio.channel( 'settings' ).reply( 'update:setting', this.updateSetting, this );\n\t\t},\n\n\t\tgetSettings: function() {\n\t\t\treturn this.model;\n\t\t},\n\n\t\tupdateSetting: function( name, value, silent ) {\n\t\t\tsilent = silent || false;\n\t\t\tthis.model.set( name, value, { silent: silent } );\n\t\t},\n\n\t\tgetSetting: function( name ) {\n\t\t\treturn this.model.get( name );\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Fetches settings models so that we can get setting information\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/formSettings',['models/app/settingCollection'], function( settingCollection ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.collection = new settingCollection( formSettings, { objectType: 'settings' } );\n\t\t\t\t\t\n\t\t\t// Responds to requests for settings models.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settingModel', this.getSettingModel, this );\n\n\t\t\t// Responds to requests for our setting collection\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:collection', this.getSettingCollection, this );\n\t\t},\n\n\t\tgetSettingModel: function( name ) {\n\t\t\treturn this.collection.findWhere( { name: name } );\n\t\t},\n\n\t\tgetSettingCollection: function() {\n\t\t\treturn this.collection;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","/**\n * Handles adding and removing the active class from form settings currently being edited.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/editActive',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Respond to requests to remove the active class from all our fields.\n\t\t\tnfRadio.channel( 'settings' ).reply( 'clear:editActive', this.clearEditActive, this );\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\n\t\t},\n\n\t\t/**\n\t\t * Loops through our fields collection and sets editActive to false.\n\t\t * \n\t\t * @since  3.0\n\t\t * @return void\n\t\t */\n        clearEditActive: function() {\n            var collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\n            _.each( collection.models, function( field ) {\n\t\t\t\tfield.set( 'editActive', false );\n            } );\n        }\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Listens for clicks on our form settings sections.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/clickEdit',['models/advanced/settingsModel'], function( settingsModel ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'settings' ), 'click:edit', this.clickEdit );\n\t\t},\n\n\t\tclickEdit: function( e, typeModel ) {\n\t\t\tvar model = nfRadio.channel( 'settings' ).request( 'get:settings' );\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: typeModel.get( 'settingGroups' ), typeModel: typeModel } );\n\t\t\tvar preventClose = nfRadio.channel( 'drawer' ).request( 'get:preventClose' );\n\t\t\tif ( ! preventClose ) {\n\t\t\t\ttypeModel.set( 'editActive', true );\n\t\t\t}\n\t\t}\n\t});\n\n\treturn controller;\n} );\n","/**\n * Makes sure that calculations don't reference calculations with a lower order.\n *\n * For example, our first caclulation can't reference the second, but the second can reference the first.\n * \n * @package Ninja Forms builder\n * @subpackage Advanced\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'controllers/advanced/calculations',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t/*\n\t\t\t * When someone types in the \"name\" or \"eq\" portion of our calculation, we need to make sure\n\t\t\t * that they haven't duplicated a name or made a bad EQ reference.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'keyup:option', this.keyUp );\n\t\t\t/*\n\t\t\t * Same thing for when our calculation option is updated\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalc );\n\t\t\t/*\n\t\t\t * When we sort our calcluations, we need to make sure that we don't get any bad EQ\n\t\t\t * references.\n\t\t\t */\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'sort:option', this.sortCalc );\n\t\t},\n\n\t\tkeyUp: function( e, optionModel ) {\n\t\t\t// Get our current value\n\t\t\tvar value = jQuery( e.target ).val();\n\t\t\t// Check to see if we're editing a name or eq\n            var id = jQuery( e.target ).data( 'id' );\n\t\t\tif( 'name' == id ) { // We are editing the name field\n\t\t\t\t// Check to see if our name already exists.\n\t\t\t\tthis.checkName( value, optionModel );\n\t\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\t} else if( 'eq' == id ) { // We're editing the eq\n\t\t\t\t// Check to see if there are any calcs referenced in our eq\n\t\t\t\tthis.checkEQ( value, optionModel );\n\t\t\t} else if( 'dec' == id ) { // We're editing the dec\n                // Check to see that we have a non-negative integer\n                this.checkDec( value, optionModel );\n            }\n\t\t},\n\n\t\tupdateCalc: function( optionModel ) {\n\t\t\tthis.checkName( optionModel.get( 'name' ), optionModel, false );\n\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\n\t\t\tthis.checkDec( optionModel.get( 'dec' ), optionModel );\n\n\t\t\tBackbone.Radio.channel( 'calcs' ).trigger( 'update:calc', optionModel );\n\t\t},\n\n\t\tsortCalc: function( optionModel, setting ) {\n\t\t\tthis.checkAllCalcs( setting.collection );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if a calc name exists.\n\t\t * \n\t\t * @since  3.0\n\t\t * @param  string \t\t\tname        calc name to check\n\t\t * @param  backbone.model \toptionModel \n\t\t * @return void\n\t\t */\n\t\tcheckName: function( name, optionModel, silent ) {\n\t\t\tsilent = silent || true;\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t// Search our calc collection for our name\n\t\t\tvar found = optionModel.collection.where( { name: String(name).trim() } );\n\n\t\t\t// If the name that was passed is the same as our current name, return false.\n\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\tfound = [];\n\t\t\t}\n\n\t\t\t// If our name exists, add an errors to the option model\n\t\t\tif ( 0 != found.length ) {\n\t\t\t\terrors.nameExists = 'Calculation names must be unique. Please enter another name.';\n\t\t\t} else {\n\t\t\t\tvar oldName = optionModel.get( 'name' );\n\t\t\t\toptionModel.set( 'name', name, { silent: silent } );\n\t\t\t\tnfRadio.channel( 'calcs' ).trigger( 'update:calcName', optionModel, oldName );\n\t\t\t\tdelete errors.nameExists;\n\t\t\t}\n\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\t\t},\n\n\t\t/**\n\t\t * Check to see if an eq contains a reference to a calc at a lower priority.\n\t\t *\n\t\t * @since  3.0\n\t\t * @param  string \t\t\teq          our equation\n\t\t * @param  backbone.model \toptionModel\n\t\t * @return void\n\t\t */\n\t\tcheckEQ: function( eq, optionModel ) {\n\t\t\t// Get any current errors on our optionModel\n\t\t\tvar errors = optionModel.get( 'errors' );\n\t\t\t/*\n\t\t\t * We're looking for two errors:\n\t\t\t * - Calculations that are below the current one can't be processed.\n\t\t\t * - Calculations can't refer to themselves.\n\t\t\t */ \n\t\t\tvar errorSelfRef = false;\n\t\t\tvar errorFutureCalc = false;\n\t\t\t// Regex that searches for {calc:key}\n\t\t\tvar calcs = eq.match( new RegExp( /{calc:(.*?)}/g ) );\n\t\t\t/*\n\t\t\t * Calcs will be an array like:\n\t\t\t * ['{calc:test}'], ['{calc:another}']\n\t\t\t * \n\t\t\t * If we have any calcs in the eq, loop through them and search for the errors.\n\t\t\t */\n\t\t\tif ( calcs ) {\n\t\t\t\tvar calculations = optionModel.collection;\n\t\t\t\t// Maps a function to each item in our calcs array.\n\t\t\t\tcalcs = calcs.map( function( calc ) {\n\t\t\t\t\t// calc will be {calc:name}\n\t\t\t\t\tvar name = calc.replace( '}', '' ).replace( '{calc:', '' );\n\t\t\t\t\t// Get our optionModel from our calculations collection.\n\t\t\t\t\tvar targetCalc = calculations.findWhere( { name: name } );\n\t\t\t\t\tif ( name == optionModel.get( 'name' ) ) {\n\t\t\t\t\t\t// If we already have a calc with this name, set an error.\n\t\t\t\t\t\terrors.selfRef = 'A calculation can\\'t reference itself!';\n\t\t\t\t\t\terrorSelfRef = true;\n\t\t\t\t\t} else if ( targetCalc && targetCalc.get( 'order' ) > optionModel.get( 'order' ) ) {\n\t\t\t\t\t\t// If the calc is after this one, set an error. \n\t\t\t\t\t\terrorFutureCalc = true;\n\t\t\t\t\t\terrors.futureCalc = 'Can\\'t reference a future calculation!';\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// If we didn't find any self ref errors, remove the key.\n\t\t\tif ( ! errorSelfRef ) {\n\t\t\t\tdelete errors.selfRef;\n\t\t\t}\n\n\t\t\t// If we didn't find any future calc errors, remove the key.\n\t\t\tif ( ! errorFutureCalc ) {\n\t\t\t\tdelete errors.futureCalc;\n\t\t\t}\n\n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n\n\t\t},\n\n        /**\n         * Ceck to see if a dec is an integer value.\n         * \n         * @since 3.1\n         * @param string            dec         our decimal value\n         * @param backbone.model    optionModel\n         * @return void\n         */\n        checkDec: function( dec, optionModel ) {\n            // If dec isn't defined, bail...\n            if( 'undefined' === typeof(dec) ) return false;\n\t\t\t// Get our current errors, if any.\n\t\t\tvar errors = optionModel.get( 'errors' );\n            /**\n             * We're looking for one error:\n             * - dec is not a non-negative integer.\n             */\n            var errorNonIntDec = false;\n            \n            // Get our target value and see if it matches what we got.\n            var checked = Math.abs( parseInt( String(dec).trim() ) );\n            if ( String(dec).trim() !== '' && checked.toString() !== String(dec).trim() ) {\n                errorNonIntDec = true;\n                errors.nonIntDec = 'Decimals must be a non-negative integer!';\n            }\n            \n            // If our dec value is a non-negative integer.\n            if ( ! errorNonIntDec ) {\n                delete errors.nonIntDec;\n            }\n            \n\t\t\t// Set errors and trigger our optionModel change.\n\t\t\toptionModel.set( 'errors', errors );\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\n            \n        },\n        \n\t\tcheckAllCalcs: function( collection ) {\n\t\t\tvar that = this;\n\t\t\tcollection.models.map( function( opt ) {\n\t\t\t\tthat.checkName( opt.get( 'name' ), opt );\n\t\t\t\tthat.checkEQ( opt.get( 'eq' ), opt );\n                that.checkDec( opt.get( 'dec' ), opt );\n\t\t\t} );\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n\n","/**\n * Loads all of our controllers using Require JS.\n * \n * @package Ninja Forms builder\n * @subpackage Fields\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine(\n\t'controllers/loadControllers',[\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\t'controllers/app/remote',\n\t\t'controllers/app/drawer',\n\t\t'controllers/app/drawerConfig',\n\t\t'controllers/app/domainConfig',\n\t\t'controllers/app/data',\t\t\n\t\t'controllers/app/drawerToggleSettingGroup',\n\t\t'controllers/app/updateDB',\n\t\t'controllers/app/formData',\n\t\t'controllers/app/previewLink',\n\t\t'controllers/app/menuButtons',\n\t\t'controllers/app/trackChanges',\n\t\t'controllers/app/undoChanges',\n\t\t'controllers/app/publishResponse',\n\t\t'controllers/app/changeDomain',\n\t\t'controllers/app/pushstate',\n\t\t'controllers/app/hotkeys',\n\t\t'controllers/app/cleanState',\n\t\t'controllers/app/coreUndo',\n\t\t'controllers/app/cloneModelDeep',\n\t\t'controllers/app/getSettingChildView',\n\t\t'controllers/app/changeSettingDefault',\n\t\t'controllers/app/fieldset',\n\t\t'controllers/app/textboxSetting',\n\t\t'controllers/app/toggleSetting',\n\t\t'controllers/app/buttonToggleSetting',\n\t\t'controllers/app/numberSetting',\n\t\t'controllers/app/radioSetting',\n\t\t'controllers/app/itemControls',\n\t\t'controllers/app/mergeTags',\n\t\t'controllers/app/mergeTagBox',\n\t\t'controllers/app/itemSettingFill',\n\t\t'controllers/app/confirmPublish',\n\t\t'controllers/app/rte',\n\t\t'controllers/app/settingFieldSelect',\n\t\t'controllers/app/settingFieldList',\n\t\t'controllers/app/settingHTML',\n\t\t'controllers/app/settingColor',\n\t\t'controllers/app/changeMenu',\n\t\t'controllers/app/mobile',\n\t\t'controllers/app/notices',\n\t\t'controllers/app/unloadCheck',\n\t\t'controllers/app/formContentFilters',\n\t\t'controllers/app/formContentGutterFilters',\n\t\t'controllers/app/cloneCollectionDeep',\n\t\t'controllers/app/trackKeyDown',\n\t\t'controllers/app/perfectScroll',\n\t\t'controllers/app/getNewSettingGroupCollection',\n\t\t'controllers/app/settingMedia',\n\t\t'controllers/app/publicLink',\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\t'controllers/fields/types',\n\t\t'controllers/fields/fieldTypeDrag',\n\t\t'controllers/fields/stagingDrag',\n\t\t'controllers/fields/staging',\n\t\t'controllers/fields/stagingSortable',\n\t\t'controllers/fields/filterTypes',\n\t\t'controllers/fields/sortable',\n\t\t'controllers/fields/data',\n\t\t'controllers/app/optionRepeater',\n\t\t'controllers/app/imageOptionRepeater',\n\t\t'controllers/fields/editActive',\n\t\t'controllers/fields/fieldSettings',\n\t\t'controllers/fields/fieldCreditCard',\n\t\t'controllers/fields/fieldList',\n\t\t'controllers/fields/fieldPassword',\n\t\t'controllers/fields/fieldQuantity',\n\t\t'controllers/fields/fieldShipping',\n\t\t'controllers/fields/key',\n\t\t'controllers/fields/notices',\n\t\t'controllers/fields/mobile',\n\t\t'controllers/fields/savedFields',\n\t\t'controllers/fields/fieldDatepicker',\n\t\t'controllers/fields/fieldDisplayCalc',\n\t\t'controllers/fields/fieldRepeater',\n\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\t'controllers/actions/types',\n\t\t'controllers/actions/data',\n\t\t'controllers/actions/actionSettings',\n\t\t'controllers/actions/editActive',\n\t\t'controllers/actions/emailFromSetting',\n\t\t'controllers/actions/addActionTypes',\n\t\t'controllers/actions/typeDrag',\n\t\t'controllers/actions/droppable',\n\t\t'controllers/actions/filterTypes',\n\t\t'controllers/actions/newsletterList',\n\t\t'controllers/actions/deleteFieldListener',\n\t\t'controllers/actions/collectPaymentFields',\n\t\t'controllers/actions/collectPaymentCalculations',\n\t\t'controllers/actions/collectPaymentFixed',\n\t\t'controllers/actions/collectPayment',\n\t\t'controllers/actions/save',\n\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\t'controllers/advanced/types',\n\t\t'controllers/advanced/data',\n\t\t'controllers/advanced/formSettings',\n\t\t'controllers/advanced/editActive',\n\t\t'controllers/advanced/clickEdit',\n\t\t'controllers/advanced/calculations'\n\t],\n\tfunction(\n\t\t/*\n\t\t * Application controllers\n\t\t */\n\t\tRemote,\n\t\tDrawer,\n\t\tDrawerConfig,\n\t\tDomainConfig,\n\t\tAppData,\n\t\tDrawerToggleSettingGroup,\n\t\tUpdateDB,\n\t\tFormData,\n\t\tPreviewLink,\n\t\tAppMenuButtons,\n\t\tAppTrackChanges,\n\t\tAppUndoChanges,\n\t\tAppPublishResponse,\n\t\tAppChangeDomain,\n\t\tPushstate,\n\t\tHotkeys,\n\t\tCleanState,\n\t\tCoreUndo,\n\t\tCloneModelDeep,\n\t\tDrawerSettingChildView,\n\t\tChangeSettingDefault,\n\t\tFieldset,\n\t\tTextboxSetting,\n\t\tToggleSetting,\n\t\tButtonToggleSetting,\n\t\tNumberSetting,\n\t\tRadioSetting,\n\t\tItemControls,\n\t\tMergeTags,\n\t\tMergeTagsBox,\n\t\tItemSettingFill,\n\t\tConfirmPublish,\n\t\tRTE,\n\t\tSettingFieldSelect,\n\t\tSettingFieldList,\n\t\tSettingHTML,\n\t\tSettingColor,\n\t\tChangeMenu,\n\t\tAppMobile,\n\t\tAppNotices,\n\t\tAppUnloadCheck,\n\t\tFormContentFilters,\n\t\tFormContentGutterFilters,\n\t\tCloneCollectionDeep,\n\t\tTrackKeyDown,\n\t\tPerfectScroll,\n\t\tGetNewSettingGroupCollection,\n\t\tSettingMedia,\n\t\tPublicLink,\n\t\t/*\n\t\t * Fields domain controllers\n\t\t */\n\t\tFieldTypes,\n\t\tFieldTypeDrag,\n\t\tFieldStagingDrag,\n\t\tStagedFieldsData,\n\t\tStagedFieldsSortable,\n\t\tDrawerFilterFieldTypes,\n\t\tMainContentFieldsSortable,\n\t\tFieldData,\n\t\tOptionRepeater,\n\t\timageOptionRepeater,\n\t\tFieldsEditActive,\n\t\tFieldSettings,\n\t\tFieldCreditCard,\n\t\tFieldList,\n\t\tFieldPassword,\n\t\tFieldQuantity,\n\t\tFieldShipping,\n\t\tFieldKey,\n\t\tNotices,\n\t\tFieldsMobile,\n\t\tSavedFields,\n\t\tFieldDatepicker,\n\t\tFieldDisplayCalc,\n\t\tFieldRepeater,\n\t\t/*\n\t\t * TODO: Actions domain controllers\n\t\t */\n\t\tActionTypes,\n\t\tActionData,\n\t\tActionSettings,\n\t\tActionEditActive,\n\t\tActionEmailFromSetting,\n\t\tActionAddTypes,\n\t\tActionTypeDrag,\n\t\tActionDroppable,\n\t\tActionFilterTypes,\n\t\tActionNewsletterList,\n\t\tActionDeleteFieldListener,\n\t\tActionCollectPaymentFields,\n\t\tActionCollectPaymentCalculations,\n\t\tActionCollectPaymentFixed,\n\t\tActionCollectPayment,\n\t\tActionSave,\n\n\t\t/*\n\t\t * TODO: Settings domain controllers\n\t\t */\n\t\tSettingTypes,\n\t\tSettingData,\n\t\tFormSettings,\n\t\tSettingsEditActive,\n\t\tSettingsClickEdit,\n\t\tAdvancedCalculations\n\t\t\n\t) {\n\t\tvar controller = Marionette.Object.extend( {\n\t\t\tinitialize: function() {\n\t\t\t\t/*\n\t\t\t\t * Application controllers\n\t\t\t\t */\n\t\t\t\tnew FormContentFilters();\n\t\t\t\tnew FormContentGutterFilters();\n\t\t\t\tnew Hotkeys();\n\t\t\t\tnew Remote();\n\t\t\t\tnew Drawer();\n\t\t\t\tnew DrawerConfig();\n\t\t\t\tnew DomainConfig();\n\t\t\t\tnew DrawerToggleSettingGroup();\n\t\t\t\tnew PreviewLink();\n\t\t\t\tnew AppMenuButtons();\n\t\t\t\tnew AppTrackChanges();\n\t\t\t\tnew AppUndoChanges();\n\t\t\t\tnew AppPublishResponse();\n\t\t\t\tnew AppChangeDomain();\n\t\t\t\tnew CleanState();\n\t\t\t\tnew CoreUndo();\n\t\t\t\tnew CloneModelDeep();\n\t\t\t\tnew ItemControls();\n\t\t\t\tnew ConfirmPublish();\n\t\t\t\tnew RTE();\n\t\t\t\tnew SettingFieldSelect();\n\t\t\t\tnew SettingFieldList();\n\t\t\t\tnew SettingHTML();\n\t\t\t\tnew SettingColor();\n\t\t\t\tnew SettingMedia();\n\t\t\t\tnew ChangeMenu();\n\t\t\t\tnew AppMobile();\n\t\t\t\tnew AppNotices();\n\t\t\t\tnew AppUnloadCheck();\n\t\t\t\tnew UpdateDB();\n\t\t\t\tnew CloneCollectionDeep();\n\t\t\t\tnew TrackKeyDown();\n\t\t\t\tnew PerfectScroll();\n\t\t\t\tnew GetNewSettingGroupCollection();\n\t\t\t\tnew PublicLink();\n\t\t\t\t// new Pushstate();\n\t\t\t\t/*\n\t\t\t\t * Fields domain controllers\n\t\t\t\t * \n\t\t\t\t * Field-specific controllers should be loaded before our field type controller.\n\t\t\t\t * This ensures that any 'init' hooks are properly registered.\n\t\t\t\t */\n\t\t\t\tnew Fieldset();\n\t\t\t\tnew OptionRepeater();\n\t\t\t\tnew imageOptionRepeater();\n\t\t\t\tnew FieldTypes();\n\t\t\t\tnew FieldTypeDrag();\n\t\t\t\tnew FieldStagingDrag();\n\t\t\t\tnew StagedFieldsData();\n\t\t\t\tnew StagedFieldsSortable();\n\t\t\t\tnew DrawerFilterFieldTypes();\n\t\t\t\tnew MainContentFieldsSortable();\n\t\t\t\tnew ChangeSettingDefault();\n\t\t\t\tnew TextboxSetting(),\n\t\t\t\tnew ToggleSetting();\n\t\t\t\tnew ButtonToggleSetting();\n\t\t\t\tnew NumberSetting();\n\t\t\t\tnew RadioSetting();\n\t\t\t\tnew DrawerSettingChildView();\n\t\t\t\tnew FieldsEditActive();\n\t\t\t\tnew FieldSettings();\n\t\t\t\tnew FieldCreditCard();\n\t\t\t\tnew FieldList();\n\t\t\t\tnew FieldPassword;\n\t\t\t\tnew FieldQuantity();\n\t\t\t\tnew FieldShipping();\n\t\t\t\tnew FieldKey();\n\t\t\t\tnew Notices();\n\t\t\t\tnew FieldsMobile();\n\t\t\t\tnew SavedFields();\n\t\t\t\tnew FieldDatepicker();\n\t\t\t\tnew FieldDisplayCalc();\n\t\t\t\tnew FieldRepeater();\n\t\t\t\t/*\n\t\t\t\t * TODO: Actions domain controllers\n\t\t\t\t */\n\t\t\t\tnew ActionNewsletterList();\n\t\t\t\tnew ActionDeleteFieldListener();\n\t\t\t\tnew ActionCollectPaymentCalculations();\n\t\t\t\tnew ActionCollectPayment();\n\t\t\t\tnew ActionSave();\n\t\t\t\tnew ActionTypes();\n\t\t\t\tnew ActionData();\n\t\t\t\tnew ActionSettings();\n\t\t\t\tnew ActionEditActive();\n\t\t\t\tnew ActionEmailFromSetting();\n\t\t\t\tnew ActionAddTypes();\n\t\t\t\tnew ActionTypeDrag();\n\t\t\t\tnew ActionDroppable();\n\t\t\t\tnew ActionFilterTypes();\n\t\t\t\tnew ActionCollectPaymentFields();\n\t\t\t\tnew ActionCollectPaymentFixed();\n\n\t\t\t\t/*\n\t\t\t\t * TODO: Settings domain controllers\n\t\t\t\t */\n\t\t\t\tnew SettingTypes();\n\t\t\t\tnew FormSettings();\n\t\t\t\tnew AdvancedCalculations();\n\t\t\t\tnew SettingData();\n\t\t\t\tnew SettingsEditActive();\n\t\t\t\tnew SettingsClickEdit();\n\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Data controllers need to be set after every other controller has been setup, even if they aren't domain-specific.\n\t\t\t\t * AppData() was after FormData();\n\t\t\t\t */\n\t\t\t\tnew AppData();\n\t\t\t\tnew FieldData();\n\t\t\t\tnew FormData();\n\t\t\t\tnew MergeTags();\n\t\t\t\tnew MergeTagsBox();\n\t\t\t\tnew ItemSettingFill();\n\t\t\t}\n\t\t});\n\n\t\treturn controller;\n} );\n\n","define( 'views/fields/mainContentEmpty',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-main-content-fields-empty',\n\n\t\tonBeforeDestroy: function() {\n\t\t\tjQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\n\t\t},\n\n\t\tonRender: function() {\n\t\t\tthis.$el = this.$el.children();\n\t\t\tthis.$el.unwrap();\n\t\t\tthis.setElement( this.$el );\n\t\t},\n\n\t\tonShow: function() {\n\t\t\tif ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\n\t\t\t\tjQuery( this.el ).parent().sortable( 'destroy' );\n\t\t\t}\n\t\t\tjQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\n\t\t\tjQuery( this.el ).parent().droppable( {\n\t\t\t\taccept: function( draggable ) {\n\t\t\t\t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tactiveClass: 'nf-droppable-active',\n\t\t\t\thoverClass: 'nf-droppable-hover',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tover: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tout: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\n\t\t\t\t},\n\t\t\t\tdrop: function( e, ui ) {\n\t\t\t\t\tui.item = ui.draggable;\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\n\t\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\n\t\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\n\t\t\t\t},\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn view;\n} );\n","/**\n * Renders our form title.\n *\n * @package Ninja Forms builder\n * @subpackage App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/app/formTitle',[], function() {\n\tvar view = Marionette.ItemView.extend({\n\t\ttagName: 'div',\n\t\ttemplate: '#tmpl-nf-header-form-title',\n\n\t\tinitialize: function() {\n\t\t\t// When we change the model (to disable it, for example), re-render.\n\t\t\tthis.model.on( 'change:title', this.render, this );\n\t\t},\n\n\t\t/**\n\t\t * These functions are available to templates, and help us to remove logic from template files.\n\t\t * \n\t\t * @since  3.0\n\t\t * @return Object\n\t\t */\n\t\ttemplateHelpers: function() {\n\t\t\tvar that = this;\n\t    \treturn {\n\t    \t\trenderTitle: function(){\n\t    \t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\n\t    \t\t\treturn _.escape( formData.get( 'settings' ).get( 'title' ) );\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t});\n\n\treturn view;\n} );\n","/**\n * Return views that might be used in extensions.\n * These are un-instantiated views.\n * \n * @package Ninja Forms builder\n * @subpackage Main App\n * @copyright (c) 2015 WP Ninjas\n * @since 3.0\n */\ndefine( 'views/loadViews',[ 'views/fields/fieldItem', 'views/fields/mainContentEmpty', 'views/app/formTitle' ], function( fieldItemView, mainContentEmptyView, FormTitleView ) {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\t// Reply to requests for our field item view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:fieldItem', this.getFieldItem );\n\t\t\n\t\t\t// Reply to requests for our empty content view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:mainContentEmpty', this.getMainContentEmpty );\n\t\t\n\t\t\t// Reply to requests for our form title view.\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:formTitle', this.getFormTitle );\n\t\t},\n\n\t\tgetFieldItem: function( model ) {\n\t\t\treturn fieldItemView;\n\t\t},\n\n\t\tgetMainContentEmpty: function() {\n\t\t\treturn mainContentEmptyView;\n\t\t},\n\n\t\tgetFormTitle: function() {\n\t\t\treturn FormTitleView;\n\t\t}\n\n\t});\n\n\treturn controller;\n} );\n","var nfRadio = Backbone.Radio;\n/** \n * Inline data converted to globally available vars sent via wp_localize_script\n * We keep them globally accessible for backwards compatibility, \n * we may want to remove them from global scope and communicate about that breaking change in the future\n **/\nwindow.actionSettings = nfDashInlineVars.actionSettings;\nwindow.preloadedFormData = nfDashInlineVars.preloadedFormData;\nwindow.actionTypeData = nfDashInlineVars.actionTypeData;\nwindow.formSettings = nfDashInlineVars.formSettings;\nwindow.formSettingTypeData = nfDashInlineVars.formSettingTypeData;\nwindow.mergeTags = nfDashInlineVars.mergeTags;\nwindow.fieldTypeData = nfDashInlineVars.fieldTypeData;\nwindow.fieldSettings = nfDashInlineVars.fieldSettings;\nwindow.fieldTypeSections = nfDashInlineVars.fieldTypeSections;\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n\trequire( ['views/app/builder', 'controllers/loadControllers', 'views/loadViews'], function( BuilderView, LoadControllers, LoadViews ) {\n\n\t\tvar NinjaForms = Marionette.Application.extend( {\n\n\t\t\tinitialize: function( options ) {\n\n\t\t\t\tvar that = this;\n\t\t\t\tMarionette.Renderer.render = function(template, data){\n\t\t\t\t\tvar template = that.template( template );\n\t\t\t\t\treturn template( data );\n\t\t\t\t};\n\n\t\t\t\t// Trigger an event before we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadControllers', this );\n\t\t\t\t// Load our controllers.\n\t\t\t\tvar loadControllers = new LoadControllers();\n\t\t\t\t// Trigger an event after we load our controllers.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadControllers', this );\n\n\t\t\t\t// Trigger an event before we load un-instantiated views\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadViews', this );\n\t\t\t\tvar loadViews = new LoadViews();\n\t\t\t\t// Trigger an event after we load un-instantiated views.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadViews', this );\n\n\t\t\t\tnfRadio.channel( 'app' ).reply( 'get:template', this.template );\n\t\t\t},\n\n\t\t\tonStart: function() {\n\t\t\t\tvar builderView = new BuilderView();\n\t\t\t\t// Trigger our after start event.\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:appStart', this );\n\n\t\t\t\t/*\n\t\t\t\t * If we're on the new forms builder, open the add fields drawer.\n\t\t\t\t */\n\t\t\t\tif ( 0 == nfAdmin.formID ) {\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Onboarding hooks\n\t\t\t\t */\n\t\t\t\tif ('function' == typeof(NinjaOnboarding)) {\n\t\t\t\t\twindow.nfOB = new NinjaOnboarding();\n\t\t\t\t\tnfOB.step(parseInt(nfAdmin.onboardingStep));\n\t\t\t\t\tthis.listenTo(nfRadio.channel('app'), 'change:clean', function(isClean) {\n\t\t\t\t\t\tnfOB.cleanChanged(isClean);\n\t\t\t\t\t});\n\t\t\t\t\tthis.listenTo(nfRadio.channel('drawer'), 'closed', function() {\n\t\t\t\t\t\tnfOB.drawerClosed()\n\t\t\t\t\t});\n\t\t\t\t\tthis.listenTo(nfRadio.channel('drawer'), 'opened', function() {\n\t\t\t\t\t\tnfOB.drawerOpened()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\ttemplate: function( template ) {\n\t\t\t\tif (!template.startsWith('script')) {\n\t\t\t\t\ttemplate = 'script'+template;\n\t\t\t\t}\n\t\t\t\treturn _.template( jQuery( template ).html(),  {\n\t\t\t\t\tevaluate:    /<#([\\s\\S]+?)#>/g,\n\t\t\t\t\tinterpolate: /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}/g,\n\t\t\t\t\tescape:      /\\{\\{([^\\}]+?)\\}\\}(?!\\})/g,\n\t\t\t\t\tvariable:    'data'\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t\n\t\tvar ninjaForms = new NinjaForms();\n\t\tninjaForms.start();\n\t} );\n} );\ndefine(\"main\", function(){});\n\n"]}

Youez - 2016 - github.com/yon3zu
LinuXploit