Shoora
3/31/2019 - 5:33 PM

visitMetric

visitMetric

define(function () {
    'use strict';

    var visitMetric = (function () {
        var sender;

        return {
            init: function (s) {
                sender = s;
            },
            start: function () {
                if (!dnevnik || !dnevnik.user) {
                    if (sender.isGroupA) {
                        sender.visitParams('groupA');
                    } else if (sender.isGroupB) {
                        sender.visitParams('groupB');
                    }
                }
            }
        };
    })();

    var entryMetric = (function () {

        var sender;

        var isHomePage = function () {
            return sender.subdomain === '' && window.location.pathname === '/';
        };

        var isLoginPageOnOldSite = function () {
            return sender.subdomain === 'login' && window.location.pathname === '/';
        };

        var isLoginPageOnNewSite = function () {
            return sender.subdomain === 'login' && /\/login\/{0,1}$/.test(window.location.pathname);
        };

        var sentGoal = function (a, b) {
            if (sender.isGroupA) {
                sender.reachGoal(a);
            } else if (sender.isGroupB) {
                sender.reachGoal(b);
            }
        };

        var sendGoalIfHomepage = function () {
            if (isHomePage()) {
                sentGoal('login1A', 'login1B');
            }
        };

        var sendGoalIfLoginForm = function () {
            var inputLogin, inputPassword;

            var freeze = true;

            var inputListener = function () {
                if (freeze) {
                    sentGoal('login2A', 'login2B');
                    freeze = false;
                }
            };

            if (isHomePage()) {
                inputLogin = document.querySelectorAll('form#loginForm .login input')[0];
                inputPassword = document.querySelectorAll('form#loginForm .password input')[0];
            } else if (isLoginPageOnOldSite()) {
                inputLogin = document.querySelectorAll('form#formLogin input#Login')[0];
                inputPassword = document.querySelectorAll('form#formLogin input#Password')[0];
            } else if (isLoginPageOnNewSite()) {
                inputLogin = document.querySelectorAll('form.login input[name="login"]')[0];
                inputPassword = document.querySelectorAll('form.login input[name="password"]')[0];
            }

            if (inputLogin && inputPassword) {
                inputLogin.addEventListener('input', inputListener);
                inputPassword.addEventListener('input', inputListener);
            }
        };

        var sendGoalIfEnter = function () {
            var buttonEnter;

            if (isLoginPageOnNewSite()) {
                buttonEnter = document.querySelectorAll('form.login input[value="Войти"]')[0];
            } else if (isLoginPageOnOldSite()) {
                buttonEnter = document.querySelectorAll('form#formLogin input#save')[0];
            } else if (isHomePage) {
                buttonEnter = document.querySelectorAll('form#loginForm .submit input#login')[0];
            }

            if (buttonEnter) {
                buttonEnter.addEventListener('click', function () { sentGoal('login3A', 'login3B'); });
            }
        };

        var defineErrorOnLoginPage = function () {
            var errorMessage = document.querySelector('form.login .login__body__hint_error-message');
            var errorLogin = document.querySelector('form.login .login__body__hint_login');
            var errorPassword = document.querySelector('form.login .login__body__hint_password');
            var errorCaptcha = document.querySelector('form.login .login__body__captcha');

            var errorInMessage = errorMessage.classList.contains('login__body__hint_hidden');
            var errorInLogin = errorLogin.classList.contains('login__body__hint_hidden');
            var errorInPassword = errorPassword.classList.contains('login__body__hint_hidden');
            var errorInCaptcha = errorCaptcha.classList.contains('login__body__captcha_hidden');

            return !(errorInMessage && errorInLogin && errorInPassword && errorInCaptcha);
        };

        var sendGoalIfError = function () {
            if (isLoginPageOnNewSite()) {
                if (defineErrorOnLoginPage()) {
                    sentGoal('login4A', 'login4B');
                }
            } else if (isLoginPageOnOldSite()) {
                var errorBlock = document.getElementById('errors');
                if (errorBlock) {
                    sentGoal('login4A', 'login4B');
                }
            }
        };

        return {
            init: function (s) {
                sender = s;
            },
            start: function () {
                sendGoalIfHomepage();
                sendGoalIfLoginForm();
                sendGoalIfEnter();
                sendGoalIfError();
            }
        };
    })();

    var recoveryMetric = (function () {
        var sender;
        var path = window.location.pathname;

        var sentGoal = function (a, b) {
            if (sender.isGroupA) {
                sender.reachGoal(a);
            } else if (sender.isGroupB) {
                sender.reachGoal(b);
            }
        };

        var isRecoveryPageOldSite = function () {
            return sender.subdomain === 'login' && /\/password\/{0,1}$/.test(path) && window.location.search === '';
            //проверяем search, чтобы счеткчик не срабатывал на новом сайте при смене пароля, т.к. там тоже субдомен = password
        };

        var isRecoveryPageNewSite = function () {
            return sender.subdomain === 'login' && /\/recovery\/{0,1}$/.test(path);
        };

        var userFoundWithErrors = function () {
            var placeholderForErrors = document.querySelector('.step1') || document.getElementById('placeholder-for-errors');
            if (placeholderForErrors) {
                return placeholderForErrors.getAttribute('data-user-found-with-errors') === 'true';
            }
        };

        var sendGoalIfRecoveryPage = function () {
            if (isRecoveryPageOldSite() || (isRecoveryPageNewSite() && !userFoundWithErrors())) {
                sentGoal('passwordrecovery1A', 'passwordrecovery1B');
            }
        };

        var sendGoalIfIdentificationComplete = function () {
            var isSecretQuestionOnNewSite = path === '/recovery/question';
            var isFinishStepOnNewSite = path === '/recovery/bylogin';
            var isInputCodeOnNewSite = path === '/recovery/code';
            var isInformAboutMailOnNewSite = path === '/recovery/email';

            var isCheckAccountOnOldSite = path === '/password/checkaccount';
            var inputValidationCode = document.querySelector('input#ValidationCode');
            var inputAnswer = document.querySelector('input#Answer');

            var identificationCompleteOnNewSite = function () {
                return isSecretQuestionOnNewSite || isFinishStepOnNewSite || isInputCodeOnNewSite || isInformAboutMailOnNewSite ||
                       (isRecoveryPageNewSite() && userFoundWithErrors());
            };

            var identificationCompleteOnOldSite = function () {
                return isCheckAccountOnOldSite && userFoundWithErrors() ||
                       (isCheckAccountOnOldSite && inputValidationCode) ||
                       (isCheckAccountOnOldSite && inputAnswer);
            };

            if (identificationCompleteOnNewSite() || identificationCompleteOnOldSite()) {
                sentGoal('passwordrecovery2A', 'passwordrecovery2B');
            }
        };

        var sendGoalIfRecoveryComplete = function () {
            var isFinishStepOnOldSite = path === '/password/setnewpassword';
            var isFinishStepOnNewSite = path === '/recovery/bylogin' || path === '/passwordchanged';

            if (isFinishStepOnNewSite || isFinishStepOnOldSite) {
                sentGoal('passwordrecovery3A', 'passwordrecovery3B');
            }
        };

        return {
            init: function (s) {
                sender = s;
            },
            start: function () {
                sendGoalIfRecoveryPage();
                sendGoalIfIdentificationComplete();
                sendGoalIfRecoveryComplete();
            }
        };
    })();

    var joinMetric = (function () {

        var sender;

        var sentGoal = function (a, b) {
            if (sender.isGroupA) {
                sender.reachGoal(a);
            } else if (sender.isGroupB) {
                sender.reachGoal(b);
            }
        };

        var sendIfStart = function () {

            if (sender.subdomain === 'company' &&
                window.location.pathname === '/join/form/' &&
                window.location.search === '?submit=%D0%9F%D0%BE%D0%B4%D0%B0%D1%82%D1%8C+%D0%B7%D0%B0%D1%8F%D0%B2%D0%BA%D1%83') {

                sentGoal('join1A', 'join1B');

            }

            else if (sender.subdomain === 'login' && /\/join\/role\/{0,1}$/.test(window.location.pathname)) {

                var button = document.querySelector('.school-join-step1 button');

                if (button) {
                    button.addEventListener('click', function () {
                        sentGoal('join1A', 'join1B');
                    });
                }

            }

        };

        var sendIfFinish = function () {

            if (sender.subdomain === 'company' &&
                window.location.pathname === '/join/form/' &&
                /\?view=sent&school=\d{1,}/.test(window.location.search)) {

                sentGoal('join2A', 'join2B');

            }

            else if (sender.subdomain === 'login' && /join\/finish\/\d{1,}\/{0,1}/.test(window.location.pathname)) {

                sentGoal('join2A', 'join2B');

            }

        };

        return {
            init: function (s) {
                sender = s;
            },
            start: function () {
                sendIfStart();
                sendIfFinish();
            }
        };

    })();

    var registerMetric = (function () {

        var sender;

        var sentGoal = function (a, b) {
            if (sender.isGroupA) {
                sender.reachGoal(a);
            } else if (sender.isGroupB) {
                sender.reachGoal(b);
            }
        };

        var sendIfFirstPage = function () {

            var isOk = sender.subdomain === 'login' && document.referrer !== '';

            var isOkSearchQuery = /\?login=[\w]{1,}&code=[0-9a-f]{1,}/.test(window.location.search);

            var isUserRegistrationOnOldSite = window.location.pathname === '/useractivation/register' && isOkSearchQuery;

            var isUserRegistrationOnNewSite = !/https{0,1}:\/\/login.*.\/useractivation\/security\?code=[0-9a-f]{1,}/.test(document.referrer) &&
                window.location.pathname === '/useractivation/personal' &&
                isOkSearchQuery;

            var isSchoolRegistrationOnOldSite = window.location.pathname === '/schoolactivation/register' && isOkSearchQuery;

            var isSchoolRegistrationOnNewSite = !/https{0,1}:\/\/login.*.\/schoolactivation\/personal\?code=[0-9a-f]{1,}/.test(document.referrer) &&
                window.location.pathname === '/schoolactivation/information' &&
                isOkSearchQuery;

            var result = isOk && ((isUserRegistrationOnOldSite || isUserRegistrationOnNewSite) || (isSchoolRegistrationOnOldSite || isSchoolRegistrationOnNewSite));

            if (result) {

                sentGoal('registr1A', 'registr1B');

            }

        };

        var sendIfRegistred = function () {

            var isUserWizard = sender.subdomain === '' && /\/user\/welcome\/{0,1}/.test(window.location.pathname);

            var isUserRegistredOnOldSite = /https{0,1}:\/\/login.*.\/useractivation\/register\?login=[\w]{1,}&code=[0-9a-f]{1,}/.test(document.referrer);

            var isUserRegistredOnNewSite = /https{0,1}:\/\/login.*.\/useractivation\/password\?code=[0-9a-f]{1,}/.test(document.referrer);

            var isUserRegistred = isUserWizard && (isUserRegistredOnOldSite || isUserRegistredOnNewSite);

            var isSchoolWizard = /https{0,1}:\/\/school.*.\/admin\/wizard.aspx\?school=[0-9]{1,}&step=building&message=activated/.test(window.location.href);

            var isSchoolRegistredOnOldSite = /https{0,1}:\/\/login.*.\/schoolactivation\/step2\/{0,1}/.test(document.referrer);

            var isSchoolRegistredOnNewSite = /https{0,1}:\/\/login.*.\/schoolactivation\/password\?code=[0-9a-f]{1,}/.test(document.referrer);

            var isSchoolRegistred = isSchoolWizard && (isSchoolRegistredOnOldSite || isSchoolRegistredOnNewSite);

            var result = isUserRegistred || isSchoolRegistred;

            if (result) {

                sentGoal('registr2A', 'registr2B');

            }

        };

        return {
            init: function (s) {
                sender = s;
            },
            start: function () {
                sendIfFirstPage();
                sendIfRegistred();
            }
        };

    })();

    var metrikaId = dnevnik.settings.yandexMetrikaId,
        reachGoal, visitParams,
        deps = [visitMetric, entryMetric, recoveryMetric, joinMetric, registerMetric];

    reachGoal = function (target) {
        var counter = window['yaCounter' + metrikaId];

        console.debug('A/B CALL GOAL > ' + target);

        if (counter && counter.reachGoal) {
            counter.reachGoal(target);

            console.debug('A/B SEND GOAL > ' + target);
        }
    };

    visitParams = function (obj) {
        var counter = window['yaCounter' + metrikaId];

        console.debug('A/B CALL PARAMS > ', obj);

        if (counter && counter.params) {
            counter.params(obj);

            console.debug('A/B SEND PARAMS > ', obj);
        }
    };

    return {
        init: function (model) {
            var i, l = deps.length, sender;

            sender = {
                subdomain: model.subdomain,
                reachGoal: reachGoal,
                visitParams: visitParams,
                isGroupA: model.group === 'groupA',
                isGroupB: model.group === 'groupB'
            };

            for (i = 0; i < l; i += 1) {
                deps[i].init(sender);
            }
        },
        start: function () {
            var i, l = deps.length;

            for (i = 0; i < l; i += 1) {
                deps[i].start();
            }
        }
    };
});