// Namespace
// tinglySession 

var TINGLY_DEBUG = 0;
var TINGLY_PROMPT = 0;
var TINGLY_SHOW_RECORDING_TRACK;
var TINGLY_RECORD_SESSION_ID;
var TINGLY_PLAYBACK_SESSION_ID = 6;
var ajaxObject = null;
var TINGLY_SESSION_ID;

//window.onload = tinglyINIT;
//tinglyINIT();

// =====================================================================
// All the function definition

function tinglyMouseTracker(x, y, c, h, txt)
{
	// looks at the coordinate and moves the div
	var box = document.createElement('div');
	box.className = 'tingly-box';
	box.style.backgroundColor = c;
	box.style.width = h + 'px';
	box.style.height = h +'px';
	box.style.left = x + 'px';
	box.style.top = y + 'px';
	box.innerHTML = txt;
	document.body.appendChild(box);
}

function tinglyAjaxDataFunction()
{
	var state = ajaxObject.readyState;
	if (state == 4) {
		ajaxObject = null;
	}
}

function tinglyAjaxPrimaryDataFunction()
{
	var state = ajaxPrimaryObject.readyState;
	var msg = 'fn'+state;
	for (var i in ajaxPrimaryObject)
	{
		msg += 'ajaxPrimaryObject[\''+i+'\'] is ' + ajaxPrimaryObject[i];
	}

	alert("msg = "+msg);
	if (state == 4) {
		alert("state 4")
		var output = ajaxPrimaryObject.responseText;
		alert("output : "+output);
		ajaxPrimaryObject = null;
	}
}

function tinglySendPrimaryDataToServer()
{
	ajaxPrimaryObject = getAjaxObject(); //new XMLHttpRequest();

	var url = 'http://scoresofsteel.org/tingly/tinglyserver.php?';
	url += 'stat=primary&hostName='+location.hostname+'&path=1';
	alert("url :"+url);
	ajaxPrimaryObject.open('GET', url, true);
	ajaxPrimaryObject.onreadystatechange = tinglyAjaxPrimaryDataFunction;
	ajaxPrimaryObject.send(null);
}

function tinglySendDataToServer(x, y, t)
{
	ajaxObject = getAjaxObject(); //new XMLHttpRequest();

	var url = 'http://scoresofsteel.org/tingly/tinglyserver.php?';
	url += 'sessid='+TINGLY_SESSION_ID+'&x='+x+'&y='+y+'&t='+t;

	if (TINGLY_DEBUG) {
		document.title = 'its tingly! url='+url;
	}
	ajaxObject.open('GET', url, true);
	ajaxObject.onreadystatechange = tinglyAjaxDataFunction;
	ajaxObject.send(null);
}

function tinglyMouseHandler(event)
{
	// process the mouse movement
	// get the x and y coordinates
	//x = event.clientX;
	//y = event.clientY;
	x = event.pageX;
	y = event.pageY;
	var d = new Date();
	t = d.getTime();

	// if SHOW_RECORDING_TRACK
	//	create a div

	// send it to server for the session recording
	// check if there is already a request underway then dont do anything
	if (!ajaxObject || (ajaxObject.requestState == 4)) {
		// all lines are clear
		tinglySendDataToServer(x, y, t);
		if (TINGLY_DEBUG) { tinglyMouseTracker(x, y, '#00ff00', 6, '');} // 6
		return;
	}
	else {
		if (TINGLY_DEBUG) { tinglyMouseTracker(x, y, '#ff0000', 1, ''); } // 1
	}

	// improve this to buffering scheme
	// take the ajaxObject, sessionID and send to server
}

function tinglyAddListenerForRecording()
{
	if (!TINGLY_SESSION_ID) {
		if (TINGLY_DEBUG) { document.title += '[err:rec]'; }
		return;
	}

	window.addEventListener('mousemove', tinglyMouseHandler, false);
}

function tinglyConnectToClient()
{
	ajaxObject = getAjaxObject(); //new XMLHttpRequest();
	if (!ajaxObject) {
		return 0;
	}

	return 1;
}

