/*
 * Copyright (c) 2008 Asavie Technologies Ltd.
 * $Revision: 1.2 $
 * $Source: /home/master/store/./tracker.js,v $
 * $Date: 2008/12/09 12:51:48 $
 */

/* Create namespace accessmylan */
if (!accessmylan) {
	var accessmylan = {};
}

/**
 * Module: accessmylan.utils
 */
accessmylan.utils || (accessmylan.utils = {});

/**
 * Helper to encode parameters (in an object array) into a query string.
 */
accessmylan.utils.buildQuery = function(params) {
	var q_params = [];
	for (var key in params) {
		if (typeof key === 'string') {
			if (params[key] instanceof Array) {
				var values = params[key];
				var q_key = encodeURIComponent(key);
				for (var i=0; i < values.length; i++) {
					var q_value = encodeURIComponent(values[i]);
					q_params.push(q_key + "=" + q_value);
				}
			}
			if (typeof params[key] === 'string') {
				var value = params[key];
				var q_key = encodeURIComponent(key);
				var q_value = encodeURIComponent(value);
				q_params.push(q_key + "=" + q_value);
			}
		}
	}
	return q_params.join("&");
};

accessmylan.utils.parseQuery = function(qs) {
	if (qs.charAt(0) == '?') {
		qs = qs.substring(1, qs.length);
	}

	var params = {};
	var avs = qs.split('&');
	for (var i=0; i < avs.length; i++) {
		var pair = avs[i].split("=", 2);
		var key = unescape(pair[0]);
		var value = unescape(pair[1]);

		if (!(key in params)) {
			params[key] = new Array();
		}
		params[key].push(value);
	}
	return params;
};

/**
 * Helper to parse a cookie string into a dictionary.
 */
accessmylan.utils.parseCookie = function(cookie, sep) {
	if (!sep) sep = "=";
	var dict = {};
	var avs = cookie.split(/\s*;\s*/);
	for (var i=0; i < avs.length; i++) {
		var pair = avs[i].split(sep, 2);
		var key = pair[0];
		var value = pair[1];

		dict[key] = value;
	}
	return dict;
};

/**
* Helper to parse a cookie value ("name1:value1|name2:value2")
*/
accessmylan.utils.parseCookieValue = function(cookieValue, sep) {
	if (!sep) sep = ":";
	var dict = {};
	var avs = cookieValue.split(/\s*\|s*/);
	for (var i=0; i < avs.length; i++) {
		var pair = avs[i].split(sep, 2);
		var key = unescape(pair[0]);
		var value = unescape(pair[1]);
		
		dict[key] = value;
		
	}
	return dict;
};

/**
* Helper to build a cookie value ("name1:value1|name2:value2")
*/
accessmylan.utils.buildCookieValue = function(params) {
	var c_params = [];
	for (var key in params) {
		if (typeof key === 'string' && params[key] !== null && params[key].length > 0) {
			c_params.push(escape(key) + ":" + escape(params[key]));
		}
	}
	return c_params.join("|");
};

accessmylan.utils.parseGACookie = function() {
	var ut = "__utmz=";

	var gaInfo = null;
	var dict = {};
	var avs = window.document.cookie.split(/\s*;\s*/);
	for (var i=0; i < avs.length; i++) {
		if (avs[i].indexOf(ut) == 0)
		{
			gaInfo = avs[i].slice(ut.length);		
		}
	}
	if (gaInfo != null && gaInfo.length > 0)
	{
		var gaParams = accessmylan.utils.parseCookieValue(gaInfo, "=");
		for (var key in gaParams) {
			if (key.indexOf("utmcsr") >= 0) dict["utm_source"] = gaParams[key];
			if (key.indexOf("utmcmd") >= 0) dict["utm_medium"] = gaParams[key];	
			if (key.indexOf("utmccn") >= 0) dict["utm_campaign"] = gaParams[key];
			if (key.indexOf("utmcct") >= 0) dict["utm_content"] = gaParams[key];
			if (key.indexOf("utmctr") >= 0) dict["utm_term"] = gaParams[key];
		}
		
		// Update for Adwords clickthroughs ...
		for (var key in gaParams) 
		{			
			if (key.indexOf("utmgclid") >= 0) 
			{
				dict["utm_source"] = "google";
				dict["utm_medium"] = "cpc";
				break;
			}
		}
	}
	return dict;
};

/**
 * Module: accessmylan.utils
 */
accessmylan.utils || (accessmylan.utils = {});


/**
 * Class: accessmylan.Tracker
 * Object: accessmylan.tracker
 */
