/*********************************************************************************
 *
 *   Event Tracking
 *
 **********************************************************************************/
(function() {
    'use strict';
    var helpersModule = (function() {
            function addClickEventListenerOnElements(elements, handler) {
                for (var i = 0; i < elements.length; i++) {
                    elements[i].addEventListener('click', handler);
                }
            }
            function doesElementHaveTagAsParent(element, htmlTagName) {
                if (element) {
                    if (element.tagName.toLowerCase() === htmlTagName) {
                        return true;
                    } else {
                        return doesElementHaveParentOfType(
                            element.parentElement,
                            htmlTagName
                        );
                    }
                } else {
                    return false;
                }
            }
            function doesElementHaveParentWithClass(element, className) {
                if (element) {
                    if (element.className.indexOf(className) > -1) {
                        return true;
                    } else {
                        return doesElementHaveParentWithClass(
                            element.parentElement,
                            className
                        );
                    }
                } else {
                    return false;
                }
            }
            function getParentElementWithTag(element, htmlTagName) {
                if (element) {
                    if (element.tagName.toLowerCase() === htmlTagName) {
                        return element;
                    } else {
                        return getParentElementWithTag(
                            element.parentElement,
                            htmlTagName
                        );
                    }
                } else {
                    return false;
                }
            }
            function getParentElementWithTagAndClass(
                element,
                htmlTagName,
                className
            ) {
                if (element) {
                    if (
                        element.tagName.toLowerCase() === htmlTagName &&
                        element.className.indexOf(className) > -1
                    ) {
                        return element;
                    } else {
                        return getParentElementWithTagAndClass(
                            element.parentElement,
                            htmlTagName,
                            className
                        );
                    }
                } else {
                    return false;
                }
            }
            // Recursively getting the parent Element which contains a href
            function getAhrefParent(element, counter) {
                if (element && counter < 10) {
                    if (element.href) {
                        return element;
                    } else {
                        counter++;
                        return getAhrefParent(element.parentElement, counter);
                    }
                } else {
                    return false;
                }
            }
            function isHrefValid(href) {
                return typeof href === 'string' && href.length > 0;
            }
            var allowBingTracking = false;
            function sendEvent(category, action, label){
              if (typeof ga !== 'undefined') {
                ga('send', 'event', category, action, label);
              }
              if (allowBingTracking){
                window.uetq = window.uetq || [];
                window.uetq.push
                ({ 'ec': category, 'ea': action, 'el': label, 'ev' : 1 });
              }
            }
            return {
                addClickEventListenerOnElements: addClickEventListenerOnElements,
                doesElementHaveTagAsParent: doesElementHaveTagAsParent,
                doesElementHaveParentWithClass: doesElementHaveParentWithClass,
                getAhrefParent: getAhrefParent,
                getParentElementWithTag: getParentElementWithTag,
                getParentElementWithTagAndClass: getParentElementWithTagAndClass,
                isHrefValid: isHrefValid,
                sendEvent: sendEvent
            };
        })(),
        eventTrackingModule = (function() {
            function whichSharePlatform(href) {
                if (
                    href.indexOf('facebook') > -1 &&
                    href.indexOf('/sharer') > -1
                ) {
                    return 'Facebook';
                }
                if (
                    href.indexOf('twitter') > -1 &&
                    href.indexOf('/share?') > -1
                ) {
                    return 'Twitter';
                }
                if (
                    href.indexOf('plus.google') > -1 &&
                    href.indexOf('/share?') > -1
                ) {
                    return 'Google+';
                }
                if (
                    href.indexOf('pinterest') > -1 &&
                    href.indexOf('pin/create/bookmarklet') > -1
                ) {
                    return 'Pinterest';
                }
                if (
                    href.indexOf('linkedin') > -1 &&
                    href.indexOf('sharearticle') > -1
                ) {
                    return 'LinkedIn';
                }
                if (href.indexOf('tumblr') > -1 && href.indexOf('share') > -1) {
                    return 'Tumblr';
                }
                if (
                    href.indexOf('reddit') > -1 &&
                    href.indexOf('/submit?') > -1
                ) {
                    return 'Reddit';
                }
                return '';
            }
            function isShareLink(href) {
                return whichSharePlatform(href).length > 0;
            }
            function isSocialLink(href) {
                var socialNames = [
                    'twitter',
                    'facebook',
                    'linkedin',
                    'pinterest',
                    'tripadvisor',
                    'plus.google',
                    'instagram',
                    'tumblr',
                    'reddit',
                    'blogger.',
                    'yelp'
                ];
                for (var i = 0; i < socialNames.length; i++) {
                    if (href.toLowerCase().indexOf(socialNames[i]) > -1) {
                        return true;
                    }
                }
                return false;
            }
            function notFromSameOrigin(href) {
                var origin = window.location.origin;
                if (origin) {
                    if (href.indexOf(origin) > -1) {
                        return false;
                    }
                    return true;
                }
                return true;
            }
            function isPdf(href) {
                if (href.indexOf('.pdf') > -1) {
                    return true;
                }
                return false;
            }
            function email(href) {
                if (href.indexOf('mailto:') > -1) {
                    var email = href.replace('mailto:', '');
                    helpersModule.sendEvent('Contact', 'Email Clicks', email);
                }
            }
            function telephone(href) {
                if (href.indexOf('tel:') > -1) {
                    var tel = href.replace('tel:', '');
                    helpersModule.sendEvent('Contact', 'Telephone Clicks', tel);
                }
            }
            function externalLink(href) {
                if (
                    href.indexOf('http') > -1 &&
                    notFromSameOrigin(href) &&
                    !isSocialLink(href) &&
                    !isPdf(href)
                ) {
                    helpersModule.sendEvent('External links', 'Clicks', href);
                }
            }
            function socialLink(href) {
                if (
                    href.indexOf('http') > -1 &&
                    isSocialLink(href) &&
                    !isShareLink(href)
                ) {
                    helpersModule.sendEvent('Social links', 'Clicks', href);
                }
            }
            function socialShare(href) {
                if (isShareLink(href)) {
                    ga(
                        'send',
                        'social',
                        whichSharePlatform(href),
                        'Share',
                        href
                    );
                }
            }
            function pdfLink(href) {
                if (href.indexOf('.pdf') > -1) {
                    helpersModule.sendEvent('PDF downloads', 'Downloads', href);
                }
            }
            function trackClickOnElementWithId(elementId, idToTrack, options) {
                if (elementId === idToTrack && options) {
                    ga(
                        'send',
                        'event',
                        options.eventCategory,
                        options.eventAction,
                        options.eventLabel
                    );
                }
            }
            function trackClickOnElementWithClass(
                elementClassName,
                classNameToTrack,
                options
            ) {
                if (
                    elementClassName.indexOf(classNameToTrack) >= 0 &&
                    options
                ) {
                    ga(
                        'send',
                        'event',
                        options.eventCategory,
                        options.eventAction,
                        options.eventLabel
                    );
                }
            }
            function trackClickOnElementWithClassAndText(
                elementClassName,
                classNameToTrack,
                elementInnerText,
                innerTextToTrack,
                options
            ) {
                if (
                    elementClassName.indexOf(classNameToTrack) >= 0 &&
                    innerTextToTrack.indexOf(innerTextToTrack) >= 0 &&
                    options
                ) {
                    ga(
                        'send',
                        'event',
                        options.eventCategory,
                        options.eventAction,
                        options.eventLabel
                    );
                }
            }
            function wrdevContactForm(formId) {
                // The form Dictionary could be used when forms could be on more than one page.
                // And the Url on which they are not is not reflecting their topic.
                if (formId && formId.length > 0) {
                    var formDictionary = {
                            formId123: 'Form Name'
                        },
                        formName = formDictionary[formId];
                    if (formName && formName.length > 0) {
                        ga(
                            'send',
                            'event',
                            'Form',
                            formName,
                            window.location.pathname.toLowerCase()
                        );
                    } else {
                        ga(
                            'send',
                            'event',
                            'Form',
                            'Submitted',
                            window.location.pathname.toLowerCase()
                        );
                    }
                }
            }
            return {
                email: email,
                telephone: telephone,
                externalLink: externalLink,
                socialLink: socialLink,
                socialShare: socialShare,
                pdfLink: pdfLink,
                trackClickOnElementWithId: trackClickOnElementWithId,
                trackClickOnElementWithClass: trackClickOnElementWithClass,
                trackClickOnElementWithClassAndText: trackClickOnElementWithClassAndText,
                wrdevContactForm: wrdevContactForm
            };
        })();
    if (typeof ga !== 'undefined') {
        document
            .querySelector('body')
            .addEventListener('click', function(event) {
                var hrefElement = helpersModule.getAhrefParent(event.target, 0),
                    href,
                    elementId = event.target.id,
                    elementClassName = event.target.className;
                if (
                    hrefElement &&
                    helpersModule.isHrefValid(hrefElement.href)
                ) {
                    href = hrefElement.href.toLowerCase();
                }
                if (href) {
                    eventTrackingModule.email(href);
                    eventTrackingModule.telephone(href);
                    eventTrackingModule.externalLink(href);
                    eventTrackingModule.socialLink(href);
                    eventTrackingModule.socialShare(href);
                    eventTrackingModule.pdfLink(href);
                }
            });
        // This event will be sent from wrdev-contact-form.js
        // When the form was submitted successfully.
        document.addEventListener(
            'FormSuccess',
            function(e) {
                if (e.detail.formId && e.detail.formId.length > 0) {
                    eventTrackingModule.wrdevContactForm(e.detail.formId);
                }
            },
            false
        );
    }
})();;
