﻿var _gaq = _gaq || [];

(function () {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

ferrari.GoogleAnalytics = function (analyticsId) {
    var pageviewPath; // If set this will be used to override the trackPageview path
    var trackerName = analyticsId.replace(/-/g, "") + 'Tracker';
    function isArray(obj) { return obj.constructor == Array; }
    // basically a wrapper for _gaq.push that prepends the tracker name to any track event
    // also lets you use parameters instead of array elements
    function track() {
        if (arguments.length > 0) {
            if (isArray(arguments[0])) {
                for (var i = 0; i < arguments.length; i++)
                    sendTrack.apply(this, arguments[i]);
            } else {
                arguments[0] = trackerName + "." + arguments[0];
                // convert arguments in to a real array
                var aargs = [];
                for (var i = 0, al = arguments.length; i < al; aargs.push(arguments[i++]));
                _gaq.push(aargs);
            }
        }
    }
    track("_setAccount", analyticsId);

    function getProductName(product) {
        return product.IssueDate + " " + product.Name + " (" + product.SKU + ")";
    }

    function enumOrderProducts(order, action) {
        for (var i = 0; i < order.LineItems.length; i++) {
            var item = order.LineItems[i];

            action(item);

            for (var j = 0; j < item.ChildLineItems.length; j++)
                action(item.ChildLineItems[j]);
        }
    }

    this.productViewed = function (product) {
//        var name = getProductName(product);
//        track("_trackEvent", 'Products', 'Viewed', name);
    }

    this.textSearch = function (searchTerm) {
        // append a fake query param for the search tracking
        var loc = location.toString();
        pageviewPath = location.pathname;
        pageviewPath += "?" + (loc.indexOf("?") >= 0 ? loc.split("?")[1] + "&" : "") + "q=" + searchTerm;
    }

    this.categorySelect = function (categoryName, location) {
        if (location != null)
            location = location + "/";
        else
            location = "";

        track("_trackEvent", "Search", location + "CategorySearch", categoryName);
    }

    this.productSearchSelect = function (product) {
        var name = getProductName(product);
        track("_trackEvent", "Search", "ProductSelected", name);
    }

    this.productAddToCart = function (product) {
        var name = getProductName(product);
        track("_trackEvent", "Product", "AddedToCart", name);
    }

    this.productRemoveFromCart = function (product) {
        var name = getProductName(product);
        track("_trackEvent", "Product", "RemovedFromCart", name);
    }

    this.proceedToCheckout = function (products) {
        track("_trackEvent", "Order", "BeginCheckout");
    }

    this.orderPlaced = function (order) {
        track("_addTrans", order.OrderId, "", order.Total, order.Tax, order.Shipping, order.ShipCity, order.ShipState, order.ShipCountry);

        enumOrderProducts(order, function (product) {
            if (product.Name.indexOf("Frame") < 0) {
                var name = getProductName(product);
                track("_addItem", order.OrderId, product.SKU, product.Name, "", product.UnitPrice, product.Quantity);
            }
        });

        track("_trackTrans");
    }

    this.pageView = function () {
        var e = "_trackPageview";
        if (pageviewPath) {
            track(e, pageviewPath);
        } else {
            track(e);
        }
    }
}
