// CLASS TRACKER
// ================================================================

var Tracker = new Object();

Tracker.track = function(theEvent) {

	// Get Event
	var event = '';
	if (typeof(theEvent) != 'undefined') {
		event = theEvent;
	}

	// Get the currently visited page
	var page = window.location.pathname;

	// Get referer and find out if it is an external referer
	var referer = document.referrer;
	var externalReferer = false;
	if (referer != '') {
		var regEx = new RegExp('^(?:f|ht)tp(?:s)?\://([^/]+)', 'im');
		var hostname = referer.match(regEx)[1].toString();
		if (hostname.indexOf('culturedcode.com') == -1) {
			externalReferer = true;
		}
	}
		
	// Should this visit be tracked? Determined later...
	var tracking = false;


	// Is this the first visit?
	if (Cookie.get('uuid') == '') {
		
		// Generate UUID
		var uuid = UUID.generate();
		//alert('generate uuid');
		
		// Try to store UUID in cookie
		if (Cookie.set('uuid', uuid, 365)) {
			// If a cookie could be stored, track this visit
			tracking = true;
		} else {
			// else don't track because it would otherwise pollute the tracking data
			tracking = false;
		}
	
	// Has an Event been triggered?
	} else if (event != '') {
		tracking = true;
		
	// Is it an external referer (blog, review, google,...)?
	} else if (externalReferer) {
		tracking = true;
	}


	
	// The actual tracking...
	if (tracking) {
	
		// Retrieve UUID
		var uuid = Cookie.get('uuid');
		
		// Send UUID, page, referer, and event to server
		AJAX.request('http://culturedcode.com/scripts/testAdTrackingDatabase.php?uuid='+uuid+'&page='+escape(page)+'&referer='+escape(referer)+'&event='+event);
		//alert('http://culturedcode.com/scripts/tracker.php?uuid='+uuid+'&page='+escape(page)+'&referer='+escape(referer)+'&event='+event);
	}

}








// CLASS UUID
// ================================================================
// http://www.af-design.com/resources/javascript_uuid.php

var UUID = new Object();

UUID.generate = function() {
	var dg = new Date(1582, 10, 15, 0, 0, 0, 0);
	var dc = new Date();
	var t = dc.getTime() - dg.getTime();
	var h = '-';
	var tl = UUID.getIntegerBits(t,0,31);
	var tm = UUID.getIntegerBits(t,32,47);
	var thv = UUID.getIntegerBits(t,48,59) + '1';
	var csar = UUID.getIntegerBits(UUID.rand(4095),0,7);
	var csl = UUID.getIntegerBits(UUID.rand(4095),0,7);
	var n = UUID.getIntegerBits(UUID.rand(8191),0,7) + 
			UUID.getIntegerBits(UUID.rand(8191),8,15) + 
			UUID.getIntegerBits(UUID.rand(8191),0,7) + 
			UUID.getIntegerBits(UUID.rand(8191),8,15) + 
			UUID.getIntegerBits(UUID.rand(8191),0,15);
	return tl + h + tm + h + thv + h + csar + csl + h + n;
}

UUID.getIntegerBits = function(value, start, end) {
	var base16 = UUID.returnBase(value,16);
	var quadArray = new Array();
	var quadString = '';
	var i = 0;
	for (i=0; i<base16.length; i++){
		quadArray.push(base16.substring(i,i+1));	
	}
	for (i=Math.floor(start/4); i<=Math.floor(end/4); i++){
		if(!quadArray[i] || quadArray[i] == '') quadString += '0';
		else quadString += quadArray[i];
	}
	return quadString;
}


UUID.returnBase = function(number, base) {
	return (number).toString(base).toUpperCase();
}

UUID.rand = function(max) {
	return Math.floor(Math.random() * (max + 1));
}




// CLASS AJAX
// ============================================================

var AJAX = new Object();

AJAX.request = function(url) {
	httpRequest = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		httpRequest = new XMLHttpRequest();
		if (httpRequest.overrideMimeType) {
			httpRequest.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!httpRequest) {
		//alert('Cannot create XMLHTTP instance');
		return false;
	}
	//httpRequest.onreadystatechange = ajaxAlertContents;
	httpRequest.open('GET', url, true);
	httpRequest.send(null);
}






// CLASS COOKIES
// ============================================================

var Cookie = new Object();

Cookie.set = function(name, value, days) {
	var date = new Date();
	var expiration = date.getTime() + (1000*60*60*24)*days;
	date.setTime(expiration);
	document.cookie = name + "=" + value +"; expires=" + date.toGMTString() + "; path=/; domain=.culturedcode.com";
	// If cookie was accepted return true
	if (value == Cookie.get(name)) { 
		return true; 
	} else {
		return false;
	}
}

Cookie.get = function(name) {
	if (document.cookie) {
		name = name + "=";
		var array = document.cookie.split(';');
		for (var i=0; i < array.length; i++) {
			var c = array[i];
			while (c.charAt(0)==' ') 
				c = c.substring(1,c.length); // removing spaces
			if (c.indexOf(name) == 0) 
				return c.substring(name.length,c.length);
		}
	}
	return '';
}

Cookie.getString = function() {
	if (document.cookie) {
		var cookieString = "";
		var a = document.cookie.split(';');
		for (var i=0; i < a.length; i++) {
			while (a[i].charAt(0)==' ') a[i] = a[i].substring(1,a[i].length); // remove spaces
			cookieString += a[i] + "&";
		}
		cookieString = cookieString.substring(0,cookieString.length-1); // remove last "&"
		return cookieString;
	}
	return '';
}






