/*
* Event Tracker
*
* A Quick About
*
* Adds the following methods to jQuery:
*   - Comment
*
* Features:
*   - Comment
*
* Created by Chad Alan
*
* Examples:
*   http://some-url.com
*
* Version 1.5.0
*
* Tested with:
*   - Windows: Firefox 3
*
* Credits:
*   - http://code.google.com/apis/analytics/docs/tracking/eventTrackerGuide.html
*   - http://lyncd.com/2009/03/better-google-analytics-javascript
*/
(function($) {
	
	var pageTracker;
	
	///-- Create page tracker method ---
	$.gaPageTracker = function(accountID, options) {
		var host = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
	
		///-- Use default options ---
		var opts = $.extend({}, {onLoad: true}, options);
		var src  = host + 'google-analytics.com/ga.js';
		
		///-- Initiate page tracker ---
		function initAnalytics() {
			if (typeof _gat !== undefined) {
				pageTracker = _gat._getTracker(accountID);
				pageTracker._trackPageview();
				debug('Google Analytics is defined','info');
			}
			else { 
				debug('Google Analytics is undefined','error');
			}
		}
		///-- Get Google Analytics script ---
		loadScript = function() {
			$.ajax({
				type: 'GET',
				url: src,
				success: function() {          
					initAnalytics(); 
					debug('Google Analytics script loaded','info');
				},
				dataType: 'script',
				cache: true
			});
		};
		
		///-- Run when called or on page load ---
		if(opts.onLoad) {
      		$(window).load(loadScript)
    	} else {
      		loadScript();
    	}
	};
	
	///-- Track event method ---
	$.trackEvent = function(category, action, label, value) {
		if(typeof pageTracker === 'undefined') {
		  	debug('Not able to track event without page tracker','error');
		}else {
			pageTracker._trackEvent(category, action, label, value);
		}
	};
	
	///-- Get URL parameters/values and return them as an associative array  | LATER USE WITH DATA POOLING ---
	function getUrlVars() {
		var vars = [], hash;
		var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
		for(var i = 0; i < hashes.length; i++) {
			hash = hashes[i].split('=');
			vars.push(hash[0]);
			vars[hash[0]] = hash[1];
		}
		return vars;
	}
	
	///-- Debugging Function ---
	function debug(msg,type){
		if(type === 'info' && $.fn.gaEventTracker.defaults.debug){
			console.info(msg);
		}else if(type === 'warning' && $.fn.gaEventTracker.defaults.debug){
			console.warn(msg);	
		}else if(type === 'error' && $.fn.gaEventTracker.defaults.debug){
			console.error('Custom Error: ' + msg);	
		}
	}
	
	///-- Create an Event Tracker Method ---
	$.fn.gaEventTracker = function(options) {
		
      	var opts = $.extend({}, $.fn.gaEventTracker.defaults, options);

    	///-- Add event handler to all matching elements ---
   		return this.each(function() {
			
			var $this           = $(this);
			var href            = $this.attr('href');
			
			if (href !== undefined){
				
				if(opts.headerID !== ''){
					$('#' + opts.headerID).find('a').addClass('headerTrack');
				}

				if(opts.footerID !== ''){
					$('#' + opts.footerID).find('a').addClass('footerTrack');
				}
				
				var extLink         = href.replace(/^https?\:\/\//i, '');
				var fileTypeExp     = /\.(zip|exe|pdf|doc*|xls*|ppt*|mp3|avi|wmv|mov)$/i;
				var socialSites     = /(youtube|twitter|facebook|myspace|digg|reddit)/i;
				var rel             = $this.attr('rel');
				var title           = $this.attr('title');
				var alt             = $this.attr('alt');
				var id              = $this.attr('id');
				var classList       = $this.attr('class').split('');
	
				///-- If this has a class of isTracked then do nothing ---
				isTracked = false;
				if ($this.hasClass('isTracked')) {
					return false;
					
				///-- Mailto Click Event ---
				}else if (href.match(/^mailto\:/i) && isTracked === false){
					$this.addClass('isTracked');
					isTracked = true;
					$this.click(function(e) {
						var mailLink = href.replace(/^mailto\:/i, '');
						$.trackEvent('Email', 'Click', mailLink);
						if (opts.debug){e.preventDefault();}
						debug('Category: Email' + '\n' + 'Action: Click' + '\n' + 'Label: ' + mailLink + '\n','info');
					});
					
				///-- File Downloads Click Event ---
				}else if (href.match(fileTypeExp) && isTracked === false){
					$this.addClass('isTracked');
					isTracked = true;
					$this.click(function(e) {
						var extension = (/[.]/.exec(href)) ? /[^.]+$/.exec(href) : undefined;
						var filePath = href.replace(/^https?\:\/\/(www.)mydomain\.com\//i, '');
						$.trackEvent('Download', 'Click - ' + extension, filePath);
						if (opts.debug){e.preventDefault();}
						debug('Category: Download' + '\n' + 'Action: Click' + '\n' + 'Label: ' + filePath + '\n','info');
					});
					
				///-- Social Click Events ---
				}else if (href.match(socialSites) && isTracked === false){
					$this.addClass('isTracked');
					isTracked = true;
					$this.click(function(e) {
						$.trackEvent('social','click',href);
						if (opts.debug){e.preventDefault();}
						debug('Category: Social' + '\n' + 'Action: Click' + '\n' + 'Label: ' + href + '\n','info');
					});
					
				///-- Customer Click Events ---
				}else if (href.match(/secure.ncsoft/i) && isTracked === false){
					$this.addClass('isTracked');
					isTracked = true;
					$this.click(function(e) {
						$.trackEvent('customer','click','store');
						if (opts.debug){e.preventDefault();}
						debug('Category: Customer' + '\n' + 'Action: Click' + '\n' + 'Label: Store' + '\n','info');
					});
				}else if (href.match(/buy_now/i) && isTracked === false){
					$this.addClass('isTracked');
					isTracked = true;
					$this.click(function(e) {
						$.trackEvent('customer','click','sale page');
						if (opts.debug){e.preventDefault();}
						debug('Category: Customer' + '\n' + 'Action: Click' + '\n' + 'Label: Sale Page' + '\n','info');
					});
				
				///-- Header Click Event ---
				}else if ($this.hasClass('headerTrack')){
					$this.addClass('isTracked');
					isTracked = true;
					$this.click(function(e) {
						$.trackEvent('Internal', 'Click' + href);
						if (opts.debug){e.preventDefault();}
						debug('Category: Header' + '\n' + 'Action: Click' + '\n' + 'Label: ' + href + '\n','info');
						
					});	
				
				///-- Footer Click Event ---
				}else if ($this.hasClass('footerTrack')){
					$this.addClass('isTracked');
					isTracked = true;
					$this.click(function(e) {
						$.trackEvent('Internal', 'Click' + href);
						if (opts.debug){e.preventDefault();}
						debug('Category: Footer' + '\n' + 'Action: Click' + '\n' + 'Label: ' + href + '\n','info');
						
					});	
					
				///-- Outbound Click Event ---
				}else if (href.match(/^https?\:/i)){
					$this.addClass('isTracked');
					isTracked = true;
					$this.click(function(e) {
						$.trackEvent('External', 'Click' + href);
						if (opts.debug){e.preventDefault();}
						debug('Category: Outbound' + '\n' + 'Action: Click' + '\n' + 'Label: ' + href + '\n','info');
					});
				}
			}
    	});
  	};
	
	///-- Create A Custom Event Tracker Method ---
	$.fn.gaCustomEventTracker = function(options) {
		
      	var opts = $.extend({}, $.fn.gaCustomEventTracker.defaults, options);

    	///-- Add event handler to all matching elements ---
   		return this.each(function() {
			
			var $this           = $(this);

			if ($this.hasClass('isCustomTracked')) {
				return false;

			///-- Custom Click Event ---
			}else {
				$this.addClass('isCustomTracked');
				isTracked = true;
				$this.click(function(e) {
					$.trackEvent(opts.category,opts.action,opts.label,opts.value);
					if (opts.debug){e.preventDefault();}
					debug('Category: ' + opts.category + '\n' + 'Action: ' + opts.action + '\n' + 'Label: ' + opts.label + '\n','info');
					
				});
			}

    	});
  	};

	///-- General-Event-Tracker Options ---
	$.fn.gaEventTracker.defaults = {
		headerID         : '',
		footerID         : '',
		category         : 'Custom',
    	action           : 'click',
    	label            : 'a',
    	value            : null,
		debug            : false,
		salePage         : "buy_now",
		fileTypes        : "zip|exe|pdf|doc*|xls*|ppt*|mp3|avi|wmv|mov"
	};
	
	///-- Custom-Event-Tracker Options ---
	$.fn.gaCustomEventTracker.defaults = {
		category         : 'Custom',
    	action           : 'click',
    	label            : null,
    	value            : null,
		debug            : false
	};

})(jQuery);
	
