/*
 * jquery.geekga-1.2.js - jQuery plugin for Google Analytics
 * 
 * Version 1.2
 * 
 * This plugin extends jQuery with two new functions:
 * 
 *   - $.geekGaTrackPage(account_id)
 *       Track a pageview on a domain.
 *
 *   - $.geekGaTrackPage(account_id, domain_name);
 *       Track a pageview on a domain and its subdomains.
 * 
 *   - $.geekGaTrackEvent(category, action, label, value)
 *       Track an event with a category, action, label and value.
 * 
 * 
 * This code is in the public domain.
 *
 * Contributors:
 *   - Armin Pasalic - http://pasalic.com.ba/ (the addition of subdomain tracking)
 * 
 * Willem van Zyl
 * willem@geekology.co.za
 * http://www.geekology.co.za/blog/
 */

(function($) {
  
  var pageTracker;
  
  
  /**
   * Track a pageview on a domain, e.g.:
   * 
   *   $.geekGaTrackPage('UA-0000000-0');
   *
   * Track a pageview on a domain and its subdomains
   * (include the leading '.'), e.g.:
   *
   *   $.geekGaTrackPage('UA-0000000-0', '.geekology.co.za');
   */
  $.geekGaTrackPage = function(account_id, domain_name) {
    
    //check whether to use an unsecured or a ssl connection:
    var host = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    var src = host + 'google-analytics.com/ga.js';
    
    //load the Google Analytics javascript file:
    $.ajax(
      {
        type:      'GET',
        url:       src,
        success:   function() {
                                //the ga.js file was loaded successfully, set the account id:
                                pageTracker = _gat._getTracker(account_id);
                                
                                //check whether a domain name was specified:
                                domain_name = domain_name || '';
                                if (domain_name != '')
                                {
                                  pageTracker._setDomainName(domain_name);
					    pageTracker._setAllowHash(false);
                                }
                                
                                //track the pageview:
                                pageTracker._trackPageview();
					  
					  extra(pageTracker);
					  
                              },
        error:     function() {
                                //the ga.js file wasn't loaded successfully:
                                throw "Unable to load ga.js; _gat has not been defined.";
                              },
        dataType:  'script',
        cache:     true
      }
    );
    
    //old method, doesn't cache the script file:
    /*
    $.getScript(src, function() {
      if (typeof _gat != undefined) {
        //the ga.js file was loaded successfully, set the account id:
        pageTracker = _gat._getTracker(account_id);
        
        //track the pageview:
        pageTracker._trackPageview();
      }
      else {
        //the ga.js file wasn't loaded successfully:
        throw "Unable to load ga.js; _gat has not been defined.";
      }
    });
    */
    
  };
  
  
  /**
   * Track an event, e.g.:
   * 
   *   $('a.twitter').click(function() {
   *     $.geekGaTrackEvent('feed', 'click', 'Twitter', 'willemvzyl');
   *   });
   */
  $.geekGaTrackEvent = function(category, action, label, value) {
    
    if (typeof pageTracker != undefined) {
      //the pageTracker was defined, track the event:
      pageTracker._trackEvent(category, action, label, value);
    } else {
      //the pageTracker wasn't defined:
      throw "Unable to track event; pageTracker has not been defined";
    }
    
  };
  
  var extra = function(pageTracker)
  {
	//	Javascript to tag file downloads and external links in Google Analytics
	//	To use, place reference to this file should be placed at the bottom of all pages, 
	//	just above the Google Analytics tracking code.
	//	All outbound links and links to non-html files should now be automatically tracked.
	//
	//  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//	Created by: 	Colm McBarron, colm.mcbarron@iqcontent.com
	//	Last updated: 	12-Feb-2006
	//
	//	Updated by:		Niamh Phelan niamh.phelan@iqcontent.com
	//	On:				22-Jul-2008
	//	For:			Upgrade to ga.js	
	//
	//	Updated by:		Peter McKenna peter.mckenna@iqcontent.com
	//	On:				07-Nov-2008
	//	For:			Track mailto: links and restructure how virtual
	//          		pageviews are structured
	//
	//	Updated by:		Peter McKenna peter.mckenna@iqcontent.com
	//	On:				19-Feb-2009
	//	For:			Fixed up some problems with how Internet 
	//					Explorer 6 was tracking links, and some minor
	//					Firefox issues.
	//
	//	Updated by:		Peter McKenna peter.mckenna@iqcontent.com
	//	On:				23-Oct-2009
	//	For:			Fixed IE issue when link is wrapped around an image
	//
	//	+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//  GA Tag Links: Version 1.2.1
	//  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	var hrefs = document.getElementsByTagName("a");
	var link_path = "";
	
	for (var l = 0; l < hrefs.length; l++) {
		try {
			// Add the hostname and link location into variables
			var link_path = hrefs[l].pathname;
			var link_location = String(hrefs[l]);
	
			// Check if it's a mail link
			if (link_location.match(/^mailto:/i)) 
			{
				addmailtotrackerlistener(hrefs[l]);
			}
			// Check to see if the link is an internal link
			else if (location.host == hrefs[l].hostname) 
			{
				if(link_path.match(/\.(doc|pdf|xls|ppt|zip|txt|vsd|vxd|js|css|rar|exe|wma|mov|avi|wmv|mp3)$/)) 
				{
					addtrackerlistener(hrefs[l]);
				}
			}
			else 
			{
				addtrackerlistener(hrefs[l]);
			}
		}
		catch(err) { }
	}
	
	// Add a listener to matching file links
	function addtrackerlistener(obj) {
		if (obj.addEventListener) {
			obj.addEventListener('click', trackfiles, true);
		} else if (obj.attachEvent) {
			obj.attachEvent("on" + 'click', trackfiles);
		}
	}
	
	// Add a special listener to mailto: links
	function addmailtotrackerlistener(obj) {
		if (obj.addEventListener) {
			obj.addEventListener('click', trackmailto, true);
		} else if (obj.attachEvent) {
			obj.attachEvent("on" + 'click', trackmailto);
		}
	}
	
	// Track file links
	function trackfiles(array_element) {
		if (array_element.srcElement && array_element.srcElement.tagName != 'IMG')
		{
			var file_path = "";
			// Track an external link
			var destination_host = (array_element.srcElement) ? array_element.srcElement.hostname : this.hostname;
			if (location.host != destination_host){
				file_path = "/virtual/exlink/" + cleanURL(window.location, true) + '/' + ((array_element.srcElement) ? array_element.srcElement.hostname : this.hostname);
				file_path = file_path + ((array_element.srcElement) ? "/" + cleanURL(array_element.srcElement.pathname, false) : this.pathname);
			}
			// Track an internal link
			else {
				file_path = ((array_element.srcElement) ? "/" + array_element.srcElement.pathname : this.pathname);	
				var file_details = file_path.split('/');
				file_path = cleanURL(window.location, true) + '/' + file_details[(file_details.length-1)];
				file_path =  (("/virtual/download/") + file_path);
			}
			pageTracker._trackPageview(file_path);
		}
	}
	
	// Generate page view for a mailto: link
	function trackmailto(array_element) {
		if (array_element.srcElement && array_element.srcElement.tagName != 'IMG')
		{
			var email = ((array_element.srcElement) ? array_element.srcElement.href : this.href).substring(7);
			var url = cleanURL(window.location, true);
			var mail_path = '/virtual/mailto/'+url+'/'+email;
			pageTracker._trackPageview(mail_path);
		}
	}
	
	// Clean leading & trailing slashes
	function cleanURL (url, end) {
		var url = url.toString();
		var urlLen = url.length;
		
		if (end) {
			if (url.charAt((urlLen-1))=='/')
				url = url.substring(0,(urlLen-1));
		}
		else {
			if (url.charAt(0)=='/')
				url = url.substring(1,urlLen);
		}
		return url;
	}
	
	// LHP
	if ($('body').hasClass('lhp'))
	{
		var lhpformat = 'ui';
		if ($('body').hasClass('nui'))
		{
			lhpformat = 'no-ui';
		}
		pageTracker._trackPageview('/virtual/lhpformat/' + lhpformat + '/'); 
	}
  };
  
})(jQuery);
