(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 -1; } if (!fireEvent && typeof el.matches === 'function') { fireEvent = el.matches('.mc4wp-form *'); } if (fireEvent) { cb.call(evt, evt); } }, true); } bind('submit', function (event) { var form = forms.getByElement(event.target); if (!event.defaultPrevented) { forms.trigger(form.id + '.submit', [form, event]); } if (!event.defaultPrevented) { forms.trigger('submit', [form, event]); } }); bind('focus', function (event) { var form = forms.getByElement(event.target); if (!form.started) { trigger('started', [form, event]); form.started = true; } }); bind('change', function (event) { var form = forms.getByElement(event.target); trigger('change', [form, event]); }); // register early listeners if (mc4wp.listeners) { var listeners = mc4wp.listeners; for (var i = 0; i < listeners.length; i++) { forms.on(listeners[i].event, listeners[i].callback); } // delete temp listeners array, so we don't bind twice delete mc4wp.listeners; } // expose forms object mc4wp.forms = forms; // expose mc4wp object globally window.mc4wp = mc4wp; },{"./forms/conditional-elements.js":2,"./forms/forms.js":4}],2:[function(require,module,exports){ "use strict"; function getFieldValues(form, fieldName) { var values = []; var inputs = form.querySelectorAll('input[name="' + fieldName + '"],select[name="' + fieldName + '"],textarea[name="' + fieldName + '"]'); for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; if ((input.type === 'radio' || input.type === 'checkbox') && !input.checked) { continue; } values.push(input.value); } return values; } function findForm(element) { var bubbleElement = element; while (bubbleElement.parentElement) { bubbleElement = bubbleElement.parentElement; if (bubbleElement.tagName === 'FORM') { return bubbleElement; } } return null; } function toggleElement(el) { var show = !!el.getAttribute('data-show-if'); var conditions = show ? el.getAttribute('data-show-if').split(':') : el.getAttribute('data-hide-if').split(':'); var fieldName = conditions[0]; var expectedValues = (conditions.length > 1 ? conditions[1] : '*').split('|'); var form = findForm(el); var values = getFieldValues(form, fieldName); // determine whether condition is met var conditionMet = false; for (var i = 0; i < values.length; i++) { 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 conditionMet = expectedValues.indexOf(value) > -1 || expectedValues.indexOf('*') > -1 && value.length > 0; if (conditionMet) { break; } } // toggle element display if (show) { el.style.display = conditionMet ? '' : 'none'; } else { el.style.display = conditionMet ? 'none' : ''; } // find all inputs inside this element and toggle [required] attr (to prevent HTML5 validation on hidden elements) var inputs = el.querySelectorAll('input,select,textarea'); [].forEach.call(inputs, function (el) { if ((conditionMet || show) && el.getAttribute('data-was-required')) { el.required = true; el.removeAttribute('data-was-required'); } if ((!conditionMet || !show) && el.required) { el.setAttribute('data-was-required', 'true'); el.required = false; } }); } // evaluate conditional elements globally function evaluate() { var elements = document.querySelectorAll('.mc4wp-form [data-show-if],.mc4wp-form [data-hide-if]'); [].forEach.call(elements, toggleElement); } // re-evaluate conditional elements for change events on forms function handleInputEvent(evt) { if (!evt.target || !evt.target.form || evt.target.form.className.indexOf('mc4wp-form') < 0) { return; } var form = evt.target.form; var elements = form.querySelectorAll('[data-show-if],[data-hide-if]'); [].forEach.call(elements, toggleElement); } document.addEventListener('keyup', handleInputEvent, true); document.addEventListener('change', handleInputEvent, true); document.addEventListener('mc4wp-refresh', evaluate, true); window.addEventListener('load', evaluate); evaluate(); },{}],3:[function(require,module,exports){ "use strict"; var serialize = require('form-serialize'); var populate = require('populate.js'); var Form = function Form(id, element) { this.id = id; this.element = element || document.createElement('form'); this.name = this.element.getAttribute('data-name') || 'Form #' + this.id; this.errors = []; this.started = false; }; Form.prototype.setData = function (data) { try { populate(this.element, data); } catch (e) { console.error(e); } }; Form.prototype.getData = function () { return serialize(this.element, { hash: true, empty: true }); }; Form.prototype.getSerializedData = function () { return serialize(this.element, { hash: false, empty: true }); }; Form.prototype.setResponse = function (msg) { this.element.querySelector('.mc4wp-response').innerHTML = msg; }; // revert back to original state Form.prototype.reset = function () { this.setResponse(''); this.element.querySelector('.mc4wp-form-fields').style.display = ''; this.element.reset(); }; module.exports = Form; },{"form-serialize":5,"populate.js":6}],4:[function(require,module,exports){ "use strict"; var Form = require('./form.js'); var forms = []; var listeners = {}; function emit(event, args) { listeners[event] = listeners[event] || []; listeners[event].forEach(function (f) { return f.apply(null, args); }); } function on(event, func) { listeners[event] = listeners[event] || []; listeners[event].push(func); } function off(event, func) { listeners[event] = listeners[event] || []; listeners[event] = listeners[event].filter(function (f) { return f !== func; }); } // get form by its id // please note that this will get the FIRST occurence of the form with that ID on the page function get(formId) { formId = parseInt(formId); // do we have form for this one already? for (var i = 0; i < forms.length; i++) { if (forms[i].id === formId) { return forms[i]; } } // try to create from first occurence of this element var formElement = document.querySelector('.mc4wp-form-' + formId); return createFromElement(formElement, formId); } // get form by
element (or any input in form) function getByElement(element) { var formElement = element.form || element; for (var i = 0; i < forms.length; i++) { if (forms[i].element === formElement) { return forms[i]; } } return createFromElement(formElement); } // create form object from element function createFromElement(formElement, id) { id = id || parseInt(formElement.getAttribute('data-id')) || 0; var form = new Form(id, formElement); forms.push(form); return form; } function trigger(eventName, eventArgs) { if (eventName === 'submit' || eventName.indexOf('.submit') > 0) { // don't spin up new thread for submit event as we want to preventDefault()... emit(eventName, eventArgs); } else { // process in separate thread to prevent errors from breaking core functionality window.setTimeout(function () { emit(eventName, eventArgs); }, 1); } } module.exports = { get: get, getByElement: getByElement, on: on, off: off, trigger: trigger }; },{"./form.js":3}],5:[function(require,module,exports){ // get successful control from form and assemble into object // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2 // types which indicate a submit action and are not successful controls // these will be ignored var k_r_submitter = /^(?:submit|button|image|reset|file)$/i; // node names which could be successful controls var k_r_success_contrls = /^(?:input|select|textarea|keygen)/i; // Matches bracket notation. var brackets = /(\[[^\[\]]*\])/g; // serializes form fields // @param form MUST be an HTMLForm element // @param options is an optional argument to configure the serialization. Default output // with no options specified is a url encoded string // - hash: [true | false] Configure the output type. If true, the output will // be a js object. // - serializer: [function] Optional serializer function to override the default one. // The function takes 3 arguments (result, key, value) and should return new result // hash and url encoded str serializers are provided with this module // - disabled: [true | false]. If true serialize disabled fields. // - empty: [true | false]. If true serialize empty fields function serialize(form, options) { if (typeof options != 'object') { options = { hash: !!options }; } else if (options.hash === undefined) { options.hash = true; } var result = (options.hash) ? {} : ''; var serializer = options.serializer || ((options.hash) ? hash_serializer : str_serialize); var elements = form && form.elements ? form.elements : []; //Object store each radio and set if it's empty or not var radio_store = Object.create(null); for (var i=0 ; i -1; } break; case 'select-multiple': var values = value.constructor === Array ? value : [value]; for(var k = 0; k < element.options.length; k++) { element.options[k].selected = (values.indexOf(element.options[k].value) > -1 ); } break; case 'select': case 'select-one': element.value = value.toString() || value; break; case 'date': element.value = new Date(value).toISOString().split('T')[0]; break; } } }; if (typeof module !== 'undefined' && module.exports) { module.exports = populate; } },{}]},{},[1]);