{"version":3,"sources":["monster.js","active.js","passive.js","saveButton.js","saveModel.js","savesCollection.js","saveItemView.js","saveEmptyView.js","savesLoadingView.js","savesCollectionView.js","app.js","main.js"],"names":["nfCookieMonster","set","name","value","days","path","secure","date","Date","expires","type","valueToUse","secureFlag","setTime","getTime","toUTCString","window","encodeURIComponent","JSON","stringify","v","document","cookie","get","nameEQ","ca","split","firstChar","parsed","i","length","c","charAt","substring","indexOf","decodeURIComponent","parse","e","remove","this","increment","parseInt","decrement","nfSaveProgressActiveController","Marionette","Object","extend","endpoint","nfSaveProgress","restApiEndpoint","initialize","options","listenTo","Backbone","Radio","channel","onFormLoaded","onFormRenderView","formModel","save_actions","_","each","action","actionID","active","reply","formLayoutView","currentUserID","model","formInstanceID","saveField","toString","findWhere","jQuery","renderSaveTable","loadLastSave","loading","SavesLoadingView","render","requestData","_wpnonce","wpApiSettings","nonce","formID","ajax","url","data","request","cache","success","textStatus","jqXHR","$el","slideUp","saves","save","pop","save_id","fields","error","collection","SavesCollection","fetch","SavesCollectionView","nfSaveProgressPassiveController","storage","localStorage","nfRadio","onFormRendered","formView","formData","getItem","onChangeModelValue","removeItem","fieldModel","fieldData","setItem","nfSaveProgressSaveButtonController","maybeValidate","registerHandlers","maybeHide","click","getExtra","formChannel","beforeSubmit","reset","bind","response","registerSubmitHandlers","trigger","fieldView","setTimeout","saveData","settings","hide_complete","form_id","hide","SaveModel","Model","Collection","models","setAuthHeaders","xhr","setRequestHeader","sync","method","beforeSend","SaveItemView","ItemView","tagName","className","template","events","click .load","target","closest","find","removeClass","addClass","click .cancel","fieldsCollection","defaults","templateHelpers","view","updated","columns","$return","column","filter","field","savedField","fieldInstanceId","id","fieldId","fieldModelInstanceId","fieldModelId","fieldValue","SaveEmptyView","on","afterRender","that","el","CompositeView","childView","emptyView","childViewContainer","collectionView","onRender","parent","show","headers","NF_SaveProgress","Application","getfieldAttributes","updateFieldsCollection","key","omit","atts","map","attributes","object","savedFields","instanceID","fieldID","visible","ready","$","start"],"mappings":"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","file":"front-end.min.js","sourcesContent":["/*!\n * cookie-monster - a simple cookie library\n * v0.3.0\n * https://github.com/jgallen23/cookie-monster\n * copyright Greg Allen 2014\n * MIT License\n */\n/*\n * MODIFICATIONS: renamed assigned variable name to avoid conflicts.\n */\nvar nfCookieMonster = {\n set: function(name, value, days, path, secure) {\n var date = new Date(),\n expires = '',\n type = typeof(value),\n valueToUse = '',\n secureFlag = '';\n path = path || \"/\";\n if (days) {\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n expires = \"; expires=\" + date.toUTCString();\n }\n if (type === \"object\" && type !== \"undefined\") {\n if(!(\"JSON\" in window)) throw \"Bummer, your browser doesn't support JSON parsing.\";\n valueToUse = encodeURIComponent(JSON.stringify({v:value}));\n } else {\n valueToUse = encodeURIComponent(value);\n }\n if (secure){\n secureFlag = \"; secure\";\n }\n\n document.cookie = name + \"=\" + valueToUse + expires + \"; path=\" + path + secureFlag;\n },\n get: function(name) {\n var nameEQ = name + \"=\",\n ca = document.cookie.split(';'),\n value = '',\n firstChar = '',\n parsed={};\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i];\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) {\n value = decodeURIComponent(c.substring(nameEQ.length, c.length));\n firstChar = value.substring(0, 1);\n if(firstChar==\"{\"){\n try {\n parsed = JSON.parse(value);\n if(\"v\" in parsed) return parsed.v;\n } catch(e) {\n return value;\n }\n }\n if (value==\"undefined\") return undefined;\n return value;\n }\n }\n return null;\n },\n remove: function(name) {\n this.set(name, \"\", -1);\n },\n increment: function(name, days) {\n var value = this.get(name) || 0;\n this.set(name, (parseInt(value, 10) + 1), days);\n },\n decrement: function(name, days) {\n var value = this.get(name) || 0;\n this.set(name, (parseInt(value, 10) - 1), days);\n }\n};","/**\n * Save User Progress Active Controller\n */\nvar nfSaveProgressActiveController = Marionette.Object.extend({\n\n endpoint: nfSaveProgress.restApiEndpoint || '',\n\n initialize: function( options ) {\n this.listenTo( Backbone.Radio.channel( 'form' ), 'loaded', this.onFormLoaded );\n this.listenTo( Backbone.Radio.channel( 'form' ), 'render:view', this.onFormRenderView );\n },\n\n onFormLoaded: function( formModel ) {\n var save_actions = formModel.get( 'save_progress_actions' );\n if( 'undefined' == typeof save_actions ) return;\n\n _.each( save_actions, function( action, actionID ){\n if( 'undefined' == typeof action.active ) return;\n Backbone.Radio.channel( 'actions-' + actionID ).reply( 'get:status', function(){\n return ( 1 == action.active );\n } )\n } );\n },\n\n onFormRenderView: function( formLayoutView ) {\n\n if( ! nfSaveProgress.currentUserID ) return;\n\n var formModel = formLayoutView.model;\n var formInstanceID = formModel.get( 'id' );\n var formID = formInstanceID.toString().split('_')[0];\n\n var saveField = formModel.get( 'fields' ).findWhere( { type: 'save' } );\n\n if( 'undefined' == typeof saveField ) {\n jQuery( '#nf-form-' + formInstanceID + '-cont .nf-saves-cont table' ).remove();\n return;\n }\n\n if( formModel.get( 'save_progress_allow_multiple' ) ){\n return this.renderSaveTable( formModel );\n }\n\n return this.loadLastSave( formModel );\n },\n\n loadLastSave: function( formModel ) {\n\n // render loading view\n var loading = new SavesLoadingView();\n loading.render();\n\n var requestData = {\n _wpnonce: wpApiSettings.nonce,\n };\n\n var formInstanceID = formModel.get( 'id' );\n var formID = formInstanceID.toString().split('_')[0];\n\n jQuery.ajax({\n url: this.endpoint + 'saves/' + formID,\n type: 'GET',\n data: Backbone.Radio.channel( 'save-progress' ).request( 'getSavesRequestData', requestData ) || requestData,\n cache: false,\n success: function( data, textStatus, jqXHR ){\n jQuery( loading.$el ).slideUp( 400, function(){\n loading.remove();\n });\n\n if( 0 == data.saves.length ) {\n jQuery( '#nf-form-' + formInstanceID + '-cont .nf-saves-cont table' ).remove();\n return;\n }\n\n var save = data.saves.pop();\n\n formModel.set( 'save_id', save.save_id );\n\n var fields = JSON.parse( save.fields );\n\n Backbone.Radio.channel( 'forms' ).request( 'save:updateFieldsCollection',\n formInstanceID,\n fields\n );\n\n jQuery( '#nf-form-' + formInstanceID + '-cont .nf-saves-cont table' ).remove();\n },\n error: function(){\n\n }\n });\n },\n\n renderSaveTable: function( formModel ) {\n\n // render loading view\n var loading = new SavesLoadingView();\n loading.render();\n\n var collection = new SavesCollection( [], {\n formModel: formModel\n });\n collection.fetch({\n success: function(){\n loading.remove();\n var collectionView = new SavesCollectionView( {\n collection: collection,\n } );\n }\n });\n },\n\n});\n","/**\n * Save Progress Passive Controller\n */\nvar nfSaveProgressPassiveController = Marionette.Object.extend({\n\n initialize: function( options ) {\n\n this.storage = window.localStorage;\n\n this.listenTo( nfRadio.channel( 'form' ), 'render:view', this.onFormRendered );\n },\n\n onFormRendered: function( formView ) {\n var formModel = formView.model;\n\n if( ! formModel.get( 'save_progress_passive_mode' ) ) return;\n\n var formInstanceID = formModel.get( 'id' );\n var formID = formInstanceID.toString().split('_')[0];\n\n var formData = this.storage.getItem( 'nfForm-' + formID );\n\n Backbone.Radio.channel( 'forms' ).request( 'save:updateFieldsCollection',\n formModel.get( 'id' ),\n JSON.parse( formData )\n );\n\n this.listenTo( nfRadio.channel( 'fields' ), 'change:modelValue', this.onChangeModelValue );\n this.listenTo( nfRadio.channel( 'form-' + formInstanceID ), 'submit:response', function(){\n this.storage.removeItem( 'nfForm-' + formID );\n } );\n },\n\n onChangeModelValue: function( fieldModel ) {\n\n var formInstanceID = fieldModel.get( 'formID' );\n var formID = formInstanceID.toString().split('_')[0];\n\n var name = 'nfForm-' + formID;\n\n\n var formModel = Backbone.Radio.channel( 'app' ).request( 'get:form', formInstanceID );\n\n if( 'undefined' == typeof formModel ) return;\n if( ! formModel.get( 'save_progress_passive_mode' ) ) return;\n\n // var formData = this.cookie.get( name ) || {};\n // formData[ fieldModel.get( 'id' ) ] = fieldModel.get( 'value' );\n\n var fieldData = Backbone.Radio.channel( 'forms' ).request( 'save:fieldAttributes', formInstanceID );\n\n this.storage.setItem( name, JSON.stringify( fieldData ) );\n },\n\n});\n","/**\n * Save Progress Save Button Controller\n */\nvar nfSaveProgressSaveButtonController = Marionette.Object.extend({\n\n endpoint: '',\n\n initialize: function( options ) {\n this.endpoint = nfSaveProgress.restApiEndpoint || '';\n\n Backbone.Radio.channel( 'forms' ).reply( 'maybe:validate', this.maybeValidate );\n\n this.listenTo( nfRadio.channel( 'save' ), 'init:model', this.registerHandlers );\n this.listenTo( nfRadio.channel( 'save' ), 'render:view', this.maybeHide );\n this.listenTo( nfRadio.channel( 'save' ), 'click:field', this.click );\n },\n\n maybeValidate: function( formModel ) {\n if( formModel.getExtra( 'saveProgress' ) ) return false;\n },\n\n registerHandlers: function( fieldModel ) {\n var formChannel = Backbone.Radio.channel( 'form-' + fieldModel.get( 'formID' ) );\n fieldModel.listenTo( formChannel, 'before:submit', this.beforeSubmit, fieldModel );\n fieldModel.listenTo( formChannel, 'submit:cancel', this.reset.bind( fieldModel ) );\n fieldModel.listenTo( formChannel, 'submit:response', this.reset.bind( fieldModel ) );\n fieldModel.listenTo( formChannel, 'submit:response', this.response.bind( this ) );\n\n var formID = fieldModel.get( 'formID' );\n fieldModel.listenTo( formChannel, 'submit:failed', function(){\n Backbone.Radio.channel( 'form-' + formID ).request( 'remove:extra', 'saveProgress' );\n } );\n fieldModel.listenTo( formChannel, 'submit:response', function(){\n Backbone.Radio.channel( 'form-' + formID ).request( 'remove:extra', 'saveProgress' );\n } );\n\n // Add progress to Save field submission data.\n Backbone.Radio.channel( 'save' ).reply( 'get:submitData', function( fieldData ){\n formID = fieldModel.get( 'formID' );\n var formModel = Backbone.Radio.channel( 'app' ).request( 'get:form', formID );\n\n if( 'undefined' != typeof formModel ){\n fieldData.save_id = formModel.get( 'save_id' );\n }\n\n return fieldData;\n } );\n this.listenTo( nfRadio.channel( 'submit' ), 'init:model', this.registerSubmitHandlers );\n },\n\n registerSubmitHandlers: function( fieldModel ) {\n fieldModel.listenTo( nfRadio.channel( 'form-' + fieldModel.get( 'formID' ) ), 'before:submit', function( formModel ){\n\n // If this isn't a save, then bail.\n if( ! Backbone.Radio.channel( 'form-' + formModel.get( 'id' ) ).request( 'get:extra', 'saveProgress' ) ) return;\n\n // Reset the submit button's label, because this is a save, not a submit.\n if ( 'undefined' != typeof this.get( 'oldLabel' ) ) {\n this.set( 'label', this.get( 'oldLabel' ) );\n }\n this.set( 'disabled', true );\n this.trigger( 'reRender' );\n }, fieldModel );\n },\n\n beforeSubmit: function() {\n this.set( 'disabled', true );\n this.trigger( 'reRender' );\n },\n\n maybeHide: function( fieldView ) {\n if( nfSaveProgress.currentUserID ) return;\n setTimeout(function(){\n fieldView.remove();\n }, 500);\n },\n\n click: function( e, fieldModel ) {\n\n fieldModel.set( 'disabled', true );\n fieldModel.set( 'oldLabel', fieldModel.get( 'label' ) );\n fieldModel.set( 'label', fieldModel.get( 'processing_label' ) );\n fieldModel.trigger( 'reRender' );\n\n // at the moment, Stripe needs this to be able to process properly\n nfRadio.channel( 'nf-save-progress').trigger( 'save-click', true );\n\n var formInstanceID = fieldModel.get( 'formID' );\n var formModel = Backbone.Radio.channel( 'app' ).request( 'get:form', formInstanceID );\n\n // Flag the submission as a Save.\n var saveData = Backbone.Radio.channel( 'forms' ).request( 'save:fieldAttributes', formInstanceID );\n Backbone.Radio.channel( 'form-' + formInstanceID ).request( 'add:extra', 'saveProgress', saveData );\n\n // Submit the form.\n Backbone.Radio.channel( 'form-' + formInstanceID ).request( 'submit', formModel );\n },\n\n response: function( response, textStatus, jqXHR, formID ) {\n\n /* If we are hiding the form, then also hide the saves table. */\n if( 1 == response.data.settings.hide_complete ){\n jQuery( '#nf-form-' + response.data.form_id + '-cont .nf-saves-cont table' ).hide();\n }\n },\n\n reset: function(){\n this.set( 'disabled', false );\n if( 'undefined' != typeof this.get( 'oldLabel' ) ) {\n this.set('label', this.get('oldLabel'));\n }\n this.trigger( 'reRender' );\n }\n\n});\n","var SaveModel = Backbone.Model.extend( {\n\n parse: function( response, options )\n {\n response.fields = JSON.parse( response.fields );\n return response;\n }\n});\n","var SavesCollection = Backbone.Collection.extend( {\n model: SaveModel,\n\n url: function() {\n var formInstanceID = this.formModel.get( 'id' );\n var formID = formInstanceID.toString().split('_')[0];\n return nfSaveProgress.restApiEndpoint + 'saves/' + formID;\n },\n\n initialize: function( models, options ) {\n this.formModel = options.formModel;\n },\n\n parse: function( response ){\n if( 'undefined' == typeof response.saves ) return;\n return response.saves;\n },\n\n setAuthHeaders: function( xhr ) {\n // If we have a localized nonce, pass that along with each sync.\n if ( 'undefined' !== typeof wpApiSettings.nonce ) {\n xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce );\n }\n },\n\n // https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/\n sync: function( method, model, options ) {\n options = options || {};\n options.beforeSend = this.setAuthHeaders;\n\n // Continue by calling Bacckbone's sync.\n return Backbone.sync( method, model, options );\n }\n});\n","var SaveItemView = Marionette.ItemView.extend({\n tagName: 'tr',\n className: 'nf-saves-item',\n template: '#tmpl-nf-save-item',\n\n events: {\n 'click .load': function( e ){\n\n jQuery( e.target ).closest( '.nf-saves-cont' ).find( '.active' ).removeClass( 'active' );\n jQuery( e.target ).closest( 'tr' ).addClass( 'active' );\n\n var formInstanceID = this.model.get( 'form_id' );\n // var formID = formInstanceID.toString().split('_')[0];\n\n Backbone.Radio.channel( 'forms' ).request( 'save:updateFieldsCollection', formInstanceID,\n this.model.get( 'fields' )\n );\n\n var formModel = Backbone.Radio.channel( 'app' ).request( 'get:form', formInstanceID );\n if( 'undefined' != typeof formModel ){\n formModel.set( 'save_id', this.model.get( 'save_id' ) );\n }\n },\n 'click .cancel': function( e ){\n jQuery( e.target ).closest( 'tr' ).removeClass( 'active' );\n\n var formInstanceID = this.model.get( 'form_id' );\n // var formID = formInstanceID.toString().split('_')[0];\n\n var formModel = Backbone.Radio.channel( 'app' ).request( 'get:form', formInstanceID );\n var fieldsCollection = formModel.get( 'fields' );\n var defaults = formModel.get( 'loadedFields' );\n fieldsCollection.reset( defaults );\n }\n },\n\n templateHelpers: function(){\n var view = this;\n return {\n updated: this.model.get( 'updated' ),\n columns: function(){\n var formModel = nfRadio.channel( 'app' ).request( 'get:form', view.model.get( 'form_id' ) );\n var columns = formModel.get( 'save_progress_table_columns' );\n var $return = '';\n _.each( columns, function( column ){\n // .filter was .find, .find is not supported by IE\n var fieldModel = formModel.get( 'fields' ).filter( function( field ){\n return column.field == field.get( 'key' );\n });\n // .filter was .find, .find is not supported by IE\n var savedField = view.model.get( 'fields' ).filter( function( field ){\n var fieldInstanceId = field.id;\n var fieldId = fieldInstanceId.toString().split('_')[0];\n\n if( 'undefined' != typeof ( fieldModel ) ) {\n /**\n * Becuase we used .filter instead of .find above for\n * fieldModel, it returns a an array\n * and we must access the first. We only expect one.\n */\n var fieldModelInstanceId = fieldModel[ 0 ].get( 'id' );\n var fieldModelId = fieldModelInstanceId.toString().split('_')[0];\n return fieldModelId == fieldId;\n } else {\n return '';\n }\n });\n /**\n * Becuase we used .filter above instead of .find for savedField,\n * it returns a an array\n * and we must access the first. We only expect one.\n */\n var fieldValue = ( 'undefined' != typeof savedField[ 0 ] ) ? savedField[ 0 ].value : '';\n $return += '' + fieldValue + '';\n })\n return $return;\n }\n }\n }\n});\n","var SaveEmptyView = Marionette.ItemView.extend({\n tagName: 'nf-save',\n template: '#tmpl-nf-save-empty',\n\n initialize: function() {\n this.on( 'render', this.afterRender );\n },\n\n afterRender: function(){\n var that = this;\n setTimeout(function(){\n jQuery( that.$el ).slideUp( 'slow', function(){\n that.remove();\n });\n }, 2000);\n }\n});\n","var SavesLoadingView = Marionette.ItemView.extend({\n tagName: \"nf-section\",\n template: \"#tmpl-nf-saves-loading\",\n el: \".form-save-loading\"\n});\n","var SavesCollectionView = Marionette.CompositeView.extend({\n tagName: 'table',\n childView: SaveItemView,\n emptyView: SaveEmptyView,\n childViewContainer: 'tbody',\n template: '#tmpl-nf-save-table',\n\n initialize: function( options ){\n\n var formInstanceID = this.collection.formModel.get( 'id' );\n var formID = formInstanceID.toString().split('_')[0];\n\n this.collection.each(function(model){\n model.set('form_id', formInstanceID);\n });\n\n // Set element selector\n this.el = '#nf-form-' + formInstanceID + '-cont';\n\n // Update element cache\n this.$el = jQuery(this.el).find('.nf-saves-cont table');\n\n this.render();\n\n this.listenTo( Backbone.Radio.channel( 'form-' + formInstanceID ), 'submit:response', function(){\n var collectionView = this;\n this.collection.fetch({\n success: function(){\n collectionView.render();\n }\n });\n }, this );\n },\n\n onRender: function(){\n if( 0 == this.collection.length ){\n this.$el.hide();\n this.$el.parent().hide();\n } else {\n this.$el.show();\n this.$el.parent().show();\n }\n },\n\n templateHelpers: function(){\n var view = this;\n return {\n headers: function(){\n var formModel = view.collection.formModel;\n var columns = formModel.get( 'save_progress_table_columns' );\n var $return = '';\n _.each( columns, function( column ){\n var fieldModel = formModel.get( 'fields' ).find( function( field ){\n return column.field == field.get( 'key' );\n });\n if( 'undefined' != typeof( fieldModel ) ) {\n $return += '' + fieldModel.get( 'label' ) + '';\n } else {\n $return += '';\n }\n });\n return $return;\n }\n }\n }\n});\n","var NF_SaveProgress = Marionette.Application.extend({\n\n initialize: function( options ){\n\n // Load Controllers.\n new nfSaveProgressActiveController();\n new nfSaveProgressSaveButtonController();\n new nfSaveProgressPassiveController();\n\n Backbone.Radio.channel( 'forms' ).reply( 'save:fieldAttributes', this.getfieldAttributes, this );\n Backbone.Radio.channel( 'forms' ).reply( 'save:updateFieldsCollection', this.updateFieldsCollection, this );\n },\n\n getfieldAttributes: function( formID ) {\n var formModel = Backbone.Radio.channel( 'app' ).request( 'get:form', formID );\n\n var fields = formModel.get( 'fields' ).filter( function( fieldModel, key ){\n if ( 'html' == fieldModel.get( 'type' ) ) return false;\n // If we don't have a value...\n // AND our field is anything other than a table editor...\n if ( ! fieldModel.get( 'value' ) && 'table_editor' != fieldModel.get( 'type' ) ) return false;\n // If the model is clean...\n // AND it has a type of anything other than file upload or table editor...\n if ( fieldModel.get( 'clean' ) && 'file_upload' != fieldModel.get( 'type' ) && 'table_editor' != fieldModel.get( 'type' ) ) return false;\n return true;\n });\n\n var omit = [\n /* core */ 'admin_label', 'element_class', 'required', 'container_class', 'custom_mask','mask', 'manual_key', 'drawerDisabled', 'input_limit', 'input_limit_msg', 'input_limit_type', 'help_text', 'desc_text', 'created_at', 'editActive', 'disabled', 'afterField', 'beforeField', 'classes', 'confirm_field', 'element_templates', 'errors', 'formID', 'key', 'label', 'label_pos', 'mirror_field', 'objectDomain', 'objectType', 'old_classname', 'order', 'parentType', 'placeholder', 'reRender', 'type', 'wrap_template',\n /* List Fields */ 'options',\n /* Table Editor */ 'hot', 'tableConfig',\n /* File Uploads */ 'uploadNonce', 'upload_types',\n /* Layout & Styles */ 'cellcid'\n ];\n\n // Attributes to be saved.\n var atts = fields.map( function( fieldModel, key ) {\n return _.omit( fieldModel.attributes, function( value, key, object ){\n\n // Omit function properties.\n if( 'function' == typeof value ) return true;\n\n // Omit known \"non-essential\" core attributes.\n if( -1 !== omit.indexOf( key ) ) return true;\n\n // Omit Layout & Styles attributes.\n if( -1 !== key.indexOf( '_styles_' ) ) return true;\n return false;\n });\n });\n return atts;\n },\n\n updateFieldsCollection: function( formInstanceID, savedFields ){\n var formModel = Backbone.Radio.channel( 'app' ).request( 'get:form', formInstanceID );\n var fieldsCollection = formModel.get( 'fields' );\n\n var instanceID = formInstanceID.toString().split('_')[1];\n\n var defaults = formModel.get( 'loadedFields' );\n fieldsCollection.reset( defaults );\n\n _.each( savedFields, function( savedField ){\n var fieldID = parseInt( savedField.id );\n\n if('undefined' !== typeof instanceID){\n fieldID += '_' + instanceID;\n }\n\n var field = fieldsCollection.get( fieldID );\n var atts = _.omit( savedField, [\n /* Core */ 'id', 'required',\n /* File Uploads */ 'uploadNonce', 'upload_types'\n ] );\n\n // Force `visible` attribute to a String\n if( 'undefined' != typeof atts.visible ) {\n atts.visible = atts.visible.toString();\n }\n\n if( 'undefined' != typeof field ) {\n field.set(atts);\n }\n });\n\n Backbone.Radio.channel( 'fields' ).trigger( 'reset:collection', fieldsCollection );\n }\n});\n","jQuery( document ).ready( function( $ ) {\n var nfSaveProgress = new NF_SaveProgress();\n nfSaveProgress.start();\n});\n"]}