
// gaUtils object
// (c) 2010 Panalysis Pty Ltd all rights reserved www.panalysis.com
// licensed to Travel the World
// for alterations and support regarding this script please contact support@panalysis.com
// Version 1.03 - 30-03-2010


function gaUtils(d)
{

	this._baseDomain ="";
	this.DebugMode = false;
	this.TrackRightClicks = false;
	this.BannerParams = new Array('ac');
	this.PageTracker = null;
	
	this._dTypes = new Array(".pdf",".doc",".docx",".xls",".xlsx",".exe",".zip",".rtf",".jpg",".png",".gif",".tiff",".tif",".mp3",".wav",".swf",".mpg");
	this._bIsMember = 0;
	this._linkerSites = new Array();
	this.formFieldStatus = new Object();
	this.formCommenced = false;
	
	if(d != "")
		this._baseDomain = d;

	this._customVarSlots = new Object();
	
	this._customVarSlots["member"] = {
		slot: 1,
		scope: 1,
		pageview: true,
		url: "/tracking/memberlogin"
	};
	this._customVarSlots["banner"] = {
		slot: 2,
		scope: 3,
		pageview: false
	};
	this._customVarSlots["adwordskeyword"] = {
		slot: 3,
		scope: 2,
		pageview: false
	};

	this.Settings = new Object();
	this.Settings["linktracking"] = {
		trackexternal: true,
		trackemail: true,
		externalbase: "/external/",
		emailbase: "/email/",
		externalpageview: true,
		emailpageview: true
	};
}

gaUtils.prototype.Initialise = function() 
{
	if(typeof(pageTracker) != 'undefined')
		this.PageTracker = pageTracker;
		
	if(document.location.hash.indexOf('debug')>=0)
	{
		this.DebugMode=true;
		this.SetDebug(true);
	}
	
	if(this._baseDomain == "")
	{
		var cDomain = document.location.hostname.toLowerCase();
		var dp = cDomain.split(".");
	
		if(dp[dp.length-1].length==2 && dp.length>=3)
			this._baseDomain = dp[dp.length-3] + "." + dp[dp.length-2] + "." + dp[dp.length-1]; // set to the current domain including country code
		else if(dp[dp.length-1].length>=3)
			this._baseDomain = dp[dp.length-2] + "." + dp[dp.length-1]; // assume .com, .info, etc
	}
	
	this._initLinks();
	this._testMember();
	this._checkBannerClick();
	if(document.location.search.indexOf('gclid')>=0)
		this._getAdWordsActualQuery();
	if(typeof(this["CustomInit"]) == "function")
	{
		this.CustomInit();
	}
}
gaUtils.prototype.SetDebug = function(val)
{
	this.DebugMode = val;
}
gaUtils.prototype.SetBaseDomain = function (val)
{
	this._baseDomain = val;
	this._initLinks();
}

gaUtils.prototype.RegisterPageTracker = function (obj) { this.PageTracker = obj; }

gaUtils.prototype.AddLinkedSite = function(d)
{
	this._linkerSites.push(d);
}

gaUtils.prototype.TrackLink = function(t,r,p)
{
	myDest = t;
	var isExternal = false;
	var isEmail = false;
	var myExtMatch = myDest.match(/^http[s]?:\/\/(.*)/);
	var myEmMatch = myDest.match(/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/);
	if(myExtMatch && myDest.indexOf(this._baseDomain) < 0)
	{
		if(this.Settings.linktracking.externalpageview)
			t = this.Settings.linktracking.externalbase + myExtMatch[1];
		else
			t = myExtMatch[1];
		
		isExternal = true;
	}
	else if(myEmMatch)
	{
		if(this.Settings.linktracking.emailpageview)
			t = this.Settings.linktracking.emailbase + myEmMatch[1];
		else
			t = myEmMatch[1];
		
		isEmail = true;
	}
	else
		t = t.replace(/http[s]?:\/\/[^\/]*/,"");
	if(p != null)
		this.PageTracker = p;
		
	if(this.PageTracker != null)
	{
		try {
			if(this.DebugMode==true)
				alert(t);
			
			if((isExternal && this.Settings.linktracking.externalpageview) || (isEmail && this.Settings.linktracking.emailpageview))
				this.PageTracker._trackPageview(t);
			else if(isExternal || isEmail)
				this.PageTracker._trackEvent("External Links","Clicks",t);
			else
				this.PageTracker._trackPageview(t);
		}
		catch (err) { }
	}
	
	if(r==true)
	{
		setTimeout("document.location.href=myDest;",500); // delay for 1/2 second
		return false;
	}
	else
		return true;
}

