(function () { var require = undefined; var define = undefined; (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 1000 && timeElapsed < 2000 && document.body.clientHeight !== pageHeight) { scrollToElement(form.element); } }); } // Bind browser events to form events (using delegation) var gator = Gator(document.body); gator.on('submit', '.mc4wp-form', function (event) { var form = forms.getByElement(event.target || event.srcElement); if (!event.defaultPrevented) { forms.trigger(form.id + '.submit', [form, event]); } if (!event.defaultPrevented) { forms.trigger('submit', [form, event]); } }); gator.on('focus', '.mc4wp-form', function (event) { var form = forms.getByElement(event.target || event.srcElement); if (!form.started) { forms.trigger(form.id + '.started', [form, event]); forms.trigger('started', [form, event]); form.started = true; } }); gator.on('change', '.mc4wp-form', function (event) { var form = forms.getByElement(event.target || event.srcElement); forms.trigger('change', [form, event]); forms.trigger(form.id + '.change', [form, event]); }); // init conditional elements _conditionalElements["default"].init(); // 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; // handle submitted form if (config.submitted_form) { var formConfig = config.submitted_form, element = document.getElementById(formConfig.element_id), form = forms.getByElement(element); handleFormRequest(form, formConfig.event, formConfig.errors, formConfig.data); } // expose mc4wp object globally window.mc4wp = mc4wp; },{"./forms/conditional-elements.js":2,"./forms/forms.js":4,"./misc/scroll-to-element.js":5,"gator":7}],2:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; 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]; var type = input.getAttribute("type"); if ((type === "radio" || 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); } var _default = { 'init': function init() { document.addEventListener('keyup', handleInputEvent, true); document.addEventListener('change', handleInputEvent, true); document.addEventListener('mc4wp-refresh', evaluate, true); window.addEventListener('load', evaluate); evaluate(); } }; exports["default"] = _default; },{}],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":6,"populate.js":8}],4:[function(require,module,exports){ 'use strict'; // deps var Form = require('./form.js'); // variables 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 all() { return forms; } function triggerEvent(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 = { "all": all, "get": get, "getByElement": getByElement, "on": on, "off": off, "trigger": triggerEvent }; },{"./form.js":3}],5:[function(require,module,exports){ 'use strict'; function scrollTo(element) { var x = window.pageXOffset || document.documentElement.scrollLeft; var y = calculateScrollOffset(element); window.scrollTo(x, y); } function calculateScrollOffset(elem) { var body = document.body, html = document.documentElement; var elemRect = elem.getBoundingClientRect(); var clientHeight = html.clientHeight; var documentHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); var scrollPosition = elemRect.bottom - clientHeight / 2 - elemRect.height / 2; var maxScrollPosition = documentHeight - clientHeight; return Math.min(scrollPosition + window.pageYOffset, maxScrollPosition); } module.exports = scrollTo; },{}],6:[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 tag but there // is a inside of the a tag that it is the target, // it should still work if (element.parentNode) { _level++; return _matchesSelector(element.parentNode, selector, boundElement); } } function _addHandler(gator, event, selector, callback) { if (!_handlers[gator.id]) { _handlers[gator.id] = {}; } if (!_handlers[gator.id][event]) { _handlers[gator.id][event] = {}; } if (!_handlers[gator.id][event][selector]) { _handlers[gator.id][event][selector] = []; } _handlers[gator.id][event][selector].push(callback); } function _removeHandler(gator, event, selector, callback) { // if there are no events tied to this element at all // then don't do anything if (!_handlers[gator.id]) { return; } // if there is no event type specified then remove all events // example: Gator(element).off() if (!event) { for (var type in _handlers[gator.id]) { if (_handlers[gator.id].hasOwnProperty(type)) { _handlers[gator.id][type] = {}; } } return; } // if no callback or selector is specified remove all events of this type // example: Gator(element).off('click') if (!callback && !selector) { _handlers[gator.id][event] = {}; return; } // if a selector is specified but no callback remove all events // for this selector // example: Gator(element).off('click', '.sub-element') if (!callback) { delete _handlers[gator.id][event][selector]; return; } // if we have specified an event type, selector, and callback then we // need to make sure there are callbacks tied to this selector to // begin with. if there aren't then we can stop here if (!_handlers[gator.id][event][selector]) { return; } // if there are then loop through all the callbacks and if we find // one that matches remove it from the array for (var i = 0; i < _handlers[gator.id][event][selector].length; i++) { if (_handlers[gator.id][event][selector][i] === callback) { _handlers[gator.id][event][selector].splice(i, 1); break; } } } function _handleEvent(id, e, type) { if (!_handlers[id][type]) { return; } var target = e.target || e.srcElement, selector, match, matches = {}, i = 0, j = 0; // find all events that match _level = 0; for (selector in _handlers[id][type]) { if (_handlers[id][type].hasOwnProperty(selector)) { match = _matchesSelector(target, selector, _gatorInstances[id].element); if (match && Gator.matchesEvent(type, _gatorInstances[id].element, match, selector == '_root', e)) { _level++; _handlers[id][type][selector].match = match; matches[_level] = _handlers[id][type][selector]; } } } // stopPropagation() fails to set cancelBubble to true in Webkit // @see http://code.google.com/p/chromium/issues/detail?id=162270 e.stopPropagation = function() { e.cancelBubble = true; }; for (i = 0; i <= _level; i++) { if (matches[i]) { for (j = 0; j < matches[i].length; j++) { if (matches[i][j].call(matches[i].match, e) === false) { Gator.cancel(e); return; } if (e.cancelBubble) { return; } } } } } /** * binds the specified events to the element * * @param {string|Array} events * @param {string} selector * @param {Function} callback * @param {boolean=} remove * @returns {Object} */ function _bind(events, selector, callback, remove) { // fail silently if you pass null or undefined as an alement // in the Gator constructor if (!this.element) { return; } if (!(events instanceof Array)) { events = [events]; } if (!callback && typeof(selector) == 'function') { callback = selector; selector = '_root'; } var id = this.id, i; function _getGlobalCallback(type) { return function(e) { _handleEvent(id, e, type); }; } for (i = 0; i < events.length; i++) { if (remove) { _removeHandler(this, events[i], selector, callback); continue; } if (!_handlers[id] || !_handlers[id][events[i]]) { Gator.addEvent(this, events[i], _getGlobalCallback(events[i])); } _addHandler(this, events[i], selector, callback); } return this; } /** * Gator object constructor * * @param {Node} element */ function Gator(element, id) { // called as function if (!(this instanceof Gator)) { // only keep one Gator instance per node to make sure that // we don't create a ton of new objects if you want to delegate // multiple events from the same node // // for example: Gator(document).on(... for (var key in _gatorInstances) { if (_gatorInstances[key].element === element) { return _gatorInstances[key]; } } _id++; _gatorInstances[_id] = new Gator(element, _id); return _gatorInstances[_id]; } this.element = element; this.id = id; } /** * adds an event * * @param {string|Array} events * @param {string} selector * @param {Function} callback * @returns {Object} */ Gator.prototype.on = function(events, selector, callback) { return _bind.call(this, events, selector, callback); }; /** * removes an event * * @param {string|Array} events * @param {string} selector * @param {Function} callback * @returns {Object} */ Gator.prototype.off = function(events, selector, callback) { return _bind.call(this, events, selector, callback, true); }; Gator.matchesSelector = function() {}; Gator.cancel = _cancel; Gator.addEvent = _addEvent; Gator.matchesEvent = function() { return true; }; if (typeof module !== 'undefined' && module.exports) { module.exports = Gator; } window.Gator = Gator; }) (); },{}],8:[function(require,module,exports){ /*! populate.js v1.0.2 by @dannyvankooten | MIT license */ ;(function(root) { /** * Populate form fields from a JSON object. * * @param form object The form element containing your input fields. * @param data array JSON data to populate the fields with. * @param basename string Optional basename which is added to `name` attributes */ var populate = function( form, data, basename) { for(var key in data) { if( ! data.hasOwnProperty( key ) ) { continue; } var name = key; var value = data[key]; if ('undefined' === typeof value) { value = ''; } if (null === value) { value = ''; } // handle array name attributes if(typeof(basename) !== "undefined") { name = basename + "[" + key + "]"; } if(value.constructor === Array) { name += '[]'; } else if(typeof value == "object") { populate( form, value, name); continue; } // only proceed if element is set var element = form.elements.namedItem( name ); if( ! element ) { continue; } var type = element.type || element[0].type; switch(type ) { default: element.value = value; break; case 'radio': case 'checkbox': for( var j=0; j < element.length; j++ ) { element[j].checked = ( value.indexOf(element[j].value) > -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; } } }; // Play nice with AMD, CommonJS or a plain global object. if ( typeof define == 'function' && typeof define.amd == 'object' && define.amd ) { define(function() { return populate; }); } else if ( typeof module !== 'undefined' && module.exports ) { module.exports = populate; } else { root.populate = populate; } }(this)); },{}]},{},[1]); })();