/* 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);
    document.observe('dom:loaded',setup_click_tracking);
}

/* parse dom and identify all of the trackable objects */
function t_cells() {
var f = $$('.trackable');
var trk = "";
for(var i=0; i<f.length; i++){
    var myid='';
    if (f[i].id == "") {   myid = f[i].className.split(' ')[0]}  /* if no ID, then pick off first class name */
    else { myid = f[i].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;
}

/* add click tracking handler to a single node */
function _observe_click(el) {
    el.observe('click',track_click);
}

/* add click events to trackable items */
function setup_click_tracking() {   
    var divs = $$('.trackable');
    for (var i=0; i < divs.length; i++) {
	var j=0;
	if (divs[i].nodeName == "A") {
	    _observe_click(divs[i]);
	}
	while (true) {
	    var l=divs[i].down('a',j); j++;
	    if (l == undefined ) { break; }
	    _observe_click(l)
	}
    }
}


/* If I am trackable, then return me, else look up the DOM for the trackable element */
function _find_trackable_element(el){
   c=el.className.split(' ');
   for (var i=0; i < c.length; i++) {
       if (c[i] == 'trackable') { 
	   return(el.id); 
       }
   }
   return(el.up('.trackable').id);
}

/* event handler for click on a trackable link; note: some browsers at some times fail to fire this event, because they have already moved on to the next page; use absolute data with caution */
function track_click(event) {
   var element=event.element();
   var click_el = _find_trackable_element(event.element());
   trackevent('Click',click_el,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,user_defined,debug) {
 debug = debug || ga_debug();
 user_defined = user_defined || '';

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

 if (user_defined.length > 0) {    /* hack to prevent setting user_defined from causing page view */
    var fakeTracker = _gat._getTracker("UA-1");
    fakeTracker._setVar(user_defined);
 }

 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 */
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);
   }
 }

 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 track_clicks_on(elements, category) {
  var record_click = function(event) {
    var element = event.element();
    var label = element.innerText || element.textContent;
    trackevent('Click', category, label);
  }
  elements.each(function(el) {
      el.observe('click', record_click);
  });
}

// THE FOLLOWING CODE IS FOR TRACKING EXTERNAL LINKS VIA GOOGLE ANALYTICS.

$(document).observe("dom:loaded", function(){
  var anchors = $$("a").select(function(anchor){ 
    var href = anchor.getAttribute("href");
    if (href) {
      if (href[0] == "/" || href[0] == "#" || href.match(/javascript:/) != null) { return false }
      if (href.match(/caring.com/) != null) { return false }
      if (href.match(/gilbertguide.com/) != null) { return false }
			if (href.match(/s3.amazonaws.com/) != null) { return false }
      if (href.match(/facebook.com|stumbleupon.com|doubleclick/) != null) { return false }
      return true;
    }
  });
  
  anchors.each(function(anchor){
    anchor.observe("click", function(e){
      try {
        var link = Event.element(e);
        if (link.nodeName != "A") { link = link.up("a") }
        if (link.getAttribute("href") == null ) { return true }
        var action = "outbound-click-";
        var action = action + (link.getAttribute("rel") && link.getAttribute("rel").match(/nofollow/) ? "nofollow" : "follow");
        trackevent("outbound-link", action, link.getAttribute("href"));
        setTimeout('document.location = "'+link.getAttribute("href")+'"', 100);
      } catch(err) {}
    });
  });
});