accessmylan.Tracker = function(doc) {
	var id, l, s, r, p, campaignInfo;
	var now = new Date();

	if (!doc) {
		doc = window.document;
	}
	
	try {
		var cookies = accessmylan.utils.parseCookie(doc.cookie);
		
		if ('AMLCAMPAIGNINFO' in cookies) {
			campaignInfo = cookies['AMLCAMPAIGNINFO'];
			this.campaign = accessmylan.utils.parseCookieValue(campaignInfo);
		} else {
			campaignInfo = '-';
			this.campaign = {};
		}
		
		if ('AMLTRACKERID' in cookies) {
			id = cookies['AMLTRACKERID'];
		} else {
			id = (now.getTime() + 0x100000000).toString(16).slice(-8)
			+ (Math.floor(Math.random()*0xFFFF)+0x10000).toString(16).slice(1)
			+ (Math.floor(Math.random()*0xFFFF)+0x10000).toString(16).slice(1)
			+ (Math.floor(Math.random()*0xFFFF)+0x10000).toString(16).slice(1)
			+ (Math.floor(Math.random()*0xFFFF)+0x10000).toString(16).slice(1);

			/* Save id in AMLTRACKERID cookie */
			doc.cookie = 'AMLTRACKERID=' + id + ';path=/;domain=.accessmylan.com';
		}
	} catch (e) {
		id = '-';
	}

	try {
		/* Language details */
		l = navigator.language || navigator.userLanguage;
	} catch (e) {
		l = '-';
	}

	try {
		/* Screen details */
		s = screen.height + '*'
			+ screen.width + '!' + screen.availWidth + '*'
			+ screen.colorDepth;
	} catch (e) {
		s = '-';
	}

	try {
		p = doc.location;
	} catch (e) {
		p = '-';
	}
	try {
		if (doc.referrer) {
			r = doc.referrer;
		}
	} catch (e) {
		r = '-';
	}
	this.params = {'id': [id],
					'l': [l],
					's': [s],
					'p': [p],
					'r': [(r || '*')],
					't0': [now.toUTCString()],
					't1': [now.getTimezoneOffset()]
					};
	return;
};

accessmylan.tracker = new accessmylan.Tracker();

accessmylan.Tracker.prototype.addParam = function(key, value) {
	if (!(key in this.params)) {
		this.params[key] = new Array();
	}

	this.params[key].push(value);
};

accessmylan.Tracker.prototype.toString = function() {
	try {
		return accessmylan.utils.buildQuery(this.params);
	} catch (e) {
		return encodeURIComponent('Exception:' + e.message);
	}
};
accessmylan.TrackerURL = "/tracker.gif";
accessmylan.Tracker.prototype.URL = function() {
	return this.url || accessmylan.TrackerURL;
};

accessmylan.Tracker.prototype.snippet = function() {
	var html = new Array();
	var dirt = Math.floor(Math.random()*0xffff).toString(16);
	// dirt is added to the URL as a cache suppression method

	return [
		'<IMG src="', this.URL(), '?D=', dirt, '&',
		this.toString(), '" ',
		'width="1" height="1" border="0" alt=""',
		'>'
		].join('');
};

accessmylan.Tracker.prototype.isOdd = function() {
	var id = this.params['id'].toString();
	var v = parseInt("0x" + id.substring(id.length-1,id.length));
	return (v % 2);
};

accessmylan.Tracker.prototype.setCampaignParam = function(name, val, override) {
	
	if (!override) override = false;
	
	if (name !== null && name.length > 0 && 
		val !== null && val.length > 0 && 
		( (!(name in this.campaign)) || (override) ) ) {
		
		this.campaign[name] = val;
		var campaignInfo = accessmylan.utils.buildCookieValue(this.campaign);
		var expires = new Date((new Date()).getTime() + 24 * 182 * 3600000);	// 6 months (like google tracker)
		var cookieString = 'AMLCAMPAIGNINFO=' + campaignInfo + ';expires=' + expires.toGMTString() + ';path=/;domain=.accessmylan.com';
		window.document.cookie = cookieString;
	}
};

accessmylan.Tracker.prototype.getCampaignParam = function(name) {
	if (name in this.campaign) {
		return this.campaign[name];
	} else {
		return null;
	}	
};

accessmylan.Tracker.prototype.getCampaignInfo = function() {
	return this.campaign;
};

accessmylan.Tracker.prototype.getSiteAB = function() {
	try {
		var cookies = accessmylan.utils.parseCookie(doc.cookie);		
		if ('AMLAB' in cookies) {
			return cookies['AMLAB'];
		}
	} catch (e) {}
	return null;	
};

