{"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","parsed","nameEQ","ca","split","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","toString","findWhere","renderSaveTable","loadLastSave","jQuery","loading","SavesLoadingView","requestData","render","_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","fieldId","id","fieldValue","SaveEmptyView","on","afterRender","that","el","CompositeView","childView","emptyView","childViewContainer","collectionView","onRender","parent","show","headers","NF_SaveProgress","Application","getfieldAttributes","updateFieldsCollection","key","omit","map","attributes","object","savedFields","instanceID","fieldID","atts","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' ).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' ).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' ).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 ) && 0 < fieldModel.length ) {\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 += '<td>' + fieldValue + '</td>';\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 += '<th>' + fieldModel.get( 'label' ) + '</th>';\n                    } else {\n                        $return += '<th></th>';\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"]}