if (!AT.Analytics) {
    AT.Analytics = {
        eventCookieName: 'e',
        eventObject: {}
    };
}

AT.Analytics.processEventCookie = function(path) {
    var eventCookie = this.getEventCookie();
    if (eventCookie) {
        $.each(eventCookie.replace(/\+/g, ' ').split('&'), function(index, encodedEvent) {
            AT.Analytics.trackEvent(AT.Analytics.parseEventFromCookie(decodeURIComponent(encodedEvent)));
        });
        this.clearEventCookie(path);
    }
};

AT.Analytics.getEventCookie = function() {
    if (document.cookie) {
        var cookies = document.cookie.split(';');
        for (var i in cookies) {
            cookies[i] = jQuery.trim(cookies[i]);
            if (cookies[i].substr(0, this.eventCookieName.length + 1) == (this.eventCookieName + '='))
                return cookies[i].substr(this.eventCookieName.length + 1);
        }
    }
};

AT.Analytics.saveEventCookie = function(event) {
    $.cookie('e', this.toEventCookieString(event), { path: '/' });
};

AT.Analytics.toEventCookieString = function(event) {
    return event.category + '=' + event.action + ':' + (event.value?event.value:'') + ':' + event.label;
};

AT.Analytics.parseEventFromCookie = function(event) {
    var equalsLocation = event.indexOf('=');
    var eventParameters = [event.substring(0, equalsLocation)];
    var colonLocation = event.indexOf(':', equalsLocation+1);
    if (colonLocation == -1) {
        eventParameters.push(event.substring(equalsLocation+1));
        return eventParameters;
    } else {
        eventParameters.push(event.substring(equalsLocation+1, colonLocation));
        return eventParameters.concat(this.parseLabelAndValueOfEventFromCookie(event.substring(colonLocation+1)));
    }
};

AT.Analytics.parseLabelAndValueOfEventFromCookie = function(labelAndValue) {
    var colonLocation = labelAndValue.indexOf(':');
    if (colonLocation == -1)
        return [];
    var value = labelAndValue.substring(0, colonLocation);
    var label = labelAndValue.substring(colonLocation+1);
    if (value)
        return [label, parseInt(value)];
    else
        return [label];
};

AT.Analytics.clearEventCookie = function(path) {
    $.cookie(this.eventCookieName, null, {path: (path ? path : '/')});
};

AT.Analytics.trackEvent = function(categoryActionLabelValue) {
    var eventName = categoryActionLabelValue[0] + '->' + categoryActionLabelValue[1];
    this.trackGoogleAnalyticsEvent(categoryActionLabelValue);
    this.trackOptimizelyEvent(eventName);
    this.triggerEvent(eventName);
};

AT.Analytics.trackGoogleAnalyticsEvent = function(categoryActionLabelValue) {
    if (_gaq)
        _gaq.push(this.stripTrailingNullElements({
            requiredElements: 3,
            maxElements: 5,
            elements: ['_trackEvent'].concat(categoryActionLabelValue)
        }));
};

AT.Analytics.trackOptimizelyEvent = function(eventName) {
    if (window.optimizely)
        window.optimizely.push(['trackEvent', eventName]);
};

AT.Analytics.trackGoogleAnalyticsSocialActivity = function(network, action, target, page) {
    if (_gaq)
        _gaq.push(this.stripTrailingNullElements({
            requiredElements: 3,
            maxElements: 5,
            elements: ['_trackSocial', network, action, target, page]
        }));
};

AT.Analytics.trackSocialActivity = function(network, action, target, page) {
    var eventName = network + '->' + action;
    this.trackGoogleAnalyticsSocialActivity(network, action, target, page);
    this.trackOptimizelyEvent(eventName);
    this.triggerEvent(eventName);
};

//AT.Analytics.addCustomVariable = function(slot, name, value, scope) {
//    _gaq.push(['_setCustomVar'].concat(arguments));
//};

AT.Analytics.triggerEvent = function(eventName) {
    var spaceLocation = eventName.indexOf(' ');
    if (spaceLocation == -1)
        $(this.eventObject).trigger(eventName);
    else
        $(this.eventObject).trigger(eventName.substring(0, spaceLocation));
};

AT.Analytics.addEventListener = function(eventName, callBack) {
    $(this.eventObject).bind(eventName, callBack);
};

AT.Analytics.stripTrailingNullElements = function(arguments) {
    for (var i = arguments.requiredElements; i < arguments.elements.length && i < arguments.maxElements; i++)
        if (!arguments.elements[i])
            return arguments.elements.slice(0, i);
    return arguments.elements;
};

