/*!
 *
 * This is a layer that pulls in a json for each page and then
 * evaluates which tracking tool needs to be fired and then grabs
 * the tracking files js dependencies and executes them.
 * 
 * dave.conlin@ally.com
 */



/*
 * todo - test/deal with tabs or other content that gets injected into the page after the fact
 *
 * */

var ALLY = ALLY || {};
ALLY.tracking = ALLY.tracking || {};

ALLY.tracking = {

    version:"0.0.1",

    init: function() {


        // look for a json file at the same url as the page we are on
        var jsonUrl = window.location.href;

        // if it's an index page and index isn't in the url add it on
        if (jsonUrl.charAt((jsonUrl.length - 1)) == '/') {
            jsonUrl = jsonUrl + 'index.html';
        }
        jsonUrl = jsonUrl.replace('.html', '.json');

        // grab the json
        ALLY.tracking.JSON.grabJSON(jsonUrl);

        // if it's returned successfully then take the next step
        $("body").bind("tracking.data-success", function(e, data) {
            ALLY.tracking.JSON.processJSON(data);
        });

    },

    utils: {
        siteCatalystClearProps: function() {
            for (var i = 0; i < 50; i++) {
                eval('s.prop' + i + ' = "";');
            }
        },
        genTrackId: function(target, api) {
            return (  api + "*" + target.replace(/#/g, "").replace(/[ .]+/g, "-") );

        },
        serializeData:function(dataObj) {
            return $.param(dataObj);
        },
        showDebugData:function() {

            // This is for debugging the tracking data. Pardon the embedded css and markup. This is just a utility. No frills here.
            // run this from your console: ALLY.tracking.utils.showDebugData();


                // do some styling of the page elements
                $("body").addClass("track-debug");
                $("body.track-debug .tracked").css({"background-color":"rgba(255,255,0,.25)"});
                $("body.track-debug img.tracked").css({"opacity":".25"});

                // add a mousover event for all tracked items
                $(".tracked").live("mouseover", function(e) {

                    // add a trackHighlight to outline the hovered over objects
                    if ($("#trackHighlight").attr("id") != "trackHighlight") {
                        $("body").append('<div id="trackHighlight"></div>');
                    }

                    // position the overlay  dynamically
                    var objOffset = $(this).offset();
                    $("#trackHighlight").css({
                        "position":"absolute",
                        "width":$(this).width(),
                        "height":$(this).height(),
                        "left":objOffset.left-6,
                        "top":objOffset.top-6,
                        "border":"1px solid rgba(0,0,0,.45)",
                        "border-radius":"8px",
                        "padding":"6px",
                        "box-shadow":"0 0 5px rgba(0,0,0,.45) inset"
                    });

                    // add a holder for the tracking data
                    if ($("#trackHover").attr("id") != "trackHover") {
                        $("body").append('<div id="trackDataTable"></div>');
                    }

                    // add the tracking data to the table
                    var temp = $(this).data();
                    debug = "<tr style='cursor:pointer;'><td colspan='2' class='header'><strong>[X] Click tracking data:</strong></td></tr>";
                    $.each(temp, function(key, val) {
                        if (key.indexOf("tracking") != -1) {
                            debug += "<tr><td><div>" + key + ":</div></td><td>" + val + "</td></tr>";
                        }
                    });
                    $("#trackDataTable").html("<table>" + debug + "</table>").show();

                    // remove all tracking debug if you click the data table
                    $("#trackDataTable").click(function(){
                        $("body").removeClass("track-debug");
                        $(".tracked").attr("style", "").die("mouseover");
                        $("#trackHighlight, #trackDataTable").remove();

                    });

                    // style the tracking data
                    $("#trackDataTable").css({
                        "border-radius":"8px",
                        "text-align":"left",
                        "background-color":"rgba(200,200,200,.75)",
                        "border":"1px solid black",
                        "width":"auto",
                        "padding":"10px",
                        "position":"absolute",
                        "bottom":"10px",
                        "left":"10px",
                        "box-shadow":"0px 0px 8px rgba(0,0,0,.5)"
                        });
                    $("#trackDataTable td").css({"width":"50%", "padding":"5px"});
                    $("#trackDataTable td.header").css({"background-color":"rgba(0,0,0,.25 )"});
                    $("#trackDataTable td div").css({"text-align":"left", "font-weight":"bold"});

                });
        }
    },


    JSON: {
        grabJSON: function(jsonUrl) {
            $.getJSON(jsonUrl)
                .success(function(data) {
                    $("body").trigger("tracking.data-success", data);
                });
        },

        processJSON: function(data) {
            if (data.tracking) {

                // handle the events
                var defaultData = $.extend(data.tracking._default, data.tracking._default.events.load);

                $.each(data.tracking, function(e, defaultData) {

                    // page load events
                    if (data.tracking._default.events.load) {
                        var tempData = $.extend(defaultData, $(this)[0].events.load);
                        if (tempData.active) {
                            ALLY.tracking.eventHandlers.pageLoadEvents[e](tempData);
                        }
                    }

                    // click events
                    if (data.tracking._default.events.click) {
                        // handle the non default clicks
                        if (e != "_default") {
                            var item = $(this)[0].events.click;
                            var temp = {};
                            var defaultItems = data.tracking._default.events.click;

                            // todo: find a better way to do this. Don't like traversing all default clicks to see if this is in there.
                            for (i = 0; i < defaultItems.length; i++) {
                                if (item[0].target == defaultItems[i].target) {
                                    temp = $.extend(defaultItems[i], item[0]);
                                    ALLY.tracking.eventHandlers.addClicks(e, [temp]);
                                } else {
                                    // add them even if they don't match so every tracking service gets
                                    // every default click that doesn't have an override
                                    ALLY.tracking.eventHandlers.addClicks(e, [defaultItems[i]]);
                                }
                            }
                        } else {

                            // throw the whole default array in the hopper
                            ALLY.tracking.eventHandlers.addClicks(data.tracking._default.api, data.tracking._default.events.click);
                        }
                    }
                });


            }

        }
    },


    eventHandlers:{

        addClicks:function(api, o) {

            // Can be called explicitly. Called automatically on page init and successful json load.
            $.each(o, function() {

                //shortcuts to the vars
                var obj = $(this)[0];
                var target = $(this)[0].target;
                obj.trackId = ALLY.tracking.utils.genTrackId(target, api);

                // todo: rework this to store data as object and not namespaced single vars
                for (var prop in obj) {
                    $(target).data("tracking." + api + "." + prop, obj[prop]);
                    $(target).addClass("tracked");
                }

                // bind the click
                $(target).bind(("click." + api), function() {
                    ALLY.tracking.eventHandlers.clickEvents[api]($(this));
                });
            });

        },

        removeClicks:function(api, o) {

            // example usage
            //ALLY.tracking.eventHandlers.removeClicks("sitecatalyst", "#banner .ilp-banner img");

            $.each($(o), function() {
                $(this).unbind("click." + api);
            })
        },

        updateClicks:function(api, o, data) {

            ALLY.tracking.eventHandlers.removeClicks(api, o);
            ALLY.tracking.eventHandlers.addClicks(api, data);

        },

        pageLoadEvents:{

            _default:function(data) {

                $("body").trigger("tracking.sitecatalyst-load", data);

                $.ajax({url:"/mx/files/pres/js/s_code.js", timeout: 5000, dataType:'script'})
                    .success(function() {
                        if (typeof(s) != "undefined" && !$("body").hasClass("tracking-sitecatalyst-load-fired")) {

                            $("body").addClass("tracking-sitecatalyst-load-fired");

                            ALLY.tracking.utils.siteCatalystClearProps();
                            s.pageName = data.page;
                            s.channel = data.section;
                            s.prop1 = data.site;
                            s.prop35 = data.subsection;
                            s.prop38 = "ILP page";
                            s.campaign = "";
                            s.events = "";
                            s.products = "";
                            s.prop24 = "";
                            s.eVar1 = "";
                            s.t();
                        }
                    });
            },

            daveclick:function(data) {

                $("body").trigger("tracking.daveclick-load", data);
                var oData = {
                    "page": data.page,
                    "event":"load",
                    "timestamp" : new Date().getTime()
                };

                $.ajax({url:"./", type:"post", data:$.param(oData), timeout: 5000});
            }
        },


        clickEvents:{

            // handle the specifics of executing a click event for a particular tracking service
            sitecatalyst:function(o) {
                ALLY.tracking.utils.siteCatalystClearProps();
                var s = s_gi(s_account);
                var type = $(o).data("tracking.sitecatalyst.type");
                var trackId = $(o).data("tracking.sitecatalyst.trackId");

                // fire the Sitecatlyst onclick function
                s.tl($(o), type, trackId);

                $(o).trigger("tracking.sitecatalyst", $(o));
            },

            doubleclick:function(o) {
                $(o).trigger("tracking.doubleclick", $(o));

                // fire off the doubleclick onclick function
            },

            daveclick:function(o) {
                $(o).trigger("tracking.daveclick", $(o));

                var oData = {
                    "trackId": $(o).data("tracking.daveclick.trackId"),
                    "label": $(o).data("tracking.daveclick.label"),
                    "type" : $(o).data("tracking.daveclick.type"),
                    "event":"load",
                    "timestamp" : new Date().getTime()
                };

                $.ajax({url:"./", type:"post", data:$.param(oData), timeout: 5000});
            }
        }

    }

};

$(document).ready(function() {


    $("body").bind("tracking", function(e, ui) {
        //console.log("tracking\t", e.namespace, "\t\t", $(ui).data("tracking." + e.namespace + ".label"));
    });

    $("body").bind("tracking.sitecatalyst-load", function(e, ui) {
        //console.log("sc-load\t\t", e.namespace, "\t\t", $(ui).data("tracking." + e.namespace + ".label"));
    });

    $("body").bind("tracking.daveclick-load", function(e) {
        //console.log("dc-load\t\t", e.namespace, "\t\t", e);
    });


    ALLY.tracking.init();

});


