{"version":3,"sources":["webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/button-loader/button-loader.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/button-loader/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/product-sample-form/product-sample-form.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/product-sample-form/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/add-alert-message/add-alert-message.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/add-alert-message/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/create-message-string/create-message-string.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/create-message-string/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/api-error-handler/api-error-handler.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/api-error-handler/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/error-handler/error-handler.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/error-handler/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/serialize-object/serialize-object.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/serialize-object/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/date-nl.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/has-house-number.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/house-number.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/house-number-addition.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/is-eighteen.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/email-exists.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/min-age.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/checked.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/helpers/single-async-validator.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/shipping-form/gift-constraints.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/form/form.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/form/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/parse-json/parse-json.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/parse-json/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/store/lib/component.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/store/store/store.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/only-words.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/password.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/ean.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/date-nl.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/email.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/phone.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/zipcode.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/house-number.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/house-number-addition.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/names.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/cd.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/pec.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/address.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/index.js","webpack:///./node_modules/lodash/_Symbol.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/_baseTrim.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/_root.js","webpack:///./node_modules/lodash/_trimmedEndIndex.js","webpack:///./node_modules/lodash/debounce.js","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./node_modules/lodash/now.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/validate.js/validate.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///(webpack)/buildin/module.js"],"names":["SUCCESS_CLASS","SUCCESS_TIMER","ButtonLoader","constructor","element","shouldAnimate","show","classList","add","remove","setAttribute","Events","$trigger","data","target","hide","showSucces","removeAttribute","focus","setTimeout","ITEM_HOOK","FOOTER_ITEM_HOOK","FOOTER_CART_ITEM_HOOK","SUBMIT_BUTTON_HOOK","ERROR_HOOK","SAMPLE_CHECK_ICON","FOOTER_ITEM_NAME","PRODUCT_PACKSHOTS","PRODUCT_IMAGE","SAMPLE_FOOTER_BUTTON","ACTIVE_CLASS","DISABLED_CLASS","HIDDEN_CLASS","ProductSampleForm","Form","maxQuantity","parseInt","form","dataset","itemsInCart","extraItemsAllowed","maxItemsReached","formItems","querySelectorAll","footerItems","footerCartItems","submitButton","querySelector","errorMessage","buttonLoader","samplesIconCheck","footerItemNames","productImage","document","productPackshots","footerSampleButtons","selectedProducts","_bindEvents","addCartItemsToFooter","updateFormState","addEventListener","e","formChangeHandler","forEach","button","removeSelectedItem","checkboxid","toggleCheckIcon","inputEl","inputId","id","showIcon","checked","iconElement","parentNode","updateFooterItems","maxItemsReachedCheck","updateImage","getTotalSelectedItems","totalItems","item","checkboxID","checkbox","getElementById","inputChecked","currentElement","index","packshot","replace","push","indexOf","splice","length","showFooterItem","footerItem","itemsToShow","JS_HOOK_MESSAGE","JS_HOOK_CONTENT","addAlertMessage","message","hook","type","scroll","selector","status","el","content","innerHTML","variantClass","className","contains","offset","createMessageString","errors","errorHtml","error","apiErrorHandler","redirectUrl","window","location","href","serverErrors","responseJSON","errorHandler","response","Error","serializeObject","elements","serialized","i","field","name","disabled","value","dateNL","options","day","month","year","split","m","d","y","date","Date","validDate","getFullYear","getMonth","getDate","hasHouseNumber","hasNumber","test","houseNumber","validHouseNumber","regex","houseNumberRegex","slice","match","houseNumberAndAddition","validHouseAndAddition","houseNumberAdditionRegex","isEighteen","is18OrOlder","JS_HOOK_EMAIL_EXISTS_MSG","JS_HOOK_NEW_CUSTOMER_MSG","emailExists","key","validate","Promise","resolve","formItem","fieldset","closest","emailExistsMsg","newCustomerMsg","showEmailExistsMsg","showNewCustomerMsg","checkEmailExistsSuccess","exists","params","email","API","post","endpoint","then","catch","minAge","birthDate","age","singleAsyncValidator","async","single","constraints","newOptions","extend","format","fullMessages","giftConstraints","dwfrm_gift_firstName","presence","allowEmpty","dwfrm_gift_lastName","dwfrm_gift_giftMessage","dwfrm_gift_email","JS_HOOK_DEFAULT_SUBMIT","ALERT_SELECTOR","FORM_SELECTOR","INPUT_TYPES","FORM_ITEM_CLASS","FORM_ITEM_WARN_CLASS","FORM_ITEM_ERROR_CLASS","FORM_ITEM_ERROR_ARIA","FORM_ITEM_DESCRIBE_ARIA","FORM_ITEM_SUCCESS_CLASS","FORM_ITEM_ERROR_MESSAGE_HOOK","REGEX_REMOVE_NEWLINES_AND_WHITESPACE","Component","store","getAttribute","gtmObj","messageSelector","formSelector","class","inputTypes","warnClass","errorClass","errorAria","describeAria","successClass","defaultValidators","getDefaultValidators","customValidationMessages","getCustomValidationMessages","customConstraints","buttonLoaders","defaultSubmit","initInputs","init","bindEvents","setInitialValidators","debounceSingleFieldValidation","debounce","input","singleFieldValidation","changeListener","keyupListener","inputs","updateInputs","bindChangeEvents","$on","obj","_constraints","initButtonLoaders","addButtonLoader","hideButtonLoaders","loader","getButtonElement","tagName","toLowerCase","parseDefaults","defaults","parseJSON","Object","keys","validators","customValidators","processServerErrors","fieldErrors","showErrors","submitFormSuccess","afterSubmitFormError","afterSubmitFormSuccess","JSON","parse","submitFormError","simpleAfterSubmitFormError","preSubmitForm","submitForm","serializeForm","validateFormSuccess","event","currentTarget","validateFormError","validateForm","preventDefault","errorKeys","isAnyError","some","fatalError","getErrorData","validateSingle","custom","inputValue","preValidateFields","validateFields","filter","items","collectFormValues","actualConstraints","singleFieldValidationSuccess","showSuccessForInput","singleFieldValidationError","showErrorsForInput","numberFieldContainsText","scrolledToError","offsetParent","getErrorContainer","hasAttribute","formItemErrorContainer","resetFormItem","warning","textContent","labelContent","trim","errorId","bindSubmitEvents","map","eventName","keyCode","getErrorMessage","errorData","errorList","Array","find","warn","json","defaultValue","parsed","props","watch","watchCollection","stateChanged","Store","subscribe","state","prevState","prop","callback","newState","previousPropState","newPropState","isArray","undefined","actions","mutations","callbacks","self","Proxy","initialState","set","processCallbacks","console","String","dispatch","actionKey","payload","dispatchWithPromise","reject","_state","_prevState","cb","commit","mutationKey","assign","onlyWords","password","ean","emailRegex","phoneRegex","zipCodeRegex","zipCodeRegexStreetOptional","houseNumberAddition","names","cd","pec","addressRegex","dateNLRegex","eanRegex","onlyWordsRegex","passwordRegex","zipCode","cdRegex","pecRegex"],"mappings":"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ACnC,UAAU,mBAAO,CAAC,2CAAO;AACzB,eAAe,mBAAO,CAAC,qDAAY;;AAEnC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO,YAAY;AAC9B,WAAW,QAAQ;AACnB;AACA,WAAW,OAAO;AAClB;AACA,WAAW,QAAQ;AACnB;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,8CAA8C,kBAAkB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC5BA,iBAAiB,mBAAO,CAAC,2DAAe;AACxC,mBAAmB,mBAAO,CAAC,6DAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC5BA,WAAW,mBAAO,CAAC,+CAAS;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;ACtBA,eAAe,mBAAO,CAAC,uDAAa;AACpC,eAAe,mBAAO,CAAC,qDAAY;AACnC,eAAe,mBAAO,CAAC,qDAAY;;AAEnC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;;AAEA,kCAAkC,6BAA6B,EAAE;AACjE;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM,GAAG,MAAM,GAAG,MAAM;AAC1D;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa,4DAA4D;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kDAAkD,KAAK,IAAI,oBAAoB;AAC/E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP,mDAAmD,OAAO;AAC1D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,2BAA2B;;AAE3B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,OAAO;AACP,KAAK;;AAEL;AACA,2BAA2B;AAC3B;AACA;AACA,OAAO;AACP,gBAAgB,cAAc,GAAG,oBAAoB;AACrD,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,OAAO,6BAA6B,KAAK,EAAE,GAAG;AAC9C,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,sBAAsB,IAAI,IAAI,WAAW;AACzC;AACA,8BAA8B,IAAI;AAClC,2CAA2C,IAAI;AAC/C,mBAAmB,IAAI;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B,SAAS;AACT;AACA;AACA,OAAO;AACP,KAAK;AACL,iBAAiB,IAAI;AACrB,6BAA6B,KAAK,KAAK;AACvC,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA,oCAAoC,sBAAsB,EAAE;AAC5D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA,eAAe;AACf,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,iBAAiB,mBAAmB;AACpC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA,SAAS,6BAA6B;AACtC;AACA,SAAS,mBAAmB,GAAG,mBAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,UAAU,WAAW;AACrD,WAAW;AACX,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,4BAA4B,cAAc,aAAa;AACvD,OAAO;AACP;AACA,KAAK;;AAEL;AACA,SAAS,kCAAkC;AAC3C;AACA,QAAQ,qBAAqB,kCAAkC;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA,SAAS,0BAA0B,GAAG,0BAA0B;AAChE;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB,EAAE;AACpD;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,kCAAkC,iBAAiB,EAAE;AACrD;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA,0DAA0D,YAAY;AACtE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,MAAM;AAClD,mCAAmC,UAAU;AAC7C;;AAEA;AACA;AACA;AACA,sCAAsC,MAAM;AAC5C,mCAAmC,eAAe;AAClD;;AAEA;AACA;AACA;AACA,qCAAqC,MAAM;AAC3C,mCAAmC,eAAe;AAClD;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA;AACA,kDAAkD,cAAc,EAAE;AAClE,kDAAkD,eAAe,EAAE;AACnE,kDAAkD,gBAAgB,EAAE;AACpE,kDAAkD,cAAc,EAAE;AAClE,kDAAkD,eAAe,EAAE;AACnE,kDAAkD,oBAAoB;AACtE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,KAAK,GAAG,MAAM;;AAErC;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB;AAClD;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,KAAK;AAC1C;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC,KAAK;AACxC;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,2BAA2B,YAAY,eAAe;AACtD;AACA,KAAK;AACL;AACA;AACA,mBAAmB;AACnB;;AAEA,2BAA2B;;AAE3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM;AAClB,gCAAgC,aAAa;AAC7C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2DAA2D,MAAM;AACjE;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C,KAAK;AACL;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,0CAA0C,EAAE,+BAA+B,EAAE,2NAA2N,EAAE;AAC1S,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA,2BAA2B;AAC3B;AACA;AACA,2BAA2B,UAAU;;AAErC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,uCAAuC;AACzE;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA+C,GAAG;;AAElD;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,kCAAkC,IAAI,EAAE,EAAE;AAC1C,+CAA+C,IAAI,EAAE,EAAE;AACvD,oDAAoD,IAAI,EAAE,EAAE;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,IAAI,qBAAqB,EAAE;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,IAAI;AACrB;AACA;AACA;;AAEA;AACA;AACA,6CAA6C;AAC7C,6CAA6C;AAC7C,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,2BAA2B;AAC3B;;AAEA;AACA;AACA;;AAEA,+BAA+B;;AAE/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mFAAmF,KAAK;;AAExF;AACA;AACA;;AAEA,kCAAkC,6CAA6C;AAC/E;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;;AAEA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA,yDAAyD,8FAAM;AAC/D,CAAC;AACD,QAAQ,KAA8B,wCAAwC,SAAI;AAClF,QAAQ,KAA6B,uCAAuC,SAAI;AAChF,QAAQ,8FAAwE;;;;;;;;;;;;;;ACpuChF;AACA;AACA;;;;;;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA","file":"js/ProductSampleForm.js","sourcesContent":["import Events from '@utilities/events';\n\nconst SUCCESS_CLASS = 'is--success';\nconst SUCCESS_TIMER = 3000;\n\nclass ButtonLoader {\n constructor(element, shouldAnimate = true) {\n this.element = element;\n this.shouldAnimate = shouldAnimate;\n }\n\n /**\n * Shows the loader\n */\n show() {\n if (!this.element) return;\n this.element.classList.add('disabled');\n this.element.classList.remove(SUCCESS_CLASS);\n this.element.setAttribute('disabled', 'disabled');\n this.element.setAttribute('tabindex', '-1');\n if (this.shouldAnimate) Events.$trigger('loader::show', { data: { target: this.element } });\n }\n\n /**\n * Hides the loader\n */\n hide(showSucces = false) {\n if (!this.element) return;\n if (this.shouldAnimate) Events.$trigger('loader::hide');\n this.element.classList.remove('disabled');\n this.element.removeAttribute('disabled');\n this.element.removeAttribute('tabindex');\n if (this.shouldAnimate) this.element.focus();\n\n if (showSucces) {\n this.element.classList.add(SUCCESS_CLASS);\n setTimeout(() => {\n this.element.classList.remove(SUCCESS_CLASS);\n }, SUCCESS_TIMER);\n }\n }\n}\n\nexport default ButtonLoader;\n","import ButtonLoader from './button-loader'\n\nexport default ButtonLoader\n","import Form from '@utilities/form';\nimport ButtonLoader from \"@components/button-loader\";\n\nconst ITEM_HOOK = '[js-hook-sample-products-item]'\nconst FOOTER_ITEM_HOOK = '[js-hook-sample-products-item-footer]'\nconst FOOTER_CART_ITEM_HOOK = '[js-hook-sample-products-item-cart-footer]'\nconst SUBMIT_BUTTON_HOOK = '[js-hook-sample-products-submit]'\nconst ERROR_HOOK = '[js-hook-sample-products-error]'\nconst SAMPLE_CHECK_ICON = '[js-hook-sample-check]'\nconst FOOTER_ITEM_NAME = '[js-hook-footer-item-name]'\nconst PRODUCT_PACKSHOTS = '[js-hook-product-packshot]'\nconst PRODUCT_IMAGE = '[js-hook-product-image]'\nconst SAMPLE_FOOTER_BUTTON = '[js-hook-sample-button-remove]'\n\nconst ACTIVE_CLASS = 'is--active';\nconst DISABLED_CLASS = 'is--disabled';\nconst HIDDEN_CLASS = 'u-hidden';\n\n/**\n * Used to order (limited amount of) product samples\n *\n * @class ProductSampleForm\n * @extends {Form}\n */\nclass ProductSampleForm extends Form {\n constructor(element) {\n super(element);\n this.maxQuantity = parseInt(this.form.dataset.maxQuantity, 10);\n this.itemsInCart = 0;\n this.extraItemsAllowed = this.maxQuantity - this.itemsInCart;\n this.maxItemsReached = this.itemsInCart >= this.maxQuantity;\n this.formItems = [...this.form.querySelectorAll(ITEM_HOOK)];\n this.footerItems = [...this.form.querySelectorAll(FOOTER_ITEM_HOOK)];\n this.footerCartItems = [...this.form.querySelectorAll(FOOTER_CART_ITEM_HOOK)];\n this.submitButton = this.form.querySelector(SUBMIT_BUTTON_HOOK);\n this.errorMessage = this.form.querySelector(ERROR_HOOK);\n this.buttonLoader = new ButtonLoader(this.form.querySelector('[type=\"submit\"]'));\n this.samplesIconCheck = [...this.form.querySelectorAll(SAMPLE_CHECK_ICON)];\n this.footerItemNames = [...this.form.querySelectorAll(FOOTER_ITEM_NAME)];\n this.productImage = document.querySelector(PRODUCT_IMAGE);\n this.productPackshots = [...document.querySelectorAll(PRODUCT_PACKSHOTS)];\n this.footerSampleButtons = [...document.querySelectorAll(SAMPLE_FOOTER_BUTTON)];\n this.selectedProducts = [];\n\n this._bindEvents();\n this.addCartItemsToFooter();\n this.updateFormState();\n }\n\n _bindEvents() {\n this.form.addEventListener('change', (e) => {\n this.formChangeHandler(e);\n });\n\n this.footerSampleButtons.forEach(button => {\n button.addEventListener('click', () => {\n this.removeSelectedItem(button.dataset.checkboxid);\n })\n })\n\n this.form.addEventListener('submit', () => {\n this.buttonLoader.show();\n });\n }\n\n static toggleCheckIcon(inputEl) {\n const inputId = inputEl.id;\n const showIcon = inputEl.checked;\n const iconElement = inputEl.parentNode.querySelector(`#item-check-${inputId}`);\n\n iconElement.classList[showIcon ? 'remove' : 'add'](HIDDEN_CLASS);\n }\n\n formChangeHandler(e) {\n this.updateFooterItems(e.target);\n this.maxItemsReachedCheck();\n this.updateFormState();\n this.updateImage(e.target);\n ProductSampleForm.toggleCheckIcon(e.target);\n }\n\n getTotalSelectedItems() {\n let totalItems = 0;\n\n this.formItems.forEach(item => {\n if(item.querySelector('input').checked) {\n totalItems++\n }\n });\n\n return totalItems;\n }\n\n removeSelectedItem(id) {\n const checkboxID = id;\n\n const checkbox = document.getElementById(checkboxID);\n checkbox.checked = false;\n\n this.updateFooterItems(checkbox);\n this.maxItemsReachedCheck();\n this.updateFormState();\n this.updateImage(checkbox);\n ProductSampleForm.toggleCheckIcon(checkbox);\n }\n\n updateImage(inputEl) {\n const inputId = inputEl.id;\n const inputChecked = inputEl.checked;\n const currentElement = document.querySelector(`#sample-product__packshot-${inputId}`);\n let index;\n\n this.productPackshots.forEach(packshot => {\n if (inputId === packshot.id.replace('sample-product__packshot-','')) {\n packshot.classList[inputChecked ? 'remove' : 'add'](HIDDEN_CLASS);\n }\n else if (inputId !== packshot.id.replace('sample-product__packshot-','')) {\n packshot.classList.add(HIDDEN_CLASS);\n }\n })\n\n if (inputChecked) {\n this.selectedProducts.push(currentElement);\n } else {\n index = this.selectedProducts.indexOf(currentElement);\n this.selectedProducts.splice(index, 1);\n }\n\n if (this.selectedProducts.length === 0) {\n this.productImage.classList.remove(HIDDEN_CLASS);\n } else {\n this.productImage.classList.add(HIDDEN_CLASS);\n this.selectedProducts[this.selectedProducts.length - 1].classList.remove(HIDDEN_CLASS);\n }\n }\n\n updateFooterItems(inputEl){\n const inputId = inputEl.id;\n const showFooterItem = inputEl.checked;\n\n this.footerItems.forEach(footerItem => {\n if (inputId === footerItem.id.replace('footer-item-','')) {\n footerItem.classList[showFooterItem ? 'add' : 'remove'](ACTIVE_CLASS);\n }\n });\n\n this.footerItemNames.forEach(footerItem => {\n if (inputId === footerItem.id.replace('footer-item-name-','')) {\n footerItem.classList[showFooterItem ? 'remove' : 'add'](HIDDEN_CLASS);\n }\n else if (inputId !== footerItem.id.replace('footer-item-name-','')) {\n footerItem.classList.add(HIDDEN_CLASS);\n }\n });\n }\n\n addCartItemsToFooter() {\n let itemsToShow = this.itemsInCart;\n\n if (itemsToShow === 0) return;\n\n this.footerCartItems.forEach(item => {\n\n if (itemsToShow > 0) {\n item.classList.add(ACTIVE_CLASS);\n }\n\n itemsToShow--;\n })\n }\n\n maxItemsReachedCheck () {\n if (this.itemsInCart >= this.maxQuantity) {\n this.maxQuantity = true;\n } else {\n this.maxItemsReached = this.getTotalSelectedItems() === this.extraItemsAllowed;\n }\n }\n\n updateFormState() {\n // hide/show error message & disabled form items\n this.form.classList[this.maxItemsReached ? 'add' : 'remove'](DISABLED_CLASS);\n this.errorMessage.classList[this.maxItemsReached ? 'remove' : 'add'](HIDDEN_CLASS);\n\n // disable on/off of submit button\n if (this.getTotalSelectedItems() > 0) {\n this.submitButton.removeAttribute('disabled');\n } else {\n this.submitButton.setAttribute('disabled', 'disabled');\n }\n }\n}\n\nexport default ProductSampleForm;\n","import ProductSampleForm from './product-sample-form';\n\nexport default ProductSampleForm;\n","import Events from '@utilities/events'\n\nconst JS_HOOK_MESSAGE = '[js-hook-message]'\nconst JS_HOOK_CONTENT = '[js-hook-alert-content]'\n\n/**\n * Add alert message to page\n *\n * @param {String} message - the message string to show\n * @param {String} hook - [js-hook-message] or custom hook\n * @param {String} type - success, warning or error type\n */\nconst addAlertMessage = function ({ message, hook, type, scroll = false }) {\n const selector = hook || JS_HOOK_MESSAGE\n const status = type || 'error'\n\n const el = document.querySelector(selector)\n\n if (!el) return\n const content = el.querySelector(JS_HOOK_CONTENT)\n content.innerHTML = message\n\n // Add classes and show\n const variantClass = `alert--${status}`;\n el.className = el.className.replace(/(?:^|\\W)alert--(\\w+)(?!\\w)/g, ` ${variantClass}`)\n if(!el.classList.contains(variantClass)) el.classList.add(variantClass)\n el.classList.remove('u-hidden')\n el.removeAttribute('aria-hidden')\n el.focus()\n\n // Scroll to alert\n if (!el.classList.contains('is--relative') && !scroll) return\n Events.$trigger('scroll-to::scroll', {\n data: {\n target: el,\n offset: 130,\n },\n })\n}\nexport default addAlertMessage\n","import addAlertMessage from './add-alert-message'\n\nexport default addAlertMessage\n","const createMessageString = function (errors) {\n let errorHtml = ''\n errors.forEach((error) => {\n errorHtml += `<p>${error}</p>`\n })\n return errorHtml\n}\nexport default createMessageString\n","import createMessageString from './create-message-string'\n\nexport default createMessageString\n","import createMessageString from '@utilities/errors/create-message-string'\nimport addAlertMessage from '../add-alert-message'\n\n/**\n * Process API error\n *\n * @param {Object|String} error - error message\n * @param {string} selector - error message selector\n */\nconst apiErrorHandler = function (error, selector) {\n if (!error) return\n const { redirectUrl } = error\n if (redirectUrl) {\n window.location.href = redirectUrl\n } else if (error.serverErrors && error.serverErrors.length) {\n addAlertMessage({\n message: createMessageString(error.serverErrors),\n hook: selector,\n type: 'error',\n scroll: 'true'\n })\n } else {\n const errorMessage = error.errorMessage || error.message || error.responseJSON\n if (!errorMessage) return\n addAlertMessage({ message: errorMessage, hook: selector, type: 'error', scroll: 'true' })\n }\n}\n\nexport default apiErrorHandler\n","import apiErrorHandler from './api-error-handler'\n\nexport default apiErrorHandler\n","import idx from 'idx'\nimport Events from '@utilities/events'\nimport apiErrorHandler from '../api-error-handler'\n\n/**\n * Process errors from API or JS errors\n *\n * @param {Object} error - error message\n */\nconst errorHandler = function (error) {\n Events.$trigger('loader::hide')\n const data = idx(error, (_) => _.response.data)\n if (data) {\n apiErrorHandler(data)\n } else {\n throw new Error(`JAVASCRIPT ERROR: ${error}`)\n }\n}\n\nexport default errorHandler\n","import errorHandler from './error-handler'\n\nexport default errorHandler\n","/**\n * Serialize all form data into an Object\n * @param {Node} form The form to serialize\n * @return {Object} The serialized form obbject\n */\nconst serializeObject = function (form) {\n if (!form || !form.elements) return ''\n\n // Setup our serialized data\n const serialized = {}\n\n // Loop through each field in the form\n for (let i = 0; i < form.elements.length; i++) {\n const field = form.elements[i]\n\n // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields\n if (\n !field.name ||\n field.disabled ||\n field.type === 'file' ||\n field.type === 'reset' ||\n field.type === 'submit' ||\n field.type === 'button'\n ) {\n /* eslint-disable-next-line */\n continue\n }\n\n // Convert field data to a query string\n if ((field.type !== 'checkbox' && field.type !== 'radio') || field.checked) {\n serialized[field.name] = field.value\n }\n }\n\n return serialized\n}\nexport default serializeObject\n","import serializeObject from './serialize-object'\n\nexport default serializeObject\n","/**\n * Check if a date is valid\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst dateNL = function (value, options) {\n if (!value) return null\n const [day, month, year] = value.split('-')\n // This instruction will create a date object\n const m = parseInt(month, 10) - 1\n const d = parseInt(day, 10)\n const y = parseInt(year, 10)\n const date = new Date(y, m, d)\n const validDate = date.getFullYear() === y && date.getMonth() === m && date.getDate() === d\n if (day && month && year && !validDate) {\n return options.message\n }\n return null\n}\nexport default dateNL\n","/**\n * Custom validator for valid house number\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst hasHouseNumber = function (value, options) {\n const hasNumber = /\\d+/.test(value)\n if (!hasNumber) {\n return options\n }\n return null\n}\nexport default hasHouseNumber\n","import regex from '../regex'\n\n/**\n * Custom validator for valid house number\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst houseNumber = function (value, options) {\n const validHouseNumber =\n value &&\n regex.houseNumberRegex.test(value) &&\n value.length <= 10 &&\n !value.slice(-1).match(/[a-zA-Z]/i)\n if (!validHouseNumber) {\n return options.message\n }\n return null\n}\nexport default houseNumber\n","import regex from '../regex'\n\n/**\n * Custom validator for valid house number + addition\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst houseNumberAndAddition = function (value, options) {\n const validHouseAndAddition =\n value &&\n regex.houseNumberRegex.test(value) &&\n value.length <= 10 &&\n !regex.houseNumberAdditionRegex.test(value)\n if (!validHouseAndAddition) {\n return options.message\n }\n return null\n}\nexport default houseNumberAndAddition\n","/**\n * Check if person is 18 years or older\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst isEighteen = function (value, options) {\n if (!value) return null\n const [day, month, year] = value.split('-')\n const is18OrOlder =\n new Date(parseInt(year, 10) + 18, parseInt(month, 10) - 1, parseInt(day, 10)) <= new Date()\n if (day && month && year && !is18OrOlder) {\n return options.message\n }\n return null\n}\nexport default isEighteen\n","import validate from 'validate.js'\nimport API from 'storefront/utilities/api'\n\nconst JS_HOOK_EMAIL_EXISTS_MSG = '[js-hook-order-account-email-exists]'\nconst JS_HOOK_NEW_CUSTOMER_MSG = '[js-hook-order-account-new-customer]'\nconst HIDDEN_CLASS = 'u-hidden'\n\n/**\n * Custom validator to check if email exists\n * @param {String} value | input value\n * @param {Object} options\n * @returns {Promise} returns resolved promise with message\n */\nconst emailExists = function (value, options, key) {\n return new validate.Promise((resolve) => {\n const formItem = document.querySelector(`[name$='${key}']`)\n const fieldset = formItem.closest('fieldset')\n // const emailMessages = fieldset.querySelector(JS_HOOK_EMAIL_MESSAGES);\n const emailExistsMsg = fieldset.querySelector(JS_HOOK_EMAIL_EXISTS_MSG)\n const newCustomerMsg = fieldset.querySelector(JS_HOOK_NEW_CUSTOMER_MSG)\n // if (!value) resolve();\n\n function showEmailExistsMsg() {\n emailExistsMsg.classList.remove(HIDDEN_CLASS)\n newCustomerMsg.classList.add(HIDDEN_CLASS)\n }\n\n function showNewCustomerMsg() {\n newCustomerMsg.classList.remove(HIDDEN_CLASS)\n emailExistsMsg.classList.add(HIDDEN_CLASS)\n }\n\n function checkEmailExistsSuccess(data) {\n if (data && data.exists) {\n showEmailExistsMsg()\n } else {\n showNewCustomerMsg()\n }\n resolve()\n }\n\n const params = {\n email: value,\n }\n\n API.post(options.endpoint, params)\n .then((response) => checkEmailExistsSuccess(response.data))\n .catch(() => resolve())\n })\n}\nexport default emailExists\n","/**\n * Check if birth date exceeds the minimum to prevent unrealistic birth dates\n * @param {String} value - input value: date (format: 01-02-1993)\n * @param {Object} options - message - feedback message\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst minAge = function (value, options) {\n if (!value || !options.message) return null\n\n const [day, month, year] = value.split('-')\n\n if (!day || !month || !year) return null\n\n const birthDate = new Date(+year, month - 1, +day)\n const age = new Date() - birthDate\n\n // Check if age is older dan 120 years\n if (!birthDate || age > 120 * 365 * 24 * 60 * 60 * 1000) return options.message\n\n return null\n}\n\nexport default minAge\n","/**\n * Custom validator for valid checkbox\n * @param {String} value | input checked\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst checked = function (value, options) {\n const message = options && options.message ? options.message : this.options.message\n if (value !== true) {\n return message\n }\n return null\n}\n\nexport default checked\n","/**\n * Custom validators\n */\nimport dateNL from './date-nl'\nimport hasHouseNumber from './has-house-number'\nimport houseNumber from './house-number'\nimport houseNumberAndAddition from './house-number-addition'\nimport isEighteen from './is-eighteen'\nimport emailExists from './email-exists'\nimport minAge from './min-age'\nimport checked from './checked'\n\nexport default {\n dateNL,\n emailExists,\n houseNumberAndAddition,\n houseNumber,\n hasHouseNumber,\n isEighteen,\n minAge,\n checked,\n}\n","import validate from 'validate.js'\n\n/**\n * Add an async single validate function to ValidateJS\n * Extend ValidateJS core functionality\n */\nconst singleAsyncValidator = () => {\n validate.async.single = function (value, constraints, options) {\n const key = options.key || 'single'\n const newOptions = validate.extend({}, validate.single.options, options, {\n format: 'flat',\n fullMessages: false,\n })\n return validate.async({ [key]: value }, { [key]: constraints }, newOptions)\n }\n}\nexport default singleAsyncValidator\n","const giftConstraints = function () {\n\n const constraints = {\n dwfrm_gift_firstName: {\n presence: {\n allowEmpty: false,\n },\n },\n\n dwfrm_gift_lastName: {\n presence: {\n allowEmpty: false,\n },\n },\n\n dwfrm_gift_giftMessage: {\n presence: {\n allowEmpty: false,\n },\n },\n\n dwfrm_gift_email: {\n presence: {\n allowEmpty: false,\n },\n email: true,\n }\n }\n\n return constraints;\n};\n\nexport default giftConstraints;\n","import validate from 'validate.js';\nimport debounce from 'lodash/debounce';\nimport API from '@utilities/api';\nimport parseJSON from '@utilities/parse-json';\nimport serializeObject from '@utilities/serialize-object';\nimport Events from '@utilities/events';\nimport errorHandler from '@utilities/errors/error-handler';\nimport customValidators from '@utilities/validation/validators';\nimport ButtonLoader from '@components/button-loader';\nimport apiErrorHandler from '@utilities/errors/api-error-handler';\nimport singleAsyncValidator from '@utilities/validation/helpers/single-async-validator';\nimport Component from '@utilities/store/lib/component';\nimport giftConstraints from '../../components/shipping-form/gift-constraints';\n\nconst JS_HOOK_DEFAULT_SUBMIT = '[type=\"submit\"]:not(.u-sr-only)';\nconst ALERT_SELECTOR = '[js-hook-message]';\nconst FORM_SELECTOR = '.c-form';\nconst INPUT_TYPES =\n 'input[name]:not(:disabled):not([type=\"hidden\"]):not([data-ignored]), textarea[name]:not([data-ignored]), select[name]:not([data-ignored])';\nconst FORM_ITEM_CLASS = '.form__item';\nconst FORM_ITEM_WARN_CLASS = 'form__item--warn';\nconst FORM_ITEM_ERROR_CLASS = 'form__item--error';\nconst FORM_ITEM_ERROR_ARIA = 'aria-invalid';\nconst FORM_ITEM_DESCRIBE_ARIA = 'aria-describedby';\nconst FORM_ITEM_SUCCESS_CLASS = 'form__item--success';\nconst FORM_ITEM_ERROR_MESSAGE_HOOK = '.form__item-error:not([data-ignored])';\nconst REGEX_REMOVE_NEWLINES_AND_WHITESPACE = /[\\n\\r]+|[\\s]{2,}/g;\n\nclass Form extends Component {\n constructor(element, store) {\n super({ store, element });\n\n this.form = element;\n this.endpoint = element.getAttribute('action');\n this.gtmObj = element.dataset.gtmObj;\n\n this.messageSelector = ALERT_SELECTOR;\n this.formSelector = FORM_SELECTOR;\n\n this.class = FORM_ITEM_CLASS;\n this.inputTypes = INPUT_TYPES;\n this.warnClass = FORM_ITEM_WARN_CLASS;\n this.errorClass = FORM_ITEM_ERROR_CLASS;\n this.errorAria = FORM_ITEM_ERROR_ARIA;\n this.describeAria = FORM_ITEM_DESCRIBE_ARIA;\n this.successClass = FORM_ITEM_SUCCESS_CLASS;\n this.message = FORM_ITEM_ERROR_MESSAGE_HOOK;\n\n // Constraints & Validation\n this.defaultValidators = this.getDefaultValidators();\n this.customValidationMessages = this.getCustomValidationMessages();\n this.constraints = {};\n this.customConstraints = {};\n\n // Buttons\n this.buttonLoaders = [];\n this.defaultSubmit = this.form.querySelector(JS_HOOK_DEFAULT_SUBMIT);\n\n this.initInputs();\n this.init();\n this.bindEvents();\n }\n\n init() {\n // Validators\n this.setInitialValidators();\n singleAsyncValidator();\n\n // Events\n const debounceSingleFieldValidation = debounce(\n (input) => this.singleFieldValidation(input),\n 800,\n );\n this.changeListener = (input) => debounceSingleFieldValidation(input);\n this.keyupListener = (input) => this.singleFieldValidation(input);\n }\n\n initInputs() {\n this.inputs = [...this.form.querySelectorAll(this.inputTypes)];\n }\n\n updateInputs() {\n this.initInputs();\n this.bindChangeEvents();\n }\n\n bindEvents() {\n Events.$on('form::update-inputs', () => this.updateInputs());\n }\n\n set constraints(obj) {\n this._constraints = obj;\n }\n\n get constraints() {\n return this._constraints;\n }\n\n initButtonLoaders() {\n if (this.defaultSubmit) {\n this.addButtonLoader(this.defaultSubmit, false);\n }\n }\n\n hideButtonLoaders() {\n this.buttonLoaders.forEach((loader) => loader.hide());\n this.buttonLoaders = [];\n }\n\n /**\n * Changes the button loader\n * @param {HTMLElement} element - DOM element of the button\n * @param {Boolean} shouldAnimate - button should animate with a loader element\n */\n addButtonLoader(element, shouldAnimate) {\n if (!element) return;\n this.buttonLoaders.push(new ButtonLoader(element, shouldAnimate));\n this.buttonLoaders[this.buttonLoaders.length - 1].show();\n }\n\n getButtonElement(target) {\n if (!target) return null;\n if (target.tagName.toLowerCase() === 'form') {\n return this.form.querySelector('[type=\"submit\"]');\n }\n if (target.tagName.toLowerCase() === 'button') {\n return target;\n }\n return null;\n }\n\n getDefaultValidators() {\n const { data, error } = Form.parseDefaults(this.form.dataset.defaultValidators);\n if (error) return new Error(`Form.js - getDefaultValidators - Error: ${error}`);\n return data;\n }\n\n getCustomValidationMessages() {\n const { data, error } = Form.parseDefaults(this.form.dataset.customValidationMessages);\n if (error) return new Error(`Form.js - getCustomValidationMessages - Error: ${error}`);\n return data;\n }\n\n /**\n * Parse an object containing defaults\n * @param {Object} defaults - defaults object\n */\n static parseDefaults(defaults) {\n const data = parseJSON(defaults, {});\n if (!data)\n return {\n error: \"Couldn't parse defaults in Form.js - function parseDefaults\",\n };\n return { data };\n }\n\n /**\n * Set initial validators on ValidateJS.\n * Add defaultValidator messages & custom validators for ean, zipcode etc\n */\n setInitialValidators() {\n if (!this.defaultValidators) return;\n\n // Init Default Validators\n Object.keys(this.defaultValidators).forEach((key) => {\n validate.validators[key].options = this.defaultValidators[key];\n });\n\n // Init Custom Validators\n Object.keys(customValidators).forEach((key) => {\n validate.validators[key] = customValidators[key];\n });\n }\n\n /**\n * Shows errors from backend/server in form per field or on top of form when it is a generic server error\n * @param {Object} data - the response data\n */\n processServerErrors(data) {\n if (data.fieldErrors?.length) {\n data.fieldErrors.forEach((error) => {\n if (Object.keys(error).length) {\n this.showErrors(error);\n }\n });\n }\n\n if (data.serverErrors?.length || data.errorMessage?.length) {\n apiErrorHandler(data, this.messageSelector);\n }\n }\n\n /**\n * Submit form success handler\n * @param {Object} data - data returned from API call\n */\n submitFormSuccess(data) {\n if (data.error) {\n if (typeof this.afterSubmitFormError === 'function') {\n this.afterSubmitFormError(data);\n } else {\n this.processServerErrors(data);\n }\n }\n // If extended form provides afterSubmitFormSuccess function, this will be called\n else if (typeof this.afterSubmitFormSuccess === 'function') {\n this.afterSubmitFormSuccess(data);\n }\n\n if (this.gtmObj) {\n Events.$trigger('gtm::push', {\n data: JSON.parse(this.gtmObj),\n });\n }\n\n if (data.redirectUrl) {\n window.location.href = data.redirectUrl;\n } else {\n this.hideButtonLoaders();\n }\n }\n\n submitFormError(error) {\n this.hideButtonLoaders();\n\n // If extended form provides simpleAfterSubmitFormError function, this will be called\n if (typeof this.simpleAfterSubmitFormError === 'function') {\n this.simpleAfterSubmitFormError();\n }\n\n errorHandler(error);\n }\n\n /**\n * Post form to API\n */\n preSubmitForm() {\n this.submitForm(this.serializeForm());\n }\n\n serializeForm() {\n return serializeObject(this.form);\n }\n\n submitForm(data) {\n API.post(this.endpoint, data)\n .then((response) => this.submitFormSuccess(response.data))\n .catch((error) => this.submitFormError(error));\n }\n\n /**\n * Form validation success handler\n *\n * @param event, submit event\n */\n validateFormSuccess(event) {\n if (event) {\n const target = this.getButtonElement(event.currentTarget);\n this.addButtonLoader(target, true);\n }\n this.preSubmitForm();\n }\n\n /**\n * Form validation error handler\n *\n * @param {Array} errors | errors returned from ValidateJS\n */\n validateFormError(errors) {\n if (errors instanceof Error) {\n // This means an exception was thrown from a validator\n apiErrorHandler(errors, this.messageSelector);\n } else {\n this.showErrors(errors);\n }\n }\n\n /**\n * Submit the shipping form\n * @param event, submit event\n */\n validateForm(event = null) {\n if (event) event.preventDefault();\n\n this.validate()\n .then(\n () => this.validateFormSuccess(event),\n (errors) => {\n const errorKeys = Object.keys(errors);\n\n // if there are errors without warning, fail validation\n const isAnyError = errorKeys.some((key) => {\n const { fatalError } = getErrorData(errors[key]);\n return fatalError;\n });\n\n if (isAnyError) {\n this.validateFormError(errors);\n return;\n }\n this.validateFormSuccess(event);\n },\n )\n .catch((error) => errorHandler(error));\n }\n\n /**\n * Validate a single field\n *\n * @param {HTMLElement} input | input that fired onChange event\n * @returns {Promise}\n */\n validateSingle(input, custom) {\n let inputValue = input.value;\n if (input.type === 'checkbox') inputValue = input.checked;\n let constraints;\n\n if (input.id === 'dwfrm_gift_firstName' || input.id === 'dwfrm_gift_lastName' || input.id === 'dwfrm_gift_email') {\n constraints = giftConstraints();;\n } else {\n constraints = custom === false ? this.constraints : this.customConstraints;\n }\n\n return validate.async.single(inputValue, constraints[input.name], {\n key: input.name,\n });\n }\n\n /**\n * Prevalidate filled fields\n */\n preValidateFields() {\n this.validateFields(this.inputs.filter((input) => input.value.length > 0));\n }\n\n /**\n * Validate fields from an array\n *\n * @param {HTMLElement[]} inputs | inputs array\n */\n validateFields(inputs) {\n ;[...inputs].forEach((input) => this.singleFieldValidation(input));\n }\n\n /**\n * Validate the form\n *\n * @returns {Promise}\n */\n validate() {\n const items = validate.collectFormValues(this.form);\n\n // create new constraints object\n // based on non hidden input fields\n const actualConstraints = {};\n\n Object.keys(items).forEach((item) => {\n const key = item;\n if (!this.constraints[key]) return;\n actualConstraints[key] = this.constraints[key];\n });\n\n return validate.async(items, actualConstraints, { fullMessages: false });\n }\n\n /**\n * Single field validation success handler\n *\n * @param {HTMLElement} input | input that fired onChange event\n */\n singleFieldValidationSuccess(input) {\n this.showSuccessForInput(input);\n }\n\n /**\n * Single field validation error handler\n *\n * @param {HTMLElement} input | input that fired onChange event\n * @param {Array} errors | errors returned from ValidateJS\n */\n singleFieldValidationError(input, errors) {\n this.showErrorsForInput(input, errors);\n return errors;\n }\n\n /**\n * Single field validation:\n * Can be called as onChange event or to validate a single input\n * @param {HTMLElement} input | input that fired onChange event\n */\n singleFieldValidation(input, custom = false) {\n if (Form.numberFieldContainsText(input)) {\n input.value = '';\n }\n\n return this.validateSingle(input, custom)\n .then(\n () => this.singleFieldValidationSuccess(input),\n (errors) => this.singleFieldValidationError(input, errors),\n )\n .catch((error) => apiErrorHandler(error));\n }\n\n /**\n * Checks if input type=\"number\" fields contain text\n *\n * @param {HTMLElement} input | input element to check\n * @returns {Boolean} return true if number field contains text, false otherwise\n */\n static numberFieldContainsText(input) {\n if (input.getAttribute('type') === 'number') {\n return !/^\\d+$/.test(input.value);\n }\n\n return false;\n }\n\n /**\n * Gather validation errors and show per input\n *\n * @param {Array} errors | errors returned from ValidateJS\n */\n showErrors(errors) {\n if (!errors) return;\n // const formItems = this.form.querySelectorAll(this.inputTypes)\n\n let scrolledToError = false;\n ;[...this.inputs].forEach((input) => {\n if (!scrolledToError && errors[input.name]) {\n const { fatalError } = getErrorData(errors[input.name]);\n\n if (fatalError) {\n input.focus();\n Events.$trigger('scroll-to::scroll', {\n data: {\n target: input.offsetParent !== null ? input : input.closest(FORM_ITEM_CLASS),\n offset: 180,\n },\n });\n scrolledToError = true;\n }\n }\n this.showErrorsForInput(input, errors[input.name]);\n });\n }\n\n getErrorContainer(input) {\n if (input.name === 'brandCode') return false;\n const formItem = input.closest(this.class);\n\n return formItem?.querySelector(this.message);\n }\n\n /**\n * Display validation error on a specific field\n *\n * @param {HTMLElement} input | input to show error on\n * @param {Array} errors | errors returned from ValidateJS or Backend\n */\n showErrorsForInput(input, errors) {\n if (input.hasAttribute('data-ignored')) return; // Allows us to ignore certain inputs. https://validatejs.org/#utilities-collect-form-values doesn't seem to work.\n\n const formItem = input.closest(this.class);\n const formItemErrorContainer = this.getErrorContainer(input);\n\n if (!formItemErrorContainer) {\n return;\n }\n\n // reset form input state\n this.resetFormItem(formItem, input);\n if (errors) {\n const { warning, fatalError, errorMessage } = getErrorData(errors);\n input.setAttribute(this.errorAria, true);\n input.setAttribute(this.describeAria, formItemErrorContainer.id);\n formItem.classList.add(!fatalError && warning ? this.warnClass : this.errorClass);\n formItemErrorContainer.textContent = errorMessage;\n formItemErrorContainer.removeAttribute('aria-hidden');\n const labelContent =\n document\n .querySelector(`label[for=\"${input.id}\"]`)\n ?.textContent.replace(REGEX_REMOVE_NEWLINES_AND_WHITESPACE, ' ')\n .trim() || '';\n Events.$trigger('gtm::errorEvent', {\n data: {\n errorMessage,\n errorId: labelContent,\n },\n });\n } else if (input.value.length > 0) {\n formItem.classList.add(this.successClass);\n }\n }\n\n showSuccessForInput(input) {\n const formItem = input.closest(this.class);\n this.resetFormItem(formItem, input);\n\n if (input.value.length > 0) {\n formItem.classList.add(this.successClass);\n }\n }\n\n /**\n * Remove error classes and any old error message\n * @param {HTMLElement} formItem | input parent that holds error/success classes\n * @param {HTMLElement} input | input element\n */\n resetFormItem(formItem, input) {\n const formItemErrorContainer = this.getErrorContainer(input);\n input.removeAttribute(this.errorAria);\n input.removeAttribute(this.describeAria);\n\n if (formItemErrorContainer) {\n formItemErrorContainer.setAttribute('aria-hidden', 'true');\n formItemErrorContainer.textContent = '';\n }\n\n if (formItem) {\n formItem.classList.remove(this.errorClass);\n formItem.classList.remove(this.warnClass);\n formItem.classList.remove(this.successClass);\n }\n }\n\n bindSubmitEvents() {\n // TODO: For debug of forms, keep for now\n // this.form.addEventListener('submit', event => {\n // event.preventDefault(event);\n // this.submitForm();\n // });\n this.form.addEventListener('submit', (event) => this.validateForm(event));\n }\n\n /**\n * Bind change events of input elements\n */\n bindChangeEvents() {\n this.inputs.map((input) => {\n const eventName =\n input.tagName === 'SELECT' || input.type === 'checkbox' || input.type === 'radio'\n ? 'change'\n : 'keyup';\n input.addEventListener(eventName, (event) => {\n if (event.keyCode !== 9 && eventName === 'change') {\n this.changeListener(input);\n } else if (event.keyCode !== 9) {\n this.keyupListener(input);\n }\n });\n input.addEventListener('paste', () => this.changeListener(input));\n });\n this.hideButtonLoaders();\n }\n}\n\nfunction getErrorMessage(errorData) {\n if (errorData) {\n if (errorData.message) {\n return errorData.message;\n }\n return errorData;\n }\n return false;\n}\n\nfunction getErrorData(errors) {\n const errorList = errors.constructor === Array ? [...errors] : [errors];\n const fatalError = errorList.find((error) => !error.warn);\n const warning = errorList.find((error) => error.warn);\n\n return {\n fatalError,\n warning,\n errorMessage: getErrorMessage(fatalError || warning),\n };\n}\n\nexport default Form;\n","import Form from './form'\n\nexport default Form\n","const parseJSON = function (json, defaultValue) {\n // This function cannot be optimised, it's best to\n // keep it small!\n let parsed\n\n try {\n parsed = JSON.parse(json)\n } catch (e) {\n parsed = defaultValue\n }\n\n return parsed || null // Could be undefined!\n}\n\nexport default parseJSON\n","import parseJSON from './parse-json'\n\nexport default parseJSON\n","// @ts-ignore\nimport idx from 'idx'\n\nimport Store from '../store/store'\n\nclass Component {\n constructor(props = {}) {\n this.watch = Component.watch || function() {}\n this.watchCollection = Component.watchCollection || function() {}\n this.stateChanged = this.stateChanged || function() {}\n if (props.store instanceof Store) {\n // This fires every time the state updates\n props.store.subscribe((state, prevState) => {\n this.stateChanged(state, prevState)\n })\n }\n\n if (props.element) {\n this.element = props.element\n }\n }\n\n static watchCollection(store, prop, callback) {\n const { state: newState, prevState } = store\n const previousPropState = idx(prevState, _ => _[prop])\n const newPropState = idx(newState, _ => _[prop])\n if (Array.isArray(previousPropState)) {\n if (\n previousPropState &&\n previousPropState.length &&\n newPropState.length !== previousPropState.length\n ) {\n // Make sure the callback is a function\n if (typeof callback === 'function') {\n return callback()\n }\n }\n }\n return undefined\n }\n\n static watch(store, prop, callback) {\n const { state: newState, prevState } = store\n const previousPropState = idx(prevState, _ => _[prop])\n const newPropState = idx(newState, _ => _[prop])\n if (\n typeof newPropState === 'boolean' ||\n typeof newPropState === 'string' ||\n typeof newPropState === 'number'\n ) {\n if (previousPropState && newPropState !== previousPropState) {\n // Make sure the callback is a function\n if (typeof callback === 'function') {\n return callback()\n }\n }\n }\n return undefined\n }\n}\nexport default Component\n","class Store {\n constructor(params) {\n // Add some default objects to hold our actions, mutations and state\n // Look in the passed params object for actions and mutations\n // that might have been passed in\n this.actions = params.actions || {}\n this.mutations = params.mutations || {}\n this.state = {}\n this.prevState = {}\n\n // A status enum to set during actions and mutations\n this.status = 'resting'\n\n // We store callbacks for when the state changes in here\n this.callbacks = []\n\n // Set our state to be a Proxy. We are setting the default state by\n // checking the params and defaulting to an empty object if no default\n // state is passed in\n const self = this\n self.state = new Proxy(params.initialState || {}, {\n set(state, key, value) {\n // Set the value as we would normally\n state[key] = value\n\n // eslint-disable-next-line\n // console.log(`stateChange: ${String(key)}: ${value}`)\n\n // Fire off our callback processor because if there's listeners,\n // they're going to want to know that something has changed\n self.processCallbacks(self.state, self.prevState)\n\n if (self.status !== 'mutation') {\n // eslint-disable-next-line\n console.warn(`You should use a mutation to set ${String(key)}`)\n }\n // Reset the status ready for the next operation\n self.status = 'resting'\n\n return true\n },\n })\n }\n\n /**\n * A dispatcher for actions that looks in the actions\n * collection and runs the action if it can find it\n *\n * @param {string} actionKey\n * @param {object} payload\n * @returns {boolean}\n * @memberof Store\n */\n dispatch(actionKey, payload) {\n // Run a quick check to see if the action actually exists\n // before we try to run it\n if (typeof this.actions[actionKey] !== 'function') {\n console.error(`Action \"${actionKey}\" doesn't exist.`)\n return false\n }\n\n // Let anything that's watching the status know that we're dispatching an action\n this.status = 'action'\n\n // Actually call the action and pass it the Store context and whatever payload was passed\n return this.actions[actionKey](this, payload)\n }\n\n /**\n * A dispatcher for actions that looks in the actions\n * collection and runs the action if it can find it\n * and returns a Promise that resolves when the action is completed\n *\n * @param {string} actionKey\n * @param {object} payload\n * @returns {Promise}\n * @memberof Store\n */\n dispatchWithPromise(actionKey, payload) {\n return new Promise((resolve, reject) => {\n // Run a quick check to see if the action actually exists\n // before we try to run it\n if (typeof this.actions[actionKey] !== 'function') {\n console.error(`Action \"${actionKey}\" doesn't exist.`);\n reject(new Error(`Action \"${actionKey}\" doesn't exist.`));\n } else {\n // Add a callback to the store\n // eslint-disable-next-line no-unused-vars\n const callback = (_state, _prevState) => {\n if (this.status === 'mutation') {\n // Action has completed, remove the callback and resolve the Promise\n this.callbacks = this.callbacks.filter(cb => cb !== callback);\n resolve();\n }\n };\n \n this.subscribe(callback);\n this.dispatch(actionKey, payload)\n .then(() => {})\n .catch((error) => {\n this.callbacks = this.callbacks.filter(cb => cb !== callback);\n reject(error);\n });\n }\n });\n }\n\n \n\n /**\n * Look for a mutation and modify the state object\n * if that mutation exists by calling it\n *\n * @param {string} mutationKey\n * @param {object} payload\n * @returns {boolean}\n * @memberof Store\n */\n commit(mutationKey, payload) {\n // Run a quick check to see if this mutation actually exists\n // before trying to run it\n if (typeof this.mutations[mutationKey] !== 'function') {\n console.error(`Mutation \"${mutationKey}\" doesn't exist`)\n return false\n }\n\n // Let anything that's watching the status know that we're mutating state\n this.status = 'mutation'\n\n this.prevState = Object.assign({}, this.state)\n\n // Get a new version of the state by running the mutation and storing the result of it\n const newState = this.mutations[mutationKey](this.state, payload)\n\n // Update the old state with the new state returned from our mutation\n this.state = newState\n\n return true\n }\n\n /**\n * Fire off each callback that's run whenever the state changes\n * We pass in some data as the one and only parameter.\n * Returns a boolean depending if callbacks were found or not\n *\n * @param {object} state\n * @param {object} prevState\n * @returns {boolean}\n */\n processCallbacks(state, prevState) {\n if (!this.callbacks.length) {\n return false\n }\n\n // We've got callbacks, so loop each one and fire it off\n this.callbacks.forEach(callback => callback(state, prevState))\n\n return true\n }\n\n /**\n * Allow an outside entity to subscribe to state changes with a valid callback.\n * Returns boolean based on wether or not the callback was added to the collection\n *\n * @param {function} callback\n * @returns {boolean}\n */\n subscribe(callback) {\n if (typeof callback !== 'function') {\n console.error('You can only subscribe to Store changes with a valid function')\n return false\n }\n\n // A valid function, so it belongs in our collection\n this.callbacks.push(callback)\n\n return true\n }\n}\n\nexport default Store\n","/**\n * Regex to check only words, no other characters then a space\n * @type {RegExp}\n */\n\nconst onlyWords = /^[\\w\\s]+$/\n\nexport default onlyWords\n","/**\n * Regex to check password\n * Per https://stackoverflow.com/questions/19605150/regex-for-password-must-contain-at-least-eight-characters-at-least-one-number-a\n * Min 1 uppercase letter.\n * Min 1 number.\n * Min 9 characters.\n * Max 30 characters\n * @type {RegExp}\n */\n\nconst password = /^(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d@$!%*?&.,\\-|+~#_/()[\\]{}=]{9,30}$/\n\nexport default password\n","/**\n * Regex to check ean barcodes\n * @type {RegExp}\n */\n\nconst ean = /^\\d{13}$/\n\nexport default ean\n","/**\n * Regex to check a dutch date format\n * @type {RegExp}\n */\n\nconst dateNL = /^(\\d{1,2})(\\/|-)(\\d{1,2})(\\/|-)(\\d{4})$/\n\nexport default dateNL\n","/**\n * Regex to check emails against\n * @type {RegExp}\n */\n\nconst emailRegex = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,10}))$/\n\nexport default emailRegex\n","/**\n * Regex to check dutch phone numbers against\n * @type {RegExp}\n */\nconst phoneRegex = /^\\s*\\+?\\s*([0-9][\\s-]*){9,20}$/\n\nexport default phoneRegex\n","/**\n * Regex to check dutch zipcodes against\n * @type {RegExp}\n */\n\nconst zipCodeRegex = /^[1-9][0-9]{3}?(?!sa|sd|ss)[a-z|A-Z]{2}$/i\nconst zipCodeRegexStreetOptional = /^[1-9][0-9]{3}(?:(?!sa|sd|ss)[a-z|A-Z]{2})?$/i\n\nexport default { zipCodeRegex, zipCodeRegexStreetOptional }\n","/**\n * Regex to check dutch housenumbers\n * @type {RegExp}\n */\n\nconst houseNumber = /^(?:[a-zA-Z0-9 ]+(?:-(?!$))?)+$/\n\nexport default houseNumber\n","/**\n * Regex to check dutch housenumber additions\n * @type {RegExp}\n */\n\nconst houseNumberAddition = /^[a-zA-Z]+$/\n\nexport default houseNumberAddition\n","/**\n * Regex to check names, with some special characters allowed\n * @type {RegExp}\n */\n\nconst names = /^(?:[\\p{L}\\p{Mn}\\p{Pd}.,'\\s]+)+$/u\n\nexport default names\n","/**\n * Regex to check cd field\n * @type {RegExp}\n */\n\nconst cd = /^[A-Z0-9]{7}$/\n\nexport default cd\n","/**\n * Regex to check pec field\n * @type {RegExp}\n */\n\nconst pec = /^[a-zA-Z0-9-_+]{1}[a-zA-Z0-9-_.+]{0,62}[a-zA-Z0-9-_+]{1}@[a-zA-Z0-9-.]{1,128}[.]{1}[a-zA-Z]{2,60}$/\n\nexport default pec\n","/**\n * Regex to check addresses against\n * @type {RegExp}\n */\n\nconst addressRegex = /^(?:[\\p{L}\\p{Mn}\\p{Pd}.,'\\s\\d]+)+$/u\n\nexport default addressRegex\n","/**\n * Validation types\n */\nimport onlyWordsRegex from './only-words'\nimport passwordRegex from './password'\nimport eanRegex from './ean'\nimport dateNLRegex from './date-nl'\nimport emailRegex from './email'\nimport phoneRegex from './phone'\nimport zipCode from './zipcode'\nimport houseNumberRegex from './house-number'\nimport houseNumberAdditionRegex from './house-number-addition'\nimport names from './names'\nimport cdRegex from './cd'\nimport pecRegex from './pec'\nimport addressRegex from './address'\n\nexport default {\n dateNLRegex,\n eanRegex,\n emailRegex,\n houseNumberRegex,\n houseNumberAdditionRegex,\n names,\n onlyWordsRegex,\n passwordRegex,\n phoneRegex,\n zipCode,\n cdRegex,\n pecRegex,\n addressRegex\n}\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","/*!\n * validate.js 0.13.1\n *\n * (c) 2013-2019 Nicklas Ansman, 2013 Wrapp\n * Validate.js may be freely distributed under the MIT license.\n * For all details and documentation:\n * http://validatejs.org/\n */\n\n(function(exports, module, define) {\n \"use strict\";\n\n // The main function that calls the validators specified by the constraints.\n // The options are the following:\n // - format (string) - An option that controls how the returned value is formatted\n // * flat - Returns a flat array of just the error messages\n // * grouped - Returns the messages grouped by attribute (default)\n // * detailed - Returns an array of the raw validation data\n // - fullMessages (boolean) - If `true` (default) the attribute name is prepended to the error.\n //\n // Please note that the options are also passed to each validator.\n var validate = function(attributes, constraints, options) {\n options = v.extend({}, v.options, options);\n\n var results = v.runValidations(attributes, constraints, options)\n , attr\n , validator;\n\n if (results.some(function(r) { return v.isPromise(r.error); })) {\n throw new Error(\"Use validate.async if you want support for promises\");\n }\n return validate.processValidationResults(results, options);\n };\n\n var v = validate;\n\n // Copies over attributes from one or more sources to a single destination.\n // Very much similar to underscore's extend.\n // The first argument is the target object and the remaining arguments will be\n // used as sources.\n v.extend = function(obj) {\n [].slice.call(arguments, 1).forEach(function(source) {\n for (var attr in source) {\n obj[attr] = source[attr];\n }\n });\n return obj;\n };\n\n v.extend(validate, {\n // This is the version of the library as a semver.\n // The toString function will allow it to be coerced into a string\n version: {\n major: 0,\n minor: 13,\n patch: 1,\n metadata: null,\n toString: function() {\n var version = v.format(\"%{major}.%{minor}.%{patch}\", v.version);\n if (!v.isEmpty(v.version.metadata)) {\n version += \"+\" + v.version.metadata;\n }\n return version;\n }\n },\n\n // Below is the dependencies that are used in validate.js\n\n // The constructor of the Promise implementation.\n // If you are using Q.js, RSVP or any other A+ compatible implementation\n // override this attribute to be the constructor of that promise.\n // Since jQuery promises aren't A+ compatible they won't work.\n Promise: typeof Promise !== \"undefined\" ? Promise : /* istanbul ignore next */ null,\n\n EMPTY_STRING_REGEXP: /^\\s*$/,\n\n // Runs the validators specified by the constraints object.\n // Will return an array of the format:\n // [{attribute: \"<attribute name>\", error: \"<validation result>\"}, ...]\n runValidations: function(attributes, constraints, options) {\n var results = []\n , attr\n , validatorName\n , value\n , validators\n , validator\n , validatorOptions\n , error;\n\n if (v.isDomElement(attributes) || v.isJqueryElement(attributes)) {\n attributes = v.collectFormValues(attributes);\n }\n\n // Loops through each constraints, finds the correct validator and run it.\n for (attr in constraints) {\n value = v.getDeepObjectValue(attributes, attr);\n // This allows the constraints for an attribute to be a function.\n // The function will be called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validators = v.result(constraints[attr], value, attributes, attr, options, constraints);\n\n for (validatorName in validators) {\n validator = v.validators[validatorName];\n\n if (!validator) {\n error = v.format(\"Unknown validator %{name}\", {name: validatorName});\n throw new Error(error);\n }\n\n validatorOptions = validators[validatorName];\n // This allows the options to be a function. The function will be\n // called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validatorOptions = v.result(validatorOptions, value, attributes, attr, options, constraints);\n if (!validatorOptions) {\n continue;\n }\n results.push({\n attribute: attr,\n value: value,\n validator: validatorName,\n globalOptions: options,\n attributes: attributes,\n options: validatorOptions,\n error: validator.call(validator,\n value,\n validatorOptions,\n attr,\n attributes,\n options)\n });\n }\n }\n\n return results;\n },\n\n // Takes the output from runValidations and converts it to the correct\n // output format.\n processValidationResults: function(errors, options) {\n errors = v.pruneEmptyErrors(errors, options);\n errors = v.expandMultipleErrors(errors, options);\n errors = v.convertErrorMessages(errors, options);\n\n var format = options.format || \"grouped\";\n\n if (typeof v.formatters[format] === 'function') {\n errors = v.formatters[format](errors);\n } else {\n throw new Error(v.format(\"Unknown format %{format}\", options));\n }\n\n return v.isEmpty(errors) ? undefined : errors;\n },\n\n // Runs the validations with support for promises.\n // This function will return a promise that is settled when all the\n // validation promises have been completed.\n // It can be called even if no validations returned a promise.\n async: function(attributes, constraints, options) {\n options = v.extend({}, v.async.options, options);\n\n var WrapErrors = options.wrapErrors || function(errors) {\n return errors;\n };\n\n // Removes unknown attributes\n if (options.cleanAttributes !== false) {\n attributes = v.cleanAttributes(attributes, constraints);\n }\n\n var results = v.runValidations(attributes, constraints, options);\n\n return new v.Promise(function(resolve, reject) {\n v.waitForResults(results).then(function() {\n var errors = v.processValidationResults(results, options);\n if (errors) {\n reject(new WrapErrors(errors, options, attributes, constraints));\n } else {\n resolve(attributes);\n }\n }, function(err) {\n reject(err);\n });\n });\n },\n\n single: function(value, constraints, options) {\n options = v.extend({}, v.single.options, options, {\n format: \"flat\",\n fullMessages: false\n });\n return v({single: value}, {single: constraints}, options);\n },\n\n // Returns a promise that is resolved when all promises in the results array\n // are settled. The promise returned from this function is always resolved,\n // never rejected.\n // This function modifies the input argument, it replaces the promises\n // with the value returned from the promise.\n waitForResults: function(results) {\n // Create a sequence of all the results starting with a resolved promise.\n return results.reduce(function(memo, result) {\n // If this result isn't a promise skip it in the sequence.\n if (!v.isPromise(result.error)) {\n return memo;\n }\n\n return memo.then(function() {\n return result.error.then(function(error) {\n result.error = error || null;\n });\n });\n }, new v.Promise(function(r) { r(); })); // A resolved promise\n },\n\n // If the given argument is a call: function the and: function return the value\n // otherwise just return the value. Additional arguments will be passed as\n // arguments to the function.\n // Example:\n // ```\n // result('foo') // 'foo'\n // result(Math.max, 1, 2) // 2\n // ```\n result: function(value) {\n var args = [].slice.call(arguments, 1);\n if (typeof value === 'function') {\n value = value.apply(null, args);\n }\n return value;\n },\n\n // Checks if the value is a number. This function does not consider NaN a\n // number like many other `isNumber` functions do.\n isNumber: function(value) {\n return typeof value === 'number' && !isNaN(value);\n },\n\n // Returns false if the object is not a function\n isFunction: function(value) {\n return typeof value === 'function';\n },\n\n // A simple check to verify that the value is an integer. Uses `isNumber`\n // and a simple modulo check.\n isInteger: function(value) {\n return v.isNumber(value) && value % 1 === 0;\n },\n\n // Checks if the value is a boolean\n isBoolean: function(value) {\n return typeof value === 'boolean';\n },\n\n // Uses the `Object` function to check if the given argument is an object.\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n // Simply checks if the object is an instance of a date\n isDate: function(obj) {\n return obj instanceof Date;\n },\n\n // Returns false if the object is `null` of `undefined`\n isDefined: function(obj) {\n return obj !== null && obj !== undefined;\n },\n\n // Checks if the given argument is a promise. Anything with a `then`\n // function is considered a promise.\n isPromise: function(p) {\n return !!p && v.isFunction(p.then);\n },\n\n isJqueryElement: function(o) {\n return o && v.isString(o.jquery);\n },\n\n isDomElement: function(o) {\n if (!o) {\n return false;\n }\n\n if (!o.querySelectorAll || !o.querySelector) {\n return false;\n }\n\n if (v.isObject(document) && o === document) {\n return true;\n }\n\n // http://stackoverflow.com/a/384380/699304\n /* istanbul ignore else */\n if (typeof HTMLElement === \"object\") {\n return o instanceof HTMLElement;\n } else {\n return o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\";\n }\n },\n\n isEmpty: function(value) {\n var attr;\n\n // Null and undefined are empty\n if (!v.isDefined(value)) {\n return true;\n }\n\n // functions are non empty\n if (v.isFunction(value)) {\n return false;\n }\n\n // Whitespace only strings are empty\n if (v.isString(value)) {\n return v.EMPTY_STRING_REGEXP.test(value);\n }\n\n // For arrays we use the length property\n if (v.isArray(value)) {\n return value.length === 0;\n }\n\n // Dates have no attributes but aren't empty\n if (v.isDate(value)) {\n return false;\n }\n\n // If we find at least one property we consider it non empty\n if (v.isObject(value)) {\n for (attr in value) {\n return false;\n }\n return true;\n }\n\n return false;\n },\n\n // Formats the specified strings with the given values like so:\n // ```\n // format(\"Foo: %{foo}\", {foo: \"bar\"}) // \"Foo bar\"\n // ```\n // If you want to write %{...} without having it replaced simply\n // prefix it with % like this `Foo: %%{foo}` and it will be returned\n // as `\"Foo: %{foo}\"`\n format: v.extend(function(str, vals) {\n if (!v.isString(str)) {\n return str;\n }\n return str.replace(v.format.FORMAT_REGEXP, function(m0, m1, m2) {\n if (m1 === '%') {\n return \"%{\" + m2 + \"}\";\n } else {\n return String(vals[m2]);\n }\n });\n }, {\n // Finds %{key} style patterns in the given string\n FORMAT_REGEXP: /(%?)%\\{([^\\}]+)\\}/g\n }),\n\n // \"Prettifies\" the given string.\n // Prettifying means replacing [.\\_-] with spaces as well as splitting\n // camel case words.\n prettify: function(str) {\n if (v.isNumber(str)) {\n // If there are more than 2 decimals round it to two\n if ((str * 100) % 1 === 0) {\n return \"\" + str;\n } else {\n return parseFloat(Math.round(str * 100) / 100).toFixed(2);\n }\n }\n\n if (v.isArray(str)) {\n return str.map(function(s) { return v.prettify(s); }).join(\", \");\n }\n\n if (v.isObject(str)) {\n if (!v.isDefined(str.toString)) {\n return JSON.stringify(str);\n }\n\n return str.toString();\n }\n\n // Ensure the string is actually a string\n str = \"\" + str;\n\n return str\n // Splits keys separated by periods\n .replace(/([^\\s])\\.([^\\s])/g, '$1 $2')\n // Removes backslashes\n .replace(/\\\\+/g, '')\n // Replaces - and - with space\n .replace(/[_-]/g, ' ')\n // Splits camel cased words\n .replace(/([a-z])([A-Z])/g, function(m0, m1, m2) {\n return \"\" + m1 + \" \" + m2.toLowerCase();\n })\n .toLowerCase();\n },\n\n stringifyValue: function(value, options) {\n var prettify = options && options.prettify || v.prettify;\n return prettify(value);\n },\n\n isString: function(value) {\n return typeof value === 'string';\n },\n\n isArray: function(value) {\n return {}.toString.call(value) === '[object Array]';\n },\n\n // Checks if the object is a hash, which is equivalent to an object that\n // is neither an array nor a function.\n isHash: function(value) {\n return v.isObject(value) && !v.isArray(value) && !v.isFunction(value);\n },\n\n contains: function(obj, value) {\n if (!v.isDefined(obj)) {\n return false;\n }\n if (v.isArray(obj)) {\n return obj.indexOf(value) !== -1;\n }\n return value in obj;\n },\n\n unique: function(array) {\n if (!v.isArray(array)) {\n return array;\n }\n return array.filter(function(el, index, array) {\n return array.indexOf(el) == index;\n });\n },\n\n forEachKeyInKeypath: function(object, keypath, callback) {\n if (!v.isString(keypath)) {\n return undefined;\n }\n\n var key = \"\"\n , i\n , escape = false;\n\n for (i = 0; i < keypath.length; ++i) {\n switch (keypath[i]) {\n case '.':\n if (escape) {\n escape = false;\n key += '.';\n } else {\n object = callback(object, key, false);\n key = \"\";\n }\n break;\n\n case '\\\\':\n if (escape) {\n escape = false;\n key += '\\\\';\n } else {\n escape = true;\n }\n break;\n\n default:\n escape = false;\n key += keypath[i];\n break;\n }\n }\n\n return callback(object, key, true);\n },\n\n getDeepObjectValue: function(obj, keypath) {\n if (!v.isObject(obj)) {\n return undefined;\n }\n\n return v.forEachKeyInKeypath(obj, keypath, function(obj, key) {\n if (v.isObject(obj)) {\n return obj[key];\n }\n });\n },\n\n // This returns an object with all the values of the form.\n // It uses the input name as key and the value as value\n // So for example this:\n // <input type=\"text\" name=\"email\" value=\"foo@bar.com\" />\n // would return:\n // {email: \"foo@bar.com\"}\n collectFormValues: function(form, options) {\n var values = {}\n , i\n , j\n , input\n , inputs\n , option\n , value;\n\n if (v.isJqueryElement(form)) {\n form = form[0];\n }\n\n if (!form) {\n return values;\n }\n\n options = options || {};\n\n inputs = form.querySelectorAll(\"input[name], textarea[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n var name = input.name.replace(/\\./g, \"\\\\\\\\.\");\n value = v.sanitizeFormValue(input.value, options);\n if (input.type === \"number\") {\n value = value ? +value : null;\n } else if (input.type === \"checkbox\") {\n if (input.attributes.value) {\n if (!input.checked) {\n value = values[name] || null;\n }\n } else {\n value = input.checked;\n }\n } else if (input.type === \"radio\") {\n if (!input.checked) {\n value = values[name] || null;\n }\n }\n values[name] = value;\n }\n\n inputs = form.querySelectorAll(\"select[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n if (input.multiple) {\n value = [];\n for (j in input.options) {\n option = input.options[j];\n if (option && option.selected) {\n value.push(v.sanitizeFormValue(option.value, options));\n }\n }\n } else {\n var _val = typeof input.options[input.selectedIndex] !== 'undefined' ? input.options[input.selectedIndex].value : /* istanbul ignore next */ '';\n value = v.sanitizeFormValue(_val, options);\n }\n values[input.name] = value;\n }\n\n return values;\n },\n\n sanitizeFormValue: function(value, options) {\n if (options.trim && v.isString(value)) {\n value = value.trim();\n }\n\n if (options.nullify !== false && value === \"\") {\n return null;\n }\n return value;\n },\n\n capitalize: function(str) {\n if (!v.isString(str)) {\n return str;\n }\n return str[0].toUpperCase() + str.slice(1);\n },\n\n // Remove all errors who's error attribute is empty (null or undefined)\n pruneEmptyErrors: function(errors) {\n return errors.filter(function(error) {\n return !v.isEmpty(error.error);\n });\n },\n\n // In\n // [{error: [\"err1\", \"err2\"], ...}]\n // Out\n // [{error: \"err1\", ...}, {error: \"err2\", ...}]\n //\n // All attributes in an error with multiple messages are duplicated\n // when expanding the errors.\n expandMultipleErrors: function(errors) {\n var ret = [];\n errors.forEach(function(error) {\n // Removes errors without a message\n if (v.isArray(error.error)) {\n error.error.forEach(function(msg) {\n ret.push(v.extend({}, error, {error: msg}));\n });\n } else {\n ret.push(error);\n }\n });\n return ret;\n },\n\n // Converts the error mesages by prepending the attribute name unless the\n // message is prefixed by ^\n convertErrorMessages: function(errors, options) {\n options = options || {};\n\n var ret = []\n , prettify = options.prettify || v.prettify;\n errors.forEach(function(errorInfo) {\n var error = v.result(errorInfo.error,\n errorInfo.value,\n errorInfo.attribute,\n errorInfo.options,\n errorInfo.attributes,\n errorInfo.globalOptions);\n\n if (!v.isString(error)) {\n ret.push(errorInfo);\n return;\n }\n\n if (error[0] === '^') {\n error = error.slice(1);\n } else if (options.fullMessages !== false) {\n error = v.capitalize(prettify(errorInfo.attribute)) + \" \" + error;\n }\n error = error.replace(/\\\\\\^/g, \"^\");\n error = v.format(error, {\n value: v.stringifyValue(errorInfo.value, options)\n });\n ret.push(v.extend({}, errorInfo, {error: error}));\n });\n return ret;\n },\n\n // In:\n // [{attribute: \"<attributeName>\", ...}]\n // Out:\n // {\"<attributeName>\": [{attribute: \"<attributeName>\", ...}]}\n groupErrorsByAttribute: function(errors) {\n var ret = {};\n errors.forEach(function(error) {\n var list = ret[error.attribute];\n if (list) {\n list.push(error);\n } else {\n ret[error.attribute] = [error];\n }\n });\n return ret;\n },\n\n // In:\n // [{error: \"<message 1>\", ...}, {error: \"<message 2>\", ...}]\n // Out:\n // [\"<message 1>\", \"<message 2>\"]\n flattenErrorsToArray: function(errors) {\n return errors\n .map(function(error) { return error.error; })\n .filter(function(value, index, self) {\n return self.indexOf(value) === index;\n });\n },\n\n cleanAttributes: function(attributes, whitelist) {\n function whitelistCreator(obj, key, last) {\n if (v.isObject(obj[key])) {\n return obj[key];\n }\n return (obj[key] = last ? true : {});\n }\n\n function buildObjectWhitelist(whitelist) {\n var ow = {}\n , lastObject\n , attr;\n for (attr in whitelist) {\n if (!whitelist[attr]) {\n continue;\n }\n v.forEachKeyInKeypath(ow, attr, whitelistCreator);\n }\n return ow;\n }\n\n function cleanRecursive(attributes, whitelist) {\n if (!v.isObject(attributes)) {\n return attributes;\n }\n\n var ret = v.extend({}, attributes)\n , w\n , attribute;\n\n for (attribute in attributes) {\n w = whitelist[attribute];\n\n if (v.isObject(w)) {\n ret[attribute] = cleanRecursive(ret[attribute], w);\n } else if (!w) {\n delete ret[attribute];\n }\n }\n return ret;\n }\n\n if (!v.isObject(whitelist) || !v.isObject(attributes)) {\n return {};\n }\n\n whitelist = buildObjectWhitelist(whitelist);\n return cleanRecursive(attributes, whitelist);\n },\n\n exposeModule: function(validate, root, exports, module, define) {\n if (exports) {\n if (module && module.exports) {\n exports = module.exports = validate;\n }\n exports.validate = validate;\n } else {\n root.validate = validate;\n if (validate.isFunction(define) && define.amd) {\n define([], function () { return validate; });\n }\n }\n },\n\n warn: function(msg) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[validate.js] \" + msg);\n }\n },\n\n error: function(msg) {\n if (typeof console !== \"undefined\" && console.error) {\n console.error(\"[validate.js] \" + msg);\n }\n }\n });\n\n validate.validators = {\n // Presence validates that the value isn't empty\n presence: function(value, options) {\n options = v.extend({}, this.options, options);\n if (options.allowEmpty !== false ? !v.isDefined(value) : v.isEmpty(value)) {\n return options.message || this.message || \"can't be blank\";\n }\n },\n length: function(value, options, attribute) {\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var is = options.is\n , maximum = options.maximum\n , minimum = options.minimum\n , tokenizer = options.tokenizer || function(val) { return val; }\n , err\n , errors = [];\n\n value = tokenizer(value);\n var length = value.length;\n if(!v.isNumber(length)) {\n return options.message || this.notValid || \"has an incorrect length\";\n }\n\n // Is checks\n if (v.isNumber(is) && length !== is) {\n err = options.wrongLength ||\n this.wrongLength ||\n \"is the wrong length (should be %{count} characters)\";\n errors.push(v.format(err, {count: is}));\n }\n\n if (v.isNumber(minimum) && length < minimum) {\n err = options.tooShort ||\n this.tooShort ||\n \"is too short (minimum is %{count} characters)\";\n errors.push(v.format(err, {count: minimum}));\n }\n\n if (v.isNumber(maximum) && length > maximum) {\n err = options.tooLong ||\n this.tooLong ||\n \"is too long (maximum is %{count} characters)\";\n errors.push(v.format(err, {count: maximum}));\n }\n\n if (errors.length > 0) {\n return options.message || errors;\n }\n },\n numericality: function(value, options, attribute, attributes, globalOptions) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var errors = []\n , name\n , count\n , checks = {\n greaterThan: function(v, c) { return v > c; },\n greaterThanOrEqualTo: function(v, c) { return v >= c; },\n equalTo: function(v, c) { return v === c; },\n lessThan: function(v, c) { return v < c; },\n lessThanOrEqualTo: function(v, c) { return v <= c; },\n divisibleBy: function(v, c) { return v % c === 0; }\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n // Strict will check that it is a valid looking number\n if (v.isString(value) && options.strict) {\n var pattern = \"^-?(0|[1-9]\\\\d*)\";\n if (!options.onlyInteger) {\n pattern += \"(\\\\.\\\\d+)?\";\n }\n pattern += \"$\";\n\n if (!(new RegExp(pattern).test(value))) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"must be a valid number\";\n }\n }\n\n // Coerce the value to a number unless we're being strict.\n if (options.noStrings !== true && v.isString(value) && !v.isEmpty(value)) {\n value = +value;\n }\n\n // If it's not a number we shouldn't continue since it will compare it.\n if (!v.isNumber(value)) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"is not a number\";\n }\n\n // Same logic as above, sort of. Don't bother with comparisons if this\n // doesn't pass.\n if (options.onlyInteger && !v.isInteger(value)) {\n return options.message ||\n options.notInteger ||\n this.notInteger ||\n this.message ||\n \"must be an integer\";\n }\n\n for (name in checks) {\n count = options[name];\n if (v.isNumber(count) && !checks[name](value, count)) {\n // This picks the default message if specified\n // For example the greaterThan check uses the message from\n // this.notGreaterThan so we capitalize the name and prepend \"not\"\n var key = \"not\" + v.capitalize(name);\n var msg = options[key] ||\n this[key] ||\n this.message ||\n \"must be %{type} %{count}\";\n\n errors.push(v.format(msg, {\n count: count,\n type: prettify(name)\n }));\n }\n }\n\n if (options.odd && value % 2 !== 1) {\n errors.push(options.notOdd ||\n this.notOdd ||\n this.message ||\n \"must be odd\");\n }\n if (options.even && value % 2 !== 0) {\n errors.push(options.notEven ||\n this.notEven ||\n this.message ||\n \"must be even\");\n }\n\n if (errors.length) {\n return options.message || errors;\n }\n },\n datetime: v.extend(function(value, options) {\n if (!v.isFunction(this.parse) || !v.isFunction(this.format)) {\n throw new Error(\"Both the parse and format functions needs to be set to use the datetime/date validator\");\n }\n\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var err\n , errors = []\n , earliest = options.earliest ? this.parse(options.earliest, options) : NaN\n , latest = options.latest ? this.parse(options.latest, options) : NaN;\n\n value = this.parse(value, options);\n\n // 86400000 is the number of milliseconds in a day, this is used to remove\n // the time from the date\n if (isNaN(value) || options.dateOnly && value % 86400000 !== 0) {\n err = options.notValid ||\n options.message ||\n this.notValid ||\n \"must be a valid date\";\n return v.format(err, {value: arguments[0]});\n }\n\n if (!isNaN(earliest) && value < earliest) {\n err = options.tooEarly ||\n options.message ||\n this.tooEarly ||\n \"must be no earlier than %{date}\";\n err = v.format(err, {\n value: this.format(value, options),\n date: this.format(earliest, options)\n });\n errors.push(err);\n }\n\n if (!isNaN(latest) && value > latest) {\n err = options.tooLate ||\n options.message ||\n this.tooLate ||\n \"must be no later than %{date}\";\n err = v.format(err, {\n date: this.format(latest, options),\n value: this.format(value, options)\n });\n errors.push(err);\n }\n\n if (errors.length) {\n return v.unique(errors);\n }\n }, {\n parse: null,\n format: null\n }),\n date: function(value, options) {\n options = v.extend({}, options, {dateOnly: true});\n return v.validators.datetime.call(v.validators.datetime, value, options);\n },\n format: function(value, options) {\n if (v.isString(options) || (options instanceof RegExp)) {\n options = {pattern: options};\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is invalid\"\n , pattern = options.pattern\n , match;\n\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n\n if (v.isString(pattern)) {\n pattern = new RegExp(options.pattern, options.flags);\n }\n match = pattern.exec(value);\n if (!match || match[0].length != value.length) {\n return message;\n }\n },\n inclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (v.contains(options.within, value)) {\n return;\n }\n var message = options.message ||\n this.message ||\n \"^%{value} is not included in the list\";\n return v.format(message, {value: value});\n },\n exclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (!v.contains(options.within, value)) {\n return;\n }\n var message = options.message || this.message || \"^%{value} is restricted\";\n if (v.isString(options.within[value])) {\n value = options.within[value];\n }\n return v.format(message, {value: value});\n },\n email: v.extend(function(value, options) {\n options = v.extend({}, this.options, options);\n var message = options.message || this.message || \"is not a valid email\";\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n if (!this.PATTERN.exec(value)) {\n return message;\n }\n }, {\n PATTERN: /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i\n }),\n equality: function(value, options, attribute, attributes, globalOptions) {\n if (!v.isDefined(value)) {\n return;\n }\n\n if (v.isString(options)) {\n options = {attribute: options};\n }\n options = v.extend({}, this.options, options);\n var message = options.message ||\n this.message ||\n \"is not equal to %{attribute}\";\n\n if (v.isEmpty(options.attribute) || !v.isString(options.attribute)) {\n throw new Error(\"The attribute must be a non empty string\");\n }\n\n var otherValue = v.getDeepObjectValue(attributes, options.attribute)\n , comparator = options.comparator || function(v1, v2) {\n return v1 === v2;\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n if (!comparator(value, otherValue, options, attribute, attributes)) {\n return v.format(message, {attribute: prettify(options.attribute)});\n }\n },\n // A URL validator that is used to validate URLs with the ability to\n // restrict schemes and some domains.\n url: function(value, options) {\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is not a valid url\"\n , schemes = options.schemes || this.schemes || ['http', 'https']\n , allowLocal = options.allowLocal || this.allowLocal || false\n , allowDataUrl = options.allowDataUrl || this.allowDataUrl || false;\n if (!v.isString(value)) {\n return message;\n }\n\n // https://gist.github.com/dperini/729294\n var regex =\n \"^\" +\n // protocol identifier\n \"(?:(?:\" + schemes.join(\"|\") + \")://)\" +\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\";\n\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n\n if (allowLocal) {\n tld += \"?\";\n } else {\n regex +=\n // IP address exclusion\n // private & local networks\n \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\n \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\n \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\";\n }\n\n regex +=\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n tld +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:[/?#]\\\\S*)?\" +\n \"$\";\n\n if (allowDataUrl) {\n // RFC 2397\n var mediaType = \"\\\\w+\\\\/[-+.\\\\w]+(?:;[\\\\w=]+)*\";\n var urlchar = \"[A-Za-z0-9-_.!~\\\\*'();\\\\/?:@&=+$,%]*\";\n var dataurl = \"data:(?:\"+mediaType+\")?(?:;base64)?,\"+urlchar;\n regex = \"(?:\"+regex+\")|(?:^\"+dataurl+\"$)\";\n }\n\n var PATTERN = new RegExp(regex, 'i');\n if (!PATTERN.exec(value)) {\n return message;\n }\n },\n type: v.extend(function(value, originalOptions, attribute, attributes, globalOptions) {\n if (v.isString(originalOptions)) {\n originalOptions = {type: originalOptions};\n }\n\n if (!v.isDefined(value)) {\n return;\n }\n\n var options = v.extend({}, this.options, originalOptions);\n\n var type = options.type;\n if (!v.isDefined(type)) {\n throw new Error(\"No type was specified\");\n }\n\n var check;\n if (v.isFunction(type)) {\n check = type;\n } else {\n check = this.types[type];\n }\n\n if (!v.isFunction(check)) {\n throw new Error(\"validate.validators.type.types.\" + type + \" must be a function.\");\n }\n\n if (!check(value, options, attribute, attributes, globalOptions)) {\n var message = originalOptions.message ||\n this.messages[type] ||\n this.message ||\n options.message ||\n (v.isFunction(type) ? \"must be of the correct type\" : \"must be of type %{type}\");\n\n if (v.isFunction(message)) {\n message = message(value, originalOptions, attribute, attributes, globalOptions);\n }\n\n return v.format(message, {attribute: v.prettify(attribute), type: type});\n }\n }, {\n types: {\n object: function(value) {\n return v.isObject(value) && !v.isArray(value);\n },\n array: v.isArray,\n integer: v.isInteger,\n number: v.isNumber,\n string: v.isString,\n date: v.isDate,\n boolean: v.isBoolean\n },\n messages: {}\n })\n };\n\n validate.formatters = {\n detailed: function(errors) {return errors;},\n flat: v.flattenErrorsToArray,\n grouped: function(errors) {\n var attr;\n\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = v.flattenErrorsToArray(errors[attr]);\n }\n return errors;\n },\n constraint: function(errors) {\n var attr;\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = errors[attr].map(function(result) {\n return result.validator;\n }).sort();\n }\n return errors;\n }\n };\n\n validate.exposeModule(validate, this, exports, module, define);\n}).call(this,\n typeof exports !== 'undefined' ? /* istanbul ignore next */ exports : null,\n typeof module !== 'undefined' ? /* istanbul ignore next */ module : null,\n typeof define !== 'undefined' ? /* istanbul ignore next */ define : null);\n","module.exports = function() {\n\tthrow new Error(\"define cannot be used indirect\");\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n"],"sourceRoot":""}