function tinglyAjaxConnectionFunction()
{
	if (ajaxObject.readyState != 4) {
		return;
	}

	if ((ajaxObject.status == 200) || (ajaxObject.status == 304)) {
		// successful request
		TINGLY_SESSION_ID = ajaxObject.responseText;
		if (TINGLY_DEBUG) { document.title += '[succ:1]'+TINGLY_SESSION_ID; }
		// clear up the ajaxObject for reuse
		ajaxObject = null;
		tinglyAddListenerForRecording();
		return;
	}

	if (TINGLY_DEBUG) { document.title += '[errs:'+ajaxObject.statusText+']('+ajaxObject.responseText + ')'; }
	return;
}

function tinglyConnectToServerRecording()
{
	//ajaxObject = new XMLHttpRequest();
	// connect to server and get session id
	if (TINGLY_DEBUG) {
		if (ajaxObject) {
			document.title += '[ao:fine]';
		}
		else {
			document.title += '[ao:err]'; 
		}
	}

	var url = 'http://scoresofsteel.org/tingly/tinglyserver.php';
	//var params = 'getsessid=1&hostName='+location.hostname+'&path=1';
	url += '?getsessid=1&hostName='+location.hostname+'&path=1';

	// return tinglySESSID
	ajaxObject.open('GET', url, true); // was true
	ajaxObject.onreadystatechange = tinglyAjaxConnectionFunction;
	ajaxObject.send(null);
}

function tinglyAjaxPlaybackFunction()
{
	if (ajaxObject.readyState != 4) {
		return;
	}

	var text = ajaxObject.responseText;


	var dataArr = text.split(' ');
	var size = dataArr.length / 3;

	if (size > 1) {
		var baseTime = 0;
		for (i = 1; i < size; i++) {
			j = 3*i;
			var x = dataArr[j];
			var y = dataArr[j + 1];
			var t = dataArr[j + 2];
			if (baseTime == 0) {
				baseTime = t;
			}
			var diffTime = t - baseTime;
			var mess = i + '@' + diffTime;
			tinglyMouseTracker(x, y, '#00ff00', 6, mess);
		}
	}
}

function tinglyConnectToServerPlayback()
{
	// connect to server and get  session id
	if (TINGLY_DEBUG) {
		if (ajaxObject) {
			document.title += '[ao:fine]';
		}
		else {
			document.title += '[ao:err]'; 
		}
	}

	var url = 'http://scoresofsteel.org/tingly/tinglyserver.php?sid='+TINGLY_PLAYBACK_SESSION_ID;
	ajaxObject.open('GET', url, true);
	ajaxObject.onreadystatechange =  tinglyAjaxPlaybackFunction;
	ajaxObject.send(null);
}

function tinglyPrompt()
{
	var id = 0;
	if (TINGLY_PROMPT) {
		id = prompt("To record, just press 'ok'. To playback enter the id",'0');
	}
		
	if (id == null || id == '') {
		TINGLY_PLAYBACK_SESSION_ID = 0;
	}
	else {
		TINGLY_PLAYBACK_SESSION_ID = id / 1;
	}
	
}

function tinglyINIT()
{
	tinglyPrompt();

	// debug information displayed on the title bar
	if (TINGLY_DEBUG) {
		if (TINGLY_PLAYBACK_SESSION_ID) {
			document.title = 'its tingly! [playback='+
				TINGLY_PLAYBACK_SESSION_ID+']';
		}
		else {
			document.title = 'its tingly! [recording:'+TINGLY_PLAYBACK_SESSION_ID+']';
		}
	}
	//alert('WOWOWO');
	// check if ajax is working on the client side/, if not move out
	if (!tinglyConnectToClient()){ 
		if (TINGLY_DEBUG) { document.title += '[ajax failed]'; }
		return;
	}
	else {
		if (TINGLY_DEBUG) { document.title += '[1]'; }
	}

	// check if server is ok

	if (TINGLY_PLAYBACK_SESSION_ID) {
		tinglyConnectToServerPlayback();
	}
	else {
		//tinglySendPrimaryDataToServer();
		tinglyConnectToServerRecording();
	}
}

function getAjaxObject() 
{
        var xmlhttp = false;
        if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
                try {xmlhttp = new XMLHttpRequest();}
                catch (e) {xmlhttp = false;}
        }

        if(!xmlhttp && typeof ActiveXObject != "undefined") {
           try{ xmlhttp=new ActiveXObject("MSXML2.XMLHTTP"); }catch(e){xmlhttp=false;}
           if(!xmlhttp)try{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){xmlhttp=false;}
        }

        return xmlhttp;
}

