// Configuration
//max size of samples we collect before we send them
var maxsize = 20;
//URL to track.php (must be same domain)
var trackingurl = "track.php";
// end Configuration

// Initialisation
var xOffset,yOffset;
var tempX = 0;
var tempY = 0;
var tmpsize = 0;
var tmpdata = "";
var session = randomString();

//detect browser
var IE = document.all?true:false
if(!IE){document.captureEvents(Event.MOUSEMOVE)}

var firstElement=document.getElementsByTagName('body')[0].childNodes[1];

xOffset=findPosX(firstElement);
yOffset=findPosY(firstElement);

if (IE)
{
	var marginLeftExplorer  = parseInt(document.getElementsByTagName('body')[0].style.marginLeft);
	var marginTopExplorer   = parseInt(document.getElementsByTagName('body')[0].style.marginTop);
	if (isNaN(marginLeftExplorer)) {marginLeftExplorer=10;}
	if (isNaN(marginTopExplorer)) {marginTopExplorer=15;}
	xOffset=xOffset+marginLeftExplorer;
	yOffset=yOffset+marginTopExplorer;
}
document.onmousemove = getMouseXYmove;
window.setInterval("startMouseMove()", 50);
document.onmousedown = getMouseXYclick;

function startMouseMove(){document.onmousemove = getMouseXYmove;}
/*Functions*/
/*Find positions*/
function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	}
	else if (obj.x){curleft += obj.x;}
	return curleft;
}
 
function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if (obj.y){curtop += obj.y;}
	return curtop;
}
function getMouseXYclick(e) 
{
	if (IE) 
	{
		tempX = event.clientX + document.body.scrollLeft
		tempY = event.clientY + document.body.scrollTop
		tempX-=xOffset;
		tempY-=yOffset;
	} 
	else 
	{
		tempX = e.pageX
		tempY = e.pageY
	}
	
	callPHP(tempX,tempY,"c");
	return true;
}
function getMouseXYmove(e)
{
	
	document.onmousemove=null;
	if (IE) 
	{
		tempX = event.clientX + document.body.scrollLeft
		tempY = event.clientY + document.body.scrollTop
		tempX-=xOffset;
		tempY-=yOffset;		
	} 
	else 
	{
		tempX = e.pageX
		tempY = e.pageY
	}

	callPHP(tempX,tempY,"m");
	return true;
}
function callPHP(x,y,e)
{
	if(tmpsize < maxsize)
	{
		if(x < 10) 		  x = "000"+x;
		else if(x < 100)  x = "00"+x;
		else if(x < 1000) x = "0"+x;
		
		if(y < 10) 		  y = "000"+y;
		else if(y < 100)  y = "00"+y;
		else if(y < 1000) y = "0"+y;
		tmpdata += x+y+e;
		//if we have a click, we always send the packets.
		if(e == "c") tmpsize = maxsize;
		else tmpsize++;
	}
	
	if(tmpsize == maxsize)
	{
		var xmlDoc = null;
		var url = Base64.encode(window.location.href);
		if(typeof window.ActiveXObject != 'undefined'){xmlDoc = new ActiveXObject('Microsoft.XMLHTTP');}
		else{xmlDoc = new XMLHttpRequest();}
//alert("track.php?d=" + tmpdata + "&l=" + url + "&s=" + session);
		xmlDoc.open( 'GET', trackingurl+"?d=" + tmpdata + "&l=" + url + "&s=" + session, true );
		xmlDoc.send( null );
		
		tmpsize = 0;
		tmpdata = "";
	}
}
function hm_loadHeatmap()
{
	var div = document.createElement('img');
	var body = document.getElementsByTagName('body')[0];
    div.src = 'graph.php';
    div.zindex = -1;
    body.zindex = 1;
    div.style.position = 'absolute';
    div.style.left = '0px';
    div.style.top = '0px';
    body.appendChild(div);
}
var Base64 = {
 	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 		input = Base64._utf8_encode(input);
 		while (i < input.length) {
 			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 			if (isNaN(chr2)) { enc3 = enc4 = 64;} 
 			else if (isNaN(chr3)) {enc4 = 64;}
 			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 		}
 		return output;
	},
 	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 		while (i < input.length) {
 			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 			output = output + String.fromCharCode(chr1);
 			if (enc3 != 64) {output = output + String.fromCharCode(chr2);}
			if (enc4 != 64) {output = output + String.fromCharCode(chr3);}
 		}
 		output = Base64._utf8_decode(output);
 		return output;
 	},
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
		for (var n = 0; n < string.length; n++) {
			var c = string.charCodeAt(n);
			if (c < 128) {utftext += String.fromCharCode(c);}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);}
			else {utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
		}
 		return utftext;
	},
 	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 		while ( i < utftext.length ) {
 			c = utftext.charCodeAt(i);
 			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 		}
 		return string;
	}
}

function randomString() {
	var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
	var string_length = 32;
	var randomstring = '';
	for (var i=0; i<string_length; i++) {
		var rnum = Math.floor(Math.random() * chars.length);
		randomstring += chars.substring(rnum,rnum+1);
	}
	return randomstring;
}