gaUtils.prototype.BannerClick = function(b)
{
	try
	{
		this.PageTracker._setCustomVar(this._customVarSlots["banner"].slot,"banner",b,this._customVarSlots["banner"].scope);
		this.PageTracker._trackEvent("Banners","Clicks",b);
	} catch (err) {}
}

gaUtils.prototype.TrackMember = function(val)
{
	var mVal = "yes";
	if(val != null)
		mVal = val;
	try
	{
		if(this.PageTracker != null)
		{
			if(this.DebugMode)
				alert("Member: Yes");
			this.PageTracker._setCustomVar(
				this._customVarSlots["member"].slot,
				"member",mVal,
				this._customVarSlots["member"].scope
			);
			
			if(this._customVarSlots["member"].pageview)
			{
				var url ="/tracking/members";
				if(typeof(this._customVarSlots["member"].url) !="undefined")
					url = this._customVarSlots["member"].url;
				
				this.PageTracker._trackPageview(url);
			}
			else
				this.PageTracker._trackEvent("Members","Visit");
		}
	}
	catch(err) {}
}

gaUtils.prototype._trim = function (val){ return val.replace(/^\s+|\s+$/g, '') ; }

gaUtils.prototype._initLinks = function()
{
	var mL = document.getElementsByTagName("a");
	var myRegexp = /^http[s]?:\/\/(.*)/;
	for(var i=0;i<mL.length;i++)
	{
		var myRef = mL[i].href.toLowerCase();
		if(myRef == undefined)
			continue;
		
		var gau = this;
		
		var myMatch = myRegexp.exec(myRef);
		var lchar = myRef.substring(myRef.length-1);
		if((lchar=="#" && mL[i].onclick != "") || (myMatch != undefined && myMatch.length>1 && this._baseDomain != undefined && myRef.indexOf(this._baseDomain) < 0))
		{
			if(this._useLinker(mL[i].hostname))
				this._addEvent(mL[i],"click",function () { gau._gaAddLinker(this); return false; });
			else
				this._addEvent(mL[i],"click",function () { gau.TrackLink(this.href,false); });
		}
		else if(myRef.toLowerCase().indexOf("mailto:")>=0)
		{
			this._addEvent(mL[i],"click",function () { gau.TrackLink(this.href.substring(7),false); });
		}
		else
		{
			for(x=0;x<this._dTypes.length;x++)
			{
				if(myRef.indexOf(this._dTypes[x])>-1)
				{
					if(mL[i].target != "")
						this._addEvent(mL[i],"click",function () { gau.TrackLink(this.href,false); });
					else
						this._addEvent(mL[i],"click",function () { gau.TrackLink(this.href,true); return false;});
						
					if(this.TrackRightClicks = true)
						this._addEvent(mL[i],"mouseup",function (e) { gau._checkRightClick(e,this); });
				}
			}
		}
	}
}

gaUtils.prototype._checkRightClick = function(e,o,pt)
{
	var button;
	// determine which button was clicked.
	if (e.which == null)
		/* IE case */
		button= (e.button < 2) ? "LEFT" : ((e.button == 4) ? "MIDDLE" : "RIGHT");
	else
		/* All others */
		button= (e.which < 2) ? "LEFT" : ((e.which == 2) ? "MIDDLE" : "RIGHT");
	
	// tracking the right mouse click isn't accurate as we can't reliably get whether the link was clicked. 
	if(button=="RIGHT")
	{
		this.TrackLink(o.href,false,pt);
	}
}

gaUtils.prototype._useLinker=function (d)
{
	var ul = false;
	if(this._linkerSites.length>0)
	{
		for(var i=0; i< this._linkerSites.length; i++)
		{
			if(d.toLowerCase().indexOf(this._linkerSites[i])>=0)
			{
				ul=true;
				break;
			}
		}
	}
	return ul;
}

gaUtils.prototype._gaAddLinker = function (o,pt)
{
	if(pt != null)
		this.PageTracker = pt;
		
	try
	{
		var l = o.href;
		o.href= this.PageTracker._getLinkerUrl(l);
		return false;
	}
	catch(err)
	{
		return true
	}
}

gaUtils.prototype._getHashParam = function (strParam){
	if(strParam =="")
		return "";
	var _pstr = document.location.hash.substring(1);
	var _uparams = _pstr.split("&");
	for(var i = 0; i < _uparams.length; i++){
		var np = _uparams[i].split("=");
		if(this._trim(np[0].toLowerCase()) == strParam.toLowerCase())
		{
			return this._trim(np[1]);
			break;
		}
	}
	return "";
}

gaUtils.prototype._getParam = function (strParam){
	var _pstr = document.location.search.substring(1);
	var _uparams = _pstr.split("&");
	for(i = 0; i < _uparams.length; i++){
		var np = _uparams[i].split("=");
		if(this._trim(np[0].toLowerCase()) == strParam.toLowerCase())
			return this._trim(np[1]);
	}
	return "";
}

