/**
 * Z powodu gorszej implementacji setInterval w IE, tworzymy
 * globalną zmienną z odwołaniem do trackera.
 */
var _NTXT_MouseTrackerRef = null;


/**
 * uruchamia zapis pozycji myszy w zadanych odstępach przez zadany
 * czas od wczytania strony. Zapisy wysyłane są na zadany URL, gdzie
 * powinna je obsługiwać odpowiednia usługa.
 * @param {int} 	testDelay	okres między kolejnymi pozycjami zapisami w milisekundach,
 * @param {int} 	timeLimit	maksymalny czas w sekundach, przez jaki zapis jest aktywny od wczytania strony
 */
function mouseTracker(delayMillsecs, timeLimit, id)
{
	var serviceUrl = 'http://mtrack.ntxt.net/logTrack.php';
	var timerID;
	var lastX;
	var lastY;
	var count;
	var uid;
	var now = new Date;
	
	this.id = window.location.host + '-' + now.getTime();
	this.startTime = now.getTime();
	this.positions = [];
	this.url = serviceUrl;
	this.delay = delayMillsecs;
	// co ile eventów wysyłamy porcję na serwer
	this.setCount(Math.floor(1000 * timeLimit / this.delay));
	// dla IE
	_NTXT_MouseTrackerRef = this;
}


mouseTracker.prototype.start = function(uid) {
	this.uid = uid;
	var me = this;
	jQuery().bind('mousemove',{scope:me}, me.savePos);
	jQuery().bind('click',{scope:me}, me.saveClick);
	jQuery(window).bind('unload',{scope:me}, me.unloadHandler);
	me.timerID = setInterval(me.sendPosition, me.delay, {scope:me});
}

mouseTracker.prototype.setCount = function(c){
	var me = this;
	me.count = c;
}

mouseTracker.prototype.savePos = function(e){
	var me			= e.data.scope;
	var elapsed		= (new Date).getTime() - me.startTime;
	var pageCenter	= jQuery(document).width() * 0.5;
	
	me.lastX = e.pageX - pageCenter;
	me.lastY = e.pageY;
	//$('#debug').html('x: ' + e.pageX + ', y:' + e.pageY + '...count: ' + me.count + ', pos: ' + me.positions.length);
	me.positions.push('m,' + elapsed + ',' + me.lastX + ',' + me.lastY);
}

mouseTracker.prototype.saveClick = function(e){
	var me			= e.data.scope;
	var elapsed		= (new Date).getTime() - me.startTime;
	me.positions.push('c,' + elapsed + ',' + me.lastX + ',' + me.lastY);
}

mouseTracker.prototype.finish = function(){
	var me = this;
	clearInterval(me.timerID);
	jQuery().unbind('mousemove', me.savePos);
}

mouseTracker.prototype.unloadHandler = function(e){
	var me			= e.data.scope;
	me.sendPosition(e.data);
}

mouseTracker.prototype.sendPosition = function(params){
	if(!params || !params.hasOwnProperty('scope'))
		me = _NTXT_MouseTrackerRef;
	else{
		var me = params.scope;
	}
	me.count--;

	if(me.positions.length > 0){
		if (me.uid) {
			var encoded = me.uid + '|' + me.id + '|' + window.location.href + ';' + me.positions.join(';');
		} else {
			var encoded = me.id + '|' + window.location.href + ';' + me.positions.join(';');
		}
		if(encoded != ''){
			var img = new Image;
			img.src = me.url + '?q=' + encoded;
		}
		me.positions = [];
	}
	if(me.count < 0) {
		me.finish();
	}else{
		//$('#trace').html(':: ' + me.count);
	}
}

var tracker = new mouseTracker(2000, 60);tracker.start('');


