/g ) );\n\t _.each( spans, function( spanVar ) {\n\t /* See if the span string contains the current\n * fieldModel's key. If so replace the span with a\n * merge tag for evaluation.\n */\n if( -1 < spanVar.indexOf( \"data-key=\\\"field:\" + fieldModel.get( 'key' ) ) ) {\n\t value = value.replace( spanVar, \"{field:\" + fieldModel.get( 'key' ) + \"}\" );\n }\n\t } );\n\n var mergeTag = '{field:' + fieldModel.get( 'key' ) + '}';\n\n const fieldValue = fieldModel.get( 'type' ) === \"repeater\" ? this.displayRepeaterData(fieldModel) : fieldModel.getValue();\n\n\t /* We replace the merge tag with the value\n\t * surrounded by a span so that we can still find it\n\t * and not affect itself or other field merge tags\n\t */\n value = value.replace( mergeTag, \"\"\n + fieldValue + \"\" );\n }, this ) ;\n htmlFieldModel.set( 'value', value );\n htmlFieldModel.trigger( 'reRender' );\n }, this );\n },\n\n displayRepeaterData: function(fieldModel) {\n const repeaterFieldIDs = Object.keys(fieldModel.getValue());\n let returnHTML = \"\", passedFields = [];\n\n _.each(repeaterFieldIDs, function(fieldID){\n if(passedFields.indexOf(fieldID) === -1) {\n const field = nfRadio.channel( 'fields' ).request( 'get:field', fieldID );\n if(typeof field !== \"undefined\"){\n const excluded = ['submit', 'html', 'hidden', 'password', 'passwordconfirm', 'divider', 'hr', 'note', 'unknown', 'button', 'confirm', 'creditcard', 'creditcardcvc', 'creditcardexpiration', 'creditcardfullname', 'creditcardnumber', 'creditcardzip', 'recaptcha', 'recaptcha_v3' ];\n if(excluded.indexOf(field.get('type')) === -1 && field.getValue().toString().length > 0){\n const index = Number(fieldID.split(\"_\").pop()) + 1;\n returnHTML += \"\"+ field.get(\"label\") + \" \" + index + \" : \" + field.getValue() + \"
\";\n passedFields.push(fieldID);\n } \n }\n }\n });\n\n return returnHTML;\n }\n\n });\n\n return controller;\n});\n\n","/**\n* When a form is loaded, enable any help text that appears on the page.\n*/\ndefine('controllers/helpText',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( nfRadio.channel( 'form' ), 'render:view', this.initHelpText );\n\n\t\t\tnfRadio.channel( 'form' ).reply( 'init:help', this.initHelpText );\n\t\t},\n\n\t\tinitHelpText: function( view ) {\n\t\t\tjQuery( view.el ).find( '.nf-help' ).each( function() {\n\t\t\t\tvar jBox = jQuery( this ).jBox( 'Tooltip', {\n\t\t\t\t\ttheme: 'TooltipBorder',\n\t\t\t\t\tcontent: jQuery( this ).data( 'text' ),\n\t\t\t\t\ttrigger: 'mouseenter focus',\n\t\t\t\t\tcloseOnMouseleave: true,\n\t\t\t\t\tcloseOnClick: true\n\t\t\t\t});\n\t\t\t// Hide tooltip on keydown and mouseleave\n\t\t\tjQuery(this).on('keydown mouseleave', function() {\n\t\t\t\tjBox.close();\n\t\t\t});\n\t\t\t} );\n\t\t}\n\t});\n\n\treturn controller;\n } );\n","define('controllers/fieldTextbox',[], function() {\n\tvar controller = Marionette.Object.extend( {\n\t\tinitialize: function() {\n nfRadio.channel( 'textbox' ).reply( 'get:calcValue', this.getCalcValue, this );\n\t\t},\n\n\t\tgetCalcValue: function( fieldModel ) {\n if('currency' == fieldModel.get('mask')){\n var form = nfRadio.channel( 'app' ).request( 'get:form', fieldModel.get( 'formID' ) );\n var currencySymbol = ('undefined' !== typeof form) ? form.get( 'currencySymbol' ) : '';\n var currencySymbolDecoded = jQuery('