/** 
 * jAnalytics
 * Add Google analytics to you website and automaticly apply tracking to links
 * 
 * @version 1.0
 * @author Sitebase
 * @uri http://www.sitebase.be
 */
(function($)
{
	
	// Define global variables
	var pageTracker;
	
	$.extend({			
		jAnalytics: function(account_id, options)
		{
		
			// Default settings
			var defaults = {
				enableMailTrack:		true,
				enableDownloadTrack:	true,				// Track downloads based in 
				enableLinkTrack:		true,				// Track outbound links
				enableButtonTrack:		true,				// Track form buttons clicked
				downloadTrackExtension:	["zip", "pdf"],	
				enableAnchorTrack: 		true				// index.html#track/campaign/newsletter-july/mylink
			}
				
			// Merge user and default settings
			settings 		= $.extend({}, defaults, options);
		
			// Call init
			init();
			
			/**
			 * bindTracking
			 * This function is called when the ga script is loaded
			 * 
			 * @return void
			 */
			function bindTracking(){
				
				// Get page tracker
				pageTracker = _gat._getTracker(account_id);

				// Start tracking pages
				pageTracker._trackPageview();
				
				// Create regex for file downloads to track
				var filetypes = new RegExp('\.(' + settings.downloadTrackExtension.join("|") + ')$', 'i');
				
				// Loop through links
				$('a').each(function(){

					var href = $(this).attr('href');

					// Track downloads
					if (href.match(filetypes) && settings.enableDownloadTrack){
						$(this).click(function() {
		  					var extension = (/[.]/.exec(href)) ? /[^.]+$/.exec(href) : undefined;
		  					result = trackEvent('Download', 'click - ' + extension, getLinkLabel($(this)));
						});
					}
					
					// Track mailto's
					else if (href.match(/^mailto\:/i) && settings.enableMailTrack){
						$(this).click(function() {
							result = trackEvent('Mailto', 'click', getLinkLabel($(this)));
						});
					}
					
					// Track outgoing links
					else if ((href.match(/^https?\:/i)) && (!href.match(document.domain))  && settings.enableLinkTrack){
						$(this).click(function() {
							result = trackEvent('External', 'click', getLinkLabel($(this)));
						});
					}
					
				});
				
				// Track form buttons
				if(settings.enableButtonTrack){
					$(':button').each(function(){
						$(this).click(function() {
							result = trackEvent('Submit', 'click', $(this).attr('name'));
						});
					});
				}
				
				// Campaign tracking
				if(settings.enableAnchorTrack){
					result = document.location.hash.match(/\#track\/(.*)/i);
					if(result){
						var parts = result[1].split("/");
						var category = parts[0];
						var action = parts[1];
						var label = parts[2] == undefined || parts[2] == "" ? stripDomain(document.location.href) : parts[2] + ' (' + stripDomain(document.location.href) + ')';
						result = trackEvent(category, action, label);
					}
				}
				
			}
			
			/**
			 * Track event
			 * 
			 * @param string category
			 * @param string action
			 * @param string label
			 * @param int value
			 * @return bool
			 */
			function trackEvent(category, action, label, value){
				 if(typeof pageTracker != 'undefined') return pageTracker._trackEvent(category, action, label, value);
				 return false;
			}
			
			/**
			 * Track page view
			 * 
			 * @param string uri
			 * @return bool
			 */
			function trackPageview(url){
				if(typeof pageTracker == 'undefined') return pageTracker._trackPageview(uri);
				return false;
			}
			
			/**
			 * Create label for a link
			 * 
			 * @param HTMLElement link
			 * @return string
			 */
			function getLinkLabel(link){
				var href = $(link).attr('href').replace(/^mailto\:/i, '');
				href = stripDomain(href);
				return $(link).attr('title') == '' ? href : href + ' (' + $(link).attr('title') + ')';
			}
			
			/**
			 * Get domainname from a url
			 * 
			 * @param string uri
			 * @return string
			 */
			function getDomain(uri, strip_www){
				domain = uri.match(/:\/\/(.[^/]+)/)[1];
				if(strip_www) domain = domain.replace("www.", "");                                     
				return domain;                                    
			}
			
			/**
			 * Strips the current domain from an internal link
			 * 
			 * @param string uri
			 * @return string
			 */
			function stripDomain(uri){
				if(uri.indexOf( "http://www." + document.domain ) > -1 || uri.indexOf( "http://" + document.domain ) > -1 ){
					uri = uri.replace("http://www." + document.domain, "").replace("http://" + document.domain, "");
				}else{
					uri = uri.replace(/^https?\:\/\/(www.)?/i, '');
				}
				uri = uri.replace(/#track(.*)/i, '');
				return uri;
			}
			
			/**
			 * Load GA tracker script from google
			 * 
			 * @return void
			 */
			function init(){

				// Get protocal (http or https)
				var url = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
				
				// Compose analytics ga script url
				url += 'google-analytics.com/ga.js';
				
				try{
					$.getScript(url, function(){
						bindTracking();
					});
				}catch(error){}
				
			}
			
			
		}
	});
})(jQuery);
