1/* ================================================================================================= 2 online-form.js 3 > store general scripts which would be used on online-form 4 5 * @TODO Simplify 6 ================================================================================================= */ 7 8// ======================== 9// Common Variables 10// ======================== 11var windowWidth = $(window).width(); 12var windowHeight = $(window).height(); 13var windowJsWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 14var windowJsHeight = windowHeight; 15var windowJsOldWidth, windowJsOldHeight; //Used to detect unexpected trigger on window resize 16var mobileDevice = false; 17var lang = $('html').attr('lang'); 18var isChrome, isFirefox, isSafari, isEdge, isIE; 19var scrollTop = 0; 20var $body = $('body'); 21//var $aniElem, aniElemPos = []; //Store position for scrolling effects 22 23// Layout or content related variables 24var cmErrMsgSamples = ''; //Stores Field Error Msgs 25var formErrMsgSamples = ''; //Stores Form Error Msgs 26var resizeTimer; 27var scrollTimer; 28 29 30// ======================== 31// Page-specific variables 32// ======================== 33 34 35// ======================== 36 37$(document).ready(function () { 38 $body = $('body'); 39 if (window.location.href.indexOf(String.fromCharCode(47)+'tc/') != -1) { 40 lang = 'tc'; 41 } else if (window.location.href.indexOf('/sc/') != -1) { 42 lang = 'sc'; 43 } else { 44 lang = 'en'; 45 } 46 init(); 47 resize(true); 48}); 49 50$(window).load(function () { 51 resize(true); 52 $body.addClass('page-ready'); 53 updatesFields(); 54}); 55 56$(window).resize(function () { 57 resize(); 58}); 59 60 61$(window).scroll(function () { 62 scroll(); 63}); 64 65function scrollToElem(elem, time) { 66 var targetPos; 67 targetPos = elem.offset().top - $('.header').outerHeight() - 40; 68 $('html, body').animate({ 69 scrollTop: targetPos 70 }, time, function () { 71 $('html, body').finish(); 72 }); 73} 74 75 76 77function init() { 78 scrollTop = $(document).scrollTop(); 79 windowWidth = $(window).width(); 80 windowHeight = $(window).height(); 81 windowJsWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 82 windowJsHeight = windowHeight; 83 /**high priority**/ 84 85 /***Common***/ 86 initOnlineFormSteps(); 87 initCustomSelect(); 88 initFields(); 89 initDateFields(); 90 initCustomRadio(); 91 initCustomCheckbox(); 92 initAddGroups(); 93 initBasicInfoTabs(); 94 initCustomUpload(); 95 /***Actions and triggers***/ 96 updatesFields(); 97 $(window).scroll(); 98} 99function resize(initMode) { 100 windowWidth = $(window).width(); 101 windowHeight = $(window).height(); 102 windowJsWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 103 windowJsHeight = windowHeight; 104 105 if (windowJsOldWidth != windowWidth) { 106 windowJsOldWidth = windowWidth; 107 //These will be run only for WIDTH Resize: 108 } 109} 110function scroll() { 111 scrollTop = $(document).scrollTop(); 112} 113// ======================== 114// Init functions 115// ======================== 116 117function initFields() { 118 var $fields = $('input'); 119 if (!$fields.length) { 120 return false; 121 } 122 $fields.change(function () { 123 updatesFields(); 124 }); 125 $fields.on('keyup', function () { 126 updatesFields(); 127 }); 128 //optional address 129 var $permanentSelect = $('#account_permanent_address_type'); 130 var $permanentGroup = $('.permanent_address-group'); 131 var $permanentRow = $('.permanent_address-row'); 132 var $correspondenceSelect = $('#account_correspondence_address_type'); 133 var $correspondenceGroup = $('.correspondence_address-group'); 134 var $correspondenceRow = $('.correspondence_address-row'); 135 var $residentialSelect = $('#account_residential_address_type'); 136 var $residentialGroup = $('.residential_address-group'); 137 var $residentialRow = $('.residential_address-row'); 138 139 $permanentSelect.change(function () { 140 var $this = $(this); 141 //console.log($this.val()); 142 if ($this.val() == "others") { 143 $permanentGroup.addClass('is-active'); 144 $permanentGroup.find('input, select').prop('disabled', false); 145 $permanentGroup.find('select').trigger('change'); 146 } else { 147 $permanentGroup.removeClass('is-active'); 148 $permanentGroup.find('input, select').prop('disabled', true); 149 $permanentGroup.find('select').trigger('change'); 150 } 151 });
152 $permanentSelect.trigger('change'); 153 $correspondenceSelect.change(function () { 154 var $this = $(this); 155 //console.log($this.val()); 156 if ($this.val() == "others") { 157 $correspondenceGroup.addClass('is-active'); 158 $correspondenceGroup.find('input, select').prop('disabled', false); 159 $correspondenceGroup.find('select').trigger('change'); 160 } else { 161 $correspondenceGroup.removeClass('is-active'); 162 $correspondenceGroup.find('input, select').prop('disabled', true); 163 $correspondenceGroup.find('select').trigger('change'); 164 } 165 }); 166 $correspondenceSelect.trigger('change'); 167 $residentialSelect.change(function () { 168 var $this = $(this); 169 //console.log($this.val()); 170 if ($this.val() == "others") { 171 $residentialGroup.addClass('is-active'); 172 $residentialGroup.find('input, select').prop('disabled', false); 173 $residentialGroup.find('select').trigger('change'); 174 } else { 175 $residentialGroup.removeClass('is-active'); 176 $residentialGroup.find('input, select').prop('disabled', true); 177 $residentialGroup.find('select').trigger('change'); 178 } 179 }); 180 $residentialSelect.trigger('change'); 181 182 updatesFields(); 183 184} 185function updatesFields() { 186 var $fields = $('input'); 187 if (!$fields.length) { 188 return false; 189 } 190 191 var isConfirmPage = ($('.online-form-confirm').length > 0 ? true : false); 192 $fields.each(function () { 193 var $this = $(this); 194 var $thisInput = $(this); 195 var $intlTelHolder = $thisInput.parent('.intl-tel-input'); 196 if ($this.val() != '' || isConfirmPage) { 197 $this.addClass('is-filled'); 198 if($intlTelHolder.length){ 199 $intlTelHolder.addClass('is-filled'); 200 } 201 } else { 202 $this.removeClass('is-filled') 203 if($intlTelHolder.length){ 204 $intlTelHolder.removeClass('is-filled'); 205 } 206 } 207 }); 208} 209function initDateFields() { 210 var $fields = $('.date-fields'); 211 if (!$fields.length) { 212 return false; 213 } 214 $fields.each(function () { 215 var $this = $(this); 216 var $thisDay = $this.find('.date-fields__day'); 217 var $thisMonth = $this.find('.date-fields__month'); 218 var $thisYear = $this.find('.date-fields__year'); 219 var $thisDate = $this.find('.date-fields__date'); 220 var $allFields = $this.find('.date-fields__day, .date-fields__year, .date-fields__month'); 221 $allFields.change(function () { 222 var valDay = $thisDay.val(); 223 var valMonth = $thisMonth.val(); 224 var valYear = $thisYear.val(); 225 if (valDay && valMonth && valYear) { 226 var date = valYear + '-' + valMonth + '-' + valDay; 227 $thisDate.val(date); 228 } else { 229 $thisDate.val(''); 230 } 231 }); 232 $allFields.trigger('change'); 233 }); 234 235} 236function initCustomRadio(){ 237 var $customRadio = $('.custom-radio'); 238 if (!$customRadio.length) { 239 return false; 240 } 241 $customRadio.each(function () { 242 var $this = $(this); 243 var $thisInput = $this.find('input[type="radio"]'); 244 var $thisName = $thisInput.attr('name'); 245 var $thisGrpInput = $('input[name="'+$thisName+'"]'); 246 247 if($this.hasClass('custom-radio--change-trigger')){ 248 var $thisTarget = $($this.data('trigger-target')); 249 $thisGrpInput.change(function(){ 250 if($thisInput.is(':checked')){ 251 $thisTarget.show(); 252 $thisTarget.find('input, select, textarea').prop('disabled', false).removeClass('disabled'); 253 } else { 254 $thisTarget.hide(); 255 $thisTarget.find('input, select, textarea').prop('disabled', true).addClass('disabled'); 256 } 257 }); 258 $thisGrpInput.trigger('change'); 259 } 260 });
261 262} 263function initCustomCheckbox(){ 264 var $customCheckbox = $('.custom-checkbox'); 265 if (!$customCheckbox.length) { 266 return false; 267 } 268 $customCheckbox.each(function () { 269 var $this = $(this); 270 var $thisInput = $this.find('input[type="checkbox"]'); 271 var $thisName = $thisInput.attr('name'); 272 var $thisGrpInput = $('input[name="'+$thisName+'"]'); 273 274 if($this.hasClass('custom-checkbox--change-trigger')){ 275 var $thisTarget = $($this.data('trigger-target')); 276 $thisGrpInput.change(function(){ 277 if($thisInput.is(':checked')){ 278 $thisTarget.show(); 279 $thisTarget.find('input, select, textarea').prop('disabled', false).removeClass('disabled'); 280 } else { 281 $thisTarget.hide(); 282 $thisTarget.find('input, select, textarea').prop('disabled', true).addClass('disabled'); 283 } 284 }); 285 $thisGrpInput.trigger('change'); 286 } 287 }); 288 289} 290function initAddGroups(){ 291 var $addGrp = $('.add-group'); 292 if (!$addGrp.length) { 293 return false; 294 } 295 function initAddGroupsItem(){ 296 var $addGrp = $('.add-group'); 297 $addGrp.each(function () { 298 var $thisGrp = $(this); 299 var $addGrpItems = $thisGrp.find('.add-group__item'); 300 $addGrpItems.each(function(){ 301 var $thisItem = $(this); 302 var $btnRemove = $thisItem.find('.add-group__btn-remove'); 303 $btnRemove.unbind().click(function(e){ 304 e.preventDefault(); 305 $thisItem.remove(); 306 if($thisGrp.find('.add-group__item').length<2){ 307 $thisGrp.find('.add-group__btn-remove').hide(); 308 } else { 309 $thisGrp.find('.add-group__btn-remove').show(); 310 } 311 }); 312 }); 313 }); 314 } 315 $addGrp.each(function () { 316 var $thisGrp = $(this); 317 var $thisTempl = $thisGrp.find('.add-group__template').clone(); 318 $thisGrp.find('.add-group__template').remove(); 319 var $thisItemsHolder = $thisGrp.find('.add-group__items-holder'); 320 var $btnAdd = $thisGrp.find('.add-group__btn-add'); 321 $btnAdd.click(function(e){ 322 e.preventDefault(); 323 var $thisNewItem = $thisTempl.clone().removeClass('add-group__template'); 324 $thisItemsHolder.append($thisNewItem); 325 initAddGroupsItem(); 326 if($thisGrp.find('.add-group__item').length<2){ 327 $thisGrp.find('.add-group__btn-remove').hide(); 328 } else { 329 $thisGrp.find('.add-group__btn-remove').show(); 330 } 331 }); 332 333 }); 334 initAddGroupsItem(); 335} 336function initBasicInfoTabs(){ 337 var $basicInfoTabs = $('.basic-info__tabs'); 338 if (!$basicInfoTabs.length) { 339 return false; 340 } 341 var $basicInfoTab = $('.basic-info__tab'); 342 $basicInfoTab.click(function(e){ 343 e.preventDefault(); 344 var $this = $(this); 345 var $target = $($this.attr('href')); 346 var $tabContent = $('.basic-info__tab-content'); 347 $tabContent.removeClass('is-active'); 348 $target.addClass('is-active'); 349 $basicInfoTab.removeClass('is-active'); 350 $this.addClass('is-active'); 351 352 }); 353 354} 355function initCustomUpload(){ 356 var $customUpload = $('.custom-upload'); 357 if (!$customUpload.length) { 358 return false; 359 } 360 console.log('initCustomUpload'); 361 $customUpload.each(function () { 362 var $this = $(this); 363 var $thisInput = $this.find('input'); 364 var $thisFilenameHolder = $this.find('.custom-upload__filename'); 365 $thisInput.change(function(){ 366 var thisVal = $thisInput.val(); 367 if(thisVal){ 368 var filename = thisVal.split('\\').pop(); 369 $thisFilenameHolder.html(filename); 370 $this.addClass('is-selected'); 371 } else { 372 $this.removeClass('is-selected'); 373 } 374 }); 375 }); 376 377} 378function initOnlineFormSteps(){ 379 var $onlineFormSteps = $('.online-form__steps'); 380 if (!$onlineFormSteps.length) { 381 return false; 382 } 383 var $steps = $onlineFormSteps.find('a.online-form__step'); 384 var html = '<div class="mob-step"><div class="custom-select"><select>'; 385 var stepTxt = 'Step '; 386 if(lang != 'en'){ 387 stepTxt = 'æ¥é©'; 388 } 389 $steps.each(function(){ 390 var $this = $(this); 391 var thisId = $this.data('to-step'); 392 var thisTxt = $this.find('.online-form__step-label').html(); 393 html += '<option value="'+thisId+'" disabled>'+stepTxt+thisId+'. '+thisTxt+'</option>'; 394 });
395 html += '</select></div></div>'; 396 $onlineFormSteps.append($(html)); 397 var $select = $onlineFormSteps.find('.mob-step select option'); 398 $select.eq(0).prop('disabled', false); 399 $onlineFormSteps.find('.mob-step select').change(function(){ 400 var thisVal = $(this).val(); 401 toFormStep(thisVal); 402 }); 403 404} 405function initFormErrMsg() { 406 var $cmErrMsgElem = $('.common-err-msg-holder'); 407 var $formErrMsgElem = $('.form-err-msg-holder'); 408 if (!$cmErrMsgElem.length && !$formErrMsgElem.length) 409 return false; 410 cmErrMsgSamples = $cmErrMsgElem.clone(); 411 formErrMsgSamples = $formErrMsgElem.clone(); 412 $cmErrMsgElem.remove(); 413 $formErrMsgElem.remove(); 414 415 $('.form-err-msg--target').replaceWith(formErrMsgSamples); 416} 417 418function initCustomSelect(eleId) { 419 if (eleId === undefined){ 420 eleId ='.custom-select'; 421 } 422 var $customSelect = $(eleId); 423 if (!$customSelect.length) { 424 return false; 425 } 426 $customSelect.each(function () { 427 var $selectHolder = $(this); 428 var $selectFieldHolder = $selectHolder.parent(); 429 var $selectListMob = $selectHolder.find('select'); 430 431 432 if ($selectHolder.hasClass('has-other')) { 433 var $otherField = $($selectHolder.data('other-target')); 434 } 435 var initListForDesktop = function () { 436 var listForDesktop = '<ul class="custom-select__list">'; 437 var triggerContent = ''; 438 var labelTxt = $selectHolder.data('label'); 439 $selectListMob.find('option').each(function (key) { 440 var thisOption = $(this); 441 var thisLabel = $(this).html(); 442 var thisVal = $(this).val(); 443 var defaultClass = ''; 444 if (key == 0 || thisOption.hasClass('option-default')) { 445 triggerContent = thisLabel; 446 } 447 if (thisOption.hasClass('option-default')) { 448 defaultClass = ' class="option-default"'; 449 if (!labelTxt) { 450 labelTxt = thisLabel; 451 } 452 } 453 var thisDtOption = '<li data-val="' + thisVal + '"' + defaultClass + '><span>' + thisLabel + '</span></li>'; 454 listForDesktop += thisDtOption; 455 }); 456 listForDesktop += '</ul>'; 457 listForDesktop = '<a href="#" class="custom-select__trigger"><span>' + triggerContent + '</span></a>' + listForDesktop; 458 459 $(listForDesktop).insertBefore($selectListMob); 460 461 if (labelTxt) { 462 var label = '<span class="field__custom-label">' + labelTxt + '</span>'; 463 $(label).insertBefore($selectHolder); 464 } 465 }; 466 initListForDesktop(); 467 468 var $selectTrigger = $selectHolder.find('.custom-select__trigger'); 469 var $selectListHolder = $selectHolder.find('.custom-select__list'); 470 var $selectList = $selectHolder.find('.custom-select__list>li'); 471 //var $defaultOption = $selectList.eq(0); 472 473 474 var selectOpen = function () { 475 selectAllClose(); 476 $selectTrigger.addClass('animating'); 477 $selectListHolder.hide().slideDown(300, function () { 478 $selectHolder.addClass('open'); 479 $selectTrigger.removeClass('animating'); 480 $(document).click(function (event) { 481 if (!$(event.target).closest('.custom-select').length && !$(event.target).is('.custom-select')) { 482 selectClose(); 483 } 484 }); 485 }); 486 }; 487 var selectClose = function () { 488 $selectTrigger.addClass('animating'); 489 $selectListHolder.show().slideUp(300, function () { 490 $selectHolder.removeClass('open'); 491 $selectTrigger.removeClass('animating'); 492 $(document).unbind(); 493 }); 494 }; 495 var selectAllClose = function () { 496 $('.custom-select.open ul').show().slideUp(300, function () { 497 $('.custom-select.open .animating').removeClass('animating'); 498 $('.custom-select.open').removeClass('open'); 499 $(document).unbind(); 500 }); 501 }; 502 var syncSelectList = function () { 503 var thisVal = $selectListMob.val(); 504 $selectList.removeClass('selected'); 505 var targetLi = $selectListHolder.find('li[data-val="' + thisVal + '"]') 506 targetLi.addClass('selected'); 507 var selectedTxt = targetLi.find('span').html(); 508 $selectTrigger.find('span').html(selectedTxt); 509 if (thisVal == '') { 510 $selectHolder.addClass('custom-select--on-default'); 511 $selectHolder.removeClass('is-filled'); 512 } else { 513 $selectHolder.removeClass('custom-select--on-default'); 514 $selectHolder.addClass('is-filled'); 515 } 516 if ($otherField) { 517 if (thisVal && thisVal.toUpperCase() == 'others'.toUpperCase()) { 518 $otherField.addClass('is-active required').prop('disabled', false).removeAttr('disabled'); 519 } else { 520 $otherField.removeClass('is-active required').prop('disabled', true).attr('disabled', ''); 521 } 522 } 523 524 if($selectListMob.prop('disabled')){ 525 $selectHolder.addClass('custom-select--disabled'); 526 } else { 527 $selectHolder.removeClass('custom-select--disabled'); 528 } 529 }; 530 $selectTrigger.click(function (event) { 531 event.preventDefault(); 532 if ($selectTrigger.hasClass('animating')) 533 return false; 534 if (!$selectHolder.hasClass('open')) { 535 selectOpen(); 536 } else { 537 selectClose(); 538 } 539 }); 540 $selectList.click(function (event) { 541 event.preventDefault(); 542 if (!$(this).hasClass('selected')) { 543 $selectList.removeClass('selected'); 544 $(this).addClass('selected'); 545 var thisVal = $(this).data('val'); 546 $selectListMob.val(thisVal); 547 $selectListMob.trigger('change'); 548 } 549 selectClose(); 550 }); 551 $selectListMob.change(function () { 552 syncSelectList(); 553 }); 554 syncSelectList(); 555 });
556} 557 558 559 560// ======================== 561// Layout Handlers 562// ======================== 563// 564 565// Action Handlers 566// ======================== 567function handleHash() { 568 var hashTag = window.location.hash; 569 if (hashTag && $(hashTag + ':visible').length) { 570 $('html, body').animate({ 571 'scrollTop': $(hashTag).offset().top - $('header').outerHeight() 572 }, 1000); 573 } 574} 575 576function cssTranslate3d(elem, xyz) { 577 elem.css({ 578 '-webkit-transform': 'translate3d(' + xyz + ')', 579 '-ms-transform': 'translate3d(' + xyz + ')', 580 'transform': 'translate3d(' + xyz + ')' 581 }); 582} 583// ======================== 584// Helper, Validation Functions 585// ======================== 586 587 588function getDaysName(length) { 589 var daysName, daysNameShort; 590 if (lang == 'zh-hk' || lang == 'zh-cn') { 591 daysName = ["ä¸", "äº", "ä¸", "å", "äº", "å ", "æ¥"]; 592 daysNameShort = daysName; 593 } else { 594 daysName = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; 595 daysNameShort = ["S", "M", "T", "W", "T", "F", "S"]; 596 } 597 if (length == 'long') { 598 return daysName; 599 } else { 600 return daysNameShort; 601 } 602} 603 604function getMonthName() { 605 var monthName; 606 if (lang == 'zh-hk' || lang == 'zh-cn') { 607 monthName = ["1æ", "2æ", "3æ", "4æ", "5æ", "6æ", "7æ", "8æ", "9æ", "10æ", "11æ", "12æ"]; 608 } else { 609 monthName = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
609November", "December"]; 610 } 611 return monthName; 612} 613function getTxtByLang(arrayTxt) { 614 var currentLang = 0; 615 switch (lang) { 616 case 'zh-hk': 617 currentLang = 1; 618 break; 619 case 'zh-cn': 620 currentLang = 2; 621 break; 622 default: 623 currentLang = 0; 624 } 625 return (arrayTxt[currentLang]); 626} 627 628function getMaxHeight(elem, mode) { 629 var maxHeight = Math.max.apply(null, elem.map(function () { 630 if (mode == 'raw') { 631 return $(this).height(); 632 } else if (mode == 'inner') { 633 return $(this).innerHeight(); 634 } else { 635 return $(this).outerHeight(); 636 } 637 }).get()); 638 return maxHeight; 639} 640function getElemBottomPos(elem) { 641 var bgTopPos = elem.offset().top; 642 var bgHeight = elem.outerHeight(); 643 return (bgTopPos + bgHeight); 644} 645function setData(elem, data, val) { 646 elem.attr('data-' + data, val).data(data, val); 647} 648function unsetData(elem, data) { 649 elem.data(data, null).removeAttr('data-' + data); 650} 651//validate functions 652function validateEmail(email) { 653 var re = /^(([^<>()[\]\\.,;:\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,}))$/; 654 return re.test(email); 655} 656 657function validatePassword(password) { 658 //var re = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[A-Za-z\d$@$!%*?&]{8,16}$/; 659 //return re.test(password); 660 661 return (password.length >= 6) && (password.length <= 12); 662} 663 664function validateTel(tel, numLimit) { 665 var intRegex = /^\d+$/; 666 if (!numLimit) { 667 numLimit = 15; 668 } 669 return (tel.length >= 8 && tel.length <= numLimit && intRegex.test(tel)); 670} 671 672function validateNum(num) { 673 var intRegex = /^\d+$/; 674 return (intRegex.test(num)); 675} 676 677function validateAddress(address) { 678 return (!address.replace(/ /g, '').match(/^\d+$/)); 679} 680 681function validateName(name) { 682 return (!name.match(/\d+/g) && !haveSpecialChar(name)); 683} 684 685function validateChineseName(name) { 686 var num = /^\d+$/; 687 var english = /^[A-Za-z0-9]*$/; 688 return (!num.test(name) && !english.test(name)); 689} 690 691function haveSpecialChar(string) { 692 var specialChars = "<>@!#$%^&*()_+[]{}?:;|'\"\\,./~`-="; 693 for (i = 0; i < specialChars.length; i++) { 694 if (string.indexOf(specialChars[i]) > -1) { 695 return true; 696 } 697 } 698 return false; 699} 700 701function IsHKID(str) { 702 var strValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 703 704 // basic check length 705 if (str.length < 8) 706 return false; 707 708 // check with bracket or not 709 if (str.charAt(str.length - 3) != '(' || str.charAt(str.length - 1) != ')'){ 710 return false; 711 } 712 713 // handling bracket 714 if (str.charAt(str.length - 3) == '(' && str.charAt(str.length - 1) == ')') 715 str = str.substring(0, str.length - 3) + str.charAt(str.length - 2); 716 717 // convert to upper case 718 str = str.toUpperCase(); 719 720 // regular expression to check pattern and split 721 var hkidPat = /^([A-Z]{1,2})([0-9]{6})([A0-9])$/; 722 var matchArray = str.match(hkidPat); 723 724 // not match, return false 725 if (matchArray == null) 726 return false; 727 728 // the character part, numeric part and check digit part 729 var charPart = matchArray[1]; 730 var numPart = matchArray[2]; 731 var checkDigit = matchArray[3]; 732 733 // calculate the checksum for character part 734 var checkSum = 0; 735 if (charPart.length == 2) { 736 checkSum += 9 * (10 + strValidChars.indexOf(charPart.charAt(0))); 737 checkSum += 8 * (10 + strValidChars.indexOf(charPart.charAt(1))); 738 } else { 739 checkSum += 9 * 36; 740 checkSum += 8 * (10 + strValidChars.indexOf(charPart)); 741 } 742 743 // calculate the checksum for numeric part 744 for (var i = 0, j = 7; i < numPart.length; i++, j--) 745 checkSum += j * numPart.charAt(i); 746 747 // verify the check digit 748 var remaining = checkSum % 11; 749 var verify = remaining == 0 ? 0 : 11 - remaining; 750 751 return verify == checkDigit || (verify == 10 && checkDigit == 'A'); 752} 753//method for hiding options 754$.fn.toggleOption = function (show) { 755 if (show) { 756 $(this).css('display', ''); 757 if ($(this).parent('span.toggleOption').length) { 758 $(this).unwrap(); 759 } 760 $(this).removeClass('disabled').prop('disabled', false).removeAttr('disabled'); 761 } else { 762 $(this).css('display', 'none'); 763 if ($(this).parent('span.toggleOption').length == 0) { 764 765 $(this).wrap('<span class="toggleOption" style="display: none;" />'); 766 } 767 $(this).addClass('disabled').prop('disabled', true).attr('disabled', ''); 768 } 769}; 770 771function disableCustomOption(holder, val) { 772 var optionDt = holder.find('ul>li[data-val="' + val + '"]'); 773 var optionMb = holder.find('select>option[value="' + val + '"]'); 774 var optionSelect = holder.find('select'); 775 776 if (val == '#all#') { 777 optionDt = holder.find('ul>li'); 778 optionMb = holder.find('select>option'); 779 } 780 if (optionSelect.val() == val) { 781 holder.find('ul>li[data-val=""]').click(); 782 optionSelect.val(''); 783 } 784 optionDt.hide(); 785 optionMb.toggleOption(false); 786} 787 788function enableCustomOption(holder, val) { 789 var optionDt = holder.find('ul>li[data-val="' + val + '"]'); 790 var optionMb = holder.find('select option[value="' + val + '"]'); 791 optionDt.show(); 792 optionMb.toggleOption(true); 793} 794 795// ======================== 796// Forms Functions 797// ======================== 798function checkFormValid(form) { 799 var formValidFlag = true; 800 801 var $required = form.find('.required'); 802 var $formAlert = form.find('.form-alert'); 803 var $formAlertGrp = form.find('.form-alert__group'); 804 805 //Clear all alert first 806 $formAlert.removeClass('is-active'); 807 $formAlertGrp.removeClass('is-active'); 808 $formAlertGrp.find('.form-alert__desc').html(''); 809 810 811 //Check Required 812 var $requiredAlertHolder = form.find('.form-alert-required'); 813 var $requiredAlertDesc = $requiredAlertHolder.find('.form-alert__desc'); 814 $required.each(function(){ 815 var $this = $(this); 816 var $thisLabel = $this.next('label'); 817 if($thisLabel.length){ 818 var thisLabelTxt = $thisLabel.html().replace('*', ''); 819 } 820 821 //Checking 822 var isEmpty = false; 823 var $thisInput = $this; 824 if($this.hasClass('custom-select')){ 825 $thisInput = $this.find('select'); 826 isEmpty = ($.trim($thisInput.val()) == ''); 827 } else if($this.hasClass('date-fields')){ 828 $thisDay = $this.find('.date-fields__day'); 829 $thisMonth = $this.find('.date-fields__month'); 830 $thisYear = $this.find('.date-fields__year'); 831 $thisLabel = $this.find('label'); 832 var thisLabelTxt = $thisLabel.html().replace('*', ''); 833 isEmpty = ($.trim($thisDay.val()) == '')&&($.trim($thisMonth.val()) == '')&&($.trim($thisYear.val()) == ''); 834 } else if($this.hasClass('birth-place-fields')) { 835 $thisCity = $this.find('.birth-place__city'); 836 $thisCountry = $this.find('.birth-place__country'); 837 $thisLabel = $this.find('label'); 838 var thisLabelTxt = $thisLabel.html().replace('*', ''); 839 isEmpty = ($.trim($thisCity.val()) == '')&&($.trim($thisCountry.val()) == ''); 840 } else if($this.hasClass('other-field')) { 841 $thisLabel = $this.parent().find('label'); 842 var thisLabelTxt = $thisLabel.html().replace('*', ''); 843 isEmpty = ($.trim($thisInput.val()) == ''); 844 } else { 845 isEmpty = ($.trim($thisInput.val()) == ''); 846 } 847 848 if(isEmpty){ 849 formValidFlag = false; 850 $requiredAlertHolder.addClass('is-active'); 851 var currentDesc = $requiredAlertDesc.html(); 852 if(currentDesc!=''){ 853 currentDesc+=', '; 854 } 855 currentDesc += thisLabelTxt; 856 $requiredAlertDesc.html(currentDesc); 857 } 858 859 });
860 861 862 if(!formValidFlag){ 863 $formAlert.addClass('is-active'); 864 scrollToElem($formAlert, 800); 865 } 866 return formValidFlag; 867} 868 869function onlineFormValidationErrorPlacement(error, element) { 870 var errorAppended = false; 871 var errorPlaceGroup = [ 872 "custom-radio__group", 873 "custom-check__group", 874 "custom-checkbox__row" 875 ]; 876 for (var i=0 ; i<errorPlaceGroup.length ; i++) { 877 if (element.parent().hasClass(errorPlaceGroup[i]) || 878 element.parent().parent().hasClass(errorPlaceGroup[i])) 879 { 880 element.closest("." + errorPlaceGroup[i]).append(error); 881 errorAppended = true; 882 break; 883 } 884 } 885 886 if (!errorAppended) { 887 element.parent().append(error); 888 } 889 890} 891
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.