accessmylan.Tracker.prototype.setSiteAB = function(ab, sitePath) {
	if (!ab) return;
	if (!sitePath) sitePath = "/";
	var expires = new Date((new Date()).getTime() + 24 * 182 * 3600000);	// 6 months
	var cookieString = 'AMLAB=' + ab + ';expires=' + expires.toGMTString() + ';path=' + sitePath;
	window.document.cookie = cookieString;
};

accessmylan.Tracker.prototype.saveCampaignInfo = function() {
	
	var source = null;
	var medium = null;
	var campaign = null;
	var content = null;
	var term = null;
	
	var qyParams = accessmylan.utils.parseQuery(location.search.substring(1));
	var gaParams = accessmylan.utils.parseGACookie();

	accessmylan.tracker.setCampaignParam('aml_trkid', this.params['id'], true);	
	
	// Source
	if (document.referrer !== null && document.referrer.length > 0) 
		source = document.referrer;
	else
		source = '(direct)';
		
	if ("utm_source" in gaParams && gaParams["utm_source"].length > 1) source = gaParams["utm_source"];
	if ("aml_source" in qyParams && qyParams["aml_source"].length >= 1) source = qyParams["aml_source"][0];
		
	// Medium
	if ("utm_medium" in gaParams && gaParams["utm_medium"].length > 1) medium = gaParams["utm_medium"];
	if ("aml_medium" in qyParams && qyParams["aml_medium"].length >= 1) medium = qyParams["aml_medium"][0];

	// Campaign
	if ("utm_campaign" in gaParams && gaParams["utm_campaign"].length > 1) campaign = gaParams["utm_campaign"];
	if ("aml_campaign" in qyParams && qyParams["aml_campaign"].length >= 1) campaign = qyParams["aml_campaign"][0];

	// Content
	if ("utm_content" in gaParams && gaParams["utm_content"].length > 1) content = gaParams["utm_content"];
	if ("aml_content" in qyParams && qyParams["aml_content"].length >= 1) content = qyParams["aml_content"][0];

	// Term
	if ("utm_term" in gaParams && gaParams["utm_term"].length > 1) content = gaParams["utm_term"];
	if ("aml_term" in qyParams && qyParams["aml_term"].length >= 1) content = qyParams["aml_term"][0];
	
	accessmylan.tracker.setCampaignParam('aml_campaign', campaign);
	accessmylan.tracker.setCampaignParam('aml_medium', medium);
	accessmylan.tracker.setCampaignParam('aml_source', source);
	accessmylan.tracker.setCampaignParam('aml_content', content);
	accessmylan.tracker.setCampaignParam('aml_term', term);

};

accessmylan.Tracker.prototype.flushCampaignInfo = function() {
	
	this.campaign = {};
	var cookieString = 'AMLCAMPAIGNINFO=undefined;expires=Fri, 02-Jan-1970 00:00:00 GMT;path=/;domain=.accessmylan.com';
	window.document.cookie = cookieString;		
};

accessmylan.Tracker.prototype.launchAB = function(a, b, page) { 

	var siteA = "a";
	var siteB = "b";
	var landing = "index.html";

	if (a) siteA = a; 
	if (b) siteB = b; 
	if (page) landing = page; 

	var siteDir = siteA;
	var query = "";
	if (location.search.substring(1).length > 0)
	{
		query = "?" + location.search.substring(1);
	}
	try {
		var lastSite = accessmylan.tracker.getSiteAB();
		if (lastSite != null && lastSite.length > 0) {
			siteDir = lastSite;
		} else {
			if (accessmylan.tracker.isOdd()) {
				siteDir = siteA;
			} else {
				siteDir = siteB;
			}
		}
	} catch (e) {
	}
		
	var baseURL = "";
	var path = "/";
	var parts = document.URL.split("/");
	for (var j=0; j<parts.length-1 && (parts[j].indexOf("?") < 0); j++) {
		baseURL = baseURL + parts[j] + "/"; 
	}
	for (var k=3; k<parts.length-1 && (parts[k].indexOf("?") < 0); k++) {
		path = path + parts[k] + "/"; 
	}
	siteURL = baseURL + siteDir + "/" + landing + query;
	
	accessmylan.tracker.flushCampaignInfo();
	accessmylan.tracker.setSiteAB(siteDir, path);
	accessmylan.tracker.saveCampaignInfo();

	window.location.replace(siteURL);
};
