1(function (win, doc, $) { 2 'use strict'; 3 4 win.AnalyticsViews = {}; 5 6 win.AnalyticsViews.Utility = {}; 7 8 win.AnalyticsViews.Utility.Location = (function () { 9 var Location = {}; 10 11 Location.matchPathname = function (patternList) { 12 var len = patternList.length; 13 var i; 14 var pathname = win.location.pathname; 15 var pattern; 16 var result = false; 17 18 for (i = 0; i < len; i++) { 19 pattern = new RegExp(patternList[i]); 20 21 if (pattern.test(pathname)) { 22 result = true; 23 24 break; 25 } 26 } 27 28 return result; 29 }; 30 31 Location.getDomain = function () { 32 return win.location.protocol + '//' + win.location.hostname; 33 }; 34 35 return Location; 36 }()); 37 38 win.AnalyticsViews.Utility.Form = (function () { 39 var Form = {}; 40 41 Form.getLabelPrefix = function () { 42 var FormFilter = null; 43 var isRootElement = null; 44 var prefix = ''; 45 var formType = ''; 46 var formSignInType = ''; 47 48 if (!win.KeyenceForm) { 49 return prefix; 50 } 51 52 FormFilter = win.KeyenceForm.FormFilter; 53 isRootElement = FormFilter.General.checkRootElement(); 54 55 if (!isRootElement) { 56 prefix = 'ready-' 57 } else { 58 formType = FormFilter.General.getFormType(); 59 formSignInType = FormFilter.SignIn.getFormType(); 60 61 if (formType === FormFilter.General.FORM_TYPE.MOBILE_NUMBER) { 62 if (formSignInType === FormFilter.SignIn.FORM_TYPE.ASU) { 63 prefix = 'asu-'; 64 } else { 65 prefix = 'mobile-'; 66 } 67 } else if (formType === FormFilter.General.FORM_TYPE.EMAIL) { 68 if (formSignInType === FormFilter.SignIn.FORM_TYPE.ASU) { 69 prefix = 'asu-'; 70 } else { 71 prefix = 'email-'; 72 } 73 } 74 } 75 76 return prefix; 77 }; 78 79 Form.setInitialScreenName = function ($formRoot, formCategory, noticeFunction) { 80 var initialScreenName = ''; 81 var formWrapper = doc.querySelector('.js-checkCurrentFormScreen'); 82 83 if (!formWrapper || !$formRoot.length) { 84 return; 85 } 86 87 initialScreenName = formWrapper.dataset.currentScreenName; 88 89 if (initialScreenName) { 90 noticeFunction.noticeScreenName( 91 initialScreenName, 92 formCategory 93 ); 94 } 95 }; 96 97 Form.attachCurrentScreenObserver = function ($formRoot, formCategory, noticeFunction) { 98 var target = doc.querySelector('.js-checkCurrentFormScreen'); 99 var observer = null; 100 var observerConfig = { 101 attributes: true 102 }; 103 var screenName = ''; 104 105 if (!target || !$formRoot.length) { 106 return; 107 } 108 109 observer = new MutationObserver(function (record) { 110 if (record[0].target === target && record[0].attributeName === 'data-current-screen-name') { 111 screenName = record[0].target.dataset.currentScreenName; 112 113 if (!screenName) { 114 return; 115 } 116 117 noticeFunction.noticeScreenName( 118 screenName, 119 formCategory 120 ); 121 } 122 }); 123 124 observer.observe(target, observerConfig); 125 }; 126 127 return Form; 128 }()); 129 130 win.AnalyticsViews.Utility.messageNames = (function () { 131 return { 132 backLink: 'backLink', 133 nextForm: 'nextForm', 134 generalForm: 'generalForm', 135 forwardLink: 'forwardLink', 136 }; 137 }()); 138 139 win.AnalyticsViews.MultiStepForm = (function () { 140 var Utility = win.AnalyticsViews.Utility; 141 142 var idNames = { 143 regArea: 'suz_regArea', 144 root: 'js-multiStepForm', 145 backEmail: 'js-regForm-btnBackToEmail', 146 backEmailSignIn: 'js-signinForm-btnBackToEmail', 147 backMobileSignIn: 'js-signinForm-btnBackToMobile', 148 backMobileRegister: 'js-regForm-btnBackToMobile', 149 preForm: 'js-multiStepForm-signinOrRegister', 150 signin: 'js-multiStepForm-signin', 151 registration: 'js-multiStepForm-registration', 152 loginPassword: 'loginPassword', 153 pwdAssistanceLink: 'suz-pwdAssistanceLink', 154 countryNumber: 'checkCountryNumber', 155 showNextButton: 'js-form-btnCheckRegistered', 156 mobileTag: 'js-formFilterGeneral-mobileNumber', 157 emailTag: 'js-formFilterGeneral-email', 158 changeEmail: 'js-formDescriptionFilter-email', 159 sendVerificationEmailButton: 'js-form-btnCheckSendMail', 160 backSignIn: 'js-sendEmail-btnBackToSignin', 161 backAutoSignUp: 'js-sendEmail-btnBackToAutoSignup', 162 forwardRegister: 'js-signinForm-btnForwardToRegister', 163 sendVerificationAutoSignUpEmailButton: 'js-form-btnCheckSendAutoSignupMail', 164 }; 165 166 var classNames = { 167 btnPrev: 'js-regForm-btnPrevious', 168 btnNext: 'js-regForm-btnNext', 169 formGroup: 'form-utilityGroup',
170 formGroupJsr: 'm-form-layout__item', 171 errorText: 'suz_errorMsg', 172 regPanel: 'js-multiStep-target', 173 regError: 'is-register-error', 174 regFlat: 'is-register-flat', 175 isCurrent: 'is-current', 176 }; 177 178 var MultiStepForm = function () { 179 this.analytics = new win.KeyenceAnalytics.Form(); 180 this.$rootElement = null; 181 this.observers = { 182 errText: null, 183 filled: null, 184 }; 185 }; 186 187 MultiStepForm.prototype.init = function () { 188 var self = this; 189 190 self.$rootElement = $('#' + idNames.root); 191 192 if (!self.$rootElement.length) { 193 return; 194 } 195 196 self.trackInputErrorAll(); 197 self.attachTrackFocus(); 198 self.attachTrackClickInput(); 199 self.attachTrackPrevious(); 200 self.attachTrackNext(); 201 self.attachTrackClickLink(); 202 203 self.observers.errText = self.attachInputErrorObserver(); 204 self.observers.filled = self.attachFilledFieldObserver(); 205 206 self.attachRegFormObserver(function () { 207 if (self.observers.errText) { 208 self.observers.errText.disconnect(); 209 } 210 211 if (self.observers.filled) { 212 self.observers.filled.disconnect(); 213 } 214 215 self.attachInputErrorObserver(); 216 self.attachFilledFieldObserver(); 217 }); 218 219 Utility.Form.setInitialScreenName(self.$rootElement, 'signin', self.analytics); 220 Utility.Form.attachCurrentScreenObserver(self.$rootElement, 'signin', self.analytics); 221 }; 222 223 MultiStepForm.prototype.attachTrackFocus = function () { 224 var self = this; 225 var selector = 'input, select'; 226 var targetIds = [ 227 idNames.countryNumber, 228 ]; 229 var isRootElement = null; 230 var firstFocusElement = document.activeElement; 231 232 if (win.KeyenceForm) { 233 isRootElement = win.KeyenceForm.FormFilter.General.checkRootElement(); 234 } 235 236 self.$rootElement.on('focus', selector, function () { 237 self.noticeFocusEvent(this); 238 }); 239 240 if (isRootElement 241 && firstFocusElement 242 && win.MultiStepForm 243 && win.MultiStepForm.isFirstFocus 244 ) { 245 if (firstFocusElement.tagName === 'INPUT' || firstFocusElement.tagName === 'SELECT') { 246 self.analytics.noticeEvent( 247 self.analytics.getEventType('SIGNIN_FOCUS'), 248 firstFocusElement, 249 'ready-' 250 ); 251 } 252 } 253 }; 254 255 MultiStepForm.prototype.noticeFocusEvent = function (element) { 256 var self = this; 257 var FormSignIn = null; 258 var prefix = ''; 259 260 if (element && self.isElementVisible(element)) { 261 // When you click the back link on the auto signup screen, the country number on the login screen is focused, so give it a mobile prefix instead of auto signup prefix. 262 if (win.KeyenceForm) { 263 FormSignIn = win.KeyenceForm.FormFilter.SignIn; 264 265 if (element.id === idNames.countryNumber && FormSignIn.getFormType() === FormSignIn.FORM_TYPE.ASU) { 266 prefix = 'mobile-'; 267 } else { 268 prefix = Utility.Form.getLabelPrefix(); 269 } 270 } else { 271 prefix = Utility.Form.getLabelPrefix(); 272 } 273 274 self.analytics.noticeEvent( 275 self.analytics.getEventType('SIGNIN_FOCUS'), 276 element, 277 prefix 278 ); 279 } 280 }; 281 282 MultiStepForm.prototype.attachTrackClickInput = function () { 283 var self = this; 284 var selector = 'button, input'; 285 var targetIds = [ 286 idNames.backEmail, 287 idNames.backEmailSignIn, 288 idNames.backMobileSignIn, 289 idNames.backMobileRegister, 290 idNames.sendVerificationEmailButton, 291 idNames.backSignIn, 292 idNames.backAutoSignUp, 293 idNames.sendVerificationAutoSignUpEmailButton, 294 ]; 295 var backLinkIds = [ 296 idNames.backEmailSignIn, 297 idNames.backMobileSignIn, 298 ]; 299 var showNextIds = [ 300 idNames.showNextButton, 301 ]; 302 var generalIds = [ 303 idNames.mobileTag, 304 idNames.emailTag, 305 idNames.changeEmail, 306 ]; 307 var forwardIds = [ 308 idNames.forwardRegister, 309 ]; 310 311 targetIds.forEach(function (id) { 312 selector += ', #' + id; 313 }); 314 315 self.$rootElement.on('click', selector, function () { 316 var element = this; 317 318 if ((element && self.isRegisterPanelVisible(element)) || targetIds.includes(element.i
318d)) { 319 self.analytics.noticeEvent( 320 self.analytics.getEventType('SIGNIN_CLICK'), 321 element, 322 Utility.Form.getLabelPrefix() 323 ); 324 325 if (backLinkIds.includes(element.id)) { 326 win.postMessage(Utility.messageNames.backLink, Utility.Location.getDomain()); 327 } else if (showNextIds.includes(element.id)) { 328 win.postMessage(Utility.messageNames.nextForm, Utility.Location.getDomain()); 329 } else if (generalIds.includes(element.id)) { 330 win.postMessage(Utility.messageNames.generalForm, Utility.Location.getDomain()); 331 } else if (forwardIds.includes(element.id)) { 332 win.postMessage(Utility.messageNames.forwardLink, Utility.Location.getDomain()); 333 } 334 } 335 }); 336 }; 337 338 MultiStepForm.prototype.attachTrackClickLink = function () { 339 var self = this; 340 var selector = 'a:not(#' + idNames.pwdAssistanceLink + ')'; 341 342 self.$rootElement.on('click', selector, function () { 343 var element = this; 344 345 if (element && !self.isRegisterationPagination(this)) { 346 self.analytics.noticeEvent( 347 self.analytics.getEventType('SIGNIN_CLICK'), 348 element, 349 Utility.Form.getLabelPrefix() 350 ); 351 } 352 }); 353 }; 354 355 MultiStepForm.prototype.attachTrackPrevious = function () { 356 var self = this; 357 var selector = '.' + classNames.btnPrev; 358 359 self.$rootElement.on('mousedown keydown touchend', selector, function () { 360 var element = this; 361 362 if (element) { 363 self.analytics.noticeEvent( 364 self.analytics.getEventType('SIGNIN_CLICK'), 365 element, 366 Utility.Form.getLabelPrefix() 367 ); 368 } 369 }); 370 }; 371 372 MultiStepForm.prototype.attachTrackNext = function () { 373 var self = this; 374 var selector = '.' + classNames.btnNext; 375 376 self.$rootElement.on('mousedown keydown touchend', selector, function () { 377 var element = this; 378 379 if (element) { 380 self.analytics.noticeEvent( 381 self.analytics.getEventType('SIGNIN_CLICK'), 382 element, 383 Utility.Form.getLabelPrefix() 384 ); 385 } 386 }); 387 }; 388 389 MultiStepForm.prototype.attachRegFormObserver = function (handler) { 390 var obs; 391 392 if (typeof handler !== 'function') { 393 return null; 394 } 395 396 obs = new MutationObserver(handler); 397 398 obs.observe(doc.getElementById(idNames.regArea), { 399 childList: true, 400 }); 401 402 return obs; 403 }; 404 405 MultiStepForm.prototype.attachInputErrorObserver = function () { 406 var self = this; 407 var obs; 408 var callback; 409 var selector = '.' + classNames.formGroup + ' .' + classNames.errorText + ', .' + classNames.formGroupJsr + ' .' + classNames.errorText; 410 411 callback = function (records) { 412 var $target = $(self.getObservationTarget(records)); 413 var $parentElement; 414 415 if ($target && $target.length) { 416 $parentElement = $target.parents('.' + classNames.formGroup); 417 418 if (!$parentElement.length) { 419 $parentElement = $target.parents('.' + classNames.formGroupJsr); 420 } 421 } 422 423 if ($parentElement && $parentElement.length) { 424 self.trackInputError($parentElement.get(0)); 425 } 426 }; 427 428 obs = new MutationObserver(callback); 429 430 self.$rootElement.find(selector).each(function () { 431 obs.observe(this, { 432 childList: true, 433 }); 434 }); 435 436 return obs; 437 }; 438 439 MultiStepForm.prototype.isRegisterationPagination = function (element) { 440 var result = false; 441 442 if (!element) { 443 return result; 444 } 445 446 if ( 447 element.classList.contains(classNames.btnNext) || 448 element.classList.contains(classNames.btnPrev) 449 ) { 450 result = true; 451 } 452 453 return result; 454 }; 455 456 MultiStepForm.prototype.getObservationTarget = function (records) { 457 var target = null; 458 var $recordItem = null; 459 var editedRecordsArray = []; 460 var i = 0; 461 462 if (records.length >= 2) { 463 for (i; i < records.length; i++) { 464 $recordItem = $(records[i].target); 465 466 if ($recordItem.is(':visible')) { 467 editedRecordsArray.push(records[i]); 468 } 469 } 470 471 records = editedRecordsArray; 472 } 473 474 if (Array.isArray(records) && (records[0] && records[0].target)) { 475 target = records[0].target; 476 } 477 478 return target; 479 }; 480 481 MultiStepForm.prototype.trackInputErrorAll = function () { 482 var self = this; 483 var $formGroups = this.$rootElement.find('.' + classNames.formGroup + ', .' + classNames.formGroupJ
483sr); 484 485 if ($formGroups.length) { 486 $formGroups.each(function () { 487 self.trackInputError(this); 488 }); 489 } 490 }; 491 492 MultiStepForm.prototype.trackInputError = function (formGroupElement) { 493 var self = this; 494 var $formGroup; 495 var $errorText; 496 var $targetElement; 497 var element; 498 var inputSelector = 'input, select'; 499 var eventType = ''; 500 var tagName = ''; 501 var isInputField = false; 502 var inputField = null; 503 504 if (!formGroupElement) { 505 return; 506 } 507 508 $formGroup = $(formGroupElement); 509 $errorText = $formGroup.find('.' + classNames.errorText); 510 511 if ($errorText.length 512 && $errorText.text().length 513 && self.isElementVisible(formGroupElement)) { 514 $targetElement = $formGroup.find('#' + idNames.loginPassword); 515 516 if (!$targetElement.length) { 517 $targetElement = $formGroup.find(inputSelector); 518 } 519 } 520 521 if (!$targetElement || !$targetElement.length) { 522 return; 523 } 524 525 element = $targetElement.get(0); 526 527 if (!element) { 528 return; 529 } 530 531 if ($formGroup.hasClass('is-unavailable')) { 532 eventType = 'SIGNIN_VALIDATE_ERROR'; 533 } else if ($targetElement.length >= 2) { 534 $targetElement.each(function () { 535 if (this.tagName === 'INPUT') { 536 isInputField = true; 537 inputField = this; 538 539 return false; 540 } 541 }); 542 543 if (isInputField && inputField.value === '') { 544 eventType = 'SIGNIN_BLANK_ERROR'; 545 } else { 546 eventType = 'SIGNIN_ERROR'; 547 } 548 } else if ($targetElement.length === 1) { 549 tagName = $targetElement.get(0).tagName; 550 551 if ((tagName === 'INPUT' && $targetElement.get(0).value === '') 552 || tagName === 'SELECT') { 553 eventType = 'SIGNIN_BLANK_ERROR'; 554 } else { 555 eventType = 'SIGNIN_ERROR'; 556 } 557 } 558 559 self.analytics.noticeEvent( 560 self.analytics.getEventType(eventType), 561 element, 562 Utility.Form.getLabelPrefix() 563 ); 564 }; 565 566 MultiStepForm.prototype.isRegisterElement = function (element) { 567 var $element = $(element); 568 569 if ($element.length && $element.parents('.' + classNames.regPanel).length) { 570 return true; 571 } 572 573 return false; 574 }; 575 576 MultiStepForm.prototype.isRegisterPanelVisible = function (element) { 577 var $element = $(element); 578 var $regPanel; 579 var result; 580 581 if (!$element || !$element.length) { 582 return false; 583 } 584 585 if (this.isRegisterElement($element)) { 586 $regPanel = $element.parents('.' + classNames.regPanel); 587 588 if ($('#' + idNames.registration).hasClass(classNames.regFlat)) { 589 result = true; 590 } else { 591 if ($regPanel.hasClass(classNames.isCurrent)) { 592 result = true; 593 } else { 594 result = false; 595 } 596 } 597 598 return result; 599 } 600 601 return $element.is(':visible'); 602 }; 603 604 MultiStepForm.prototype.isElementVisible = function (element) { 605 var $element = $(element); 606 607 if (!$element || !$element.length) { 608 return false; 609 } 610 611 if (!$element.is(':visible') 612 || $element.css('visibility') !== 'visible' 613 || $element.css('opacity') === '0') { 614 return false; 615 } 616 617 return true; 618 }; 619 620 MultiStepForm.prototype.attachFilledFieldObserver = function () { 621 var self = this; 622 var targets = doc.querySelectorAll('.js-validateValue-root'); 623 var observer = null; 624 var observerConfig = { 625 attributeFilter: ['class'], 626 attributeOldValue: true, 627 }; 628 var field = null; 629 630 if (!targets.length) { 631 return; 632 } 633 634 observer = new MutationObserver(function (record) { 635 if (record[0].target.classList.contains('is-field-valid') && 636 !record[0].target.classList.contains('is-error') && 637 !record[0].oldValue.includes('is-field-valid') 638 ) { 639 field = record[0].target.querySelector('.js-validateValue-target'); 640 641 if (!field) { 642 return; 643 } 644 645 self.analytics.noticeFilledFieldName( 646 field, 647 self.analytics.getEventType('SIGNIN_FILLED'), 648 ); 649 } 650 }); 651
652 targets.forEach(function (target) { 653 observer.observe(target, observerConfig); 654 }); 655 656 return observer; 657 }; 658 659 return MultiStepForm; 660 }()); 661 662 win.AnalyticsViews.PasswordAssistance = (function () { 663 var Utility = win.AnalyticsViews.Utility; 664 665 var idNames = { 666 emailAddress: 'js-reset-EmailAddress', 667 sendEmail: 'js-reset-sendMail', 668 histBackPwd: 'js-reset-histBackPwd', 669 pwdJsr: 'js-reset-Pwd', 670 pwd: 'suz_password', 671 resetPwd: 'suz_confirmPassword', 672 editPwd: 'js-reset-editPwd', 673 mobileNumber: 'remindMobileNumber', 674 verificationCode: 'remindVerificationCode', 675 showPassword: 'resetPassword-showPassword', 676 mobileTag: 'js-formFilterGeneral-mobileNumber', 677 emailTag: 'js-formFilterGeneral-email', 678 getVerificationCode: 'remindVerificationCode-getCode', 679 }; 680 681 var classNames = { 682 isError: 'is-error', 683 formGroup: 'form-utilityGroup', 684 formGroupJsr: 'm-form-layout__item', 685 errorText: 'suz_errorMsg', 686 }; 687 688 var names = { 689 passwordAssistanceActionForm: 'user_passwordAssistanceActionForm', 690 passwordAssistanceResetActionForm: 'user_passwordAssistance_resetPasswordActionForm', 691 }; 692 693 var PasswordAssistance = function () { 694 this.analytics = new win.KeyenceAnalytics.Form(); 695 this.urlPatternList = [ 696 /^\/user\/passwordAssistance\//, 697 /^\/user\/passwordAssistance\/resetPassword\//, 698 ]; 699 this.$form = null; 700 }; 701 702 PasswordAssistance.prototype.init = function () { 703 var self = this; 704 705 self.$form = $('form[name="' + names.passwordAssistanceActionForm + '"]'); 706 self.$resetForm = $('form[name="' + names.passwordAssistanceResetActionForm + '"]'); 707 708 if (!this.canStartTracking()) { 709 return; 710 } 711 712 self.trackInputErrorAll(); 713 self.attachTrackFocusEvent(); 714 self.attachTrackClickEvent(); 715 self.attachTrackErrorEvent(); 716 self.attachInputErrorObserver(); 717 self.attachFilledFieldObserver(); 718 719 Utility.Form.setInitialScreenName(self.$form, 'reset', self.analytics); 720 Utility.Form.attachCurrentScreenObserver(self.$form, 'reset', self.analytics); 721 }; 722 723 PasswordAssistance.prototype.canStartTracking = function () { 724 var len = this.urlPatternList.length; 725 var i; 726 var pathname = win.location.pathname; 727 var pattern; 728 var result = false; 729 730 for (i = 0; i < len; i++) { 731 pattern = new RegExp(this.urlPatternList[i]); 732 733 if (pattern.test(pathname)) { 734 result = true; 735 736 break; 737 } 738 } 739 740 return result; 741 }; 742 743 PasswordAssistance.prototype.attachTrackFocusEvent = function () { 744 var self = this; 745 var selector = [ 746 '#' + idNames.emailAddress, 747 '#' + idNames.pwdJsr, 748 '#' + idNames.pwd, 749 '#' + idNames.resetPwd, 750 '#' + idNames.mobileNumber, 751 '#' + idNames.verificationCode, 752 ].join(', '); 753 var elements = document.querySelectorAll(selector); 754 var isRootElement = null; 755 var firstFocusElement = document.activeElement; 756 757 if (win.KeyenceForm) { 758 isRootElement = win.KeyenceForm.FormFilter.General.checkRootElement(); 759 } 760 761 Array.prototype.forEach.call(elements, function (elm) { 762 elm.addEventListener('focus', function () { 763 self.noticeFocusEvent(this); 764 }); 765 }); 766 767 if (isRootElement 768 && firstFocusElement 769 && win.KeyenceForm.filledFieldValidator.config.isFirstFocus 770 ) { 771 if (firstFocusElement.tagName === 'INPUT' || firstFocusElement.tagName === 'SELECT') { 772 self.analytics.noticeEvent( 773 self.analytics.getEventType('RESET_FOCUS'), 774 firstFocusElement, 775 'ready-' 776 ); 777 } 778 } 779 }; 780 781 PasswordAssistance.prototype.noticeFocusEvent = function (element) { 782 var self = this; 783 784 if (!self.isElementVisible(element)) { 785 return; 786 } 787 788 self.analytics.noticeEvent( 789 self.analytics.getEventType('RESET_FOCUS'), 790 element, 791 Utility.Form.getLabelPrefix() 792 ); 793 }; 794 795 PasswordAssistance.prototype.attachTrackClickEvent = function () { 796 var self = this; 797 var selector = [ 798 '#' + idNames.sendEmail, 799 '#' + idNames.histBackPwd, 800 '#' + idNames.editPwd, 801 '#' + idNames.showPassword, 802 '#' + idNames.mobileTag, 803 '#' + idNames.emailTag, 804 '#' + idNames.getVerificationCode, 805 ].join(', '); 806 var elements = document.querySelectorAll(selector); 807 var generalIds = [ 808 idNames.mobileTag, 809 idNames.emailTag, 810 ]; 811 812 Array.prototype.forEach.call(elements, function (elm) { 813 elm.addEventListener('click', function () { 814 self.analytics.noticeEvent( 815 self.analytics.getEventType('RESET_CLICK'), 816 elm, 817 Utility.Form.getLabelPrefix() 818 ); 819 820 if (generalIds.includes(elm.id)) { 821 win.postMessage(Utility.messageNames.generalForm, Utility.Location.getDomain()); 822 } 823 }); 824 }); 825 }; 826 827 PasswordAssistance.prototype.attachTrackErrorEvent = function () { 828 var self = this; 829 var selector = [ 830 '#' + idNames.emailAddress, 831 '#' + idNames.pwd, 832 ].join(', '); 833 var elements = document.querySelectorAll(selector); 834 835 Array.prototype.forEach.call(elements, function (elm) { 836 var formCol = elm.parentNode; 837 var errorBall; 838 839 if (formCol.classList.contains('form_col')) { 840 errorBall = formCol.nextElementSibling; 841 } 842 843 if (errorBall && errorBall.classList.contains('ErrorBall')) { 844 self.analytics.noticeEvent(self.analytics.getEventType('RESET_ERROR'), elm); 845 } 846 }); 847 }; 848
849 PasswordAssistance.prototype.attachRegFormObserver = function (handler) { 850 var obs; 851 852 if (typeof handler !== 'function') { 853 return null; 854 } 855 856 obs = new MutationObserver(handler); 857 858 obs.observe(this.$form.get(0), { 859 childList: true, 860 }); 861 862 return obs; 863 }; 864 865 PasswordAssistance.prototype.attachInputErrorObserver = function () { 866 var self = this; 867 var obs; 868 var callback; 869 var selector = '.' + classNames.formGroup + ' .' + classNames.errorText + ', .' + classNames.formGroupJsr + ' .' + classNames.errorText; 870 871 callback = function (records) { 872 var $target = $(self.getObservationTarget(records)); 873 var $parentElement; 874 875 if ($target && $target.length) { 876 $parentElement = $target.parents('.' + classNames.formGroup); 877 878 if (!$parentElement.length) { 879 $parentElement = $target.parents('.' + classNames.formGroupJsr); 880 } 881 } 882 883 if ($parentElement && $parentElement.length) { 884 self.trackInputError($parentElement.get(0)); 885 } 886 }; 887 888 obs = new MutationObserver(callback); 889 890 if (self.$form.length) { 891 self.$form.find(selector).each(function () { 892 obs.observe(this, { 893 childList: true, 894 }); 895 }); 896 } else if (self.$resetForm.length) { 897 self.$resetForm.find(selector).each(function () { 898 obs.observe(this, { 899 childList: true, 900 }); 901 }); 902 } 903 904 return obs; 905 }; 906 907 PasswordAssistance.prototype.getObservationTarget = function (records) { 908 var target = null; 909 910 if (Array.isArray(records) && (records[0] && records[0].target)) { 911 target = records[0].target; 912 } 913 914 return target; 915 }; 916 917 PasswordAssistance.prototype.trackInputErrorAll = function () { 918 var self = this; 919 var $formGroups = this.$form.find('.' + classNames.formGroup + ', .' + classNames.formGroupJsr); 920 var $resetFormGroups = this.$resetForm.find('.' + classNames.formGroup + ', .' + classNames.formGroupJsr); 921 922 if ($formGroups.length) { 923 $formGroups.each(function () { 924 self.trackInputError(this); 925 }); 926 } else if ($resetFormGroups.length) { 927 $resetFormGroups.each(function () { 928 self.trackInputError(this); 929 }); 930 } 931 }; 932 933 PasswordAssistance.prototype.trackInputError = function (formGroupElement) { 934 var self = this; 935 var $formGroup; 936 var $errorText; 937 var $targetElement; 938 var element; 939 var inputSelector = 'input, select'; 940 var eventType = ''; 941 var tagName = ''; 942 943 if (!formGroupElement) { 944 return; 945 } 946 947 $formGroup = $(formGroupElement); 948 $errorText = $formGroup.find('.' + classNames.errorText); 949 950 if ($errorText.is(':visible') 951 && $errorText.text().length 952 && self.isElementVisible(formGroupElement)) { 953 $targetElement = $formGroup.find('#' + idNames.pwdJsr); 954 955 if (!$targetElement.length) { 956 $targetElement = $formGroup.find(inputSelector); 957 } 958 } 959 960 if ($targetElement && $targetElement.length) { 961 element = $targetElement.get(0); 962 963 if ($formGroup.hasClass('is-unavailable')) { 964 eventType = 'RESET_VALIDATE_ERROR'; 965 } else if ($targetElement.length === 1) { 966 tagName = element.tagName; 967 968 if ((tagName === 'INPUT' && element.value === '') 969 || tagName === 'SELECT') { 970 eventType = 'RESET_BLANK_ERROR'; 971 } else { 972 eventType = 'RESET_ERROR'; 973 } 974 } 975 976 if (element) { 977 self.analytics.noticeEvent( 978 self.analytics.getEventType(eventType), 979 element, 980 Utility.Form.getLabelPrefix() 981 ); 982 } 983 } 984 }; 985 986 PasswordAssistance.prototype.isElementVisible = function (element) { 987 var $element = $(element); 988 989 if (!$element || !$element.length) { 990 return false; 991 } 992 993 if (!$element.is(':visible') 994 || $element.css('visibility') !== 'visible' 995 || $element.css('opacity') === '0') { 996 return false; 997 } 998 999 return true; 1000 }; 1001 1002 PasswordAssistance.prototype.attachFilledFieldObserver = function () { 1003 var self = this; 1004 var targets = doc.querySelectorAll('.js-validateValue-root'); 1005 var observer = null; 1006 var observerConfig = { 1007 attributeFilter: ['class'], 1008 attributeOldValue: true, 1009 }; 1010 var field = null; 1011 1012 if (!targets.length) { 1013 return; 1014 } 1015 1016 observer = new MutationObserver(function (record) { 1017 if (record[0].target.classList.contains('is-field-valid') && 1018 !record[0].target.classList.contains('is-error') && 1019 !record[0].oldValue.includes('is-field-valid') 1020 ) { 1021 field = record[0].target.querySelector('.js-validateValue-target'); 1022 1023 if (!field) { 1024 return; 1025 } 1026 1027 self.analytics.noticeFilledFieldName( 1028 field, 1029 self.analytics.getEventType('RESET_FILLED'), 1030 ); 1031 } 1032 }); 1033
1034 targets.forEach(function (target) { 1035 observer.observe(target, observerConfig); 1036 }); 1037 1038 return observer; 1039 }; 1040 1041 return PasswordAssistance; 1042 }()); 1043 1044 win.AnalyticsViews.RegisteredMemberForm = (function () { 1045 var idNames = { 1046 loggedInButton: 'js-form-btnLoginedContinue', 1047 autoLoginButton: 'js-form-autoLoginSwitch', 1048 autoSignUpButton: 'js-form-autoSignupSwitch', 1049 multiStepFormRoot: 'js-multiStepForm', 1050 }; 1051 1052 var RegisteredMemberForm = function () { 1053 this.analytics = new win.KeyenceAnalytics.Form(); 1054 }; 1055 1056 RegisteredMemberForm.prototype.init = function () { 1057 var self = this; 1058 1059 self.$multiStepFormRootElement = $('#' + idNames.multiStepFormRoot); 1060 1061 if (self.$multiStepFormRootElement.length) { 1062 return; 1063 } 1064 1065 self.attachTrackClickEvent(); 1066 }; 1067 1068 RegisteredMemberForm.prototype.attachTrackClickEvent = function () { 1069 var self = this; 1070 var selector = [ 1071 '#' + idNames.loggedInButton, 1072 '#' + idNames.autoLoginButton, 1073 '#' + idNames.autoSignUpButton, 1074 ].join(', '); 1075 var elements = document.querySelectorAll(selector); 1076 1077 Array.prototype.forEach.call(elements, function (elm) { 1078 elm.addEventListener('click', function () { 1079 self.analytics.noticeEvent( 1080 self.analytics.getEventType('SIGNIN_CLICK'), 1081 elm, 1082 '' 1083 ); 1084 }); 1085 }); 1086 }; 1087 1088 return RegisteredMemberForm; 1089 }()); 1090 1091 win.AnalyticsViews.DownloadFilter = (function () { 1092 var Utility = win.AnalyticsViews.Utility; 1093 1094 var idNames = { 1095 categoriesLegacy: 'js-filterCategories', 1096 categories: 'js-searchFilterByCategories', 1097 fileTypesLegacy: 'js-filterFileTypes', 1098 fileTypes: 'js-searchFilterByFileTypes', 1099 }; 1100 1101 var DownloadFilter = function () { 1102 this.analytics = new win.KeyenceAnalytics.Analytics(); 1103 this.urlPatternList = [ 1104 /^\/products\/[a-zA-Z0-9-_]+\/[a-zA-Z0-9-_]+\/[a-zA-Z0-9-_]+\/downloads\/$/, 1105 /^\/downloads\/$/, 1106 ]; 1107 }; 1108 1109 DownloadFilter.prototype.init = function () { 1110 if (!Utility.Location.matchPathname(this.urlPatternList)) { 1111 return; 1112 } 1113 1114 this.attachTrackAddCategory(); 1115 this.attachTrackAddFileTypes(); 1116 }; 1117 1118 DownloadFilter.prototype.attachTrackAddCategory = function () { 1119 var self = this; 1120 var selector = [ 1121 '#' + idNames.categoriesLegacy + ' label input[type="checkbox"]', 1122 '#' + idNames.categories + ' label input[type="checkbox"]', 1123 '#' + idNames.categories + ' [role="checkbox"]', 1124 ].join(', '); 1125 var elements = doc.querySelectorAll(selector); 1126 1127 Array.prototype.forEach.call(elements, function (checkbox) { 1128 checkbox.addEventListener('click', function (e) { 1129 var elem = e.currentTarget.type ? checkbox.nextElementSibling : checkbox; 1130 1131 self.analytics.noticeEvent( 1132 win.KeyenceAnalytics.DownloadFilter.name, 1133 win.KeyenceAnalytics.DownloadFilter.EVENT_TYPES.CLICK_CATEGORY, 1134 elem 1135 ); 1136 }); 1137 }); 1138 }; 1139 1140 DownloadFilter.prototype.attachTrackAddFileTypes = function () { 1141 var self = this; 1142 var selector = [ 1143 '#' + idNames.fileTypesLegacy + ' label input[type="checkbox"]', 1144 '#' + idNames.fileTypes + ' label input[type="checkbox"]', 1145 '#' + idNames.fileTypes + ' [role="checkbox"]', 1146 ].join(', '); 1147 var elements = document.querySelectorAll(selector); 1148 1149 Array.prototype.forEach.call(elements, function (checkbox) { 1150 checkbox.addEventListener('click', function () { 1151 self.analytics.noticeEvent( 1152 win.KeyenceAnalytics.DownloadFilter.name, 1153 win.KeyenceAnalytics.DownloadFilter.EVENT_TYPES.CLICK_FILE_TYPES, 1154 checkbox 1155 ); 1156 }); 1157 }); 1158 }; 1159 1160 return DownloadFilter; 1161 }()); 1162 1163 win.AnalyticsViews.CTABanner = (function () { 1164 var CTABanner = function () { 1165 this.analytics = new win.KeyenceAnalytics.Analytics(); 1166 }; 1167 1168 CTABanner.prototype.init = function () { 1169 var self = this; 1170 1171 win.addEventListener('message', function (event) { 1172 self.attachTrackShow(event); 1173 self.attachTrackClickLink(event); 1174 self.attachTrackClickClose(event); 1175 }); 1176 }; 1177 1178 CTABanner.prototype.attachTrackShow = function (event) { 1179 var self = this; 1180 var eventType = ''; 1181
1182 if (event.data.schema === 'image') { 1183 eventType = win.KeyenceAnalytics.CTABanner.EVENT_TYPES.SHOW_IMAGE_SCHEMA; 1184 } 1185 1186 if (event.data.schema === 'video') { 1187 eventType = win.KeyenceAnalytics.CTABanner.EVENT_TYPES.SHOW_MOVIE_SCHEMA; 1188 } 1189 1190 self.analytics.noticeEvent( 1191 win.KeyenceAnalytics.CTABanner.name, 1192 eventType, 1193 doc.body 1194 ); 1195 }; 1196 1197 CTABanner.prototype.attachTrackClickLink = function (event) { 1198 var self = this; 1199 var selector = [ 1200 '[data-cta-measure]', 1201 ].join(', '); 1202 var links = doc.querySelectorAll(selector); 1203 var eventType = ''; 1204 1205 Array.prototype.forEach.call(links, function (link) { 1206 link.addEventListener('click', function () { 1207 if (event.data.schema === 'image') { 1208 eventType = win.KeyenceAnalytics.CTABanner.EVENT_TYPES.CLICK_IMAGE_SCHEMA_LINK; 1209 } 1210 1211 if (event.data.schema === 'video') { 1212 eventType = win.KeyenceAnalytics.CTABanner.EVENT_TYPES.CLICK_MOVIE_SCHEMA_LINK; 1213 } 1214 1215 self.analytics.noticeEvent( 1216 win.KeyenceAnalytics.CTABanner.name, 1217 eventType, 1218 link 1219 ); 1220 }); 1221 }); 1222 }; 1223 1224 CTABanner.prototype.attachTrackClickClose = function (event) { 1225 var self = this; 1226 var selector = [ 1227 '#js-ctaBanner-closeButton', 1228 ].join(', '); 1229 var closeTriggers = doc.querySelectorAll(selector); 1230 var eventType = ''; 1231 1232 Array.prototype.forEach.call(closeTriggers, function (trigger) { 1233 trigger.addEventListener('click', function () { 1234 if (event.data.schema === 'image') { 1235 eventType = win.KeyenceAnalytics.CTABanner.EVENT_TYPES.CLICK_IMAGE_SCHEMA_CLOSE; 1236 } 1237 1238 if (event.data.schema === 'video') { 1239 eventType = win.KeyenceAnalytics.CTABanner.EVENT_TYPES.CLICK_MOVIE_SCHEMA_CLOSE; 1240 } 1241 1242 self.analytics.noticeEvent( 1243 win.KeyenceAnalytics.CTABanner.name, 1244 eventType, 1245 doc.body 1246 ); 1247 }); 1248 }); 1249 }; 1250 1251 return CTABanner; 1252 }()); 1253 1254 win.AnalyticsViews.SideCTA = (function () { 1255 var classNames = { 1256 link: 'js-menuConversion-link', 1257 removeButton: 'js-menuConversion-removeButton' 1258 }; 1259 1260 var attrSelectors = { 1261 link: '[data-floating-side-navigation-link]' 1262 } 1263 1264 var SideCTA = function () { 1265 this.analytics = new win.KeyenceAnalytics.Analytics(); 1266 }; 1267 1268 SideCTA.prototype.init = function () { 1269 this.attachTrackClickSideCTALink(); 1270 this.attachTrackClickSideCTARemoveButton(); 1271 }; 1272 1273 SideCTA.prototype.attachTrackClickSideCTALink = function () { 1274 var self = this; 1275 var $doc = $(doc); 1276 1277 $doc.on('click', `.${classNames.link}, ${attrSelectors.link}`, function () { 1278 var element = this; 1279 1280 if (element) { 1281 self.analytics.noticeEvent( 1282 win.KeyenceAnalytics.SideCTA.name, 1283 win.KeyenceAnalytics.SideCTA.EVENT_TYPES.CLICK_LINK, 1284 element 1285 ); 1286 } 1287 }); 1288 }; 1289 1290 SideCTA.prototype.attachTrackClickSideCTARemoveButton = function () { 1291 var self = this; 1292 var $doc = $(doc); 1293 1294 $doc.on('click', '.' + classNames.removeButton, function () { 1295 var element = this; 1296 1297 if (element) { 1298 self.analytics.noticeEvent( 1299 win.KeyenceAnalytics.SideCTA.name, 1300 win.KeyenceAnalytics.SideCTA.EVENT_TYPES.CLICK_REMOVE_BUTTON, 1301 element 1302 ); 1303 } 1304 }); 1305 }; 1306 1307 return SideCTA; 1308 }()); 1309 1310
1311 win.AnalyticsViews.ModalWindow = (function () { 1312 var classNames = { 1313 root: 'js-modalWindow', 1314 show: 'js-modalWindow-showButton', 1315 }; 1316 1317 var ModalWindow = function () { 1318 this.analytics = new win.KeyenceAnalytics.Analytics(); 1319 }; 1320 1321 ModalWindow.prototype.init = function () { 1322 this.attachTrackShow(); 1323 this.attachTrackClose(); 1324 }; 1325 1326 ModalWindow.prototype.attachTrackShow = function () { 1327 var self = this; 1328 var showButtons = doc.querySelectorAll(`.${classNames.show}`); 1329 1330 if (showButtons.length) { 1331 showButtons.forEach(button => { 1332 button.addEventListener('click', function (event) { 1333 self.analytics.noticeEvent( 1334 win.KeyenceAnalytics.ModalWindow.name, 1335 win.KeyenceAnalytics.ModalWindow.EVENT_TYPES.SHOW, 1336 event.currentTarget 1337 ); 1338 }) 1339 }) 1340 } 1341 }; 1342 1343 ModalWindow.prototype.attachTrackClose = function () { 1344 var self = this; 1345 var roots = doc.querySelectorAll(`.${classNames.root}`) 1346 1347 if (roots.length) { 1348 roots.forEach(root => { 1349 root.addEventListener('close', function (event) { 1350 self.analytics.noticeEvent( 1351 win.KeyenceAnalytics.ModalWindow.name, 1352 win.KeyenceAnalytics.ModalWindow.EVENT_TYPES.CLOSE, 1353 event.currentTarget 1354 ); 1355 }) 1356 }) 1357 } 1358 }; 1359 1360 return ModalWindow; 1361 }()); 1362 1363 1364 win.AnalyticsViews.init = function () { 1365 if (win.KeyenceAnalytics) { 1366 new win.AnalyticsViews.MultiStepForm().init(); 1367 new win.AnalyticsViews.PasswordAssistance().init(); 1368 new win.AnalyticsViews.RegisteredMemberForm().init(); 1369 new win.AnalyticsViews.DownloadFilter().init(); 1370 new win.AnalyticsViews.CTABanner().init(); 1371 new win.AnalyticsViews.SideCTA().init(); 1372 new win.AnalyticsViews.ModalWindow().init(); 1373 } 1374 }; 1375 1376 doc.addEventListener('DOMContentLoaded', () => { 1377 if (win.analyticsViewsComplete === true) { 1378 return; 1379 } 1380 1381 win.AnalyticsViews.init(); 1382 win.analyticsViewsComplete = true; 1383 }); 1384}(window, document, this.jQuery));
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.