<\/div>\");\n input.after(matches);\n\n input.on(\"input\", function () {\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n input.addClass(\"error\");\n component.removeClass(\"valid-reference\");\n\n timeout = setTimeout(function () {\n const val = input.val().toString();\n if (val.length >= 4) {\n const query = {\n str: val\n };\n $.post(component.attr(\"data-api-path\") + \"auto-complete\", query, function (data) {\n if (!data.status) {\n $.eosmsg(data);\n } else {\n if (!data.matches) {\n input.addClass(\"error\");\n }\n\n matches.removeClass(\"hidden\");\n matches.html(\"\");\n\n $.each(data.matches, function () {\n\n const pmatch = $(\"
\" + this.match + \"<\/div>\");\n\n pmatch.on(\"click\", function () {\n input.val($(this).text());\n component.addClass(\"valid-reference\");\n matches.addClass(\"hidden\");\n return -1;\n });\n\n matches.append(pmatch);\n\n if (parseInt(this[\"exact-match\"])) {\n pmatch.addClass(\"exact-match\");\n\n if (this.match === val) {\n component.addClass(\"valid-reference\");\n input.removeClass(\"error\");\n matches.addClass(\"hidden\");\n return -1;\n }\n }\n });\n }\n });\n }\n }, 300);\n });\n }\n\n $(this).find(\".button.auto-gen\").off(\"click\").on(\"click\", function (e) {\n e.preventDefault();\n $.get($(this).attr(\"href\"), function (data) {\n if (!data.newval) {\n alert(data);\n } else {\n component.find(\"input\").val(data.newval);\n }\n });\n });\n\n const input = $(this).find(\"input\");\n\n if (input.attr(\"data-input-filter\")) {\n switch (input.attr(\"data-input-filter\")) {\n case \"currency\":\n input.eosinputcurrency({symbol: $(this).attr(\"data-symbol\")});\n break;\n\n case \"reference-number\":\n input.eosinputreferencenumber({symbol: $(this).attr(\"data-symbol\")});\n break;\n }\n }\n });\n\n };\n\n init();\n\n $(document).on(\"content-changed\", function () {\n init();\n });\n});\n\n\/*******\n\/form\/script\/public\/email\n*********\/\n$(document).ready(function () {\n\n $(\".layout-component.form-component.email\").each(function () {\n const component = $(this);\n const conf = $(this).find(\"input.confirm\");\n if (conf.length) {\n\n const mp = component.find(\"input[data-master='true']\");\n\n component.data({\n validate: function () {\n if (conf.val() !== mp.val()) {\n component.find(\".validate-error\").removeClass(\"hidden\");\n return false;\n }else {\n component.find(\".validate-error\").addClass(\"hidden\");\n return true;\n }\n }\n });\n\n component.find(\"input\").on(\"input\", function () {\n if (conf.val() !== mp.val()) {\n component.addClass(\"error\");\n component.find(\"input\").addClass(\"error\");\n component.removeClass(\"complete\");\n component.find(\"input\").removeClass(\"complete\");\n component.find(\".validate-error\").removeClass(\"hidden\");\n } else {\n component.find(\".validate-error\").addClass(\"hidden\");\n component.removeClass(\"error\");\n component.find(\"input\").removeClass(\"error\");\n component.addClass(\"complete\");\n component.find(\"input\").addClass(\"complete\");\n }\n });\n\n\n }\n });\n\n\n});\n\n\/*******\n\/form\/script\/public\/select\n*********\/\n$(document).ready(function(){\n $(\".layout-component.select\").each(function(){\n var container = $(this);\n if($(this).hasClass(\"searchable\")){\n \n container.find(\".option\").on(\"click\", function(){\n container.find(\".option-search-input\").val($(this).text().trim());\n container.find(\".data-container\").val($(this).attr(\"data-value\").trim());\n $(this).parent().addClass(\"hidden\");\n });\n \n $(this).find(\".option-search-input\").on(\"input\", function(){\n var filter = $(this).val().toLowerCase();\n \n container.find(\".option\").addClass(\"hidden\");\n \n if(!filter.length){\n container.find(\".options\").addClass(\"hidden\");\n }else {\n container.find(\".options\").removeClass(\"hidden\");\n }\n \n container.find(\".option\").each(function(){\n if($(this).text().toLowerCase().indexOf(filter) > -1){\n $(this).removeClass(\"hidden\");\n }\n });\n });\n }\n });\n});\n\n\/*******\n\/form\/script\/public\/checkbox\n*********\/\n$(document).ready(function () {\n\n $(\".layout-component.checkbox\").each(function () {\n\n $(this).find(\".n-a\").on(\"click\", function (e) {\n var container = $(this).parents(\".multi-select-container\");\n var input = $(this).parent().find(\"input\");\n if ($(this).attr(\"data-selected\") === \"true\") {\n input.val($(this).attr(\"data-value\"));\n $(this).attr(\"data-selected\", \"false\");\n input.removeClass(\"disabled\");\n container.removeClass(\"na-checked\");\n } else {\n input.val(\"--n\/a--\");\n $(this).attr(\"data-selected\", \"true\");\n input.prop(\"checked\", \"checked\");\n input.addClass(\"disabled\");\n container.addClass(\"na-checked\");\n }\n input.trigger(\"change\");\n });\n\n $(this).find(\".checkbox-value\").each(function () {\n var container = $(this);\n\n $(this).children(\"input\").on(\"click\", function (e) {\n if ($(this).attr(\"data-imutable\")) {\n e.preventDefault();\n return;\n }\n if ($(this).prop(\"checked\")) {\n container.addClass(\"checked\");\n } else {\n container.removeClass(\"checked\");\n }\n });\n\n $(this).find(\".csb-input\").on(\"click\", function () {\n var parent_checkbox = $(this).parents(\".checkbox-value\").find(\"input:first\");\n if ($(this).prop(\"checked\")) {\n parent_checkbox.prop(\"checked\", \"checked\");\n container.addClass(\"checked\");\n } else {\n var any_checked = false;\n container.find(\".csb-input\").each(function () {\n if ($(this).prop(\"checked\")) {\n any_checked = true;\n }\n });\n\n if (!any_checked) {\n parent_checkbox.prop(\"checked\", false);\n container.removeClass(\"checked\");\n }\n\n }\n });\n });\n\n var max_selected = parseInt($(this).attr(\"data-max-selected\"));\n\n\n\n if (max_selected) {\n var container = $(this);\n\n \/\/need it here as well as onclick else pre-selected boxes don't work properly\n var curr_selected = container.find(\"input:checked\").length;\n if (curr_selected >= max_selected) {\n container.find(\"input:not(:checked)\").attr(\"disabled\", \"disabled\");\n }\n\n $(this).find(\".checkbox-value\").children(\"input\").on(\"click\", function (e) {\n var curr_selected = container.find(\"input:checked\").length;\n if (curr_selected >= max_selected) {\n container.find(\"input:not(:checked)\").attr(\"disabled\", \"disabled\");\n } else if (curr_selected < max_selected) {\n container.find(\"input:not(:checked)\").removeAttr(\"disabled\");\n }\n });\n }\n });\n});\n\n\n\/*******\n\/form\/script\/public\/ajax\n*********\/\n\nvar ddiv = null;\n\nif (typeof arguments != 'undefined') {\n ddiv = arguments[0];\n}\n\n$(document).ready(function () {\n\n $(\".layout.mod_form\").each(function () {\n\n var mfl = $(this);\n\n if (!mfl.find(\"form\").length) {\n return;\/\/.layout.mod_form can be nested ( it shouldn't be, but it is! )\n }\n\n var config = $(this).find(\".layout-component.main-config\");\n\n if (config.attr(\"data-ajax\")) {\n config.parents(\"form:first\").off(\"submit\").on(\"submit\", function (e, args) {\n e.preventDefault();\n\n var form = $(this);\n\n if (form.data(\"submitted\")) {\n return;\n }\n\n var query = $(this).serializeObject();\n\n query.ajax = true;\n\n if ($(this).data(\"submit-cancel\")) {\n query.cancelled = true;\n }\n\n $.eosbusy.show();\n\n $.post($(this).attr(\"action\"), query, function (data) {\n $.eosbusy.hide();\n\n if (!data.status) {\n $.eosmsg(data);\n return;\n }\n\n if (data.status === \"ERROR\") {\n if (data.key) {\n $.triggerwarning({\n key: data.key,\n container: form,\n msg: data.msg\n }, function () {\n $.eosmsg(data.msg);\n });\n return;\n }\n }\n\n if (data.missing) {\n if (args) {\n if (args.onerror) {\n args.onerror();\n }\n }\n form.find(\"[data-cid=\" + data.which + \"]\").addClass(\"required-missing\");\n if (data.errors) {\n $.triggerwarning({\n key: \"form-field-\" + data.which,\n container: form\n }, function () {\n $.eosmsg(data.errors);\n });\n \/\/console.log(data);\n \/\/$.eosmsg(data.errors);\n }\n } else {\n \n switch (data.action) {\n case \"redirect\":\n document.location = data.redirect;\n break;\n\n case \"reset\":\n mfl.data(\"reset\")();\n if (data.msg) {\n $.eosmsg({\n \"auto-close\": true,\n \"actimeout\": 3000,\n content: data.msg\n });\n } else {\n $.eosmsg({\n \"auto-close\": true,\n \"actimeout\": 3000,\n content: \"Form Submitted\"\n });\n }\n\n return;\n\n default:\n if (data.js) {\n var tf = new Function(data.js);\n tf(form, data, ddiv);\n break;\n }\n if (data.html) {\n \/\/form.html(data.html);\n \/\/do nothing - js events etc all break if we do this!\n }\n if (data.errors) {\n alert(data.errors);\n return;\n }\n }\n \/\/looks like all ok, so don't let the user re-submit\n form.data({\n submitted: true\n });\n\n $(\".layout-component.payment-before-complete\").trigger(\"payment-bypassed\");\n\n form.find(\".button.tab-ctrl.next-tab\").trigger(\"click\", {nosubmit: true, nocloseevent: true});\n }\n });\n });\n }\n });\n});\n\n\/*******\n\/form\/script\/public\/base\n*********\/\n\n$(document).ready(function () {\n\n $(\".layout.mod_form:not(.initialised)\").each(function () {\n var mf = $(this);\n\n if (!mf.find(\"form\").length) {\n return;\n }\n\n let stored_data = {};\n\n const form = mf.find(\"form\");\n\n if (form.attr(\"data-session-data-check\")) {\n\n const query = {\n \"form-id\": form.find(\"input[name='form-id']\").val()\n };\n\n $.post(\"\/form\/api\/data-available\", query, function (data) {\n if (data === \"YES\") {\n if (confirm(\"Load Previously Entered Data?\")) {\n $.post(\"\/form\/api\/get-session-data\", query, function (data) {\n if (data.status === \"OK\") {\n\n form.data({\n initialising: true\n });\n\n stored_data = data.post;\n\n $.each(data[\"post\"], function (k, v) {\n\n const input = form.find(\":input[name='\" + k + \"']\");\n\n if (input.length) {\n\n let type = \"text\";\n\n if (input[0].tagName.toLowerCase() === \"textarea\") {\n type = \"text-area\";\n } else if (input[0].tagName.toLowerCase() === \"select\") {\n type = \"select\";\n } else {\n type = input.attr(\"type\");\n }\n\n switch (type) {\n case \"text\":\n input.val(v);\n input.trigger(\"input\");\n break;\n\n case \"radio\":\n\n if (!v) {\n v = \"\";\n }\n\n input.each(function () {\n if ($(this).prop(\"value\") === v) {\n $(this).trigger(\"click\");\n return -1;\n }\n });\n break;\n\n case \"select\":\n\n if (!v) {\n v = \"\";\n }\n\n if (v) {\n input.find(\"option\").each(function () {\n if ($(this).attr(\"value\") === v || $(this).text() === v) {\n input.val($(this).attr(\"value\"));\n }\n });\n }\n\n input.trigger(\"change\");\n break;\n\n case \"checkbox\":\n if (v) {\n input.trigger(\"click\");\n }\n break;\n\n case \"text-area\":\n input.val(v);\n input.trigger(\"input\");\n break;\n }\n }\n\n });\n\n form.data({\n initialising: false\n });\n\n } else {\n $.eosmsg(data);\n }\n });\n }\n }\n });\n }\n\n let input_timeout = null;\n\n form.on(\"input\", function (e, d) {\n\n if (form.data(\"initialising\")) {\n return;\n }\n\n if (input_timeout) {\n clearTimeout(input_timeout);\n }\n\n input_timeout = setTimeout(function () {\n\n const form_data = form.find(\":not(.file-data)\").serializeObject();\n\n const query = {\n \"form-id\": form.find(\"input[name='form-id']\").val()\n };\n\n if (!query[\"form-id\"]) {\n return;\n }\n\n $.each(form_data, function (k, v) {\n\n if (typeof stored_data[k] === \"undefined\") {\n stored_data[k] = v;\n query[k] = v;\n } else {\n\n const str1 = JSON.stringify(stored_data[k]);\n const str2 = JSON.stringify(v);\n\n if (str1 !== str2) {\n query[k] = v;\n stored_data[k] = v;\n }\n }\n\n });\n\n $.post(\"\/form\/api\/log-progress\", query, function (data) {\n if (data !== \"OK\") {\n console.log(\"Error Logging Progress\", data);\n }\n });\n\n }, 1000);\n\n });\n\n mf.addClass(\"initialised\");\n\n $(this).find(\".layout-component.required\").each(function () {\n\n var component = $(this);\n\n $(this).data({\n \"has-errors\": function () {\n\n if (component.hasClass(\"dependency-not-met\")) {\n return false;\n }\n\n var error = false;\n\n var input = component.find(\":input\");\n var val = \"\";\n\n switch (input.attr(\"type\")) {\n case \"checkbox\":\n if (input.prop(\"checked\")) {\n val = input.val().trim();\n }\n break;\n\n case \"radio\":\n\n input.each(function () {\n if ($(this).prop(\"checked\")) {\n val = $(this).val().trim();\n }\n });\n\n break;\n\n default:\n val = input.val();\n if (val) {\n val = val.trim();\n }\n }\n\n if (input.attr(\"data-initial-value\") && input.attr(\"data-initial-value\").length) {\n if (val === input.attr(\"data-initial-value\")) {\n val = \"\";\n }\n }\n\n if (val && val.length) {\n input.addClass(\"complete\");\n component.addClass(\"complete\");\n component.removeClass(\"required-missing\");\n component.find(\".form-field-error\").remove();\n }\n\n if (!component.hasClass(\"complete\")) {\n let msg = component.attr(\"data-missing-message\");\n\n error = true;\n\n component.addClass(\"required-missing\");\n\n if (!msg) {\n switch (input[0].tagName) {\n case \"SELECT\":\n msg = \"Please select an item in the list\";\n break;\n\n case \"TEXTAREA\":\n msg = \"Please supply a value\";\n break;\n\n case \"INPUT\":\n switch (input.attr(\"type\")) {\n case \"text\":\n msg = \"Please supply a value\";\n break;\n case \"password\":\n msg = \"Please supply a password\";\n break;\n\n case \"checkbox\":\n case \"radio\":\n msg = \"Please Select one of the options\";\n break;\n case \"file\":\n msg = \"Please Upload a File\";\n break;\n }\n break;\n }\n }\n\n if (!component.find(\".form-field-error\").length) {\n component.append(\"