﻿// Prevent console commands from throwing errors in IE
try { console.log('init console... done'); } catch (e) { console = { log: function () { } }; }

var _gaq = _gaq || [];

var mr = mr || {};
mr.tracking = mr.tracking || {};

mr.tracking.google = {
    accountId: 'UA-XXXXXXXX-X',
    domain: '',
    eventScopeVisitorLevel: 1,
    eventScopeSessionLevel: 2,
    eventScopePageLevel: 3,

    init: function (/* optional */accountId, domain, allowHash, isAuth) {
        var instance = mr.tracking.google;
        instance.log('init mr.tracking.google...');
        instance.log('Account: ' + accountId + '|Domain: ' + domain + '|AllowHash: ' + allowHash);
        /* set instance */
        if (accountId !== undefined && accountId.length > 0) {
            instance.accountId = accountId;
        }

        /* clear gaq variables */
        _gaq = [];

        /* set variables */
        if (allowHash !== undefined && allowHash.length > 0) {
            instance.setVariable('_setAllowHash', allowHash);
        }
        if (domain !== undefined && domain.length > 0) {
            /*Appears to cause problems with Urchin tracking
            instance.setVariable('_setDomainName', domain);*/
            instance.domain = domain;
        }
        instance.setVariable('_setAccount', instance.accountId);
        var authValue = '';
        if (isAuth) { authValue = 'Logged In'; } else { authValue = 'Logged Off'; }
        instance.setCustomVariable(1, 'User Registration Status', authValue, instance.eventScopeSessionLevel);

        instance.log('Registering Handlers....');
        instance.registerHandlers();
        instance.log('Registering Handlers complete');
        instance.log('mr.tracking.google: successfully loaded');
    },

    setCustomVariable: function (position, name, value, scope) {
        _gaq.push(['_setCustomVar', position, name, value, scope]);
    },

    setVariable: function (name, value) {
        _gaq.push([name, value]);
    },

    addPageView: function () {
        mr.tracking.google.addVirtualPageView();
        return true;
    },

    addVirtualPageView: function (url) {
        var instance = mr.tracking.google;

        if (url !== undefined && url.length > 0) {
            if (url.indexOf('/') != 0) {
                url = '/' + url;
            }
            _gaq.push(['_trackPageview', url]);
            instance.log('Tracking virtual pageview: ' + url);
        } else {
            _gaq.push(['_trackPageview']);
            instance.log('Tracking pageview: ' + window.location.href);
        }
        return true;
    },

    trackExternalLinkEvent: function (link, category, action, label, doPopup) {
        var instance = mr.tracking.google;
        var href = link.attr('href');
        instance.trackEvent(category, action, label);

        /*
        * class="defer" on a link signifies that there are other handlers on it and
        * that the trackOutboundLink method should not automatically fire the link
        */
        if (!($(link).hasClass('defer'))) {
            /*  Delay function call for track event to finish */
            if (doPopup !== undefined && doPopup == true) {
                /* setTimeout Fix */
                if (document.all) {
                    /* IE */
                    window.setTimeout('window.open("' + href + '");', 300);
                } else {
                    window.setTimeout(function (href) { window.open(href); }, 300, href);
                }
            }
            return false;
        }
        return false;
    },

    trackMouseOver: function (category, action, /* optional */label, value) {
        var instance = mr.tracking.google;
        instance.trackEvent(category, action, label, value);
        return true;
    },

    trackEvent: function (category, action, /* optional */label, value) {
        var instance = mr.tracking.google;
        var returVal = false;
        if (value == 'undefined') { value = undefined; }
        if (label == 'undefined') { label = undefined; }
        if (value !== undefined && label !== undefined) {
            returVal = _gaq.push(['_trackEvent', category, action, label, value]);
            instance.log('Tracking event: ' + category + '|' + action + '|' + label + '|' + value);
        } else if (value !== undefined) {
            returVal = _gaq.push(['_trackEvent', category, action, undefined, value]);
            instance.log('Tracking event: ' + category + '|' + action + '|' + undefined + '|' + value);
        } else if (label !== undefined) {
            returVal = _gaq.push(['_trackEvent', category, action, label]);
            instance.log('Tracking event: ' + category + '|' + action + '|' + label);
        } else {
            returVal = _gaq.push(['_trackEvent', category, action]);
            instance.log('Tracking event: ' + category + '|' + action);
        }
        return true;
    },

    registerHandlers: function () {
        var instance = mr.tracking.google;
        var domain = instance.getBaseURL();

        $(document).ready(function () {
            var links = $('a').not('.colorbox, .thickbox, .addthis_button_compact, .addthis_button_facebook_like')
				.filter(function () {
				    var result = false;
				    var obj = $(this);
				    var href = obj.attr('href');
				    if (href === undefined) { return false; }
				    var test1 = (/^[a-z]+:\/\//.test(href.toLowerCase()));
				    var test2 = (obj.attr('rel').toLowerCase().indexOf("notrack") == -1);
				    var test3 = (href.indexOf(location.host) == -1);
				    if (test1 && test2 && test3) {
				        result = true;
				    }
				    return result;
				});

            /* Outbound links */
            links.each(function () {
                //console.log('Registering Outbound link: ' + this.href);
                jQuery(this).bind('click', function (e) {
                    if (!(jQuery(this).hasClass('defer'))) {
                        e.stopImmediatePropagation();
                        e.preventDefault();
                    }
                    var host = location.host.toLowerCase();
                    var doPopup = ((this.target.toLowerCase() == '_blank') || (this.rel.indexOf('new-window') > -1) || (this.href.toLowerCase().indexOf(host) == -1));

                    //instance.trackOutboundLink(jQuery(this), 'Outbound', 'Click', usePopup);
                    //console.log('Tracking outbound link: ' + this.href);

                    var link = jQuery(this);
                    var category = 'Outbound Links';
                    var action = 'Clicked';
                    var instance = mr.tracking.google;
                    var href = link.attr('href');
                    if (href.indexOf('itunes.apple.com') > -1) {
                        category = 'Kitchen Helper App';
                        action = 'Click to iTunes';
                    }
                    instance.trackEvent(category, action, href);
                    /*
                    * class="defer" on a link signifies that there are other handlers on it and
                    * that the trackOutboundLink method should not automatically fire the link
                    */
                    if (!($(link).hasClass('defer'))) {
                        /*  Delay function call for track event to finish */
                        if (doPopup !== undefined && doPopup == true) {
                            /* setTimeout Fix */
                            if (document.all) {
                                /* IE */
                                window.setTimeout('window.open("' + href + '");', 300);
                            } else {
                                window.setTimeout(function (href) { window.open(href); }, 300, href);
                            }
                        } else {
                            /* setTimeout Fix */
                            if (document.all) {
                                /* IE */
                                window.setTimeout("window.location.href='" + href + "';", 300);
                            } else {
                                window.setTimeout(function (href) { window.location.href = href; }, 300, href);
                            }
                        }
                        return false;
                    } else {
                        return true;
                    }

                    return false;
                });
            });
            /* File Extensions */
            jQuery('a[href$=".pdf"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.addVirtualPageView('/documents/pdf/' + filename);
                    instance.trackEvent('Document Downloads', 'Document Downloaded', filename);

                    //instance.log('Track .pdf document download');
                });
            });
            jQuery('a[href$=".xls"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.addVirtualPageView('/documents/excel/' + filename);
                    instance.trackEvent('Document Downloads', 'Document Downloaded', filename);
                    //instance.log('Track .xls document download');
                });
            });
            jQuery('a[href$=".xlsx"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.addVirtualPageView('/documents/excel/' + filename);
                    instance.trackEvent('Document Downloads', 'Document Downloaded', filename);
                    //instance.log('Track .xlsx document download');
                });
            });
            jQuery('a[href$=".doc"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.addVirtualPageView('/documents/word/' + filename);
                    instance.trackEvent('Document Downloads', 'Document Downloaded', filename);
                    //instance.log('Track .doc document download');
                });
            });
            jQuery('a[href$=".docx"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.addVirtualPageView('/documents/word/' + filename);
                    instance.trackEvent('Document Downloads', 'Document Downloaded', filename);
                    //instance.log('Track .docx document download');
                });
            });
            jQuery('a[href$=".mp4"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.addVirtualPageView('/videos/mp4/' + filename);
                    instance.trackEvent('Videos', 'Video Viewed', filename);
                    //instance.log('Track .mp4 video view');
                });
            });
            jQuery('a[href$=".wmv"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.addVirtualPageView('/videos/wmv/' + filename);
                    instance.trackEvent('Videos', 'Video Viewed', filename);
                    //instance.log('Track .wmv video view');
                });
            });
            jQuery('a[href$=".zip"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.addVirtualPageView('/files/zip/' + filename);
                    instance.trackEvent('Files', 'File Downloaded', filename);
                    //instance.log('Track .zip file view');
                });
            });
            /* Flowplayer*/
            jQuery('a[id="player"]').each(function () {
                jQuery(this).bind('click', function () {
                    var url = jQuery(this).attr('href');
                    var filename = url.substring(url.lastIndexOf('/') + 1);
                    instance.trackEvent('Videos', 'Video Viewed', filename);
                    //instance.log('Track video view');
                });
            });
        });
    },
    /* Video Events */
    trackVideoStart: function (filename) {
        var instance = mr.tracking.google;
        instance.trackEvent('Videos', 'Video Started', filename);
    },

    trackVideoStop: function (filename, time) {
        var instance = mr.tracking.google;
        instance.trackEvent('Videos', 'Video Stopped', filename, time);
    },

    trackVideoFinished: function (filename) {
        var instance = mr.tracking.google;
        instance.trackEvent('Videos', 'Video Viewed', filename);
    },
    /* Utils */
    pause: function (m) {
        var dt = new Date();
        while ((new Date()) - dt <= m) { /* Do nothing */ }
    },
    log: function (msg) {
        console.log(msg);
    },
    getBaseURL: function () {
        var host = location.host.toLowerCase();
        var hostParts = host.split('.');
        if (hostParts.length < 3)
            return '';
        var domain = '.' + hostParts[hostParts.length - 2] + '.' + hostParts[hostParts.length - 1].replace('/', '');
        mr.tracking.google.log('Local domain: ' + domain);
        return domain;
    }
}
