(function (){
var requirejs, require, define;
(function (undef){
var main, req, makeMap, handlers,
defined={},
waiting={},
config={},
defining={},
hasOwn=Object.prototype.hasOwnProperty,
aps=[].slice,
jsSuffixRegExp=/\.js$/;
function hasProp(obj, prop){
return hasOwn.call(obj, prop);
}
function normalize(name, baseName){
var nameParts, nameSegment, mapValue, foundMap, lastIndex,
foundI, foundStarMap, starI, i, j, part,
baseParts=baseName&&baseName.split("/"),
map=config.map,
starMap=(map&&map['*'])||{};
if(name&&name.charAt(0)==="."){
if(baseName){
name=name.split('/');
lastIndex=name.length - 1;
if(config.nodeIdCompat&&jsSuffixRegExp.test(name[lastIndex])){
name[lastIndex]=name[lastIndex].replace(jsSuffixRegExp, '');
}
name=baseParts.slice(0, baseParts.length - 1).concat(name);
for (i=0; i < name.length; i +=1){
part=name[i];
if(part==="."){
name.splice(i, 1);
i -=1;
}else if(part===".."){
if(i===1&&(name[2]==='..'||name[0]==='..')){
break;
}else if(i > 0){
name.splice(i - 1, 2);
i -=2;
}}
}
name=name.join("/");
}else if(name.indexOf('./')===0){
name=name.substring(2);
}}
if((baseParts||starMap)&&map){
nameParts=name.split('/');
for (i=nameParts.length; i > 0; i -=1){
nameSegment=nameParts.slice(0, i).join("/");
if(baseParts){
for (j=baseParts.length; j > 0; j -=1){
mapValue=map[baseParts.slice(0, j).join('/')];
if(mapValue){
mapValue=mapValue[nameSegment];
if(mapValue){
foundMap=mapValue;
foundI=i;
break;
}}
}}
if(foundMap){
break;
}
if(!foundStarMap&&starMap&&starMap[nameSegment]){
foundStarMap=starMap[nameSegment];
starI=i;
}}
if(!foundMap&&foundStarMap){
foundMap=foundStarMap;
foundI=starI;
}
if(foundMap){
nameParts.splice(0, foundI, foundMap);
name=nameParts.join('/');
}}
return name;
}
function makeRequire(relName, forceSync){
return function (){
var args=aps.call(arguments, 0);
if(typeof args[0]!=='string'&&args.length===1){
args.push(null);
}
return req.apply(undef, args.concat([relName, forceSync]));
};}
function makeNormalize(relName){
return function (name){
return normalize(name, relName);
};}
function makeLoad(depName){
return function (value){
defined[depName]=value;
};}
function callDep(name){
if(hasProp(waiting, name)){
var args=waiting[name];
delete waiting[name];
defining[name]=true;
main.apply(undef, args);
}
if(!hasProp(defined, name)&&!hasProp(defining, name)){
throw new Error('No ' + name);
}
return defined[name];
}
function splitPrefix(name){
var prefix,
index=name ? name.indexOf('!'):-1;
if(index > -1){
prefix=name.substring(0, index);
name=name.substring(index + 1, name.length);
}
return [prefix, name];
}
makeMap=function (name, relName){
var plugin,
parts=splitPrefix(name),
prefix=parts[0];
name=parts[1];
if(prefix){
prefix=normalize(prefix, relName);
plugin=callDep(prefix);
}
if(prefix){
if(plugin&&plugin.normalize){
name=plugin.normalize(name, makeNormalize(relName));
}else{
name=normalize(name, relName);
}}else{
name=normalize(name, relName);
parts=splitPrefix(name);
prefix=parts[0];
name=parts[1];
if(prefix){
plugin=callDep(prefix);
}}
return {
f: prefix ? prefix + '!' + name:name,
n: name,
pr: prefix,
p: plugin
};};
function makeConfig(name){
return function (){
return (config&&config.config&&config.config[name])||{};};
}
handlers={
require: function (name){
return makeRequire(name);
},
exports: function (name){
var e=defined[name];
if(typeof e!=='undefined'){
return e;
}else{
return (defined[name]={});
}},
module: function (name){
return {
id: name,
uri: '',
exports: defined[name],
config: makeConfig(name)
};}};
main=function (name, deps, callback, relName){
var cjsModule, depName, ret, map, i,
args=[],
callbackType=typeof callback,
usingExports;
relName=relName||name;
if(callbackType==='undefined'||callbackType==='function'){
deps = !deps.length&&callback.length ? ['require', 'exports', 'module']:deps;
for (i=0; i < deps.length; i +=1){
map=makeMap(deps[i], relName);
depName=map.f;
if(depName==="require"){
args[i]=handlers.require(name);
}else if(depName==="exports"){
args[i]=handlers.exports(name);
usingExports=true;
}else if(depName==="module"){
cjsModule=args[i]=handlers.module(name);
}else if(hasProp(defined, depName) ||
hasProp(waiting, depName) ||
hasProp(defining, depName)){
args[i]=callDep(depName);
}else if(map.p){
map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
args[i]=defined[depName];
}else{
throw new Error(name + ' missing ' + depName);
}}
ret=callback ? callback.apply(defined[name], args):undefined;
if(name){
if(cjsModule&&cjsModule.exports!==undef &&
cjsModule.exports!==defined[name]){
defined[name]=cjsModule.exports;
}else if(ret!==undef||!usingExports){
defined[name]=ret;
}}
}else if(name){
defined[name]=callback;
}};
requirejs=require=req=function (deps, callback, relName, forceSync, alt){
if(typeof deps==="string"){
if(handlers[deps]){
return handlers[deps](callback);
}
return callDep(makeMap(deps, callback).f);
}else if(!deps.splice){
config=deps;
if(config.deps){
req(config.deps, config.callback);
}
if(!callback){
return;
}
if(callback.splice){
deps=callback;
callback=relName;
relName=null;
}else{
deps=undef;
}}
callback=callback||function (){};
if(typeof relName==='function'){
relName=forceSync;
forceSync=alt;
}
if(forceSync){
main(undef, deps, callback, relName);
}else{
setTimeout(function (){
main(undef, deps, callback, relName);
}, 4);
}
return req;
};
req.config=function (cfg){
return req(cfg);
};
requirejs._defined=defined;
define=function (name, deps, callback){
if(typeof name!=='string'){
throw new Error('See almond README: incorrect module build, no module name');
}
if(!deps.splice){
callback=deps;
deps=[];
}
if(!hasProp(defined, name)&&!hasProp(waiting, name)){
waiting[name]=[name, deps, callback];
}};
define.amd={
jQuery: true
};}());
define("../lib/almond", function(){});
define('models/whenModel',[], function(){
var model=Backbone.Model.extend({
initialize: function(models, options){
if(! this.get('key')||! this.get('comparator') ) return;
if('calc'==this.get('type') ){
var calcModel=nfRadio.channel('form-' + this.collection.options.condition.collection.formModel.get('id') ).request('get:calc', this.get('key') );
if('undefined'==typeof calcModel) return;
this.listenTo(calcModel, 'change:value', this.updateCalcCompare);
this.updateCalcCompare(calcModel);
}else{
var fieldModel=nfRadio.channel('form-' + options.condition.collection.formModel.get('id') ).request('get:fieldByKey', this.get('key') );
if('undefined'==typeof fieldModel) return;
fieldModel.on('change:value', this.updateFieldCompare, this);
this.listenTo(nfRadio.channel('field-' + fieldModel.get('id') ), 'keyup:field', this.maybeupdateFieldCompare);
this.updateFieldCompare(fieldModel);
fieldModel.on('change:visible', this.updateFieldCompare, this);
}},
updateCalcCompare: function(calcModel){
this.updateCompare(calcModel.get('value') );
},
maybeupdateFieldCompare: function(el, fieldModel, keyCode){
if('checkbox'==fieldModel.get('type') ){
var fieldValue=('checked'==jQuery(el).attr('checked') ) ? 1:0;
}else if('listcheckbox'==fieldModel.get('type') ){
var fieldValue=fieldModel.get('value').join();
}else if('date'==fieldModel.get ('type') ){
var fieldValue=fieldModel.get('value');
if(_.isEmpty(fieldValue) ){
fieldValue='1970/01/01';
}
let date_mode=fieldModel.get('date_mode');
if('undefined'==typeof date_mode){
date_mode='date_only';
}
let date=0;
if('time_only'==fieldModel.get('date_mode') ){
date='1970/01/01';
}else{
date=fieldValue;
}
let hour=fieldModel.get('selected_hour');
if('undefined'==typeof hour){
hour='00';
}
let minute=fieldModel.get('selected_minute');
if('undefined'==typeof minute){
minute='00';
}
if('date_and_time'==date_mode&&'1970/01/01'==date){
fieldValue=false;
}else{
fieldValue=date + ' ' + hour + ':' + minute + ' UT';
let dateObject=new Date(fieldValue);
fieldValue=Math.floor(dateObject.getTime() / 1000);
}}else{
var fieldValue=jQuery(el).val();
}
this.updateFieldCompare(fieldModel, null, fieldValue);
},
updateCompare: function(value){
var this_val=this.get('value');
if('calc'===this.get('type') ){
this_val=Number(this_val);
value=Number(value);
}
var status=this.compareValues[ this.get('comparator') ](value, this_val);
this.set('status', status);
},
updateFieldCompare: function(fieldModel, val, fieldValue){
if(_.isEmpty(fieldValue) ){
fieldValue=fieldModel.get('value');
}
if('checkbox'==fieldModel.get('type') ){
if(0==fieldValue){
fieldValue='unchecked';
}else{
fieldValue='checked';
}}else if('date'==fieldModel.get('type') ){
if(_.isEmpty(fieldValue) ){
fieldValue='1970/01/01';
}
let date_mode=fieldModel.get('date_mode');
if('undefined'==typeof date_mode){
date_mode='date_only';
}
let date=0;
if('time_only'==fieldModel.get('date_mode') ){
date='1970/01/01';
}else{
date=fieldValue;
}
let hour=fieldModel.get('selected_hour');
if('undefined'==typeof hour){
hour='00';
}
let ampm=fieldModel.get('selected_ampm');
if('undefined'!=typeof ampm){
if('pm'==ampm&&'12'!=hour){
hour=parseInt(hour) + 12;
}else if('am'==ampm&&'12'==hour){
hour='00';
}}
let minute=fieldModel.get('selected_minute');
if('undefined'==typeof minute){
minute='00';
}
if('date_and_time'==date_mode&&'1970/01/01'==date){
fieldValue=false;
}else{
fieldValue=date + ' ' + hour + ':' + minute + ' UT';
let dateObject=new Date(fieldValue);
fieldValue=Math.floor(dateObject.getTime() / 1000);
}}
this.updateCompare(fieldValue);
if(! fieldModel.get('visible') ){
this.set('status', false);
}},
compareValues: {
'equal': function(a, b){
return a==b;
},
'notequal': function(a, b){
return a!=b;
},
'contains': function(a, b){
if(jQuery.isArray(a) ){
return a.indexOf(b) >=0;
}else{
if(b.indexOf('"') >=0){
b=b.replace(/['"]+/g, '');
return new RegExp("\\b" + b + "\\b").test(a);
}
return a.toLowerCase().indexOf(b.toLowerCase()) >=0;
}},
'notcontains': function(a, b){
return ! this.contains(a, b);
},
'greater': function(a, b){
if(jQuery.isNumeric(b) ){
return parseFloat(a) > parseFloat(b);
}else if('string'==typeof a){
return 0 < a.length;
}},
'less': function(a, b){
if(jQuery.isNumeric(b) ){
return parseFloat(a) < parseFloat(b);
}else if('string'==typeof a){
return 0 >=a.length;
}},
'greaterequal': function(a, b){
return parseFloat(a) > parseFloat(b)||parseFloat(a)==parseFloat(b);
},
'lessequal': function(a, b){
return parseFloat(a) < parseFloat(b)||parseFloat(a)==parseFloat(b);
}}
});
return model;
});
define('models/whenCollection',['models/whenModel'], function(WhenModel){
var collection=Backbone.Collection.extend({
model: WhenModel,
initialize: function(models, options){
this.options=options;
}});
return collection;
});
define('models/conditionModel',[ 'models/whenCollection' ], function(WhenCollection){
var model=Backbone.Model.extend({
initialize: function(options){
this.set('when', new WhenCollection(this.get('when'), { condition: this }) );
this.get('when').on('change:status', this.checkWhen, this);
this.checkWhen();
},
checkWhen: function(){
var statusResults=this.get('when').pluck('status');
var connectors=this.get('when').pluck('connector');
var allAND=_.every(_.values(connectors), function(v){ return v=='AND' }, this);
if(allAND){
var status=_.every(_.values(statusResults), function(v){ return v; }, this);
}else{
var status=_.some(_.values(statusResults), function(v){ return v; }, this);
}
if(status){
_.each(this.get('then'), function(then, index){
nfRadio.channel('condition:trigger').request(then.trigger, this, then);
}, this);
}else{
_.each(this.get('else'), function(elseData, index){
nfRadio.channel('condition:trigger').request(elseData.trigger, this, elseData);
}, this);
}}
});
return model;
});
define('models/conditionCollection',['models/conditionModel'], function(ConditionModel){
var collection=Backbone.Collection.extend({
model: ConditionModel,
initialize: function(models, options){
this.formModel=options.formModel;
}});
return collection;
});
define('controllers/initCollection',[ 'models/conditionCollection' ], function(ConditionCollection){
var controller=Marionette.Object.extend({
initialize: function(formModel){
this.collection=new ConditionCollection(formModel.get('conditions'), { formModel: formModel });
this.listenTo(nfRadio.channel('fields'), 'reset:collection', this.resetCollection);
},
resetCollection: function(fieldsCollection){
var formModel=fieldsCollection.options.formModel;
this.collection=new ConditionCollection(formModel.get('conditions'), { formModel: formModel });
}});
return controller;
});
define('controllers/showHide',[], function(){
var controller=Marionette.Object.extend({
initialize: function(){
nfRadio.channel('condition:trigger').reply('hide_field', this.hideField, this);
nfRadio.channel('condition:trigger').reply('show_field', this.showField, this);
},
hideField: function(conditionModel, then){
var targetFieldModel=nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:fieldByKey', then.key);
if('undefined'==typeof targetFieldModel) return;
targetFieldModel.set('visible', false);
if(! targetFieldModel.get('clean') ){
targetFieldModel.trigger('change:value', targetFieldModel);
}
nfRadio.channel('fields').request('remove:error', targetFieldModel.get('id'), 'required-error');
},
showField: function(conditionModel, then){
var targetFieldModel=nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:fieldByKey', then.key);
if('undefined'==typeof targetFieldModel) return;
targetFieldModel.set('visible', true);
if(! targetFieldModel.get('clean') ){
targetFieldModel.trigger('change:value', targetFieldModel);
}
if('recaptcha'===targetFieldModel.get('type') ){
this.renderRecaptcha();
}
if('turnstile'===targetFieldModel.get('type') ){
this.renderTurnstile();
}
var viewEl={ el: nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:el') };
nfRadio.channel('form').request('init:help', viewEl);
},
renderRecaptcha: function(){
jQuery('.g-recaptcha').each(function(){
var callback=jQuery(this).data('callback');
var fieldID=jQuery(this).data('fieldid');
if(typeof window[ callback ]!=='function'){
window[ callback ]=function(response){
nfRadio.channel('recaptcha').request('update:response', response, fieldID);
};}
var opts={
theme: jQuery(this).data('theme'),
sitekey: jQuery(this).data('sitekey'),
callback: callback
};
grecaptcha.render(jQuery(this)[0], opts);
});
},
renderTurnstile: function(){
if(typeof turnstile==='undefined'){
return;
}
jQuery('.cf-turnstile, .nf-cf-turnstile').each(function(){
var element=this;
var sitekey=jQuery(element).data('sitekey');
var fieldID=jQuery(element).data('fieldid');
if(! sitekey||jQuery(element).children().length > 0){
return;
}
try {
var callbackName='nfTurnstileCallback_' + fieldID;
window[ callbackName ]=function(token){
var input=document.getElementById('nf-field-' + fieldID);
if(input){
input.value=token;
jQuery(input).trigger('change');
jQuery(input).closest('.field-wrap').removeClass('nf-error');
jQuery(input).closest('.field-wrap').find('.nf-error-msg').remove();
}
if(typeof nfRadio!=='undefined'&&nfRadio.channel){
try {
nfRadio.channel('turnstile').request('update:response', token, fieldID);
} catch(e){
}}
};
turnstile.render(element, {
sitekey: sitekey,
theme: jQuery(element).data('theme')||'auto',
size: jQuery(element).data('size')||'normal',
callback: callbackName
});
} catch(e){
}});
}});
return controller;
});
define('controllers/changeRequired',[], function(){
var controller=Marionette.Object.extend({
initialize: function(){
nfRadio.channel('condition:trigger').reply('set_required', this.setRequired, this);
nfRadio.channel('condition:trigger').reply('unset_required', this.unsetRequired, this);
},
setRequired: function(conditionModel, then){
var targetFieldModel=nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:fieldByKey', then.key);
if('undefined'==typeof targetFieldModel) return;
targetFieldModel.set('required', 1);
targetFieldModel.trigger('reRender', targetFieldModel);
},
unsetRequired: function(conditionModel, then){
var targetFieldModel=nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:fieldByKey', then.key);
if('undefined'==typeof targetFieldModel) return;
targetFieldModel.set('required', 0);
targetFieldModel.trigger('reRender', targetFieldModel);
nfRadio.channel('fields').request('remove:error', targetFieldModel.get('id'), 'required-error');
}});
return controller;
});
define('controllers/showHideOption',[], function(){
var controller=Marionette.Object.extend({
initialize: function(){
nfRadio.channel('condition:trigger').reply('show_option', this.showOption, this);
nfRadio.channel('condition:trigger').reply('hide_option', this.hideOption, this);
},
showOption: function(conditionModel, then){
var option=this.getOption(conditionModel, then);
option.visible=true;
this.updateFieldModel(conditionModel, then);
},
hideOption: function(conditionModel, then){
var option=this.getOption(conditionModel, then);
option.visible=false;
this.updateFieldModel(conditionModel, then);
},
getFieldModel: function(conditionModel, then){
return nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:fieldByKey', then.key);
},
getOption: function(conditionModel, then){
var targetFieldModel=this.getFieldModel(conditionModel, then);
var options=targetFieldModel.get('options');
return _.find(options, function(option){ return option.value==then.value });
},
updateFieldModel: function(conditionModel, then){
var targetFieldModel=this.getFieldModel(conditionModel, then);
var options=targetFieldModel.get('options');
targetFieldModel.set('options', options);
targetFieldModel.trigger('reRender');
}});
return controller;
});
define('controllers/changeValue',[], function(){
var controller=Marionette.Object.extend({
initialize: function(){
nfRadio.channel('condition:trigger').reply('change_value', this.changeValue, this);
},
changeValue: function(conditionModel, then){
var targetFieldModel=nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:fieldByKey', then.key);
if('checkbox'==targetFieldModel.get('type') ){
if('unchecked'==targetFieldModel.changed.value){
then.value=1;
}else if('checked'==targetFieldModel){
then.value=0;
}}
targetFieldModel.set('value', then.value);
targetFieldModel.trigger('reRender', targetFieldModel);
},
});
return controller;
});
define('controllers/selectDeselect',[], function(){
var controller=Marionette.Object.extend({
initialize: function(){
nfRadio.channel('condition:trigger').reply('select_option', this.selectOption, this);
nfRadio.channel('condition:trigger').reply('deselect_option', this.deselectOption, this);
},
selectOption: function(conditionModel, then){
var targetFieldModel=nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:fieldByKey', then.key);
if(_.contains([ 'listselect', 'listcountry', 'liststate' ], targetFieldModel.get('type') )){
targetFieldModel.set('clean', false);
}
var options=targetFieldModel.get('options');
var option=_.find(options, { value: then.value });
option.selected=1;
targetFieldModel.set('options', options);
if(_.contains([ 'listselect', 'listcountry', 'liststate' ], targetFieldModel.get('type') )){
targetFieldModel.set('value', option.value);
}else{
var value=targetFieldModel.get('value');
if(_.isArray(value) ){
if(0 > value.indexOf(option.value) ){
value.push(option.value);
targetFieldModel.set('value', '');
}}else{
value=option.value;
}
targetFieldModel.set('value', value);
}
targetFieldModel.trigger('reRender', targetFieldModel);
},
deselectOption: function(conditionModel, then){
var targetFieldModel=nfRadio.channel('form-' + conditionModel.collection.formModel.get('id') ).request('get:fieldByKey', then.key);
var options=targetFieldModel.get('options');
var option=_.find(options, { value: then.value });
option.selected=0;
targetFieldModel.set('options', options);
var currentValue=targetFieldModel.get('value');
if(_.isArray(currentValue) ){
currentValue=_.without(currentValue, then.value);
}else{
currentValue='';
}
targetFieldModel.set('value', currentValue);
targetFieldModel.trigger('reRender', targetFieldModel);
},
});
return controller;
});
define('controllers/actions',[], function(){
var controller=Marionette.Object.extend({
actions: {},
initialize: function(){
nfRadio.channel('condition:trigger').reply('activate_action', this.activateAction, this);
nfRadio.channel('condition:trigger').reply('deactivate_action', this.deactivateAction, this);
nfRadio.channel('actions').reply('get:status', this.getStatus, this);
},
activateAction: function(conditionModel, thenObject){
this.actions[ thenObject.key ]=true;
console.log('activate action');
},
deactivateAction: function(conditionModel, thenObject){
console.log('deactivate action');
this.actions[ thenObject.key ]=false;
},
getStatus: function($id){
return this.actions[ $id ];
}});
return controller;
});
var nfRadio=Backbone.Radio;
require([ 'controllers/initCollection', 'controllers/showHide', 'controllers/changeRequired', 'controllers/showHideOption', 'controllers/changeValue', 'controllers/selectDeselect', 'controllers/actions' ], function(InitCollection, ShowHide, ChangeRequired, ShowHideOption, ChangeValue, SelectDeselect, Actions){
var NFConditionalLogic=Marionette.Application.extend({
initialize: function(options){
this.listenTo(nfRadio.channel('form'), 'after:loaded', this.loadControllers);
},
loadControllers: function(formModel){
new ShowHide();
new ChangeRequired();
new ShowHideOption();
new ChangeValue();
new SelectDeselect();
new Actions();
new InitCollection(formModel);
},
onStart: function(){
}});
var nfConditionalLogic=new NFConditionalLogic();
nfConditionalLogic.start();
});
define("main", function(){});
}());