/* call this function to boot up the library work */
function track_setup(ga_id, ga_debug) {
    set_ga_id(ga_id);
    set_ga_debug(ga_debug);
    jQuery(document).ready(setup_click_tracking);
}

/* parse dom and identify all of the trackable objects */
function t_cells() {
    var trk = "";
    jQuery('.trackable').each(function(i, e){
        var obj = jQuery(e);
        var myid = (obj.attr('id') == undefined) ? (obj.attr('class').split(' ')[0]) : obj.attr('id');
        if (trk.length > 0) {
            trk += ',';
        }
        trk += 'v_cell:' + myid;
    });
    return trk;
}

function t_channel() {
    if (typeof(t_channel_v) == "undefined") {
        return '';
    }
    if (t_channel_v.length == 0) {
        return '';
    }
    return "channel:" + t_channel_v;
}

function t_template() {
    if (typeof(t_template_v) == "undefined") {
        return '';
    }
    if (t_template_v.length == 0) {
        return '';
    }
    return "template:" + t_template_v;
}

function t_promo() {
    if (typeof(t_promo_v) == "undefined") {
        return '';
    }
    if (t_promo_v.length == 0) {
        return '';
    }
    return t_promo_v;
}

function t_etc() {
    if (typeof(t_etc_v) == "undefined") {
        return '';
    }
    if (t_etc_v.length == 0) {
        return '';
    }
    return t_etc_v;
}

/* set custom variables to be sent with next tracking call */
var t_custom_vars = [];
function set_custom_var(slot, key, value, scope) {
    t_custom_vars[slot] = [key, value, scope];
}

var t_ga_id_v;
function set_ga_id(id) {
    t_ga_id_v = id;
}

function ga_id() {
    return t_ga_id_v;
}

var t_ga_debug_v = false;
function set_ga_debug(d) {
    t_ga_debug_v = d;
}

function ga_debug() {
    return t_ga_debug_v;
}

/* set non-default event category for Google event tracking of clicks */
var click_event_category = 'Click';
function set_trackable_click_event_category(cat) {
    click_event_category = cat;
}

/* add click events to trackable items */
function setup_click_tracking() {
    jQuery('a.trackable').click(track_click);
    jQuery('.trackable').find('a').click(track_click);
}

/* event handler for click on a trackable link */
/* todo: to avoid data loss, update to use trackevent_link() in preference to trackevent() and test */

function track_click() {
    trackevent(click_event_category, this.id, my_page());
}

/* utility function to find my uri */
function my_page() {
    if (typeof(t_alt_pagename_v) == "undefined" || t_alt_pagename_v.length == 0) {
        return document.location.pathname;
    } else {
        return t_alt_pagename_v;
    }
}

/* compose tracking url from components sent in */
function tracking_url() {
    var s = my_page() + document.location.search;
    if (arguments.length == 0) {
        return s;
    }
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i].length != 0) {
            if (! (s.charAt(s.length - 1) == '?' || s.charAt(s.length - 1) == '&')) {
                if (s.indexOf('?') >= 0) {
                    s += '&'
                } else {
                    s += '?'
                }
            }
            s += arguments[i];
        }
    }
    return s;
}

/* create properly formatted tracking url param from component inputs */
function tracking_param() {
    var s = '';
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i].length == 0) {
            continue;
        }
        if (s.length > 0) {
            s += ',';
        }
        s += arguments[i];
    }
    if (s.length > 0) {
        return s;
    }
    else {
        return '';
    }
}

/* encapsulate tracking logic: all tracking should flow through here */
function trackit(url, debug) {
    debug = debug || ga_debug();

    tracker = ga_id();
    if (debug) {
        var msg = "TRACKER: " + tracker + " PAGE: " + url;
        if (typeof(console) != "undefined") {
            console.log(msg);
        }
    }

    var pageTracker = _gat._getTracker(tracker);

    for (i = 1; i <= 5; i++) {
        /* scoop up all the custom variables and set */
        if (t_custom_vars[i]) {
            c = t_custom_vars[i];
            pageTracker._setCustomVar(i, c[0], c[1], c[2]);
            if (typeof(console) != "undefined") {
                console.log("custom var: " + i + ' ' + c[0] + ' ' + c[1] + ' ' + c[2]);
            }
        }
    }

    pageTracker._trackPageview(url);
    return true;
}

/* track events; label and value are optional */
/* note that value must be a number, not a string, or the GA call isn't made and the error is swallowed silently */
function trackevent(category, action, label, value) {
    label = label || '';
    var i = action.lastIndexOf('_');
    /* exclude suffix -- part of action ending in _.* */
    if (i > 0) {
        action = action.substring(0, i);
    }

    if (ga_debug()) {
        var msg = "Event Tracker: " + ga_id() + " CATEGORY: " + category + " ACTION: " + action + " LABEL: " + label + " VALUE: " + value;
        if (typeof(console) != "undefined") {
            console.log(msg);
        }
    }

    if (typeof(_gat) == "undefined") {
        // This helps in development when networking is not available.
        return;
    }

    var pageTracker = _gat._getTracker(ga_id());
    pageTracker._initData();
    /* avoid y is undefined error */

    var res = false;
    if (value) {
        res = pageTracker._trackEvent(category, action, label, value);
    }
    else {
        res = pageTracker._trackEvent(category, action, label);
    }
    return res;
}

function trackValidForm(id, action, href) {
    element = document.getElementById(id);
    if (element.checkValidity()) {
        trackevent('Click', action, href, '');
        element.submit();
    }
}

/* If you are tracking a link with event tracking, call this in preference to trackevent() */
/* note: if label is empty, we will store the url in the label field */
function trackevent_link(href, category, action, label, value) {
    try {
        if (typeof(label) == "undefined") {
            label = '';
        }
        if (label == '') {
            label = href;
        }
        trackevent(category, action, label, value);
        setTimeout('document.location = "' + href + '"', 100);
    } catch(err) {};
}


function track_clicks_on(elements, action, label) {
    elements.each(function(i, e) {
        jQuery(e).click(function(){
            if (typeof(label) == "undefined") {
                label = e.innerText || e.textContent;
            }
            trackevent(click_event_category, action, label, e.href);
        });
    });
}


function track_stages_promo_view(flow, variant, promo) {
    var virtual_url = "/virtual/showpromo/?tracking=";
    if (promo) {
        virtual_url += "v_cell:promo-" + promo + ",";
    }
    virtual_url += "v_cell:wizard-" + flow + ",v_cell:variant-" + variant;
    trackit(virtual_url);
}

function provider_page_click_tracking(selector, value, resource_type, resource_url) {
    jQuery(selector).each(function(i, e){
        var data_value = e.readAttribute('data-value');
        var external = e.readAttribute('external');
        var href = e.readAttribute('href');

        jQuery(e).click(function() {
            if (external) {
                trackevent_link(href, value, resource_type, resource_url, data_value);
            } else {
                trackevent(value, resource_type, resource_url, data_value);
            }
        });
    });
}

function logLocalEvent(url,params)
{
  jQuery.ajax({
    url: url,
    data: params,
    async: false
  });
}
