PageSourceSearch

https://www.ebshkdirect.com/hk/web/js/online-form.js?_=20261002

js ebshkdirect.com collected 2026-10-02 15:36:43 UTC 30,744 bytes, 891 lines download raw bytes

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.