gaUtils.prototype._setCookie = function(cookieName,cookieValue,expire,strDomain) {
	var pdm = "";
	if (strDomain && strDomain!="") 
		pdm=" domain="+strDomain+";"; 

	if((typeof(expire)).toLowerCase() == "date")
		document.cookie = cookieName+"="+escape(cookieValue) + ";expires="+expire.toGMTString() + "; path=/;" + pdm;
	else
		document.cookie = cookieName+"="+escape(cookieValue) + "; path=/;" + pdm;
}

gaUtils.prototype._getCookie = function(strParam){
	var _ucookies = document.cookie.split(";");
	for(i = 0; i < _ucookies.length; i++){
		var np = _ucookies[i].split("=");
		if(this._trim(np[0].toLowerCase()) == strParam.toLowerCase())
		{
			var val ="";
			for(i=1;i<np.length;i++)
			{
				if(i>1)
					val += "=";
				
				val += np[i];
			}
			return this._trim(val);
		}
	}
	return "";
}

gaUtils.prototype._testMember = function()
{
	var utmv = this._getCookie('__utmv');
	if(utmv != "" && utmv.indexOf('member')>0)
	{
		this._bIsMember=1;
		return true;
	}

	var isM =0;
	if(typeof(window['_galoginStatus']) != "undefined")
	{
		try
		{
			if( _galoginStatus.toUpperCase()=="SUCCESS")
				isM=1;
		}
		catch(err) { }
	}
	if(typeof(window['_gaismember']) != "undefined")
	{
		try
		{
			if( _gaismember == 1)
				isM=1;
		}
		catch(err) { }
	}
	
	var mq = this._getParam('im');
	if((mq != "" && mq.toLowerCase().indexOf('guest')<0) || isM==1 )
	{
		this._bIsMember=1;
		this.TrackMember();
	}
}

gaUtils.prototype.AddDownloadType = function(t) 
{
	if(t != "")
	{
		if(t.substr(0,1) != ".")
			t = "." + t;
		this._dTypes[this._dTypes.length] = t;
	}
}

gaUtils.prototype._checkBannerClick = function(params)
{

	if(params != null)
		this._addBannerParams(params);
		
	for(i=0; i<this.BannerParams.length; i++)
	{
		var p = this.BannerParams[i];
		var b = this._getParam(p);
		var c = this._getHashParam(p);
		if(b != "" || c != "")
		{
			if (b=="")
				b = c; 
			
			if(this.DebugMode)
				alert("Banner/Link: " + b);
			this.BannerClick(b);
		}
	}
}

gaUtils.prototype._addBannerParams = function(params)
{
	if(this.BannerParams == undefined)
		this.BannerParams = new Array();
	
	var bIsOK = true;
	if(params instanceof Array)
	{
		for(var i=0; i<params.length; i++)
		{
			bIsOK = true;
			for(var x=0; x<this.BannerParams.length; x++)
			{
				if(this.BannerParams[x] == params[i])
					bIsOK = false;
			}
			if(bIsOK == true)
				this.BannerParams.push(params[i]);
		}
		
		
	}
	else
	{
		bIsOK = true;
		for(var x=0; x<this.BannerParams.length; x++)
		{
			if(this.BannerParams[x] == params)
				bIsOK = false;
		}
		if(bIsOK == true)
			this.BannerParams.push(params);
	}
}

gaUtils.prototype._getAdWordsActualQuery = function()
{
	var dr = document.referrer;
	if(dr == null || dr=="")
		return;
		
	if(dr.toLowerCase().indexOf('google')>0)
	{
		var m = dr.match(/q=([^&$]*?)[&$]/i);
		if(m.length>1)
		{
			var q = unescape(m[1]);
			q = q.replace('+',' ');
			this.PageTracker._setCustomVar(
				this._customVarSlots["adwordskeyword"].slot,
				"AdWordsKeyword",
				q,
				this._customVarSlots["adwordskeyword"].scope
			);
			this.PageTracker._trackEvent("AdWords Keywords",q);
		}
	}
}

gaUtils.prototype._addEvent = function ( obj, type, fn ) 
{
	if ( obj.attachEvent ) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
		obj.attachEvent( 'on'+type, obj[type+fn] );
	} else
		obj.addEventListener( type, fn, false );
}

gaUtils.prototype._removeEvent = function( obj, type, fn ) 
{
	if ( obj.detachEvent ) {
		obj.detachEvent( 'on'+type, obj[type+fn] );
		obj[type+fn] = null;
	} else
		obj.removeEventListener( type, fn, false );
}

