const default_cc_mask=[4,4,4,4],default_cc_csc=3;let CreditCardCheck=[{name:"AmEx",mask:[4,6,5],detector:/^3[47]\d{0,13}/,csc:4},{name:"Visa",mask:[4,4,4,4],detector:/^4\d{0,15}/,csc:3},{name:"Mastercard",mask:[4,4,4,4],detector:/^(5[1-5]\d{0,2}|22[2-9]\d{0,1}|2[3-7]\d{0,2})\d{0,12}/,csc:3},{name:"Maestro",mask:[4,4,4,4],detector:/^(?:5[0678]\d{0,2}|6304|67\d{0,2})\d{0,12}/,csc:3},{name:"JCB",mask:[4,4,4,4],detector:/^(?:35\d{0,2})\d{0,12}/,csc:3},{name:"JCB15",mask:[4,6,5],detector:/^(?:2131|1800)\d{0,11}/,csc:3},{name:"UnionPay",mask:[4,4,4,4],detector:/^(62|81)\d{0,14}/,csc:3},{name:"Discover",mask:[4,4,4,4],detector:/^(?:6011|65\d{0,2}|64[4-9]\d?)\d{0,12}/,csc:4},{name:"Diners",mask:[4,6,4],detector:/^3(?:0([0-5]|9)|[689]\d?)\d{0,11}/,csc:3}];function ccTypeCheckByNumber(val){var cardFound=CreditCardCheck.find((function(obj){return obj.detector.test(val)}));return void 0!==cardFound?{name:cardFound.name,mask:cardFound.mask,csc:cardFound.csc}:{name:"DEFAULT",mask:default_cc_mask,csc:3}}function ccNumCheck(str,mask){const limit=mask.reduce((function(a,b){return a+b}),0);if(str.length!=limit)return!1;{let nCheck=0,bEven=!1;const value=str.replace(/\D/g,"");for(let n=value.length-1;n>=0;n--){const cDigit=value.charAt(n);let nDigit=parseInt(cDigit,10);bEven&&(nDigit*=2)>9&&(nDigit-=9),nCheck+=nDigit,bEven=!bEven}return nCheck%10==0}}function ccExpDateCheck(str){if(4==str.length){var month=str.slice(0,2),year=str.slice(2,4),date=new Date,currentYear=parseInt(date.getFullYear().toString().substr(-2)),currentMonth=parseInt(date.getMonth()+1);return parseInt(year)==currentYear?parseInt(month)>=currentMonth&&parseInt(month)<=12:parseInt(year)>currentYear&&parseInt(year)<=99&&(parseInt(month)>0&&parseInt(month)<=12)}return!1}function ccCodeCheck(str,limit){return str.length==limit}function ccNumValidate(parent,e){const checkVal=e.value.toString(),cleaned=Formatter.numbersOnlyString(checkVal);var cardCSC=qs(parent,'input[name="cc-csc"]');if("createEvent"in document){var event=document.createEvent("Event");event.initEvent("input",!0,!0),cardCSC.dispatchEvent(event)}else cardCSC.fireEvent("oninput");var cardType=ccTypeCheckByNumber(cleaned),formatted;return"DEFAULT"!=cardType.name?qs(parent,".input-icon.card").setAttribute("data-type",cardType.name):qs(parent,".input-icon.card").setAttribute("data-type",""),ccNumCheck(Formatter.numbersOnlyString(Formatter.maskFormat(e,cleaned,cardType.mask," ")),cardType.mask)}function ccExpValidate(parent,e){const checkVal=e.value.toString(),cleaned=Formatter.numbersOnlyString(checkVal);var formatted;return ccExpDateCheck(Formatter.numbersOnlyString(Formatter.maskFormat(e,cleaned,[2,2],"/")))}function ccCodeValidate(parent,e){const checkVal=e.value.toString(),cleaned=Formatter.numbersOnlyString(checkVal);var cardNo=qs(parent,'input[name="cc-number"]').value,cleanedNo,cardType=ccTypeCheckByNumber(Formatter.numbersOnlyString(cardNo)),formatted;return ccCodeCheck(Formatter.numbersOnlyString(Formatter.maskFormat(e,cleaned,[cardType.csc],"")),cardType.csc)}function onCountrySelected(elm){const parent=elm.closest(".country-selector"),ios=elm.getAttribute("data-value"),code=elm.getAttribute("data-code");qs(parent,".selected-country").setAttribute("data-value",ios),qs(parent,".selected-country>input").value=code,cutClass(parent,["active"])}function renderCountries(container,countries){container&&(AppUI.clearNodes(container),eachNode(countries,(function(country){const option=document.createElement("li");option.textContent="zh"===current_lang?country.name_zh:country.name,option.setAttribute("data-value",country.iso),option.setAttribute("data-code",country.dial[0]),option.addEventListener("click",(function(){onCountrySelected(this)})),container.appendChild(option)})))}window.initCountryDropdown=function(){dq(".form .country-selector")&&eachNode(dqa(".form .country-selector:not(.disable-select)"),(function(e){const dropdown_container=qs(e,".dropdown-list");renderCountries(dropdown_container,country_data),qs(e,".selected-country").addEventListener("click",(function(){togClass(e,"active")})),qs(e,".search-country").addEventListener("input",(function(){const key=this.value;let list=country_data;key&&(list=country_data.filter((function(item){return item.name.toLowerCase().indexOf(key.toLowerCase())>=0||item.name_zh.indexOf(key)>=0}))),renderCountries(dropdown_container,list)}))}))};var form=dqa("form"),input_cc_num=dqa('input[name="cc-number"]'),input_cc_exp=dqa('input[name="cc-exp"]'),input_cc_csc=dqa('input[name="cc-csc"]'),input_phone_hk=dqa('input[data-mode="input-phone-hk"]');const input_numeric=dqa('input[data-type="numeric"]'),required_input=dqa('input[type="text"][required], input[type="email"][required],input[type="password"][required],input[type="tel"][required], textarea[required], input[type="hidden"][required]'),required_select=dqa("select[required]"),required_checker=dqa('input[type="radio"][required], input[type="checkbox"][required]');var formObj=[];function initForms(){form.length&&eachNode(form,(function(e,i){var inputEl=qsa(e,"input[required], textarea[required]"),selectEl=qsa(e,"select[required]"),inputObj=[],selectObj=[];function logSubmit(event){return devlog("form submission attempt"),event.preventDefault(),!1}eachNode(inputEl,(function(item){inputObj.push({id:item.id,name:item.name,valid:0})})),eachNode(selectEl,(function(item){selectObj.push({id:item.id,name:item.name,val:null,valid:0})})),formObj.push({name:e.id,pass:inputObj,select:selectObj}),e.addEventListener("submit",logSubmit)}))}function initFormatListeners(){eachNode(input_cc_exp,(function(item){item.addEventListener("keydown",(function(ev){ev.keyCode===KEYS_CODE.delete?(ev.preventDefault(),deleteOverride(item,ev.target.selectionStart,ev.target.selectionEnd,"/")):ev.keyCode===KEYS_CODE.backspace&&(ev.preventDefault(),backSpaceOverride(item,ev.target.selectionStart,ev.target.selectionEnd,"/"))}))})),eachNode(input_cc_num,(function(item){item.addEventListener("keydown",(function(ev){ev.keyCode===KEYS_CODE.delete?(ev.preventDefault(),deleteOverride(item,ev.target.selectionStart,ev.target.selectionEnd," ")):ev.keyCode===KEYS_CODE.backspace&&(ev.preventDefault(),backSpaceOverride(item,ev.target.selectionStart,ev.target.selectionEnd," "))}))})),eachNode(input_phone_hk,(function(item){item.addEventListener("keydown",(function(ev){ev.keyCode===KEYS_CODE.delete?(ev.preventDefault(),deleteOverride(item,ev.target.selectionStart,ev.target.selectionEnd," ")):ev.keyCode===KEYS_CODE.backspace&&(ev.preventDefault(),backSpaceOverride(item,ev.target.selectionStart,ev.target.selectionEnd," "))}))})),eachNode(input_numeric,(function(item){item.addEventListener("keydown",(function(ev){if(!ev.defaultPrevented){var handled=!1;void 0!==ev.keyCode&&(Validator.isNumberInput(ev.keyCode)||Validator.isFunctionKey(ev.keyCode)?(Validator.isNumberInput(ev.keyCode)||Validator.isFunctionKey(ev.keyCode))&&(handled=!1):handled=!0),handled&&(ev.preventDefault(),item.value=Formatter.numbersOnlyString(item.value))}}),!0)})),eachNode(required_input,(function(item){item.addEventListener("input",(function(){validate(this)}))})),eachNode(required_select,(function(item){item.addEventListener("change",(function(){validate(this)}))})),eachNode(required_checker,(function(item){item.addEventListener("click",(function(){validate(this)}))})),dq(".system-selector")&&eachNode(dqa(".system-selector>select"),(function(e){e.addEventListener("change",(function(){const parent=this.closest(".system-selector");this.value?(addClass(this,["hasValue"]),addClass(parent,["selected"])):(cutClass(this,["hasValue"]),cutClass(parent,["selected"]))}))})),dq(".password-input .input-icon.pw")&&eachNode(dqa(".password-input .input-icon.pw"),(function(e){e.addEventListener("click",(function(){const parent=this.closest(".password-input");"password"===qs(parent,"input").type?(qs(parent,"input").type="text",addClass(e,["pw-hide"])):(qs(parent,"input").type="password",cutClass(e,["pw-hide"]))}))})),dq(".form .country-selector:not(.disable-select)")&&eachNode(dqa(".form .country-selector:not(.disable-select)"),(function(e){const dropdown_container=qs(e,".dropdown-list");renderCountries(dropdown_container,country_data),qs(e,".selected-country").addEventListener("click",(function(){togClass(e,"active")})),qs(e,".search-country").addEventListener("input",(function(){const key=this.value;let list=country_data;key&&(list=country_data.filter((function(item){return item.name.toLowerCase().indexOf(key.toLowerCase())>=0||item.name_zh.indexOf(key)>=0}))),renderCountries(dropdown_container,list)}))}))}function showInputError(inputId,error){cutClass(dq("."+inputId+"-ok"),["show"]),cutClass(dq("."+inputId+"-empty"),["show"]),cutClass(dq("."+inputId+"-inv"),["show"]),addClass(dq("."+inputId+"-"+error),["show"]),addClass(dq("#"+inputId),["error"])}function clearInputError(inputId){cutClass(dq("."+inputId+"-ok"),["show"]),cutClass(dq("."+inputId+"-empty"),["show"]),cutClass(dq("."+inputId+"-inv"),["show"]),cutClass(dq("#"+inputId),["error"])}function passEmpty(e,value,name,passObj){let isOptional=!1;return e.hasAttribute("data-optional")&&"true"==e.getAttribute("data-optional")&&(isOptional=!0),passObj.valid<0&&(isOptional=!0),""!==value?addClass(e,["hasValue"]):cutClass(e,["hasValue"]),""==value?isOptional?(clearInputError(name),passObj.valid=1,!0):(showInputError(name,"empty"),passObj.valid=0,!1):(clearInputError(name),addClass(dq("."+name+"-ok"),["show"]),passObj.valid=1,!0)}function passFormat(e,value,name,passObj,isFormat){let isOptional=!1;return e.hasAttribute("data-optional")&&"true"==e.getAttribute("data-optional")&&(isOptional=!0),passObj.valid<0&&(isOptional=!0),""!==value?addClass(e,["hasValue"]):cutClass(e,["hasValue"]),""==value?isOptional?(clearInputError(name),passObj.valid=1,addClass(dq("."+name+"-ok"),["show"]),!0):(showInputError(name,"empty"),passObj.valid=0,!1):isFormat?(clearInputError(name),passObj.valid=1,addClass(dq("."+name+"-ok"),["show"]),!0):(showInputError(name,"inv"),passObj.valid=0,!1)}function passChecker(e,name,passObj){let isOptional=!1;if(e.hasAttribute("data-optional")&&"true"==e.getAttribute("data-optional")&&(isOptional=!0),passObj.valid<0&&(isOptional=!0),cutClass(dq("."+name+"-empty"),["show"]),cutClass(dq("."+name+"-inv"),["show"]),isOptional)return eachNode(dqa('input[name="'+name+'"]'),(function(checker){cutClass(checker,["error"])})),passObj.valid=1,!0;{let isSelected=!1;return eachNode(dqa('input[name="'+name+'"]'),(function(checker){checker.checked&&(isSelected=!0)})),isSelected?(eachNode(dqa('input[name="'+name+'"]'),(function(checker){cutClass(checker,["error"])})),passObj.valid=1,!0):(eachNode(dqa('input[name="'+name+'"]'),(function(checker){addClass(checker,["error"])})),addClass(dq("."+name+"-empty"),["show"]),passObj.valid=0,!1)}}function passAppointmentDate(e,passObj){const name=e.name,value=e.value;let isOptional=!1;if(e.hasAttribute("data-optional")&&"true"==e.getAttribute("data-optional")&&(isOptional=!0),passObj.valid<0&&(isOptional=!0),""!==value?addClass(e,["hasValue"]):cutClass(e,["hasValue"]),""==value)return isOptional?(clearInputError(name),passObj.valid=1,addClass(dq("."+name+"-ok"),["show"]),!0):(showInputError(name,"empty"),passObj.valid=0,!1);if(e.getAttribute("data-error"))return showInputError(name,e.getAttribute("data-error")),passObj.valid=0,!1;{const date=DateFormatter.convertStrToDate(e.value);return date.getTime()<=(new Date).getTime()?(showInputError(name,"inv"),passObj.valid=0,!1):(clearInputError(name),passObj.valid=1,addClass(dq("."+name+"-ok"),["show"]),!0)}}function validate(e){const name_array=e.name.split("-"),dataType=name_array[name_array.length-1],parent=e.closest("form.form"),formName=parent.id,formFound=formObj.find((function(obj){return obj.name===formName}));if(void 0!==formFound){let passVal=null;passVal="select"==e.tagName.toLowerCase()?formFound.select.find((function(obj){return obj.id===e.id})):formFound.pass.find((function(obj){return obj.id===e.id})),"radio"===e.type||"checkbox"===e.type?passChecker(e,e.name,passVal):"select"===e.tagName.toLowerCase()?passEmpty(e,e.value,e.name,passVal):"appointment-date"===e.name?passAppointmentDate(e,passVal):"email"===e.name||"email"===dataType?passFormat(e,e.value,e.name,passVal,Validator.regexEmail(e.value)):"phone"===e.name||"phone"===dataType?"input-phone-hk"===e.getAttribute("data-mode")?passFormat(e,e.value,e.name,passVal,Validator.validateHKphone(e)):passFormat(e,e.value,e.name,passVal,Validator.regexNumeric(e.value)):"age"===e.name?passFormat(e,e.value,e.name,passVal,Validator.regexAge(e.value)):"newpassword"===e.name?passFormat(e,e.value,e.name,passVal,Validator.regexPW(e.value)):"confirmpassword"==e.name?passFormat(e,e.value,e.name,passVal,e.value==dq('input[name="newpassword"]').value):"cc-number"==e.name?passFormat(e,e.value,e.name,passVal,ccNumValidate(parent,e)):"cc-exp"==e.name?passFormat(e,e.value,e.name,passVal,ccExpValidate(parent,e)):"cc-csc"==e.name?passFormat(e,e.value,e.name,passVal,ccCodeValidate(parent,e)):"idNum"==e.name||"idNum"==dataType?"hkid"==e.getAttribute("data-mode")?passFormat(e,e.value,e.name,passVal,Validator.validateHKID(e)):passFormat(e,e.value,e.name,passVal,Validator.regexIdNum(e.value)):e.hasAttribute("data-type")&&"numeric"==e.getAttribute("data-type")?passFormat(e,e.value,e.name,passVal,Validator.regexNumeric(e.value)):passEmpty(e,e.value,e.name,passVal)}}window.findSelectedValue=function(name){let selected_opts=null;return dq('input[name="'+name+'"]')&&("radio"===dq('input[name="'+name+'"]').type?eachNode(dqa('input[name="'+name+'"]'),(function(e){e.checked&&(selected_opts=e.value)})):"checkbox"===dq('input[name="'+name+'"]').type?(selected_opts=[],eachNode(dqa('input[name="'+name+'"]'),(function(e){e.checked&&selected_opts.push(e.value)}))):selected_opts=dq('input[name="'+name+'"]').value),selected_opts},window.clearForm=function(id){const form=dq("#"+id);if(form){eachNode(qsa(form,".input-error"),(function(e){cutClass(e,["show"])})),eachNode(qsa(form,".tick-ok"),(function(e){cutClass(e,["show"])})),eachNode(qsa(form,"input"),(function(e){cutClass(e,["error"]),cutClass(e,["hasValue"])})),eachNode(qsa(form,'input[type="text"]'),(function(e){e.value=""})),eachNode(qsa(form,'input[type="tel"]'),(function(e){e.value=""})),eachNode(qsa(form,'input[type="email"]'),(function(e){e.value=""})),eachNode(qsa(form,'input[type="password"]'),(function(e){e.value=""})),eachNode(qsa(form,"textarea"),(function(e){cutClass(e,["error"]),cutClass(e,["hasValue"]),e.value=""})),eachNode(qsa(form,"select"),(function(e){refreshSelect(e)})),qs(form,".country-selector")&&eachNode(qsa(form,".country-selector:not(.disable-select)"),(function(e){qs(e,".selected-country").setAttribute("data-value","HKG"),qs(e,".selected-country>input").value="852",qs(e,".search-country").value="",renderCountries(qs(e,".dropdown-list"),country_data)}));const formFound=formObj.find((function(obj){return obj.name===id}));null!=formFound&&(eachNode(formFound.pass,(function(item){item.valid=0})),eachNode(formFound.select,(function(item){item.valid=0})))}},window.refreshSelect=function(select){const first_opt=qs(select,"option:first-of-type");if(first_opt){first_opt.selected=!0,select.value=first_opt.getAttribute("value"),cutClass(select,["hasValue"]);const parent=select.closest(".system-selector");parent&&cutClass(parent,["selected"])}cutClass(select,["error"]),cutClass(dq("."+select.name+"-ok"),["show"]),cutClass(dq("."+select.name+"-empty"),["show"]),cutClass(dq("."+select.name+"-inv"),["show"]),select.value&&App.callEvent("change",select)},window.clearMsg=function(form_id){eachNode(qsa(dq("#"+form_id),".input-error"),(function(e){cutClass(e,["show"])})),eachNode(qsa(dq("#"+form_id),"input, textarea, selector"),(function(e){cutClass(e,["error"])}))},window.generalFormCheck=function(form){clearMsg(form);const formFound=formObj.find((function(obj){return obj.name===form}));if(void 0!==formFound){formFound.pass.forEach((function(item){validate(dq("#"+item.id))})),formFound.select.forEach((function(item){validate(dq("#"+item.id))}));let formValid=0;return formFound.pass.forEach((function(item){formValid+=item.valid})),formFound.select.forEach((function(item){formValid+=item.valid})),formValid==formFound.pass.length+formFound.select.length||(formFound.pass.forEach((function(item){validate(dq("#"+item.id))})),formFound.select.forEach((function(item){validate(dq("#"+item.id))})),qs(dq("#"+form),".error")&&AppUI.scrollToView(qs(dq("#"+form),".error")),!1)}return!1},document.addEventListener("DOMContentLoaded",(function(){initForms(),initFormatListeners()})),window.addEventListener("click",(function(ev){if(dq(".phone-input .country-selector")){let isCountrySelector=!1;eachNode(dqa(".phone-input .country-selector, .phone-input .country-selector *"),(function(e){ev.target==e&&(isCountrySelector=!0)})),isCountrySelector||eachNode(dqa(".phone-input .country-selector"),(function(e){cutClass(e,["active"])}))}}));