PluginProbe
HTML Forms – Simple WordPress Forms Plugin / 1.3.21
HTML Forms – Simple WordPress Forms Plugin v1.3.21
1.7.0 trunk 1.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.2.0 1.3.0 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 All 67 releases
← All changes | assets/js/public.js +554 -1 trunk1.3.21 View file →
@@ -1 +1,554 @@
1 -(()=>{var e={424(){function e(e,t){const n=!!e.getAttribute("data-show-if"),r=!!e.getAttribute("data-hide-if"),o=n?e.getAttribute("data-show-if").split(":"):e.getAttribute("data-hide-if").split(":"),a=o[0],s=(o.length>1?o[1]:"*").split("|"),i=function(e,t,n){const r=[],o=e.querySelectorAll(`input[name="${t}"], select[name="${t}"], textarea[name="${t}"], button[name="${t}"]`);return[].forEach.call(o,o=>{const a=o.type.toLowerCase();if("radio"!==a&&"checkbox"!==a||o.checked){if("button"===a||"submit"===a||"BUTTON"===o.tagName){if((!n||n.target!==o)&&e.dataset[t]!==o.value)return;e.dataset[t]=o.value}r.push(o.value)}}),0===r.length&&r.push(""),r}(function(e){let t=e;for(;t.parentElement;)if(t=t.parentElement,"FORM"===t.tagName)return t;return null}(e),a,t);let c=!1;for(let e=0;e<i.length;e++){const t=i[e];if(c=s.indexOf(t)>-1||s.indexOf("*")>-1&&t.length>0,c)break}e.style.display=n?c?"":"none":c?"none":"";const l=e.querySelectorAll("input, select, textarea");[].forEach.call(l,e=>{n&&(c&&e.getAttribute("data-was-required")&&(e.required=!0,e.removeAttribute("data-was-required")),!c&&e.required&&(e.setAttribute("data-was-required","true"),e.required=!1)),r&&(!c&&e.getAttribute("data-was-required")&&(e.required=!0,e.removeAttribute("data-was-required")),c&&e.required&&(e.setAttribute("data-was-required","true"),e.required=!1))})}function t(){const t=document.querySelectorAll(".hf-form [data-show-if], .hf-form [data-hide-if]");[].forEach.call(t,e)}function n(t){if(!t.target||!t.target.form||t.target.form.className.indexOf("hf-form")<0)return;const{form:n}=t.target,r=n.querySelectorAll("[data-show-if], [data-hide-if]");[].forEach.call(r,n=>{e(n,t)})}document.addEventListener("click",n),document.addEventListener("keyup",n),document.addEventListener("change",n),document.addEventListener("hf-refresh",t),document.addEventListener("swup:contentReplaced",t),window.addEventListener("load",t),t()},863(e){function t(e){return e.innerHTML?e.innerHTML:e.value}function n(e,t){e.innerHTML?e.innerHTML=t:e.value=t}e.exports=function(e,r){const o=e.querySelector('input[type="submit"], button[type="submit"]');let a,s;function i(){const e=t(o);n(o,e.length>=5?r:`${e} ${r}`)}return r=r||"·",o&&(a=o.cloneNode(!0)),{start:function(){if(o){const e=o.getAttribute("data-loading-text");e?n(o,e):(o.style.width=window.getComputedStyle(o).width,n(o,r),s=window.setInterval(i,500))}else e.style.opacity="0.5";e.classList&&e.classList.add("mc4wp-loading")},stop:function(){if(o){o.style.width=a.style.width;const e=t(a);n(o,e),window.clearInterval(s)}else e.style.opacity="";e.className=e.className.replace("mc4wp-loading","")}}}},968(e,t,n){const r=n(564),o=[].filter.call(document.forms,e=>e.className.indexOf("hf-form")>-1);if(o){const e=function(e){const t={},n=new URLSearchParams(e).entries();for(let e=0;e<n.length;e++){const[r,o]=n[e];if("[]"===r.substring(r.length-2)){const e=r.substring(0,r.length-2);t[e]=t[e]||[],t[e].push(o)}else t[r]=o}return t}(window.location.search);o.forEach(t=>{r(t,e)})}},564(e){e.exports&&(e.exports=function e(t,n,r){for(const o in n){if(!n.hasOwnProperty(o))continue;const a=o;let s=n[o];if(void 0===s&&(s=""),null===s&&(s=""),void 0!==r&&(a=r+"["+o+"]"),s.constructor===Array)a+="[]";else if("object"==typeof s){e(t,s,a);continue}const i=t.elements.namedItem(a);if(!i)continue;const c=i.type||i[0].type;switch(c){default:i.value=s;break;case"radio":case"checkbox":{const e=s.constructor===Array?s:[s];for(let t=0;t<i.length;t++)i[t].checked=e.indexOf(i[t].value)>-1}break;case"select-multiple":{const e=s.constructor===Array?s:[s];for(let t=0;t<i.options.length;t++)i.options[t].selected=e.indexOf(i.options[t].value)>-1}break;case"select":case"select-one":i.value=s.toString()||s;break;case"date":i.value=new Date(s).toISOString().split("T")[0]}const l=new Event("change",{bubbles:!0});switch(c){default:i.dispatchEvent(l);break;case"radio":case"checkbox":for(let e=0;e<i.length;e++)i[e].checked&&i[e].dispatchEvent(l)}}})}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";n(968),n(424);const e={},t={trigger:function(t,n){e[t]=e[t]||[],e[t].forEach(e=>e.apply(null,n))},on:function(t,n){e[t]=e[t]||[],e[t].push(n)},off:function(t,n){e[t]=e[t]||[],e[t]=e[t].filter(e=>e!==n)}};var r=n(863),o=n.n(r);function a(e){!function(e){const t=e.querySelectorAll(".hf-message");[].forEach.call(t,e=>{e.parentNode.removeChild(e)})}(e),s("submit",e);const t=new FormData(e),n=e.querySelectorAll("[data-was-required=true]");[].forEach.call(n,e=>{t.append("_was_required[]",e.getAttribute("name"))});const r=window.hf_js_vars||{ajax_url:window.location.href};let a=new XMLHttpRequest;a.onreadystatechange=function(e){const t=new(o())(e);return t.start(),function(){if(4===this.readyState){let n;if(t.stop(),this.status>=200&&this.status<400){try{n=JSON.parse(this.responseText)}catch(e){return void console.log(`HTML Forms: failed to parse AJAX response.\n\nError: "${e}"`)}s("submitted",e),n.error?s("error",e):s("success",e),n.message&&(function(e,t){const n=document.createElement("p");n.className=`hf-message hf-message-${t.type}`,n.innerHTML=t.text,n.role="alert",(e.querySelector(".hf-messages")||e).appendChild(n)}(e,n.message),s("message",e)),n.hide_form&&(e.querySelector(".hf-fields-wrap").style.display="none"),n.redirect_url&&(window.location=n.redirect_url),n.error||e.reset()}else console.log(this.responseText)}}}(e),a.open("POST",r.ajax_url,!0),a.setRequestHeader("X-Requested-With","XMLHttpRequest"),a.send(t),a=null}function s(e,n){n.dispatchEvent(new CustomEvent(`hf-${e}`)),t.trigger(e,[n])}void 0===window.html_forms&&(document.addEventListener("submit",function(e){const t=e.target;t.className.indexOf("hf-form")<0||(e.preventDefault(),a(t))},!1),window.html_forms={on:t.on,off:t.off,submit:a})})()})();
1 +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2 +'use strict';
3 +
4 +Object.defineProperty(exports, "__esModule", {
5 + value: true
6 +});
7 +exports["default"] = void 0;
8 +
9 +function getFieldValues(form, fieldName, evt) {
10 + var values = [];
11 + var inputs = form.querySelectorAll('input[name="' + fieldName + '"], select[name="' + fieldName + '"], textarea[name="' + fieldName + '"], button[name="' + fieldName + '"]');
12 +
13 + for (var i = 0; i < inputs.length; i++) {
14 + var input = inputs[i];
15 + var type = input.type.toLowerCase();
16 +
17 + if ((type === 'radio' || type === 'checkbox') && !input.checked) {
18 + continue;
19 + } // ignore buttons which are not clicked (in case there's more than one button with same name)
20 +
21 +
22 + if (type === 'button' || type === 'submit' || input.tagName === 'BUTTON') {
23 + if ((!evt || evt.target !== input) && form.dataset[fieldName] !== input.value) {
24 + continue;
25 + }
26 +
27 + form.dataset[fieldName] = input.value;
28 + }
29 +
30 + values.push(input.value);
31 + } // default to an empty string
32 + // can be used to show or hide an element when a field is empty or has not been set
33 + // Usage: data-show-if="FIELDNAME:"
34 +
35 +
36 + if (values.length === 0) {
37 + values.push('');
38 + }
39 +
40 + return values;
41 +}
42 +
43 +function findForm(element) {
44 + var bubbleElement = element;
45 +
46 + while (bubbleElement.parentElement) {
47 + bubbleElement = bubbleElement.parentElement;
48 +
49 + if (bubbleElement.tagName === 'FORM') {
50 + return bubbleElement;
51 + }
52 + }
53 +
54 + return null;
55 +}
56 +
57 +function toggleElement(el, evt) {
58 + var show = !!el.getAttribute('data-show-if');
59 + var conditions = show ? el.getAttribute('data-show-if').split(':') : el.getAttribute('data-hide-if').split(':');
60 + var fieldName = conditions[0];
61 + var expectedValues = (conditions.length > 1 ? conditions[1] : '*').split('|');
62 + var form = findForm(el);
63 + var values = getFieldValues(form, fieldName, evt); // determine whether condition is met
64 +
65 + var conditionMet = false;
66 +
67 + for (var i = 0; i < values.length; i++) {
68 + var value = values[i]; // condition is met when value is in array of expected values OR expected values contains a wildcard and value is not empty
69 +
70 + conditionMet = expectedValues.indexOf(value) > -1 || expectedValues.indexOf('*') > -1 && value.length > 0;
71 +
72 + if (conditionMet) {
73 + break;
74 + }
75 + } // toggle element display
76 +
77 +
78 + if (show) {
79 + el.style.display = conditionMet ? '' : 'none';
80 + } else {
81 + el.style.display = conditionMet ? 'none' : '';
82 + } // find all inputs inside this element and toggle [required] attr (to prevent HTML5 validation on hidden elements)
83 +
84 +
85 + var inputs = el.querySelectorAll('input, select, textarea');
86 + [].forEach.call(inputs, function (el) {
87 + if ((conditionMet || show) && el.getAttribute('data-was-required')) {
88 + el.required = true;
89 + el.removeAttribute('data-was-required');
90 + }
91 +
92 + if ((!conditionMet || !show) && el.required) {
93 + el.setAttribute('data-was-required', 'true');
94 + el.required = false;
95 + }
96 + });
97 +} // evaluate conditional elements globally
98 +
99 +
100 +function evaluate() {
101 + var elements = document.querySelectorAll('.hf-form [data-show-if], .hf-form [data-hide-if]');
102 + [].forEach.call(elements, toggleElement);
103 +} // re-evaluate conditional elements for change events on forms
104 +
105 +
106 +function handleInputEvent(evt) {
107 + if (!evt.target || !evt.target.form || evt.target.form.className.indexOf('hf-form') < 0) {
108 + return;
109 + }
110 +
111 + var form = evt.target.form;
112 + var elements = form.querySelectorAll('[data-show-if], [data-hide-if]');
113 + [].forEach.call(elements, function (el) {
114 + return toggleElement(el, evt);
115 + });
116 +}
117 +
118 +var _default = {
119 + init: function init() {
120 + document.addEventListener('click', handleInputEvent, true);
121 + document.addEventListener('keyup', handleInputEvent, true);
122 + document.addEventListener('change', handleInputEvent, true);
123 + document.addEventListener('hf-refresh', evaluate, true);
124 + window.addEventListener('load', evaluate);
125 + evaluate();
126 + }
127 +};
128 +exports["default"] = _default;
129 +
130 +},{}],2:[function(require,module,exports){
131 +"use strict";
132 +
133 +Object.defineProperty(exports, "__esModule", {
134 + value: true
135 +});
136 +exports["default"] = void 0;
137 +var listeners = {};
138 +
139 +function trigger(event, args) {
140 + listeners[event] = listeners[event] || [];
141 + listeners[event].forEach(function (f) {
142 + return f.apply(null, args);
143 + });
144 +}
145 +
146 +function on(event, func) {
147 + listeners[event] = listeners[event] || [];
148 + listeners[event].push(func);
149 +}
150 +
151 +function off(event, func) {
152 + listeners[event] = listeners[event] || [];
153 + listeners[event] = listeners[event].filter(function (f) {
154 + return f !== func;
155 + });
156 +}
157 +
158 +var _default = {
159 + trigger: trigger,
160 + on: on,
161 + off: off
162 +};
163 +exports["default"] = _default;
164 +
165 +},{}],3:[function(require,module,exports){
166 +"use strict";
167 +
168 +function getButtonText(button) {
169 + return button.innerHTML ? button.innerHTML : button.value;
170 +}
171 +
172 +function setButtonText(button, text) {
173 + button.innerHTML ? button.innerHTML = text : button.value = text;
174 +}
175 +
176 +function Loader(formEl, _char) {
177 + var button = formEl.querySelector('input[type="submit"], button[type="submit"]');
178 + _char = _char || "\xB7";
179 + var originalButton, loadingInterval;
180 +
181 + if (button) {
182 + originalButton = button.cloneNode(true);
183 + }
184 +
185 + function start() {
186 + if (button) {
187 + var loadingText = button.getAttribute('data-loading-text');
188 +
189 + if (loadingText) {
190 + // Use text from "data-loading-text" attribute
191 + setButtonText(button, loadingText);
192 + } else {
193 + // Use default loading character (. .. ...)
194 + button.style.width = window.getComputedStyle(button).width;
195 + setButtonText(button, _char);
196 + loadingInterval = window.setInterval(tick, 500);
197 + }
198 + } else {
199 + // If form had no button element, change opacity
200 + formEl.style.opacity = '0.5';
201 + }
202 +
203 + if (formEl.classList) {
204 + formEl.classList.add('mc4wp-loading');
205 + }
206 + }
207 +
208 + function stop() {
209 + if (button) {
210 + button.style.width = originalButton.style.width;
211 + var text = getButtonText(originalButton);
212 + setButtonText(button, text);
213 + window.clearInterval(loadingInterval);
214 + } else {
215 + formEl.style.opacity = '';
216 + }
217 +
218 + formEl.className = formEl.className.replace('mc4wp-loading', '');
219 + }
220 +
221 + function tick() {
222 + var text = getButtonText(button);
223 + setButtonText(button, text.length >= 5 ? _char : text + ' ' + _char);
224 + }
225 +
226 + return {
227 + start: start,
228 + stop: stop
229 + };
230 +}
231 +
232 +module.exports = Loader;
233 +
234 +},{}],4:[function(require,module,exports){
235 +'use strict';
236 +
237 +Object.defineProperty(exports, "__esModule", {
238 + value: true
239 +});
240 +exports["default"] = void 0;
241 +
242 +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
243 +
244 +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
245 +
246 +function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
247 +
248 +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
249 +
250 +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
251 +
252 +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
253 +
254 +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
255 +
256 +var populate = require('populate.js'); // parse ?query=string with array support. no nesting.
257 +
258 +
259 +function parseUrlParams(q) {
260 + var params = new URLSearchParams(q);
261 + var obj = {};
262 +
263 + var _iterator = _createForOfIteratorHelper(params.entries()),
264 + _step;
265 +
266 + try {
267 + for (_iterator.s(); !(_step = _iterator.n()).done;) {
268 + var _step$value = _slicedToArray(_step.value, 2),
269 + name = _step$value[0],
270 + value = _step$value[1];
271 +
272 + if (name.substr(name.length - 2) === '[]') {
273 + var arrName = name.substr(0, name.length - 2);
274 + obj[arrName] = obj[arrName] || [];
275 + obj[arrName].push(value);
276 + } else {
277 + obj[name] = value;
278 + }
279 + }
280 + } catch (err) {
281 + _iterator.e(err);
282 + } finally {
283 + _iterator.f();
284 + }
285 +
286 + return obj;
287 +}
288 +
289 +function init() {
290 + if (!window.URLSearchParams) {
291 + return;
292 + } // only act on form elements outputted by HTML Forms
293 +
294 +
295 + var forms = [].filter.call(document.forms, function (f) {
296 + return f.className.indexOf('hf-form') > -1;
297 + });
298 +
299 + if (!forms) {
300 + return;
301 + } // fill each form with data from URL params
302 +
303 +
304 + var data = parseUrlParams(window.location.search);
305 + forms.forEach(function (f) {
306 + populate(f, data);
307 + });
308 +}
309 +
310 +var _default = {
311 + init: init
312 +};
313 +exports["default"] = _default;
314 +
315 +},{"populate.js":7}],5:[function(require,module,exports){
316 +"use strict";
317 +
318 +/* window.CustomEvent polyfill for IE */
319 +(function () {
320 + if (typeof window.CustomEvent === 'function') return false;
321 +
322 + function CustomEvent(event, params) {
323 + params = params || {
324 + bubbles: false,
325 + cancelable: false,
326 + detail: undefined
327 + };
328 + var evt = document.createEvent('CustomEvent');
329 + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
330 + return evt;
331 + }
332 +
333 + CustomEvent.prototype = window.Event.prototype;
334 + window.CustomEvent = CustomEvent;
335 +})();
336 +
337 +},{}],6:[function(require,module,exports){
338 +"use strict";
339 +
340 +var _formPrefiller = _interopRequireDefault(require("./form-prefiller.js"));
341 +
342 +var _conditionality = _interopRequireDefault(require("./conditionality.js"));
343 +
344 +require("./polyfills/custom-event.js");
345 +
346 +var _events = _interopRequireDefault(require("./events.js"));
347 +
348 +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
349 +
350 +var Loader = require('./form-loading-indicator.js');
351 +
352 +var vars = window.hf_js_vars || {
353 + ajax_url: window.location.href
354 +};
355 +
356 +function cleanFormMessages(formEl) {
357 + var messageElements = formEl.querySelectorAll('.hf-message');
358 + [].forEach.call(messageElements, function (el) {
359 + el.parentNode.removeChild(el);
360 + });
361 +}
362 +
363 +function addFormMessage(formEl, message) {
364 + var txtElement = document.createElement('p');
365 + txtElement.className = 'hf-message hf-message-' + message.type;
366 + txtElement.innerHTML = message.text; // uses innerHTML because we allow some HTML strings in the message settings
367 +
368 + txtElement.role = 'alert';
369 + var wrapperElement = formEl.querySelector('.hf-messages') || formEl;
370 + wrapperElement.appendChild(txtElement);
371 +}
372 +
373 +function handleSubmitEvents(e) {
374 + var formEl = e.target;
375 +
376 + if (formEl.className.indexOf('hf-form') < 0) {
377 + return;
378 + } // always prevent default (because regular submit doesn't work for HTML Forms)
379 +
380 +
381 + e.preventDefault();
382 + submitForm(formEl);
383 +}
384 +
385 +function submitForm(formEl) {
386 + cleanFormMessages(formEl);
387 + emitEvent('submit', formEl);
388 + var formData = new FormData(formEl);
389 + [].forEach.call(formEl.querySelectorAll('[data-was-required=true]'), function (el) {
390 + formData.append('_was_required[]', el.getAttribute('name'));
391 + });
392 + var request = new XMLHttpRequest();
393 + request.onreadystatechange = createRequestHandler(formEl);
394 + request.open('POST', vars.ajax_url, true);
395 + request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
396 + request.send(formData);
397 + request = null;
398 +}
399 +
400 +function emitEvent(eventName, element) {
401 + // browser event API: formElement.on('hf-success', ..)
402 + element.dispatchEvent(new CustomEvent('hf-' + eventName)); // custom events API: html_forms.on('success', ..)
403 +
404 + _events["default"].trigger(eventName, [element]);
405 +}
406 +
407 +function createRequestHandler(formEl) {
408 + var loader = new Loader(formEl);
409 + loader.start();
410 + return function () {
411 + // are we done?
412 + if (this.readyState === 4) {
413 + var response;
414 + loader.stop();
415 +
416 + if (this.status >= 200 && this.status < 400) {
417 + try {
418 + response = JSON.parse(this.responseText);
419 + } catch (error) {
420 + console.log('HTML Forms: failed to parse AJAX response.\n\nError: "' + error + '"');
421 + return;
422 + }
423 +
424 + emitEvent('submitted', formEl);
425 +
426 + if (response.error) {
427 + emitEvent('error', formEl);
428 + } else {
429 + emitEvent('success', formEl);
430 + } // Show form message
431 +
432 +
433 + if (response.message) {
434 + addFormMessage(formEl, response.message);
435 + emitEvent('message', formEl);
436 + } // Should we hide form?
437 +
438 +
439 + if (response.hide_form) {
440 + formEl.querySelector('.hf-fields-wrap').style.display = 'none';
441 + } // Should we redirect?
442 +
443 +
444 + if (response.redirect_url) {
445 + window.location = response.redirect_url;
446 + } // clear form
447 +
448 +
449 + if (!response.error) {
450 + formEl.reset();
451 + }
452 + } else {
453 + // Server error :(
454 + console.log(this.responseText);
455 + }
456 + }
457 + };
458 +}
459 +
460 +document.addEventListener('submit', handleSubmitEvents, false); // useCapture=false to ensure we bubble upwards (and thus can cancel propagation)
461 +
462 +_conditionality["default"].init();
463 +
464 +_formPrefiller["default"].init();
465 +
466 +window.html_forms = {
467 + on: _events["default"].on,
468 + off: _events["default"].off,
469 + submit: submitForm
470 +};
471 +
472 +},{"./conditionality.js":1,"./events.js":2,"./form-loading-indicator.js":3,"./form-prefiller.js":4,"./polyfills/custom-event.js":5}],7:[function(require,module,exports){
473 +
474 +/**
475 + * Populate form fields from a JSON object.
476 + *
477 + * @param form object The form element containing your input fields.
478 + * @param data array JSON data to populate the fields with.
479 + * @param basename string Optional basename which is added to `name` attributes
480 + */
481 +function populate(form, data, basename) {
482 + for (var key in data) {
483 + if (! data.hasOwnProperty(key)) {
484 + continue;
485 + }
486 +
487 + var name = key;
488 + var value = data[key];
489 +
490 + if ('undefined' === typeof value) {
491 + value = '';
492 + }
493 +
494 + if (null === value) {
495 + value = '';
496 + }
497 +
498 + // handle array name attributes
499 + if (typeof(basename) !== "undefined") {
500 + name = basename + "[" + key + "]";
501 + }
502 +
503 + if (value.constructor === Array) {
504 + name += '[]';
505 + } else if(typeof value == "object") {
506 + populate(form, value, name);
507 + continue;
508 + }
509 +
510 + // only proceed if element is set
511 + var element = form.elements.namedItem(name);
512 + if (! element) {
513 + continue;
514 + }
515 +
516 + var type = element.type || element[0].type;
517 +
518 + switch(type ) {
519 + default:
520 + element.value = value;
521 + break;
522 +
523 + case 'radio':
524 + case 'checkbox':
525 + var values = value.constructor === Array ? value : [value];
526 + for (var j=0; j < element.length; j++) {
527 + element[j].checked = values.indexOf(element[j].value) > -1;
528 + }
529 + break;
530 +
531 + case 'select-multiple':
532 + var values = value.constructor === Array ? value : [value];
533 + for(var k = 0; k < element.options.length; k++) {
534 + element.options[k].selected = (values.indexOf(element.options[k].value) > -1 );
535 + }
536 + break;
537 +
538 + case 'select':
539 + case 'select-one':
540 + element.value = value.toString() || value;
541 + break;
542 +
543 + case 'date':
544 + element.value = new Date(value).toISOString().split('T')[0];
545 + break;
546 + }
547 +
548 + }
549 +};
550 +
551 +if (typeof module !== 'undefined' && module.exports) {
552 + module.exports = populate;
553 +}
554 +},{}]},{},[6]);