AlkantarClanX12
Your IP : 216.73.216.59
{"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","attributes","itemControls","maybeDeactivate","click","maybeClickEdit","changeToggle","renderToggle","settingName","actionLabel","actionView","droppable","accept","hoverClass","drop","updateActiveClass","editActive","settingItem","objectDomain","order","idAttribute","fieldType","parentType","listimageGet","listimageSet","updateFieldKey","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","updateLabel","replaceFieldKey","initMergeTags","mergeTagsView","jBoxes","maxHeight","onOpen","prev","onClose","tagModel","currentValue","newPos","currentPos","caret","substr","nfCurrentCodeMirror","cm","caretPos","replaceStart","posFromIndex","replaceEnd","replaceRange","setCursor","nfCurrentQuillInstance","quill","replaceIndex","deleteText","insertText","setSelection","calcTag","getFieldKeyFormatCalc","optionModel","calc","openMergeTags","returnMergeTags","preventDefault","currentModel","upMergeTags","changeActiveTag","downMergeTags","dir","inc","currentIndex","nextModel","userInfo","system","updateOpen","targetTag","oldTag","fieldMergeTag","newKey","newLabel","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","quillInstance","root","quillSelection","getSelection","layout","tagCollection","mergeTagListView","mergeTagGroupListView","rteEditor","closest","posY","outerHeight","tagBoxY","windowHeight","innerHeight","tagBoxHeight","boxHeight","repeaterRow","scrollLeft","posX","newCursorIndex","replaceLength","quillText","getText","cursorPos","$input","str","patt","exec","string","$this","$toolbar","$settingContainer","$quillContainer","$settingEl","quillEl","__quill","insertIndex","range","Math","max","getLength","$inputSetting","autocomplete","$overlayElement","rteContainer","$eventTarget","dataID","indexFromPos","getCursor","getValue","mergetags","mergetag","confirmPublish","initSettingModel","destroySetting","meta_image_frame","currentContext","quillInstances","registerStyleAttributors","Quill","Parchment","import","_nfStyleAttributorsRegistered","attributor","StyleAttributor","scope","Scope","BLOCK","register","INLINE","textAlignAttributor","whitelist","Block","DivBlot","create","super","blotName","QuillBlotFormatter","default","Container","NfListItem","formats","domNode","statics","NfOrderedList","NfBulletList","allowedChildren","requiredContainer","ScrollBlot","Inline","NfSpan","class","hasAttribute","filtered","c","startsWith","patchTableRowCheckMerge","TableRow","_nfCheckMergePatched","originalCheckMerge","checkMerge","head","tail","initRTE","settingEl","instanceId","now","random","quillContainer","requestAnimationFrame","initQuillInstance","containerEl","modules","toolbar","container","list","align","table","showLinkDialog","removeLink","openMediaManager","showMergeTags","toggleCodeView","undo","redo","showTablePicker","delay","maxStack","userOnly","blotFormatter","clipboard","addMatcher","delta","wrapper","cloneNode","sanitized","normalizeTableHtml","convert","initialValue","hasLegacyTable","hasLegacyTables","_nfOriginalHtml","_nfUserHasEdited","_nfSkipNextTextChange","_nfSkipNextMergeTagDetection","processedHtml","prepareHtmlForQuill","showLegacyTableNotice","addDashicons","settingContainer","cursor","line","ch","charOffset","getWrapperElement","oldDelta","source","currentHtml","originalHtml","updateDataModel","oldRange","mergeTagBoxLastShown","totalInsertLength","ops","op","insert","isBulkInsert","is","showTableContextMenu","quillHtml","hasUnsupported","hasUnsupportedHtml","normalizedOriginal","hasDegradation","hasHtmlDegradation","showCodeViewNotice","mergeButton","lastFormatsGroup","last","sanitizeQuillHtml","normalizeQuillLists","temp","querySelectorAll","ul","ol","li","firstChild","replaceChild","listItems","allBullet","hasBullet","removeAttribute","removeRTE","dropdownHtml","linkDropdown","existingDropdown","dropdown","insertLink","ev","linkText","linkUrl","newWindow","link","formatText","wp","media","frames","media_attachment","state","toJSON","insertMedia","insertEmbed","filename","original","quillOutput","unsupportedPatterns","origText","notice","quillCodeViewAutoSwitch","dismiss","prepend","htmlOverride","code","codeMirror","normalized","removeData","sanitizedHtml","textarea","CodeMirror","fromTextArea","mode","lineNumbers","lineWrapping","viewportMargin","Infinity","setSize","tmp","tds","tableLegacyNotice","tableLegacyConvert","slideUp","tableElements","childNodes","nodeType","removeChild","tables","tbody","querySelector","orphanTds","tr","firstOrphan","insertBefore","allTrs","ths","td","a","rows","isThead","directTrs","k","unsupported","trs","cells","existingRowId","needsId","rowId","existingPicker","wasOurs","picker","tableInsertTable","gridHtml","r","gridCells","row","dataset","col","toggle","cols","tableModule","getModule","insertTable","cell","targetRow","targetCol","min","menuItems","tableInsertRowAbove","tableInsertRowBelow","separator","tableInsertColumnLeft","tableInsertColumnRight","tableDeleteRow","tableDeleteColumn","tableDeleteTable","menuItem","clientX","clientY","items","focused","idx","eq","textEl","urlEl","isNewWindowEl","isNewWindow","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","setupResizeListener","resizeTimer","addNotice","closeNotice","notices","appDefaults","constructOnInit","stack","animation","close","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","typeSectionModel","TypeCollection","SectionCollection","fieldTypeSections","registerSection","fieldTypeData","getFieldType","getTypeCollection","getTypeSections","getSavedFields","shiftKey","startDrag","stopDrag","getCurrentDraggableHelperClone","setProperty","draggableHelperClone","stagedFields","num","addStagedField","getStagingCollection","sortStagedFields","clearStagedFields","beforeCloseDrawer","tmpField","sortableEl","pos","receiveStagedFields","overStagedFields","outStagedFields","startStagedFields","stopStagedFields","addActiveClass","stagedFieldsEl","removeActiveClass","currentHelper","helperClone","hiddenFields","addHiddenFieldTypes","filterCollection","found","alias","convertDateFormat","dateFormat","moment","locale","locales","defineLocale","months","monthsShort","weekdays","weekdaysShort","weekdaysMin","maybeFilterHTML","filter_esc_status","renderPlaceholder","disable_input","maybeRequired","maybeInputLimit","maybeDisableAutocomplete","disable_browser_autocomplete","custom_autocomplete","maybeChecked","default_value","renderOptions","optionLabel","taxonomy","taxonomyTerms","typeData","settingGroup","enabledTaxonomyTerms","attribute","reduce","enabledTaxonomyTerm","terms","checked","defaultValue","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","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","headerText","headerContainer","renderFieldsetClasses","currency_symbol","limit","clickAddOption","trimLeft","trimRight","lines","slugify","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","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","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","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","evaluate","interpolate","variable"],"mappings":"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CA,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,qCAEA,SAIAuvD,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,OAzHAxvD,WAAAlF,OAAAoF,OAAA,CACAG,WAAA,WAIA,IAAA8rD,EACA,IAAAC,EACA,IAAA3B,EACA,IAAAf,EACA,IAAAC,EACA,IAAAC,EACA,IAAAC,EACA,IAAAE,EACA,IAAA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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\" data-testid=\"nf-merge-tag-picker-' + this.name + '\"></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\tattributes: function() {\n\t\t\treturn {\n\t\t\t\t'data-testid': 'nf-action-row-' + this.model.get('id'),\n\t\t\t\t'data-qa-id': this.model.get('qaId')\n\t\t\t};\n\t\t},\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// When we edit a label, update the merge tag label.\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-label' ), 'update:setting', this.updateLabel );\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\tif( window.nfCurrentCodeMirror ) {\n\t\t\t\t\tvar cm = window.nfCurrentCodeMirror;\n\t\t\t\t\tvar tag = tagModel.get( 'tag' );\n\t\t\t\t\tvar find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\n\t\t\t\t\tvar caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\n\t\t\t\t\tvar replaceStart = cm.posFromIndex(caretPos - find.length);\n\t\t\t\t\tvar replaceEnd = cm.posFromIndex(caretPos);\n\t\t\t\t\tcm.replaceRange(tag, replaceStart, replaceEnd);\n\t\t\t\t\tcm.setCursor(cm.posFromIndex(caretPos - find.length + tag.length));\n\t\t\t\t\tcm.focus();\n\t\t\t\t\twindow.nfCurrentCodeMirror = null;\n\t\t\t\t} else if( window.nfCurrentQuillInstance ) {\n\t\t\t\t\tvar quill = window.nfCurrentQuillInstance;\n\t\t\t\t\tvar tag = tagModel.get( 'tag' );\n\t\t\t\t\tvar find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\n\t\t\t\t\tvar caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\n\t\t\t\t\tvar replaceIndex = caretPos - 1;\n\t\t\t\t\tquill.deleteText( replaceIndex, find.length );\n\t\t\t\t\tquill.insertText( replaceIndex, tag );\n\t\t\t\t\tquill.setSelection( replaceIndex + tag.length );\n\t\t\t\t\twindow.nfCurrentQuillInstance = null;\n\t\t\t\t}\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 ) );\n\t\t\t}\n\n\t\t},\n\n\t\tupdateLabel: function( fieldModel ) {\n\t\t\tvar newLabel = fieldModel.get( 'label' );\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( 'label', newLabel );\n\t\t\t}\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 /* QUILL */\n this.listenTo( nfRadio.channel( 'quill' ), 'focus', function( settingModel, dataModel, quill ) {\n that.quillInstance = quill;\n that.focusCallback( false, quill.root, 'rte' );\n } );\n this.listenTo( nfRadio.channel( 'quill' ), 'change', function( settingModel, dataModel, value ){\n // Save current selection for merge tag insertion\n if( that.quillInstance ) {\n that.quillSelection = that.quillInstance.getSelection();\n }\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( '.ql-toolbar .merge-tags, .ql-nf-merge-tags' ).off( 'click' );\n jQuery( '.ql-toolbar .merge-tags, .ql-nf-merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\n jQuery( '.ql-toolbar .merge-tags, .ql-nf-merge-tags' ).off( 'click' );\n jQuery( '.ql-toolbar .merge-tags, .ql-nf-merge-tags' ).on( 'click', this.mergeTagsButtonClick );\n } );\n\n jQuery( document ).on( 'keyup', function( event ){\n if( 27 == event.keyCode ){\n // Only act when the merge tag box is actually visible — otherwise\n // ESC would use stale 'old' state to delete content from Quill (#7884)\n if ( 'none' === jQuery( '#merge-tags-box' ).css( 'display' ) ) return;\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' ).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 this.listenTo( Backbone.Radio.channel( 'fieldSetting-label' ), '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( '.ql-container' );\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 // Clear merge-tag state so a subsequent ESC press in another\n // context can't use stale caret/old values to delete content (#7884).\n this.caret = 0;\n this.old = '';\n window.nfCurrentQuillInstance = null;\n window.nfCurrentCodeMirror = null;\n // jQuery( 'body' ).append( jQuery( '#merge-tags-box' ) );\n },\n\n insertTag: function( tag ) {\n // Check if we're in code view with a CodeMirror instance\n if( window.nfCurrentCodeMirror ) {\n var cm = window.nfCurrentCodeMirror;\n var find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\n var replace = tag;\n var caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\n\n // Replace the partial merge tag text with the full tag\n var replaceStart = cm.posFromIndex(caretPos - find.length);\n var replaceEnd = cm.posFromIndex(caretPos);\n cm.replaceRange(replace, replaceStart, replaceEnd);\n\n // Set cursor after inserted tag\n var newCursorIndex = caretPos - find.length + replace.length;\n cm.setCursor(cm.posFromIndex(newCursorIndex));\n cm.focus();\n\n // Clean up\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n window.nfCurrentCodeMirror = null;\n\n return;\n }\n\n // Check if we have a global Quill instance first (for Quill RTEs)\n if( window.nfCurrentQuillInstance ) {\n var quillInstance = window.nfCurrentQuillInstance;\n var find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\n var replace = tag;\n var caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\n\n // The caret position is right after the { character\n // So the { is at position caretPos - 1\n var replaceIndex = caretPos - 1;\n var replaceLength = find.length;\n\n // Guard against destructive deletes from stale state (#7884).\n // If `find` is empty/missing, or the caret position is invalid,\n // or the text at replaceIndex doesn't actually match `find`,\n // refuse to delete and just close the box. Without these checks\n // an ESC press with leftover state would chew through real\n // content one character at a time.\n var quillText = quillInstance.getText();\n var stateIsValid = (\n typeof find === 'string' && find.length > 0 &&\n replaceIndex >= 0 &&\n replaceIndex + replaceLength <= quillText.length &&\n quillText.substr( replaceIndex, replaceLength ) === find\n );\n\n if ( ! stateIsValid ) {\n // Just close the box and clean up — do NOT mutate content.\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n window.nfCurrentQuillInstance = null;\n return;\n }\n\n quillInstance.deleteText(replaceIndex, replaceLength);\n quillInstance.insertText(replaceIndex, replace);\n\n // Set cursor position after the inserted tag\n var cursorPos = replaceIndex + replace.length;\n quillInstance.setSelection(cursorPos);\n\n // Clean up\n jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\n jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\n jQuery( '#merge-tags-box' ).css( 'display', 'none' );\n nfRadio.channel( 'drawer' ).request( 'enable:close' );\n\n // Clear the global instance\n window.nfCurrentQuillInstance = null;\n\n return;\n }\n\n // Otherwise, use the original logic for regular inputs\n var $input = jQuery( '.merge-tag-focus' );\n\n if( 0 != $input.closest( '.nf-setting' ).first().find( '.ql-editor' ).length ){\n $input = $input.closest( '.nf-setting' ).first().find( '.ql-editor' );\n }\n\n if( 1 < $input.length ){ $input = $input.first(); }\n\n if( $input.hasClass( 'ql-editor' ) ){\n var str = $input.html();\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 $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 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 // Check if this is a button inside a Quill toolbar\n var $toolbar = $this.closest('.ql-toolbar');\n if ( $toolbar.length > 0 ) {\n // This is a Quill toolbar button - find the Quill container\n var $settingContainer = $toolbar.closest('.nf-setting');\n var $quillContainer = $settingContainer.find('.ql-container');\n var $settingEl = $settingContainer.find('.setting');\n\n // Get Quill instance\n var quillInstance = window.nfCurrentQuillInstance;\n if ( !quillInstance ) {\n quillInstance = $settingEl.data('quill');\n }\n if ( !quillInstance ) {\n var quillEl = $quillContainer.find('.ql-editor');\n if ( quillEl.length && quillEl[0].__quill ) {\n quillInstance = quillEl[0].__quill;\n }\n }\n\n if ( quillInstance ) {\n // Store globally for merge tag insertion\n window.nfCurrentQuillInstance = quillInstance;\n\n // Get current selection or insert at end of content\n var range = quillInstance.getSelection();\n var insertIndex;\n if (range) {\n insertIndex = range.index;\n } else {\n // No selection, insert at end\n insertIndex = Math.max(0, quillInstance.getLength() - 1);\n }\n\n // Insert { character\n quillInstance.insertText(insertIndex, '{');\n quillInstance.setSelection(insertIndex + 1);\n\n // Set merge tag system variables\n nfRadio.channel('mergeTags').request('set:caret', insertIndex + 1);\n nfRadio.channel('mergeTags').request('set:old', '{');\n\n // Mark editor as focused\n jQuery(quillInstance.root).addClass('merge-tag-focus');\n\n // Add overlay class\n $settingContainer.find('.ql-container').parent().addClass('merge-tag-focus-overlay');\n\n // Update tag list and show merge tags box\n nfRadio.channel('merge-tags').request('update:taglist', 'fields', false);\n jQuery('#merge-tags-box').css('display', 'block');\n nfRadio.channel('drawer').request('prevent:close');\n\n // Position the merge tag box\n nfRadio.channel('mergeTags').trigger('focus', quillInstance.root, 'rte');\n\n // Focus the search input\n setTimeout(function() {\n jQuery('#merge-tags-box').find('.merge-tag-filter').find('input').focus();\n }, 100);\n\n return;\n }\n }\n\n // Standard merge tag button (not in Quill toolbar)\n var $inputSetting = $this.siblings( '.setting' ).first();\n\n // Check if this is a Quill RTE editor (standard button next to RTE)\n var $quillContainer = $inputSetting.find( '.ql-container' );\n if ( $quillContainer.length > 0 ) {\n // Handle Quill editor with standard button\n var quillInstance = window.nfCurrentQuillInstance;\n if ( !quillInstance ) {\n quillInstance = $inputSetting.data( 'quill' );\n }\n if ( !quillInstance ) {\n var quillEl = $quillContainer.find( '.ql-editor' );\n if ( quillEl.length && quillEl[0].__quill ) {\n quillInstance = quillEl[0].__quill;\n }\n }\n\n if ( quillInstance ) {\n window.nfCurrentQuillInstance = quillInstance;\n\n var range = quillInstance.getSelection();\n var insertIndex = range ? range.index : Math.max(0, quillInstance.getLength() - 1);\n\n quillInstance.insertText(insertIndex, '{');\n quillInstance.setSelection(insertIndex + 1);\n\n nfRadio.channel('mergeTags').request('set:caret', insertIndex + 1);\n nfRadio.channel('mergeTags').request('set:old', '{');\n\n jQuery(quillInstance.root).addClass('merge-tag-focus');\n } else {\n return;\n }\n } else {\n // Handle regular input/textarea\n var text = $inputSetting.val() || '';\n $inputSetting.val( text + '{' ).change();\n nfRadio.channel('mergeTags').request('set:caret', text.length + 1 );\n nfRadio.channel('mergeTags').request('set:old', '{' );\n $inputSetting.addClass( 'merge-tag-focus' );\n }\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( '.ql-container' ).length ){\n $overlayElement.find('.ql-container' ).parent().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( 'ql-editor' ) || jQuery( e.target ).closest( '.ql-container' ).length ) {\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 rteContainer = $this.closest( '.nf-setting' ).find( '.ql-container' );\n if( rteContainer.length && rteContainer.offset() ) {\n var posY = rteContainer.offset().top - jQuery(window).scrollTop();\n var height = rteContainer.outerHeight();\n } else {\n // Fallback if no RTE container found\n var posY = $this.offset().top - jQuery(window).scrollTop();\n var height = $this.outerHeight();\n }\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 rteContainer = $this.closest( '.nf-setting' ).find( '.ql-container' );\n if( rteContainer.length && rteContainer.offset() ) {\n var posX = rteContainer.offset().left - jQuery(window).scrollLeft();\n jQuery( '#merge-tags-box' ).css( 'left', posX );\n jQuery( '#merge-tags-box' ).css( 'width', rteContainer.width() );\n } else {\n // Fallback to settings container\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 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 // Check if this event originated from a Quill editor\n // If so, skip - rte.js handles merge tag detection for Quill via text-change event\n var $eventTarget = jQuery(event.target);\n if ($eventTarget.hasClass('ql-editor') || $eventTarget.closest('.ql-editor').length > 0) {\n return; // Let rte.js handle Quill merge tag detection\n }\n\n // Also skip if the setting contains a Quill editor (event bubbled up)\n var $this = jQuery(this);\n if ($this.find('.ql-editor').length > 0) {\n return; // Let rte.js handle Quill merge tag detection\n }\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 if( 'undefined' != typeof target ) {\n $this = jQuery(target);\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 caretPos = 0;\n if( window.nfCurrentCodeMirror ) {\n caretPos = window.nfCurrentCodeMirror.indexFromPos(window.nfCurrentCodeMirror.getCursor());\n } else if( window.nfCurrentQuillInstance ) {\n var range = window.nfCurrentQuillInstance.getSelection();\n caretPos = range ? range.index : 0;\n }\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 content = '';\n if ( window.nfCurrentCodeMirror ) {\n content = window.nfCurrentCodeMirror.getValue();\n } else if ( window.nfCurrentQuillInstance ) {\n content = window.nfCurrentQuillInstance.root.innerHTML;\n }\n var mergetags = content.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( '.ql-container' ).length ){\n $overlayElement.find('.ql-container' ).parent().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 (Quill)\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\tthis.currentContext = {};\n\t\t\tthis.quillInstances = {}; // Track Quill instances\n\n\t\t\t// Register style attributors so Quill preserves inline styles (margin, padding, etc.)\n\t\t\t// This must be done before any Quill instances are created.\n\t\t\tthis.registerStyleAttributors();\n\t\t},\n\n\t\t/**\n\t\t * Register Parchment StyleAttributors for CSS properties that Quill doesn't\n\t\t * natively support. This allows inline styles like margin and padding to\n\t\t * survive the Delta conversion and remain editable.\n\t\t *\n\t\t * Without this, Quill's Delta architecture discards any style attribute\n\t\t * it doesn't have a registered Attributor for.\n\t\t */\n\t\tregisterStyleAttributors: function() {\n\t\t\tvar that = this;\n\n\t\t\t// Wait for Quill to be available\n\t\t\tif (typeof Quill === 'undefined') {\n\t\t\t\tsetTimeout(function() { that.registerStyleAttributors(); }, 100);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar Parchment = Quill.import('parchment');\n\t\t\tif (!Parchment || Parchment._nfStyleAttributorsRegistered) {\n\t\t\t\treturn; // Already registered or Parchment not available\n\t\t\t}\n\n\t\t\t// CSS properties to preserve through Quill's Delta conversion\n\t\t\tvar styleProps = [\n\t\t\t\t// Margin properties\n\t\t\t\t'margin', 'margin-top', 'margin-bottom', 'margin-left', 'margin-right',\n\t\t\t\t// Padding properties\n\t\t\t\t'padding', 'padding-top', 'padding-bottom', 'padding-left', 'padding-right',\n\t\t\t\t// Other common styling properties\n\t\t\t\t'line-height', 'text-indent'\n\t\t\t];\n\n\t\t\tstyleProps.forEach(function(prop) {\n\t\t\t\t// Create a StyleAttributor for each property\n\t\t\t\t// Scope.BLOCK means it applies to block-level elements (p, h1, etc.)\n\t\t\t\tvar attributor = new Parchment.StyleAttributor(prop, prop, {\n\t\t\t\t\tscope: Parchment.Scope.BLOCK\n\t\t\t\t});\n\t\t\t\tQuill.register(attributor, true);\n\t\t\t});\n\n\t\t\t// Also register inline-level style attributors for spans and inline elements\n\t\t\tvar inlineStyleProps = [\n\t\t\t\t'color', 'background-color', 'font-size', 'font-family'\n\t\t\t];\n\n\t\t\tinlineStyleProps.forEach(function(prop) {\n\t\t\t\tvar attributor = new Parchment.StyleAttributor(prop, prop, {\n\t\t\t\t\tscope: Parchment.Scope.INLINE\n\t\t\t\t});\n\t\t\t\tQuill.register(attributor, true);\n\t\t\t});\n\n\t\t\t// Register text-align as a StyleAttributor so alignment outputs inline styles\n\t\t\t// instead of Quill's default class-based alignment (ql-align-center, etc.)\n\t\t\t// Fixes issue #7923\n\t\t\tvar textAlignAttributor = new Parchment.StyleAttributor('align', 'text-align', {\n\t\t\t\tscope: Parchment.Scope.BLOCK,\n\t\t\t\twhitelist: ['', 'center', 'right', 'justify']\n\t\t\t});\n\t\t\tQuill.register(textAlignAttributor, true);\n\n\t\t\tParchment._nfStyleAttributorsRegistered = true;\n\n\t\t\t// Register a custom Div blot so <div> elements are preserved\n\t\t\t// instead of being converted to <p> elements\n\t\t\tvar Block = Quill.import('blots/block');\n\n\t\t\t// Create DivBlot extending Block\n\t\t\tclass DivBlot extends Block {\n\t\t\t\tstatic create(value) {\n\t\t\t\t\tvar node = super.create();\n\t\t\t\t\treturn node;\n\t\t\t\t}\n\t\t\t}\n\t\t\tDivBlot.blotName = 'div';\n\t\t\tDivBlot.tagName = 'DIV';\n\n\t\t\tQuill.register(DivBlot, true);\n\n\t\t\t// Register BlotFormatter for image resize handles (#7879)\n\t\t\tif (typeof QuillBlotFormatter !== 'undefined' && QuillBlotFormatter.default) {\n\t\t\t\tQuill.register('modules/blotFormatter', QuillBlotFormatter.default);\n\t\t\t}\n\n\t\t\t// =====================================================================\n\t\t\t// Custom List Blots - Fix for #7937, #7938, #7942\n\t\t\t// =====================================================================\n\t\t\t// Quill's default ListItem injects <span class=\"ql-ui\"> elements for\n\t\t\t// checkbox toggle UI. These spans persist in saved HTML and trigger\n\t\t\t// the code-view lock on subsequent edits.\n\t\t\t//\n\t\t\t// Our custom implementation:\n\t\t\t// 1. NfListItem - ListItem without UI span injection\n\t\t\t// 2. NfOrderedList - Container for <ol> elements\n\t\t\t// 3. NfBulletList - Container for <ul> elements (Quill only supports OL by default)\n\t\t\t// =====================================================================\n\n\t\t\tvar Container = Quill.import('blots/container');\n\t\t\tvar Scroll = Quill.import('blots/scroll');\n\n\t\t\t// Custom ListItem that does NOT inject ql-ui spans\n\t\t\t// The key difference from Quill's ListItem: no constructor override = no attachUI()\n\t\t\tclass NfListItem extends Block {\n\t\t\t\tstatic create(value) {\n\t\t\t\t\tvar node = super.create();\n\t\t\t\t\tnode.setAttribute('data-list', value);\n\t\t\t\t\treturn node;\n\t\t\t\t}\n\n\t\t\t\tstatic formats(domNode) {\n\t\t\t\t\treturn domNode.getAttribute('data-list') || undefined;\n\t\t\t\t}\n\n\t\t\t\tformat(name, value) {\n\t\t\t\t\tif (name === this.statics.blotName && value) {\n\t\t\t\t\t\tthis.domNode.setAttribute('data-list', value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsuper.format(name, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tNfListItem.blotName = 'list';\n\t\t\tNfListItem.tagName = 'LI';\n\n\t\t\t// Container for ordered lists\n\t\t\tclass NfOrderedList extends Container {\n\t\t\t\tstatic create(value) {\n\t\t\t\t\treturn super.create();\n\t\t\t\t}\n\t\t\t}\n\t\t\tNfOrderedList.blotName = 'ordered-list';\n\t\t\tNfOrderedList.tagName = 'OL';\n\n\t\t\t// Container for unordered lists (Quill doesn't support UL by default)\n\t\t\tclass NfBulletList extends Container {\n\t\t\t\tstatic create(value) {\n\t\t\t\t\treturn super.create();\n\t\t\t\t}\n\t\t\t}\n\t\t\tNfBulletList.blotName = 'bullet-list';\n\t\t\tNfBulletList.tagName = 'UL';\n\n\t\t\t// Set up container relationships\n\t\t\tNfOrderedList.allowedChildren = [NfListItem];\n\t\t\tNfBulletList.allowedChildren = [NfListItem];\n\n\t\t\t// ListItem can be in either container type\n\t\t\tNfListItem.requiredContainer = NfOrderedList;\n\n\t\t\t// Register with Quill (true = override existing)\n\t\t\tQuill.register(NfListItem, true);\n\t\t\tQuill.register(NfOrderedList, true);\n\t\t\tQuill.register(NfBulletList, true);\n\n\t\t\t// Update Scroll's allowed children to include our list containers\n\t\t\tvar ScrollBlot = Quill.import('blots/scroll');\n\t\t\tif (ScrollBlot && ScrollBlot.allowedChildren) {\n\t\t\t\tif (ScrollBlot.allowedChildren.indexOf(NfOrderedList) === -1) {\n\t\t\t\t\tScrollBlot.allowedChildren.push(NfOrderedList);\n\t\t\t\t}\n\t\t\t\tif (ScrollBlot.allowedChildren.indexOf(NfBulletList) === -1) {\n\t\t\t\t\tScrollBlot.allowedChildren.push(NfBulletList);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// =====================================================================\n\t\t\t// Custom Span Blot - Fix for #7942\n\t\t\t// =====================================================================\n\t\t\t// Quill strips custom id and class attributes from spans. This blot\n\t\t\t// preserves them through the Delta conversion.\n\t\t\t// =====================================================================\n\n\t\t\tvar Inline = Quill.import('blots/inline');\n\n\t\t\tclass NfSpan extends Inline {\n\t\t\t\tstatic create(value) {\n\t\t\t\t\tvar node = super.create();\n\t\t\t\t\tif (value && typeof value === 'object') {\n\t\t\t\t\t\tif (value.id) node.setAttribute('id', value.id);\n\t\t\t\t\t\tif (value.class) node.setAttribute('class', value.class);\n\t\t\t\t\t}\n\t\t\t\t\treturn node;\n\t\t\t\t}\n\n\t\t\t\tstatic formats(domNode) {\n\t\t\t\t\tvar formats = {};\n\t\t\t\t\tif (domNode.hasAttribute('id')) {\n\t\t\t\t\t\tformats.id = domNode.getAttribute('id');\n\t\t\t\t\t}\n\t\t\t\t\tif (domNode.hasAttribute('class')) {\n\t\t\t\t\t\t// Filter out Quill's internal classes\n\t\t\t\t\t\tvar classes = domNode.getAttribute('class');\n\t\t\t\t\t\tvar filtered = classes.split(' ').filter(function(c) {\n\t\t\t\t\t\t\treturn c && !c.startsWith('ql-');\n\t\t\t\t\t\t}).join(' ');\n\t\t\t\t\t\tif (filtered) {\n\t\t\t\t\t\t\tformats.class = filtered;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn Object.keys(formats).length > 0 ? formats : undefined;\n\t\t\t\t}\n\n\t\t\t\tformat(name, value) {\n\t\t\t\t\tif (name === 'nf-span') {\n\t\t\t\t\t\tif (value && typeof value === 'object') {\n\t\t\t\t\t\t\tif (value.id) this.domNode.setAttribute('id', value.id);\n\t\t\t\t\t\t\tif (value.class) this.domNode.setAttribute('class', value.class);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsuper.format(name, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tNfSpan.blotName = 'nf-span';\n\t\t\tNfSpan.tagName = 'SPAN';\n\n\t\t\tQuill.register(NfSpan, true);\n\n\t\t\t// Monkey-patch TableRow.checkMerge to prevent infinite loop on malformed HTML (#7944)\n\t\t\t// When malformed table HTML is pasted (e.g., orphan <tr> elements, whitespace between\n\t\t\t// table elements), Quill can create TableRow blots with non-TableCell children.\n\t\t\t// The original checkMerge() assumes all children have a formats() method, causing\n\t\t\t// TypeError which doesn't halt the optimize cycle, resulting in infinite loop.\n\t\t\tthis.patchTableRowCheckMerge();\n\t\t},\n\n\t\t/**\n\t\t * Patch TableRow.checkMerge() to add defensive type checking.\n\t\t * Prevents infinite loop when malformed table HTML creates invalid blot structure.\n\t\t * Fixes issue #7944.\n\t\t */\n\t\tpatchTableRowCheckMerge: function() {\n\t\t\tvar TableRow = Quill.import('formats/table-row');\n\t\t\tif (!TableRow || TableRow._nfCheckMergePatched) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar originalCheckMerge = TableRow.prototype.checkMerge;\n\n\t\t\tTableRow.prototype.checkMerge = function() {\n\t\t\t\t// Defensive check: ensure all children have formats() method (are TableCells)\n\t\t\t\t// If any child is not a proper TableCell, skip the merge to prevent TypeError\n\t\t\t\tif (!this.children || !this.children.head) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (typeof this.children.head.formats !== 'function') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (!this.children.tail || typeof this.children.tail.formats !== 'function') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (this.next && this.next.children) {\n\t\t\t\t\tif (this.next.children.head && typeof this.next.children.head.formats !== 'function') {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.next.children.tail && typeof this.next.children.tail.formats !== 'function') {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn originalCheckMerge.call(this);\n\t\t\t};\n\n\t\t\tTableRow._nfCheckMergePatched = true;\n\t\t},\n\n\t\tinitSettingModel: function( settingModel ) {\n\t\t\t// Hide the standard merge tag button - we use the one in the Quill toolbar instead\n\t\t\tsettingModel.set( 'hide_merge_tags', true );\n\t\t},\n\n\t\tinitRTE: function( settingModel, dataModel, settingView ) {\n\t\t\tvar that = this;\n\t\t\tvar settingEl = jQuery( settingView.el ).find( 'div.setting' );\n\n\t\t\t// Check if already initialized to prevent infinite loop\n\t\t\tif (settingEl.data('quill-initialized')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Mark as initialized\n\t\t\tsettingEl.data('quill-initialized', true);\n\n\t\t\t// Clear any existing content and create a container for Quill\n\t\t\tsettingEl.empty();\n\n\t\t\t// Create unique ID for this instance\n\t\t\tvar instanceId = 'quill-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);\n\t\t\tvar quillContainer = jQuery('<div id=\"' + instanceId + '\"></div>');\n\t\t\tsettingEl.append(quillContainer);\n\n\t\t\t// Use requestAnimationFrame for better timing\n\t\t\trequestAnimationFrame(function() {\n\t\t\t\t// Double-check element is still in DOM and attached\n\t\t\t\tif (jQuery.contains(document, quillContainer[0])) {\n\t\t\t\t\tthat.initQuillInstance(instanceId, settingModel, dataModel, settingView);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tinitQuillInstance: function( instanceId, settingModel, dataModel, settingView ) {\n\t\t\tvar that = this;\n\t\t\tvar settingEl = jQuery( settingView.el ).find( 'div.setting' );\n\n\t\t\t// Verify element exists and is in the DOM\n\t\t\tvar containerEl = document.getElementById(instanceId);\n\t\t\tif (!containerEl || !jQuery.contains(document, containerEl)) {\n\t\t\t\treturn; // Silently fail if element not found\n\t\t\t}\n\n\t\t\t// Define custom toolbar\n\t\t\tvar toolbarOptions = [\n\t\t\t\t[{ 'header': [1, 2, 3, false] }],\n\t\t\t\t['bold', 'italic', 'underline', 'clean'],\n\t\t\t\t[{ 'list': 'ordered'}, { 'list': 'bullet' }],\n\t\t\t\t[{ 'align': ['', 'center', 'right', 'justify'] }],\n\t\t\t\t['nf-link', 'nf-unlink'],\n\t\t\t\t[{ 'table': 'table' }],\n\t\t\t\t['nf-undo', 'nf-redo'],\n\t\t\t\t['nf-media', 'nf-code', 'nf-merge-tags']\n\t\t\t];\n\n\t\t\t// Build modules config\n\t\t\tvar modulesConfig = {\n\t\t\t\ttoolbar: {\n\t\t\t\t\tcontainer: toolbarOptions,\n\t\t\t\t\thandlers: {\n\t\t\t\t\t\t'nf-link': function() {\n\t\t\t\t\t\t\tthat.showLinkDialog(quill, settingView);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'nf-unlink': function() {\n\t\t\t\t\t\t\tthat.removeLink(quill);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'nf-media': function() {\n\t\t\t\t\t\t\tthat.openMediaManager(quill, settingView);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'nf-merge-tags': function() {\n\t\t\t\t\t\t\tthat.showMergeTags(quill, settingView);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'nf-code': function() {\n\t\t\t\t\t\t\tthat.toggleCodeView(quill, settingView, settingModel, dataModel);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'nf-undo': function() {\n\t\t\t\t\t\t\tquill.history.undo();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'nf-redo': function() {\n\t\t\t\t\t\t\tquill.history.redo();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'table': function() {\n\t\t\t\t\t\t\tthat.showTablePicker(quill, settingView);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\thistory: {\n\t\t\t\t\tdelay: 1000,\n\t\t\t\t\tmaxStack: 50,\n\t\t\t\t\tuserOnly: true\n\t\t\t\t},\n\t\t\t\ttable: true,\n\t\t\t\tblotFormatter: {} // Image resize handles (#7879)\n\t\t\t};\n\n\t\t\t// Initialize Quill\n\t\t\tvar quill = new Quill('#' + instanceId, {\n\t\t\t\ttheme: 'snow',\n\t\t\t\tmodules: modulesConfig,\n\t\t\t\tplaceholder: ''\n\t\t\t});\n\n\t\t\t// Add clipboard matcher to sanitize table HTML during paste operations (#7944)\n\t\t\t// This runs before Quill's Delta conversion, fixing malformed table structures\n\t\t\t// that would otherwise cause infinite loops in checkMerge()\n\t\t\tquill.clipboard.addMatcher('TABLE', function(node, delta) {\n\t\t\t\t// Create a temporary container and re-parse the table through our sanitizer\n\t\t\t\tvar wrapper = document.createElement('div');\n\t\t\t\twrapper.appendChild(node.cloneNode(true));\n\t\t\t\tvar sanitized = that.normalizeTableHtml(wrapper.innerHTML);\n\n\t\t\t\t// If sanitization changed the structure, re-convert\n\t\t\t\tif (sanitized !== wrapper.innerHTML) {\n\t\t\t\t\tvar tempContainer = document.createElement('div');\n\t\t\t\t\ttempContainer.innerHTML = sanitized;\n\t\t\t\t\t// Use Quill's clipboard to convert the sanitized HTML\n\t\t\t\t\treturn quill.clipboard.convert({ html: sanitized });\n\t\t\t\t}\n\n\t\t\t\treturn delta;\n\t\t\t});\n\n\t\t\t// Set initial content — normalize legacy Summernote tables for Quill compatibility\n\t\t\tvar initialValue = dataModel.get( settingModel.get( 'name' ) ) || '';\n\t\t\tvar hasLegacyTable = this.hasLegacyTables(initialValue);\n\n\t\t\t// Store tracking state on the Quill instance BEFORE assigning innerHTML.\n\t\t\t// Setting innerHTML triggers Quill's MutationObserver which emits a\n\t\t\t// text-change event with source 'user'. Without these flags being set\n\t\t\t// first, both text-change handlers below (persistence + merge-tag\n\t\t\t// detection) would react to the initial content load — which causes\n\t\t\t// the merge-tag box to auto-appear when the loaded content contains\n\t\t\t// closed merge tags like {calc:calc1} (#7884).\n\t\t\tquill._nfOriginalHtml = initialValue;\n\t\t\tquill._nfUserHasEdited = false;\n\t\t\tquill._nfSkipNextTextChange = true;\n\t\t\tquill._nfSkipNextMergeTagDetection = true;\n\n\t\t\t// Pre-process HTML: normalize tables and prepare lists for Quill\n\t\t\tvar processedHtml = this.normalizeTableHtml(initialValue);\n\t\t\tprocessedHtml = this.prepareHtmlForQuill(processedHtml);\n\t\t\tquill.root.innerHTML = processedHtml;\n\n\t\t\tif (hasLegacyTable) {\n\t\t\t\tthis.showLegacyTableNotice(settingView, instanceId, quill, settingModel, dataModel);\n\t\t\t}\n\n\t\t\t// Store instance\n\t\t\tthis.quillInstances[instanceId] = {\n\t\t\t\tquill: quill,\n\t\t\t\tsettingModel: settingModel,\n\t\t\t\tdataModel: dataModel,\n\t\t\t\tsettingView: settingView\n\t\t\t};\n\n\t\t\t// Store Quill reference on the editor element for external access\n\t\t\tquill.root.__quill = quill;\n\n\t\t\t// Also store on the setting element for merge tag button access\n\t\t\tsettingEl.data('quill', quill);\n\n\t\t\t// Add custom button icons using Dashicons\n\t\t\tthis.addDashicons(settingView, settingModel);\n\n\t\t\t// Manually attach click handler to merge tags button\n\t\t\t// We can't rely on mergeTagBox's automatic attachment since timing is wrong\n\t\t\tsetTimeout(function() {\n\t\t\t\tvar toolbar = jQuery(settingView.el).find('.ql-toolbar');\n\t\t\t\tvar mergeButton = toolbar.find('.merge-tags');\n\n\t\t\t\t// Remove any existing handlers and attach new one\n\t\t\t\tmergeButton.off('click').on('click', function(e) {\n\t\t\t\t\tvar quillInstance = that.quillInstances[instanceId];\n\t\t\t\t\tif (!quillInstance) return;\n\n\t\t\t\t\tvar quill = quillInstance.quill;\n\t\t\t\t\tvar settingContainer = jQuery(settingView.el).find('.setting');\n\n\t\t\t\t\t// When in code view, insert into CodeMirror instead of the hidden Quill editor\n\t\t\t\t\tif (settingContainer.hasClass('code-view')) {\n\t\t\t\t\t\tvar cm = settingContainer.data('codeMirror');\n\t\t\t\t\t\tif (cm) {\n\t\t\t\t\t\t\tvar cursor = cm.getCursor();\n\t\t\t\t\t\t\tcm.replaceRange('{', cursor);\n\t\t\t\t\t\t\t// Position caret after the inserted '{'\n\t\t\t\t\t\t\tvar newPos = { line: cursor.line, ch: cursor.ch + 1 };\n\t\t\t\t\t\t\tcm.setCursor(newPos);\n\t\t\t\t\t\t\tcm.focus();\n\n\t\t\t\t\t\t\t// Set merge tag system variables\n\t\t\t\t\t\t\tnfRadio.channel('mergeTags').request('set:old', '{');\n\t\t\t\t\t\t\t// Use a flat character offset for the merge tag system\n\t\t\t\t\t\t\tvar charOffset = cm.indexFromPos(newPos);\n\t\t\t\t\t\t\tnfRadio.channel('mergeTags').request('set:caret', charOffset);\n\n\t\t\t\t\t\t\t// Store a CodeMirror-aware context for merge tag insertion\n\t\t\t\t\t\t\twindow.nfCurrentQuillInstance = null;\n\t\t\t\t\t\t\twindow.nfCurrentCodeMirror = cm;\n\n\t\t\t\t\t\t\t// Update tag list\n\t\t\t\t\t\t\tnfRadio.channel('merge-tags').request('update:taglist', 'fields', false);\n\n\t\t\t\t\t\t\t// Show the merge tags box\n\t\t\t\t\t\t\tjQuery('#merge-tags-box').css('display', 'block');\n\n\t\t\t\t\t\t\t// Position it near the CodeMirror editor\n\t\t\t\t\t\t\tnfRadio.channel('mergeTags').trigger('focus', cm.getWrapperElement(), 'rte');\n\n\t\t\t\t\t\t\t// Focus the search input\n\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\tjQuery('#merge-tags-box').find('.merge-tag-filter').find('input').focus();\n\t\t\t\t\t\t\t}, 100);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store reference globally for merge tag insertion\n\t\t\t\t\twindow.nfCurrentQuillInstance = quill;\n\t\t\t\t\twindow.nfCurrentCodeMirror = null;\n\n\t\t\t\t\t// Mark the editor as focused\n\t\t\t\t\tjQuery(quill.root).addClass('merge-tag-focus');\n\n\t\t\t\t\t// Get cursor position - use last known position or end of content if no selection\n\t\t\t\t\tvar range = quill.getSelection();\n\t\t\t\t\tvar insertIndex;\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\tinsertIndex = range.index;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No selection (editor lost focus), insert at end of content\n\t\t\t\t\t\t// getLength() includes the trailing newline, so subtract 1\n\t\t\t\t\t\tinsertIndex = Math.max(0, quill.getLength() - 1);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Mark as user-edited since clicking the merge tag button is an intentional edit.\n\t\t\t\t\t// Without this, the insertText call below fires text-change with source 'api',\n\t\t\t\t\t// which would not set _nfUserHasEdited and the merge tag would not be persisted.\n\t\t\t\t\tquill._nfUserHasEdited = true;\n\n\t\t\t\t\t// Insert a { character to trigger merge tag mode\n\t\t\t\t\tquill.insertText(insertIndex, '{');\n\t\t\t\t\tquill.setSelection(insertIndex + 1);\n\n\t\t\t\t\t// Set merge tag system variables\n\t\t\t\t\tnfRadio.channel('mergeTags').request('set:old', '{');\n\t\t\t\t\tnfRadio.channel('mergeTags').request('set:caret', insertIndex + 1);\n\n\t\t\t\t\t// Add overlay class\n\t\t\t\t\tvar container = jQuery(quill.root).closest('.nf-setting');\n\t\t\t\t\tcontainer.find('.ql-container').parent().addClass('merge-tag-focus-overlay');\n\n\t\t\t\t\t// Update tag list\n\t\t\t\t\tnfRadio.channel('merge-tags').request('update:taglist', 'fields', false);\n\n\t\t\t\t\t// Show the merge tags box\n\t\t\t\t\tjQuery('#merge-tags-box').css('display', 'block');\n\n\t\t\t\t\t// Position it (call focusCallback)\n\t\t\t\t\tnfRadio.channel('mergeTags').trigger('focus', quill.root, 'rte');\n\n\t\t\t\t\t// Focus the search input\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tjQuery('#merge-tags-box').find('.merge-tag-filter').find('input').focus();\n\t\t\t\t\t}, 100);\n\t\t\t\t});\n\t\t\t}, 100);\n\n\t\t\t// Handle content changes - persist when content has actually changed\n\t\t\tquill.on('text-change', function(delta, oldDelta, source) {\n\t\t\t\t// Skip the text-change fired by innerHTML assignment during initialization\n\t\t\t\tif (quill._nfSkipNextTextChange) {\n\t\t\t\t\tquill._nfSkipNextTextChange = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Mark as edited if source is 'user' (direct user interaction)\n\t\t\t\tif (source === 'user') {\n\t\t\t\t\tquill._nfUserHasEdited = true;\n\t\t\t\t}\n\n\t\t\t\t// Also mark as edited if content has substantially changed from original,\n\t\t\t\t// even for API changes (e.g., dangerouslyPasteHTML). This ensures\n\t\t\t\t// programmatic content insertion is persisted to the data model.\n\t\t\t\tif (!quill._nfUserHasEdited) {\n\t\t\t\t\tvar currentHtml = quill.root.innerHTML;\n\t\t\t\t\tvar originalHtml = quill._nfOriginalHtml || '';\n\t\t\t\t\t// Compare content (normalize whitespace for comparison)\n\t\t\t\t\tvar currentNormalized = currentHtml.replace(/\\s+/g, ' ').trim();\n\t\t\t\t\tvar originalNormalized = originalHtml.replace(/\\s+/g, ' ').trim();\n\t\t\t\t\tif (currentNormalized !== originalNormalized) {\n\t\t\t\t\t\tquill._nfUserHasEdited = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (quill._nfUserHasEdited) {\n\t\t\t\t\tvar value = quill.root.innerHTML;\n\t\t\t\t\tthat.updateDataModel(settingModel, dataModel, value);\n\t\t\t\t\tnfRadio.channel( 'quill' ).trigger( 'change', settingModel, dataModel, value );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle focus and blur\n\t\t\tquill.on('selection-change', function(range, oldRange, source) {\n\t\t\t\tif (range) {\n\t\t\t\t\t// Mark the editor as focused for merge tags\n\t\t\t\t\tjQuery(quill.root).addClass('merge-tag-focus');\n\t\t\t\t\t// Set global reference for merge tag insertion\n\t\t\t\t\twindow.nfCurrentQuillInstance = quill;\n\t\t\t\t\tnfRadio.channel( 'quill' ).trigger( 'focus', settingModel, dataModel, quill );\n\t\t\t\t} else if (oldRange) {\n\t\t\t\t\tjQuery(quill.root).removeClass('merge-tag-focus');\n\t\t\t\t\tif (quill._nfUserHasEdited) {\n\t\t\t\t\t\tvar value = quill.root.innerHTML;\n\t\t\t\t\t\tthat.updateDataModel(settingModel, dataModel, value);\n\t\t\t\t\t\tnfRadio.channel( 'quill' ).trigger( 'blur', settingModel, dataModel, value );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnfRadio.channel( 'quill' ).trigger( 'blur', settingModel, dataModel, quill._nfOriginalHtml );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Clear global Quill reference on blur to prevent the global ESC\n\t\t\t// handler from using stale state to delete content (#7884).\n\t\t\t// Registered as a separate listener to avoid conflicts with the\n\t\t\t// blur logic in the handler above (which may be modified by #7865).\n\t\t\tquill.on('selection-change', function(range, oldRange, source) {\n\t\t\t\tif (!range && oldRange) {\n\t\t\t\t\tif ( 'none' === jQuery( '#merge-tags-box' ).css( 'display' ) ) {\n\t\t\t\t\t\twindow.nfCurrentQuillInstance = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle text changes for merge tag detection (typing '{')\n\t\t\tvar mergeTagBoxLastShown = 0;\n\t\t\tquill.on('text-change', function(delta, oldDelta, source) {\n\t\t\t\t// Skip the text-change fired by initial innerHTML assignment.\n\t\t\t\t// Quill's MutationObserver reports DOM-level mutations as 'user'\n\t\t\t\t// even when triggered programmatically, so without this guard the\n\t\t\t\t// merge-tag box would auto-appear if loaded content contained\n\t\t\t\t// open-looking merge tag patterns (#7884).\n\t\t\t\t// Consume the flag BEFORE the source check so it can't get stuck\n\t\t\t\t// set if Quill ever fires the init event with a non-user source.\n\t\t\t\tif (quill._nfSkipNextMergeTagDetection) {\n\t\t\t\t\tquill._nfSkipNextMergeTagDetection = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Only handle user input, not programmatic changes\n\t\t\t\tif (source !== 'user') return;\n\n\t\t\t\t// Bulk inserts (paste, dangerouslyPasteHTML, programmatic content\n\t\t\t\t// load) shouldn't trigger the merge-tag UI even if the inserted\n\t\t\t\t// content has a stray `{`. A real keystroke inserts exactly one\n\t\t\t\t// character per text-change.\n\t\t\t\tvar totalInsertLength = 0;\n\t\t\t\tif (delta && delta.ops) {\n\t\t\t\t\tfor (var i = 0; i < delta.ops.length; i++) {\n\t\t\t\t\t\tvar op = delta.ops[i];\n\t\t\t\t\t\tif (op.insert && typeof op.insert === 'string') {\n\t\t\t\t\t\t\ttotalInsertLength += op.insert.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar isBulkInsert = totalInsertLength > 1;\n\n\t\t\t\t// Get cursor position\n\t\t\t\tvar range = quill.getSelection();\n\t\t\t\tvar caretPos = range ? range.index : 0;\n\t\t\t\tnfRadio.channel('mergeTags').request('set:caret', caretPos);\n\n\t\t\t\t// Get plain text content (not HTML)\n\t\t\t\tvar content = quill.getText();\n\n\t\t\t\t// Find open merge tags in the content\n\t\t\t\tvar mergetags = content.match(/{([a-zA-Z0-9]|:|_|-|}| |\\/)*/g);\n\n\t\t\t\t// Filter out closed merge tags\n\t\t\t\tif (mergetags) {\n\t\t\t\t\tmergetags = _.filter(mergetags, function(mergetag) {\n\t\t\t\t\t\treturn -1 == mergetag.indexOf('}');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If an open merge tag is found, show the Merge Tag Box —\n\t\t\t\t// but only when the change was a single-character edit (the\n\t\t\t\t// user typed `{` or deleted a `}`). Bulk inserts must not\n\t\t\t\t// auto-open the box (#7884).\n\t\t\t\tif (mergetags && mergetags.length > 0 && !isBulkInsert) {\n\t\t\t\t\tnfRadio.channel('mergeTags').request('set:old', mergetags[0]);\n\n\t\t\t\t\tjQuery('#merge-tags-box').css('display', 'block');\n\t\t\t\t\tnfRadio.channel('drawer').request('prevent:close');\n\t\t\t\t\tjQuery(quill.root).addClass('merge-tag-focus');\n\n\t\t\t\t\t// Store global reference\n\t\t\t\t\twindow.nfCurrentQuillInstance = quill;\n\n\t\t\t\t\t// Add overlay class\n\t\t\t\t\tvar container = jQuery(quill.root).closest('.nf-setting');\n\t\t\t\t\tcontainer.find('.ql-container').parent().addClass('merge-tag-focus-overlay');\n\n\t\t\t\t\t// Position merge tag box\n\t\t\t\t\tnfRadio.channel('mergeTags').trigger('focus', quill.root, 'rte');\n\n\t\t\t\t\t// Filter the tag list\n\t\t\t\t\tvar value = mergetags[0].replace('{', '');\n\t\t\t\t\tnfRadio.channel('merge-tags').request('filtertags', value);\n\n\t\t\t\t\t// Focus the search input (only if box wasn't already visible)\n\t\t\t\t\tif (!jQuery('#merge-tags-box').is(':visible') || (Date.now() - mergeTagBoxLastShown > 200)) {\n\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\tjQuery('#merge-tags-box').find('.merge-tag-filter').find('input').focus();\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Track when we showed the box\n\t\t\t\t\tmergeTagBoxLastShown = Date.now();\n\t\t\t\t} else {\n\t\t\t\t\t// Hide merge tag box if no open merge tags\n\t\t\t\t\t// But don't hide if we just showed it (within 200ms) to prevent flicker\n\t\t\t\t\tvar timeSinceShown = Date.now() - mergeTagBoxLastShown;\n\t\t\t\t\tif (timeSinceShown > 200 && jQuery('#merge-tags-box').is(':visible')) {\n\t\t\t\t\t\tjQuery('#merge-tags-box').css('display', 'none');\n\t\t\t\t\t\tnfRadio.channel('drawer').request('enable:close');\n\t\t\t\t\t\tjQuery('#merge-tags-box').removeClass();\n\t\t\t\t\t\tjQuery('.merge-tag-focus-overlay').removeClass('merge-tag-focus-overlay');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle right-click context menu for tables\n\t\t\tjQuery(quill.root).on('contextmenu', function(e) {\n\t\t\t\tthat.showTableContextMenu(quill, e);\n\t\t\t});\n\n\t\t\t// Check for HTML degradation or unsupported HTML and auto-switch to code view if needed\n\t\t\tvar quillHtml = quill.root.innerHTML;\n\t\t\tvar hasUnsupported = quill._nfOriginalHtml && that.hasUnsupportedHtml(quill._nfOriginalHtml);\n\t\t\t// Compare NORMALIZED HTML to Quill output, not raw original (#7944)\n\t\t\t// Raw HTML may have malformed structures that get fixed during normalization,\n\t\t\t// so comparing raw to output would falsely trigger content loss detection\n\t\t\tvar normalizedOriginal = quill._nfOriginalHtml ? that.normalizeTableHtml(quill._nfOriginalHtml) : '';\n\t\t\tvar hasDegradation = normalizedOriginal && that.hasHtmlDegradation(normalizedOriginal, quillHtml);\n\t\t\tif (hasUnsupported || hasDegradation) {\n\t\t\t\t// Auto-switch to code view with original HTML preserved\n\t\t\t\tthat.toggleCodeView(quill, settingView, settingModel, dataModel, quill._nfOriginalHtml);\n\t\t\t\t// Show notice to user\n\t\t\t\tthat.showCodeViewNotice(settingView);\n\t\t\t}\n\n\t\t\t// Store reference for later\n\t\t\tsettingEl.data('quill-instance', instanceId);\n\t\t},\n\n\t\taddDashicons: function(settingView, settingModel) {\n\t\t\tvar toolbar = jQuery(settingView.el).find('.ql-toolbar');\n\n\t\t\t// Replace button content with dashicons\n\t\t\ttoolbar.find('.ql-bold').html('<span class=\"dashicons dashicons-editor-bold\"></span>');\n\t\t\ttoolbar.find('.ql-italic').html('<span class=\"dashicons dashicons-editor-italic\"></span>');\n\t\t\ttoolbar.find('.ql-underline').html('<span class=\"dashicons dashicons-editor-underline\"></span>');\n\t\t\ttoolbar.find('.ql-list[value=\"ordered\"]').html('<span class=\"dashicons dashicons-editor-ol\"></span>');\n\t\t\ttoolbar.find('.ql-list[value=\"bullet\"]').html('<span class=\"dashicons dashicons-editor-ul\"></span>');\n\t\t\t// Note: Don't replace .ql-align content - it's a dropdown picker that needs its internal structure\n\t\t\ttoolbar.find('.ql-clean').html('<span class=\"dashicons dashicons-editor-removeformatting\"></span>');\n\n\t\t\t// Add custom buttons with dashicons\n\t\t\ttoolbar.find('button.ql-nf-link').html('<span class=\"dashicons dashicons-admin-links\"></span>');\n\t\t\ttoolbar.find('button.ql-nf-unlink').html('<span class=\"dashicons dashicons-editor-unlink\"></span>');\n\t\t\ttoolbar.find('button.ql-nf-media').html('<span class=\"dashicons dashicons-admin-media\"></span>');\n\n\t\t\t// Find or create merge tags button\n\t\t\tvar mergeButton = toolbar.find('button.ql-nf-merge-tags');\n\t\t\tif (mergeButton.length === 0) {\n\t\t\t\t// Quill didn't create the button, so create it manually in the last .ql-formats group\n\t\t\t\tvar lastFormatsGroup = toolbar.find('.ql-formats').last();\n\t\t\t\tif (lastFormatsGroup.length === 0) {\n\t\t\t\t\t// Create a new formats group if none exists\n\t\t\t\t\tlastFormatsGroup = jQuery('<span class=\"ql-formats\"></span>');\n\t\t\t\t\ttoolbar.append(lastFormatsGroup);\n\t\t\t\t}\n\t\t\t\tmergeButton = jQuery('<button type=\"button\" class=\"ql-nf-merge-tags merge-tags\"><span class=\"dashicons dashicons-list-view\"></span></button>');\n\t\t\t\tlastFormatsGroup.append(mergeButton);\n\t\t\t} else {\n\t\t\t\tmergeButton.html('<span class=\"dashicons dashicons-list-view\"></span>').addClass('merge-tags');\n\t\t\t}\n\n\t\t\t// Add data-testid for E2E testing, matching pattern from other settings\n\t\t\tvar settingName = settingModel ? settingModel.get('name') : '';\n\t\t\tif (settingName) {\n\t\t\t\tmergeButton.attr('data-testid', 'nf-merge-tag-picker-' + settingName);\n\t\t\t}\n\n\t\t\ttoolbar.find('.ql-table').html('<span class=\"dashicons dashicons-editor-table\"></span>');\n\t\t\ttoolbar.find('button.ql-nf-code').html('<span class=\"dashicons dashicons-editor-code\"></span>');\n\t\t\ttoolbar.find('button.ql-nf-undo').html('<span class=\"dashicons dashicons-undo\"></span>');\n\t\t\ttoolbar.find('button.ql-nf-redo').html('<span class=\"dashicons dashicons-redo\"></span>');\n\t\t},\n\n\t\t/**\n\t\t * Sanitize HTML before saving to remove Quill artifacts and normalize lists.\n\t\t *\n\t\t * Removes:\n\t\t * - <span class=\"ql-ui\"></span> elements injected by Quill's list handling\n\t\t * - Empty ql-* class attributes left after filtering\n\t\t *\n\t\t * Normalizes:\n\t\t * - Quill's <ol><li data-list=\"bullet\"> to standard <ul><li>\n\t\t * - Quill's <ol><li data-list=\"ordered\"> to standard <ol><li> (removes data-list)\n\t\t *\n\t\t * @param {string} html - The HTML to sanitize\n\t\t * @returns {string} - Sanitized HTML\n\t\t * @since 3.14.4\n\t\t * @see https://github.com/Saturday-Drive/ninja-forms/issues/7937\n\t\t * @see https://github.com/Saturday-Drive/ninja-forms/issues/7938\n\t\t */\n\t\tsanitizeQuillHtml: function(html) {\n\t\t\tif (!html) return html;\n\n\t\t\t// Remove ql-ui spans that Quill injects for list item UI\n\t\t\t// These are empty spans used for checkbox toggle and shouldn't be persisted\n\t\t\thtml = html.replace(/<span\\s+class=\"ql-ui\"[^>]*>\\s*<\\/span>/gi, '');\n\n\t\t\t// Remove any other empty ql-* spans\n\t\t\thtml = html.replace(/<span\\s+class=\"ql-[^\"]*\"[^>]*>\\s*<\\/span>/gi, '');\n\n\t\t\t// Clean up any data-list attributes with ql-ui contamination\n\t\t\t// This handles edge cases where ql-ui class got added alongside data-list\n\t\t\thtml = html.replace(/\\s+class=\"ql-ui\"/gi, '');\n\n\t\t\t// Normalize Quill's list format back to standard HTML\n\t\t\t// Quill uses <ol> for ALL lists with data-list=\"bullet|ordered\" on <li> elements\n\t\t\thtml = this.normalizeQuillLists(html);\n\n\t\t\treturn html;\n\t\t},\n\n\t\t/**\n\t\t * Pre-process HTML before loading into Quill.\n\t\t *\n\t\t * Converts standard <ul> to Quill's internal format:\n\t\t * - <ul><li>Item</li></ul> → <ol><li data-list=\"bullet\">Item</li></ol>\n\t\t *\n\t\t * This allows Quill to track the list type so we can restore it on save.\n\t\t *\n\t\t * @param {string} html - The HTML to pre-process\n\t\t * @returns {string} - HTML formatted for Quill consumption\n\t\t * @since 3.14.4\n\t\t * @see https://github.com/Saturday-Drive/ninja-forms/issues/7937\n\t\t */\n\t\tprepareHtmlForQuill: function(html) {\n\t\t\tif (!html || html.indexOf('<ul') === -1) return html;\n\n\t\t\t// Use a temporary DOM element to parse and manipulate the HTML\n\t\t\tvar temp = document.createElement('div');\n\t\t\ttemp.innerHTML = html;\n\n\t\t\t// Find all <ul> elements and convert to <ol> with data-list=\"bullet\"\n\t\t\tvar bulletLists = temp.querySelectorAll('ul');\n\n\t\t\tbulletLists.forEach(function(ul) {\n\t\t\t\t// Create replacement <ol>\n\t\t\t\tvar ol = document.createElement('ol');\n\n\t\t\t\t// Copy attributes from ul to ol\n\t\t\t\tfor (var i = 0; i < ul.attributes.length; i++) {\n\t\t\t\t\tvar attr = ul.attributes[i];\n\t\t\t\t\tol.setAttribute(attr.name, attr.value);\n\t\t\t\t}\n\n\t\t\t\t// Mark all <li> children with data-list=\"bullet\"\n\t\t\t\tvar listItems = ul.querySelectorAll(':scope > li');\n\t\t\t\tlistItems.forEach(function(li) {\n\t\t\t\t\tli.setAttribute('data-list', 'bullet');\n\t\t\t\t});\n\n\t\t\t\t// Move children to new ol\n\t\t\t\twhile (ul.firstChild) {\n\t\t\t\t\tol.appendChild(ul.firstChild);\n\t\t\t\t}\n\n\t\t\t\t// Replace ul with ol\n\t\t\t\tul.parentNode.replaceChild(ol, ul);\n\t\t\t});\n\n\t\t\treturn temp.innerHTML;\n\t\t},\n\n\t\t/**\n\t\t * Convert Quill's list format back to standard HTML lists.\n\t\t *\n\t\t * Quill internally uses <ol> for all lists, differentiating by data-list attribute:\n\t\t * - <ol><li data-list=\"bullet\">Item</li></ol> → <ul><li>Item</li></ul>\n\t\t * - <ol><li data-list=\"ordered\">Item</li></ol> → <ol><li>Item</li></ol>\n\t\t *\n\t\t * @param {string} html - The HTML to normalize\n\t\t * @returns {string} - Normalized HTML with proper <ul>/<ol> tags\n\t\t * @since 3.14.4\n\t\t * @see https://github.com/Saturday-Drive/ninja-forms/issues/7937\n\t\t */\n\t\tnormalizeQuillLists: function(html) {\n\t\t\tif (!html || html.indexOf('<ol') === -1) return html;\n\n\t\t\t// Use a temporary DOM element to parse and manipulate the HTML\n\t\t\tvar temp = document.createElement('div');\n\t\t\ttemp.innerHTML = html;\n\n\t\t\t// Find all <ol> elements\n\t\t\tvar orderedLists = temp.querySelectorAll('ol');\n\n\t\t\torderedLists.forEach(function(ol) {\n\t\t\t\t// Get direct <li> children only\n\t\t\t\tvar listItems = ol.querySelectorAll(':scope > li');\n\t\t\t\tif (listItems.length === 0) return;\n\n\t\t\t\t// Check if all items are bullet type\n\t\t\t\tvar allBullet = true;\n\t\t\t\tvar hasBullet = false;\n\n\t\t\t\tlistItems.forEach(function(li) {\n\t\t\t\t\tvar dataList = li.getAttribute('data-list');\n\t\t\t\t\tif (dataList === 'bullet') {\n\t\t\t\t\t\thasBullet = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tallBullet = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// If all items are bullet type, convert <ol> to <ul>\n\t\t\t\tif (allBullet && hasBullet) {\n\t\t\t\t\tvar ul = document.createElement('ul');\n\t\t\t\t\t// Copy attributes from ol to ul (except type-specific ones)\n\t\t\t\t\tfor (var i = 0; i < ol.attributes.length; i++) {\n\t\t\t\t\t\tvar attr = ol.attributes[i];\n\t\t\t\t\t\tif (attr.name !== 'type' && attr.name !== 'start') {\n\t\t\t\t\t\t\tul.setAttribute(attr.name, attr.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Move children to new ul\n\t\t\t\t\twhile (ol.firstChild) {\n\t\t\t\t\t\tul.appendChild(ol.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\tol.parentNode.replaceChild(ul, ol);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Clean up data-list attributes from all list items\n\t\t\tvar allItems = temp.querySelectorAll('li[data-list]');\n\t\t\tallItems.forEach(function(li) {\n\t\t\t\tli.removeAttribute('data-list');\n\t\t\t});\n\n\t\t\treturn temp.innerHTML;\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\t// Sanitize HTML before saving to remove Quill artifacts\n\t\t\tvar after = this.sanitizeQuillHtml(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},\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\tvar settingEl = jQuery( settingView.el ).find( 'div.setting' );\n\t\t\tvar instanceId = settingEl.data('quill-instance');\n\n\t\t\tif (instanceId && this.quillInstances[instanceId]) {\n\t\t\t\tdelete this.quillInstances[instanceId];\n\t\t\t}\n\n\t\t\tsettingEl.empty();\n\t\t},\n\n\t\tshowLinkDialog: function(quill, settingView) {\n\t\t\tvar that = this;\n\t\t\tvar range = quill.getSelection(true);\n\t\t\tvar text = range ? quill.getText(range.index, range.length) : '';\n\n\t\t\t// Create link dialog\n\t\t\tvar linkDropdown = nfRadio.channel( 'app' ).request( 'get:template', '#tmpl-nf-rte-link-dropdown' );\n\t\t\tvar dropdownHtml = linkDropdown({});\n\n\t\t\tvar toolbar = jQuery(settingView.el).find('.ql-toolbar');\n\t\t\tvar existingDropdown = toolbar.find('.nf-link-dropdown');\n\n\t\t\tif (existingDropdown.length) {\n\t\t\t\texistingDropdown.remove();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar dropdown = jQuery('<div class=\"nf-link-dropdown\" role=\"dialog\"></div>').attr('aria-label', nfi18n.insertLink || 'Insert Link').html(dropdownHtml);\n\t\t\ttoolbar.append(dropdown);\n\n\t\t\tdropdown.find('.link-text').val(text);\n\t\t\tdropdown.find('.link-url').focus();\n\n\t\t\t// Close link dialog on Escape\n\t\t\tdropdown.on('keydown', function(ev) {\n\t\t\t\tif (ev.keyCode === 27) {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t\tdropdown.remove();\n\t\t\t\t\tquill.focus();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdropdown.find('.insert-link').on('click', function() {\n\t\t\t\tvar linkText = dropdown.find('.link-text').val();\n\t\t\t\tvar linkUrl = dropdown.find('.link-url').val();\n\t\t\t\tvar newWindow = dropdown.find('.link-new-window').prop('checked');\n\n\t\t\t\tif (linkUrl) {\n\t\t\t\t\t// Mark as user-edited — inserting a link via the dialog is an intentional edit\n\t\t\t\t\tquill._nfUserHasEdited = true;\n\n\t\t\t\t\tvar format = { link: linkUrl };\n\t\t\t\t\tif (newWindow) {\n\t\t\t\t\t\tformat.target = '_blank';\n\t\t\t\t\t}\n\n\t\t\t\t\tif (range && range.length > 0) {\n\t\t\t\t\t\tquill.formatText(range.index, range.length, format);\n\t\t\t\t\t} else if (linkText) {\n\t\t\t\t\t\tquill.insertText(range.index, linkText, format);\n\t\t\t\t\t\tquill.setSelection(range.index + linkText.length);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdropdown.remove();\n\t\t\t});\n\n\t\t\tdropdown.find('.cancel-link').on('click', function() {\n\t\t\t\tdropdown.remove();\n\t\t\t});\n\n\t\t\t// Store current quill instance for later\n\t\t\tthat.currentContext = { quill: quill, range: range };\n\t\t},\n\n\t\tremoveLink: function(quill) {\n\t\t\tvar range = quill.getSelection();\n\t\t\tif (range) {\n\t\t\t\t// Mark as user-edited — removing a link via the toolbar is an intentional edit\n\t\t\t\tquill._nfUserHasEdited = true;\n\t\t\t\tquill.formatText(range.index, range.length, { link: false });\n\t\t\t}\n\t\t},\n\n\t\topenMediaManager: function(quill, settingView) {\n\t\t\tvar that = this;\n\t\t\tvar range = quill.getSelection(true);\n\n\t\t\t// Store context\n\t\t\tthis.currentContext = { quill: quill, range: range };\n\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\t// Runs when an image is selected.\n\t\t\tthis.meta_image_frame.on('select', function(){\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 );\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\tinsertMedia: function( media ) {\n\t\t\tvar quill = this.currentContext.quill;\n\t\t\tvar range = this.currentContext.range || quill.getSelection(true) || { index: 0 };\n\n\t\t\t// Mark as user-edited — inserting media via the library is an intentional edit\n\t\t\tquill._nfUserHasEdited = true;\n\n\t\t\tif ( 'image' == media.type ) {\n\t\t\t\tquill.insertEmbed(range.index, 'image', media.url);\n\t\t\t\tquill.setSelection(range.index + 1);\n\t\t\t} else {\n\t\t\t\tvar linkText = media.title || media.filename;\n\t\t\t\tquill.insertText(range.index, linkText, { link: media.url });\n\t\t\t\tquill.setSelection(range.index + linkText.length);\n\t\t\t}\n\t\t},\n\n\t\tshowMergeTags: function(quill, settingView) {\n\t\t\t// Mark the quill root as focused\n\t\t\tjQuery(quill.root).addClass('merge-tag-focus');\n\n\t\t\t// Store quill reference for merge tag insertion\n\t\t\tthis.currentContext = { quill: quill };\n\t\t},\n\n\t\thasHtmlDegradation: function(original, quillOutput) {\n\t\t\t// Quick empty check\n\t\t\tif (!original || original === '<p><br></p>') return false;\n\n\t\t\t// Normalize for comparison\n\t\t\tvar normOrig = original.replace(/\\s+/g, ' ').trim().toLowerCase();\n\t\t\tvar normQuill = quillOutput.replace(/\\s+/g, ' ').trim().toLowerCase();\n\n\t\t\t// If they're essentially the same, no degradation\n\t\t\tif (normOrig === normQuill) return false;\n\n\t\t\t// Check for lost elements that Quill doesn't support\n\t\t\t// Note: <div>, <span class=>, <span style=>, id=, style= are now supported\n\t\t\t// via custom blots and StyleAttributors (#7937, #7938, #7942)\n\t\t\tvar unsupportedPatterns = [\n\t\t\t\t/<hr[\\s/>]/i, // horizontal rules\n\t\t\t\t/<thead[\\s>]/i, // table headers\n\t\t\t\t/<th[\\s>]/i // th elements\n\t\t\t];\n\n\t\t\tfor (var i = 0; i < unsupportedPatterns.length; i++) {\n\t\t\t\tif (unsupportedPatterns[i].test(original) && !unsupportedPatterns[i].test(quillOutput)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for significant content loss (>10% reduction)\n\t\t\tvar origText = original.replace(/<[^>]+>/g, '').trim();\n\t\t\tvar quillText = quillOutput.replace(/<[^>]+>/g, '').trim();\n\t\t\tif (origText.length > 0 && quillText.length < origText.length * 0.9) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * Check if HTML contains features that Quill cannot preserve.\n\t\t * Used to detect when content should be edited in code view instead of WYSIWYG.\n\t\t *\n\t\t * @param {string} html - The HTML to check\n\t\t * @returns {boolean} - True if HTML has unsupported features\n\t\t *\n\t\t * @since 3.14.4 Removed patterns for:\n\t\t * - <ul> - Now supported via NfBulletList blot (#7937)\n\t\t * - <ol> - Now fixed, no ql-ui injection + sanitization (#7938)\n\t\t * - <span class=...> - Now supported via NfSpan blot (#7942)\n\t\t * - id attributes - Now supported via NfSpan blot (#7942)\n\t\t */\n\t\thasUnsupportedHtml: function(html) {\n\t\t\tif (!html) return false;\n\n\t\t\t// Patterns for HTML features Quill doesn't support\n\t\t\t// Note: <div> and style= are now supported via custom blots and StyleAttributors\n\t\t\t// Note: <ul>, <ol>, <span class=>, id= are now supported via custom blots (#7937, #7938, #7942)\n\t\t\tvar unsupportedPatterns = [\n\t\t\t\t/<hr[\\s/>]/i, // horizontal rules - no Quill blot exists\n\t\t\t\t/<thead[\\s>]/i, // table headers - normalized to tbody\n\t\t\t\t/<th[\\s>]/i // th elements - normalized to td\n\t\t\t];\n\n\t\t\tfor (var i = 0; i < unsupportedPatterns.length; i++) {\n\t\t\t\tif (unsupportedPatterns[i].test(html)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\tshowCodeViewNotice: function(settingView) {\n\t\t\tvar container = jQuery(settingView.el).find('.setting');\n\t\t\tvar notice = jQuery('<div class=\"nf-code-view-notice\" role=\"alert\"></div>');\n\t\t\tnotice.append(jQuery('<span></span>').text(nfi18n.quillCodeViewAutoSwitch));\n\t\t\tnotice.append(jQuery('<button class=\"nf-dismiss-notice\" type=\"button\"></button>').attr('aria-label', nfi18n.dismiss || 'Dismiss').html('×'));\n\t\t\tnotice.find('.nf-dismiss-notice').on('click', function() {\n\t\t\t\tnotice.remove();\n\t\t\t});\n\t\t\tcontainer.prepend(notice);\n\t\t},\n\n\t\ttoggleCodeView: function(quill, settingView, settingModel, dataModel, htmlOverride) {\n\t\t\tvar that = this;\n\t\t\tvar container = jQuery(settingView.el).find('.setting');\n\t\t\tvar toolbar = jQuery(settingView.el).find('.ql-toolbar');\n\t\t\tvar isCodeView = container.hasClass('code-view');\n\n\t\t\tif (isCodeView) {\n\t\t\t\t// Switch back to WYSIWYG\n\t\t\t\tvar codeMirror = container.data('codeMirror');\n\t\t\t\tvar code = codeMirror ? codeMirror.getValue() : container.find('textarea').val();\n\n\t\t\t\t// Check if HTML has features Quill can't preserve (div, inline styles, etc.)\n\t\t\t\t// If so, stay in code view to prevent content loss.\n\t\t\t\tif (that.hasUnsupportedHtml(code)) {\n\t\t\t\t\t// Stay in code view — save to data model and notify user\n\t\t\t\t\tthat.updateDataModel(settingModel, dataModel, code);\n\t\t\t\t\tthat.showCodeViewNotice(settingView);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check for degradation via table normalization\n\t\t\t\t// Compare normalized HTML to what Quill would output, not raw to normalized\n\t\t\t\t// Raw HTML may have malformed structures that normalization intentionally fixes,\n\t\t\t\t// which is not degradation - it's repair (#7944)\n\t\t\t\tvar normalized = that.normalizeTableHtml(code);\n\t\t\t\t// Only check for truly unsupported features, not structural repairs\n\t\t\t\tif (that.hasUnsupportedHtml(normalized)) {\n\t\t\t\t\t// Stay in code view — save to data model and notify user\n\t\t\t\t\tthat.updateDataModel(settingModel, dataModel, code);\n\t\t\t\t\tthat.showCodeViewNotice(settingView);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Save raw code to data model BEFORE Quill normalizes it\n\t\t\t\tthat.updateDataModel(settingModel, dataModel, code);\n\t\t\t\t// Reset state for the new content\n\t\t\t\tquill._nfOriginalHtml = code;\n\t\t\t\tquill._nfUserHasEdited = false;\n\t\t\t\tquill._nfSkipNextTextChange = true;\n\t\t\t\t// Sanitize table HTML to prevent infinite loop on malformed structures (#7944)\n\t\t\t\t// Then pre-process HTML to convert <ul> to Quill's internal format\n\t\t\t\tvar processedHtml = that.normalizeTableHtml(code);\n\t\t\t\tprocessedHtml = that.prepareHtmlForQuill(processedHtml);\n\t\t\t\tquill.root.innerHTML = processedHtml;\n\t\t\t\tcontainer.find('.code-view-wrapper').remove();\n\t\t\t\tcontainer.find('.ql-container').show();\n\t\t\t\ttoolbar.show();\n\t\t\t\tcontainer.removeClass('code-view');\n\t\t\t\tcontainer.removeData('codeMirror');\n\n\t\t\t\t// Remove active state from code button\n\t\t\t\ttoolbar.find('.ql-nf-code').removeClass('ql-active');\n\t\t\t} else {\n\t\t\t\t// Switch to code view\n\t\t\t\tvar html = htmlOverride || quill.root.innerHTML;\n\n\t\t\t\t// Sanitize HTML to remove Quill artifacts and restore proper list format\n\t\t\t\tvar sanitizedHtml = that.sanitizeQuillHtml(html);\n\n\t\t\t\t// Save to data model immediately when switching to code view\n\t\t\t\t// This ensures the HTML is persisted even if the drawer closes before blur\n\t\t\t\tthat.updateDataModel(settingModel, dataModel, sanitizedHtml);\n\n\t\t\t\tcontainer.find('.ql-container').hide();\n\n\t\t\t\t// Keep toolbar visible but add active state to code button\n\t\t\t\ttoolbar.find('.ql-nf-code').addClass('ql-active');\n\n\t\t\t\t// Create wrapper and textarea for CodeMirror\n\t\t\t\tvar wrapper = jQuery('<div class=\"code-view-wrapper\"></div>');\n\t\t\t\tvar textarea = jQuery('<textarea class=\"code-view-textarea\"></textarea>');\n\t\t\t\ttextarea.val(sanitizedHtml);\n\t\t\t\twrapper.append(textarea);\n\t\t\t\tcontainer.append(wrapper);\n\t\t\t\tcontainer.addClass('code-view');\n\n\t\t\t\t// Initialize CodeMirror with Monokai theme\n\t\t\t\tif (typeof CodeMirror !== 'undefined') {\n\t\t\t\t\tvar codeMirror = CodeMirror.fromTextArea(textarea[0], {\n\t\t\t\t\t\tmode: 'xml',\n\t\t\t\t\t\ttheme: 'monokai',\n\t\t\t\t\t\tlineNumbers: true,\n\t\t\t\t\t\tlineWrapping: true,\n\t\t\t\t\t\tviewportMargin: Infinity\n\t\t\t\t\t});\n\t\t\t\t\tcodeMirror.setSize('100%', '200px');\n\t\t\t\t\tcontainer.data('codeMirror', codeMirror);\n\n\t\t\t\t\tcodeMirror.on('blur', function() {\n\t\t\t\t\t\tvar value = codeMirror.getValue();\n\t\t\t\t\t\tthat.updateDataModel(settingModel, dataModel, value);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback if CodeMirror not loaded\n\t\t\t\t\ttextarea.css({\n\t\t\t\t\t\t'width': '100%',\n\t\t\t\t\t\t'height': '150px',\n\t\t\t\t\t\t'font-family': 'monospace'\n\t\t\t\t\t});\n\t\t\t\t\ttextarea.on('blur', function() {\n\t\t\t\t\t\tvar value = jQuery(this).val();\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}\n\t\t},\n\n\t\thasLegacyTables: function(html) {\n\t\t\tif (html.toLowerCase().indexOf('<table') === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar tmp = document.createElement('div');\n\t\t\ttmp.innerHTML = html;\n\t\t\t// Any <th> is inherently legacy — Quill only supports <td>\n\t\t\tif (tmp.querySelectorAll('th').length > 0) return true;\n\t\t\tvar tds = tmp.querySelectorAll('td');\n\t\t\tfor (var i = 0; i < tds.length; i++) {\n\t\t\t\tif (!tds[i].hasAttribute('data-row')) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tshowLegacyTableNotice: function(settingView, instanceId, quill, settingModel, dataModel) {\n\t\t\tvar that = this;\n\t\t\tvar toolbar = jQuery(settingView.el).find('.ql-toolbar');\n\t\t\tvar notice = jQuery('<div class=\"nf-legacy-table-notice\" role=\"alert\"></div>');\n\t\t\tnotice.append(jQuery('<span class=\"nf-legacy-table-text\"></span>').text(nfi18n.tableLegacyNotice));\n\t\t\tnotice.append(jQuery('<button type=\"button\" class=\"nf-convert-table-btn\"></button>').text(nfi18n.tableLegacyConvert));\n\t\t\tnotice.append(jQuery('<button type=\"button\" class=\"nf-dismiss-notice\"></button>').attr('aria-label', nfi18n.dismiss || 'Dismiss').html('×'));\n\n\t\t\ttoolbar.after(notice);\n\n\t\t\tnotice.find('.nf-convert-table-btn').on('click', function() {\n\t\t\t\tvar value = quill.root.innerHTML;\n\t\t\t\tthat.updateDataModel(settingModel, dataModel, value);\n\t\t\t\tnfRadio.channel('quill').trigger('change', settingModel, dataModel, value);\n\t\t\t\tnotice.slideUp(function() { notice.remove(); });\n\t\t\t});\n\n\t\t\tnotice.find('.nf-dismiss-notice').on('click', function() {\n\t\t\t\tnotice.slideUp(function() { notice.remove(); });\n\t\t\t});\n\t\t},\n\n\t\tnormalizeTableHtml: function(html) {\n\t\t\tif (html.toLowerCase().indexOf('<table') === -1) {\n\t\t\t\treturn html;\n\t\t\t}\n\n\t\t\tvar tmp = document.createElement('div');\n\t\t\ttmp.innerHTML = html;\n\n\t\t\t// === MALFORMED TABLE STRUCTURE FIXES (Issue #7944) ===\n\t\t\t// These fixes prevent Quill's infinite loop by ensuring proper table structure\n\t\t\t// before Quill's DOM parser processes the HTML.\n\n\t\t\t// 1. Remove text nodes (whitespace/newlines) from inside table structure elements\n\t\t\t// Whitespace between <table> and <td> creates text blots that cause checkMerge() to crash\n\t\t\tvar tableElements = tmp.querySelectorAll('table, tbody, thead, tfoot, tr');\n\t\t\tfor (var i = 0; i < tableElements.length; i++) {\n\t\t\t\tvar el = tableElements[i];\n\t\t\t\tvar childNodes = Array.prototype.slice.call(el.childNodes);\n\t\t\t\tfor (var j = 0; j < childNodes.length; j++) {\n\t\t\t\t\tvar child = childNodes[j];\n\t\t\t\t\t// Remove text nodes (nodeType 3) and comment nodes (nodeType 8)\n\t\t\t\t\tif (child.nodeType === 3 || child.nodeType === 8) {\n\t\t\t\t\t\tel.removeChild(child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 2. Fix orphan <td> elements that are direct children of <table> or <tbody>\n\t\t\t// Wrap them in <tr> elements\n\t\t\tvar tables = tmp.querySelectorAll('table');\n\t\t\tfor (var i = 0; i < tables.length; i++) {\n\t\t\t\tvar table = tables[i];\n\t\t\t\tvar tbody = table.querySelector('tbody');\n\t\t\t\tvar container = tbody || table;\n\n\t\t\t\tvar orphanTds = [];\n\t\t\t\tvar children = Array.prototype.slice.call(container.children);\n\t\t\t\tfor (var j = 0; j < children.length; j++) {\n\t\t\t\t\tif (children[j].tagName === 'TD' || children[j].tagName === 'TH') {\n\t\t\t\t\t\torphanTds.push(children[j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Wrap consecutive orphan TDs in a single TR\n\t\t\t\tif (orphanTds.length > 0) {\n\t\t\t\t\tvar tr = document.createElement('tr');\n\t\t\t\t\tvar firstOrphan = orphanTds[0];\n\t\t\t\t\tcontainer.insertBefore(tr, firstOrphan);\n\t\t\t\t\tfor (var j = 0; j < orphanTds.length; j++) {\n\t\t\t\t\t\ttr.appendChild(orphanTds[j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. Remove orphan <tr> elements that have no <td> children\n\t\t\t// These cause checkMerge() to fail when checking formats()\n\t\t\tvar allTrs = tmp.querySelectorAll('tr');\n\t\t\tfor (var i = 0; i < allTrs.length; i++) {\n\t\t\t\tvar tr = allTrs[i];\n\t\t\t\tvar hasCells = tr.querySelector('td, th');\n\t\t\t\tif (!hasCells) {\n\t\t\t\t\ttr.parentNode.removeChild(tr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// === END MALFORMED TABLE STRUCTURE FIXES ===\n\n\t\t\t// Convert <th> to <td> (Quill only supports TD), preserving all attributes\n\t\t\tvar ths = tmp.querySelectorAll('th');\n\t\t\tfor (var i = 0; i < ths.length; i++) {\n\t\t\t\tvar td = document.createElement('td');\n\t\t\t\ttd.innerHTML = ths[i].innerHTML;\n\t\t\t\tfor (var a = 0; a < ths[i].attributes.length; a++) {\n\t\t\t\t\ttd.setAttribute(ths[i].attributes[a].name, ths[i].attributes[a].value);\n\t\t\t\t}\n\t\t\t\tths[i].parentNode.replaceChild(td, ths[i]);\n\t\t\t}\n\n\t\t\t// Move <thead> and <tfoot> rows into <tbody> (Quill only supports TBODY)\n\t\t\tvar sections = tmp.querySelectorAll('thead, tfoot');\n\t\t\tfor (var i = 0; i < sections.length; i++) {\n\t\t\t\tvar table = sections[i].parentNode;\n\t\t\t\tvar tbody = table.querySelector('tbody');\n\t\t\t\tif (!tbody) {\n\t\t\t\t\ttbody = document.createElement('tbody');\n\t\t\t\t\ttable.appendChild(tbody);\n\t\t\t\t}\n\t\t\t\tvar rows = sections[i].querySelectorAll('tr');\n\t\t\t\tvar isThead = sections[i].tagName === 'THEAD';\n\t\t\t\tfor (var j = 0; j < rows.length; j++) {\n\t\t\t\t\tif (isThead) {\n\t\t\t\t\t\ttbody.insertBefore(rows[j], tbody.firstChild);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttbody.appendChild(rows[j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsections[i].parentNode.removeChild(sections[i]);\n\t\t\t}\n\n\t\t\t// Ensure every table has a <tbody> wrapper\n\t\t\tvar tables = tmp.querySelectorAll('table');\n\t\t\tfor (var i = 0; i < tables.length; i++) {\n\t\t\t\tif (!tables[i].querySelector('tbody')) {\n\t\t\t\t\tvar tbody = document.createElement('tbody');\n\t\t\t\t\tvar children = tables[i].children;\n\t\t\t\t\tvar directTrs = [];\n\t\t\t\t\tfor (var k = 0; k < children.length; k++) {\n\t\t\t\t\t\tif (children[k].tagName === 'TR') {\n\t\t\t\t\t\t\tdirectTrs.push(children[k]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (var k = 0; k < directTrs.length; k++) {\n\t\t\t\t\t\ttbody.appendChild(directTrs[k]);\n\t\t\t\t\t}\n\t\t\t\t\ttables[i].appendChild(tbody);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove <caption>, <colgroup>, <col> (unsupported by Quill table blots)\n\t\t\tvar unsupported = tmp.querySelectorAll('caption, colgroup, col');\n\t\t\tfor (var i = 0; i < unsupported.length; i++) {\n\t\t\t\tunsupported[i].parentNode.removeChild(unsupported[i]);\n\t\t\t}\n\n\t\t\t// Add data-row to cells that don't have it (required by Quill table module)\n\t\t\tvar trs = tmp.querySelectorAll('tr');\n\t\t\tfor (var i = 0; i < trs.length; i++) {\n\t\t\t\tvar cells = trs[i].querySelectorAll('td');\n\t\t\t\tvar existingRowId = null;\n\t\t\t\tvar needsId = false;\n\n\t\t\t\tfor (var j = 0; j < cells.length; j++) {\n\t\t\t\t\tif (cells[j].hasAttribute('data-row')) {\n\t\t\t\t\t\texistingRowId = cells[j].getAttribute('data-row');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tneedsId = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (needsId) {\n\t\t\t\t\tvar rowId = existingRowId || ('row-' + Math.random().toString(36).slice(2, 6));\n\t\t\t\t\tfor (var j = 0; j < cells.length; j++) {\n\t\t\t\t\t\tif (!cells[j].hasAttribute('data-row')) {\n\t\t\t\t\t\t\tcells[j].setAttribute('data-row', rowId);\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\treturn tmp.innerHTML;\n\t\t},\n\n\t\tshowTablePicker: function(quill, settingView) {\n\t\t\tvar range = quill.getSelection(true);\n\t\t\tvar toolbar = jQuery(settingView.el).find('.ql-toolbar');\n\n\t\t\t// Close any existing picker (handles multi-instance case)\n\t\t\tvar existingPicker = jQuery('.nf-table-picker');\n\t\t\tvar wasOurs = toolbar.find('.nf-table-picker').length > 0;\n\t\t\texistingPicker.remove();\n\t\t\tjQuery(document).off('mousedown.nfTablePicker keydown.nfTablePicker');\n\n\t\t\t// Toggle behavior — clicking table button again closes its own picker\n\t\t\tif (wasOurs) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Build the 10x10 grid\n\t\t\tvar maxRows = 10;\n\t\t\tvar maxCols = 10;\n\t\t\tvar picker = jQuery('<div class=\"nf-table-picker\" role=\"dialog\"></div>').attr('aria-label', nfi18n.tableInsertTable || 'Insert Table');\n\t\t\tvar grid = jQuery('<div class=\"nf-table-grid\" role=\"grid\"></div>');\n\t\t\tvar label = jQuery('<div class=\"nf-table-label\" aria-live=\"polite\">0 \\u00d7 0</div>');\n\n\t\t\tvar gridHtml = '';\n\t\t\tfor (var r = 1; r <= maxRows; r++) {\n\t\t\t\tfor (var c = 1; c <= maxCols; c++) {\n\t\t\t\t\tvar isFirst = (r === 1 && c === 1);\n\t\t\t\t\tgridHtml += '<div class=\"nf-table-cell\" role=\"gridcell\" tabindex=\"' + (isFirst ? '0' : '-1') + '\" data-row=\"' + r + '\" data-col=\"' + c + '\" aria-label=\"' + r + ' \\u00d7 ' + c + '\"></div>';\n\t\t\t\t}\n\t\t\t}\n\t\t\tgrid.html(gridHtml);\n\n\t\t\tpicker.append(grid);\n\t\t\tpicker.append(label);\n\t\t\ttoolbar.append(picker);\n\n\t\t\t// Focus the first cell for keyboard users\n\t\t\tgrid.find('.nf-table-cell[data-row=\"1\"][data-col=\"1\"]').focus();\n\n\t\t\t// Cache grid cells for efficient hover highlighting\n\t\t\tvar gridCells = grid[0].querySelectorAll('.nf-table-cell');\n\n\t\t\t// Highlight cells on hover\n\t\t\tgrid.on('mouseover', '.nf-table-cell', function() {\n\t\t\t\tvar row = parseInt(this.dataset.row, 10);\n\t\t\t\tvar col = parseInt(this.dataset.col, 10);\n\t\t\t\tlabel.text(row + ' \\u00d7 ' + col);\n\n\t\t\t\tfor (var i = 0; i < gridCells.length; i++) {\n\t\t\t\t\tvar r = parseInt(gridCells[i].dataset.row, 10);\n\t\t\t\t\tvar c = parseInt(gridCells[i].dataset.col, 10);\n\t\t\t\t\tgridCells[i].classList.toggle('highlight', r <= row && c <= col);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Insert table on click\n\t\t\tgrid.on('click', '.nf-table-cell', function() {\n\t\t\t\tvar rows = parseInt(this.dataset.row, 10);\n\t\t\t\tvar cols = parseInt(this.dataset.col, 10);\n\n\t\t\t\tquill.focus();\n\t\t\t\tif (range) {\n\t\t\t\t\tquill.setSelection(range.index, 0);\n\t\t\t\t}\n\n\t\t\t\tvar tableModule = quill.getModule('table');\n\t\t\t\tif (tableModule) {\n\t\t\t\t\tquill._nfUserHasEdited = true;\n\t\t\t\t\ttableModule.insertTable(rows, cols);\n\t\t\t\t}\n\n\t\t\t\tpicker.remove();\n\t\t\t\tjQuery(document).off('mousedown.nfTablePicker keydown.nfTablePicker');\n\t\t\t});\n\n\t\t\t// Keyboard navigation for grid\n\t\t\tgrid.on('keydown', '.nf-table-cell', function(e) {\n\t\t\t\tvar cell = jQuery(this);\n\t\t\t\tvar row = parseInt(cell.data('row'), 10);\n\t\t\t\tvar col = parseInt(cell.data('col'), 10);\n\t\t\t\tvar targetRow = row;\n\t\t\t\tvar targetCol = col;\n\n\t\t\t\tswitch (e.keyCode) {\n\t\t\t\t\tcase 37: targetCol = Math.max(1, col - 1); break; // Left\n\t\t\t\t\tcase 38: targetRow = Math.max(1, row - 1); break; // Up\n\t\t\t\t\tcase 39: targetCol = Math.min(maxCols, col + 1); break; // Right\n\t\t\t\t\tcase 40: targetRow = Math.min(maxRows, row + 1); break; // Down\n\t\t\t\t\tcase 13: // Enter — insert table\n\t\t\t\t\t\tcell.trigger('click');\n\t\t\t\t\t\treturn;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn; // Let other keys pass through\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvar target = grid.find('.nf-table-cell[data-row=\"' + targetRow + '\"][data-col=\"' + targetCol + '\"]');\n\t\t\t\tif (target.length) {\n\t\t\t\t\tcell.attr('tabindex', '-1');\n\t\t\t\t\ttarget.attr('tabindex', '0').focus();\n\t\t\t\t\t// Trigger highlight update\n\t\t\t\t\ttarget.trigger('mouseover');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Close on outside click\n\t\t\tsetTimeout(function() {\n\t\t\t\tjQuery(document).on('mousedown.nfTablePicker', function(e) {\n\t\t\t\t\tif (!jQuery(e.target).closest('.nf-table-picker, .ql-table').length) {\n\t\t\t\t\t\tpicker.remove();\n\t\t\t\t\t\tjQuery(document).off('mousedown.nfTablePicker keydown.nfTablePicker');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\t// Close on ESC\n\t\t\tjQuery(document).on('keydown.nfTablePicker', function(e) {\n\t\t\t\tif (e.keyCode === 27) {\n\t\t\t\t\tpicker.remove();\n\t\t\t\t\tjQuery(document).off('mousedown.nfTablePicker keydown.nfTablePicker');\n\t\t\t\t\tquill.focus();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tshowTableContextMenu: function(quill, e) {\n\t\t\t// Remove any existing context menus and their event handlers\n\t\t\tjQuery('.nf-table-context-menu').remove();\n\t\t\tjQuery(document).off('mousedown.nfTableContext');\n\n\t\t\t// Check if right-click target is inside a table cell\n\t\t\tvar td = jQuery(e.target).closest('td, th');\n\t\t\tif (!td.length) return;\n\n\t\t\tvar tableModule = quill.getModule('table');\n\t\t\tif (!tableModule) return;\n\n\t\t\te.preventDefault();\n\n\t\t\tvar menuItems = [\n\t\t\t\t{ label: nfi18n.tableInsertRowAbove, action: 'insertRowAbove' },\n\t\t\t\t{ label: nfi18n.tableInsertRowBelow, action: 'insertRowBelow' },\n\t\t\t\t{ separator: true },\n\t\t\t\t{ label: nfi18n.tableInsertColumnLeft, action: 'insertColumnLeft' },\n\t\t\t\t{ label: nfi18n.tableInsertColumnRight, action: 'insertColumnRight' },\n\t\t\t\t{ separator: true },\n\t\t\t\t{ label: nfi18n.tableDeleteRow, action: 'deleteRow' },\n\t\t\t\t{ label: nfi18n.tableDeleteColumn, action: 'deleteColumn' },\n\t\t\t\t{ label: nfi18n.tableDeleteTable, action: 'deleteTable' }\n\t\t\t];\n\n\t\t\tvar menu = jQuery('<div class=\"nf-table-context-menu\" role=\"menu\"></div>');\n\n\t\t\tmenuItems.forEach(function(item, index) {\n\t\t\t\tif (item.separator) {\n\t\t\t\t\tmenu.append(jQuery('<div class=\"nf-table-context-separator\" role=\"separator\"></div>'));\n\t\t\t\t} else {\n\t\t\t\t\tvar menuItem = jQuery('<div class=\"nf-table-context-item\" role=\"menuitem\" tabindex=\"-1\"></div>').text(item.label);\n\t\t\t\t\tmenuItem.on('click', function() {\n\t\t\t\t\t\tquill._nfUserHasEdited = true;\n\t\t\t\t\t\tif (typeof tableModule[item.action] === 'function') {\n\t\t\t\t\t\t\ttableModule[item.action]();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmenu.remove();\n\t\t\t\t\t\tjQuery(document).off('mousedown.nfTableContext keydown.nfTableContext');\n\t\t\t\t\t\tquill.focus();\n\t\t\t\t\t});\n\t\t\t\t\tmenu.append(menuItem);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Position at mouse location\n\t\t\tmenu.css({\n\t\t\t\tleft: e.clientX + 'px',\n\t\t\t\ttop: e.clientY + 'px'\n\t\t\t});\n\n\t\t\tjQuery('body').append(menu);\n\n\t\t\t// Focus first menu item for keyboard users\n\t\t\tmenu.find('.nf-table-context-item').first().focus();\n\n\t\t\t// Keyboard navigation for context menu\n\t\t\tjQuery(document).on('keydown.nfTableContext', function(ev) {\n\t\t\t\tvar items = menu.find('.nf-table-context-item');\n\t\t\t\tvar focused = menu.find('.nf-table-context-item:focus');\n\t\t\t\tvar idx = items.index(focused);\n\n\t\t\t\tswitch (ev.keyCode) {\n\t\t\t\t\tcase 40: // Down arrow\n\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\tidx = (idx + 1) % items.length;\n\t\t\t\t\t\titems.eq(idx).focus();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 38: // Up arrow\n\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\tidx = (idx - 1 + items.length) % items.length;\n\t\t\t\t\t\titems.eq(idx).focus();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 13: // Enter\n\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\tif (focused.length) {\n\t\t\t\t\t\t\tfocused.trigger('click');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 27: // Escape\n\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\tmenu.remove();\n\t\t\t\t\t\tjQuery(document).off('mousedown.nfTableContext keydown.nfTableContext');\n\t\t\t\t\t\tquill.focus();\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Close on outside click\n\t\t\tsetTimeout(function() {\n\t\t\t\tjQuery(document).on('mousedown.nfTableContext', function(ev) {\n\t\t\t\t\tif (!jQuery(ev.target).closest('.nf-table-context-menu').length) {\n\t\t\t\t\t\tmenu.remove();\n\t\t\t\t\t\tjQuery(document).off('mousedown.nfTableContext keydown.nfTableContext');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t},\n\n\t\tclickExtra: function( e, settingModel, dataModel, settingView ) {\n\t\t\t// Handle any extra click events (like the insert link button)\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\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\n\t\t\t\tif ( 0 != text.length && 0 != url.length && this.currentContext.quill ) {\n\t\t\t\t\tvar quill = this.currentContext.quill;\n\t\t\t\t\tvar range = this.currentContext.range || quill.getSelection(true) || { index: 0 };\n\n\t\t\t\t\t// Mark as user-edited — inserting a link via clickExtra is an intentional edit\n\t\t\t\t\tquill._nfUserHasEdited = true;\n\n\t\t\t\t\tvar format = { link: url };\n\t\t\t\t\tif (isNewWindow) {\n\t\t\t\t\t\tformat.target = '_blank';\n\t\t\t\t\t}\n\n\t\t\t\t\tquill.insertText(range.index, text, format);\n\t\t\t\t\tquill.setSelection(range.index + text.length);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttextEl.val( '' );\n\t\t\turlEl.val( '' );\n\t\t\tisNewWindowEl.prop( 'checked', false );\n\t\t\tjQuery( e.target ).closest( '.nf-link-dropdown' ).remove();\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 * Also close mobile menu when screen is resized above mobile breakpoint.\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\n\t\t\t// Listen for window resize to auto-close menu on desktop\n\t\t\tthis.setupResizeListener();\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\t/**\n\t\t * Setup window resize listener with debouncing\n\t\t * Automatically closes mobile menu when screen exceeds mobile breakpoint\n\t\t *\n\t\t * @since 3.x\n\t\t * @return void\n\t\t */\n\t\tsetupResizeListener: function() {\n\t\t\tvar that = this;\n\t\t\tvar resizeTimer;\n\t\t\tvar mobileBreakpoint = 900; // Must match CSS breakpoint in media-queries.scss\n\n\t\t\tjQuery( window ).on( 'resize.nfMobileMenu', function() {\n\t\t\t\tclearTimeout( resizeTimer );\n\t\t\t\tresizeTimer = setTimeout( function() {\n\t\t\t\t\t// If window width exceeds mobile breakpoint, close mobile menu\n\t\t\t\t\tif ( jQuery( window ).width() > mobileBreakpoint ) {\n\t\t\t\t\t\tthat.closeMobileMenu();\n\t\t\t\t\t}\n\t\t\t\t}, 250 ); // Debounce delay in milliseconds\n\t\t\t});\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\tif ( 1 == this.disable_browser_autocomplete ) {\n\t\t\t\t\t\treturn 'autocomplete=\"off\"';\n\t\t\t\t\t} else if ( this.custom_autocomplete && this.custom_autocomplete.trim() !== '' ) {\n\t\t\t\t\t\treturn 'autocomplete=\"' + this.custom_autocomplete.trim() + '\"';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 'autocomplete=\"on\"';\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> ';\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\tnfRadio.channel( 'option-repeater' ).trigger( 'init:optionModel', 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 attributes: function() {\n return {\n 'data-qa-id': this.model.get( 'qaId' )\n };\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() {\n\t\t\tvar that = this;\n\t\t\t// Add data-testid to the ADD NEW button for E2E testing\n\t\t\tvar settingName = this.model.get( 'name' );\n\t\t\tjQuery( this.el ).find( '.nf-add-new' ).attr( 'data-testid', 'nf-repeater-add-' + settingName );\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 attributes: function() {\n return {\n 'data-qa-id': this.model.get( 'qaId' )\n };\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"]}
Home - Capital GMC Buick Regina
Skip to content
{{ $t(category) }}
Error
{{vehicle.modelData.year}} {{vehicle.modelData.make}} {{vehicle.modelData.model}}
Starting from {{vehicle.modelData.startingPrice | moneyFormat(lang)}}
Welcome to Capital GMC BUICK – REGINA
Thank you for choosing Capital GMC Buick | Regina, your premier certified Buick and GMC dealership proudly serving drivers in Regina and the surrounding communities. Whether you’re searching for a brand-new Buick or GMC vehicle or a meticulously inspected pre-owned model, we have a diverse selection to match your needs and lifestyle.
Beyond our impressive inventory, we offer a seamless and stress-free financing experience through our well-connected finance centre, where our team of experts is dedicated to securing the best loan or lease options for you, quickly, transparently, and hassle-free.
But our commitment to you doesn’t stop at the sale. Our state-of-the-art service centre is staffed with skilled Buick and GMC technicians who use the latest equipment and genuine OEM parts to keep your vehicle running at its best. From routine maintenance to complex repairs, we’ve got you covered.
Experience top-tier customer service, quality vehicles, and expert care, all in one place. Visit Capital GMC Buick | Regina today or call us at 306-205-8072 with any questions. We’re here to help!
Ask a Question
Capital GMC Buick – Regina
Contact Us
Have a question or need assistance? Fill out the form and we will reach out to you as soon as possible.
Notice: JavaScript is required for this content.
CLOSE
Schedule a Visit
Let us know when you are coming and how we can assist you. We can ensure someone will be on hand to help you out at the desired date and time.
Notice: JavaScript is required for this content.
CLOSE
Find a Career
Have a look at our list of available positions and apply online today to join our team!
×
Opportunities to Grow
The auto industry is constantly changing and we want to continue to grow. We offer growth, leadership & mentorship programs to allow our staff to grow with us.
×
Competitive Salary
We have a significant earning potential with incentive-based pay in most roles. We also offer an employee referral bonus with paid bonuses.
×
Health & Dental
We offer a comprehensive benefits package including extended health, dental, and vision care. We also include paramedical, life insurance, paid sick leave, short & long-term disability coverages.
×
Vacation
We value our employees and want everyone to take their vacation time. We offer a minimum of 2 weeks vacation each year.
×
Training & Development
We have many opportunities for paid education and training in-house as well as training from the Manufacturer.
×
$10,000 Cash Giveaway – Terms & Conditions
All October long, stop by Capital GMC Buick Cadillac, to enter for your chance to win $10,000 cash. No purchase is required, but entries must be made in-store.
The contest is open to residents of Saskatchewan who are 18+. Dealership employees and their households are not eligible. Entries will be accepted from October 1 to October 31, 2025. A random draw will take place on November 1, 2025.
The prize is one $10,000 award, paid by cheque, and must be accepted as awarded. Winner will be contacted by phone or email and must respond within 7 days or another entry may be drawn. Odds of winning depend on the number of entries received.By entering, you agree that Capital Automotive Group may use your name and photo for winner announcements. The contest is governed by the laws of Saskatchewan.
Notice: JavaScript is required for this content.
CLOSE