/**
 * @author aanda
 */

var visitData = new Object();
var startTime = new Date().getTime();
var lastTarget = false;
var eventLog = new Array();
var activityTimer = false;
var lastUserEvent = 0;
var lastLogEvent = 0;
var logFrame = false;
var debugMode = false;
var debriefed = false;
var inFocus = true;

function initLogger() {
	var frameHeight = 0;
	var frameWidth = 0;
	if(debugMode) {
		frameHeight = 200;
		frameWidth = 400;
	}		
		
	MochiKit.Signal.connect(document.body, "onclick",logClick);
	MochiKit.Signal.connect(document.body, "onmousemove",logMove);
	MochiKit.Signal.connect(document.body, "onkeypress",logKey);
	MochiKit.Signal.connect(document.body, "onkeydown",logKey);
	MochiKit.Signal.connect(document.body, "onscroll",logScroll);
	MochiKit.Signal.connect(window, "onblur",logBlur);
	MochiKit.Signal.connect(window, "onfocus",logFocus);
	
	MochiKit.Signal.connect(window, "onresize",logResize);
	
	
	//MochiKit.Signal.connect(document.body, "onbeforeunload",unloadLog);
	
	populateVisitData();
	activityTimer = window.setInterval(doTimer, 1500);	
	logFrame = document.createElement("iframe");
	MochiKit.DOM.setNodeAttribute("height", logFrame, frameHeight);
	MochiKit.DOM.setNodeAttribute("width", logFrame, frameWidth);
	MochiKit.DOM.setNodeAttribute("id", logFrame, "logFrame");	
	logFrame.height = frameHeight;
	logFrame.width = frameWidth;
	//MochiKit.DOM.setNodeAttribute("src", logFrame, "/lab/funnel/debrief/save.cfm");
	logFrame.src = "/lab/funnel/debrief/save.cfm";
	document.body.appendChild(logFrame);
}

function doTimer() {

	var curTime = new Date().getTime() 
	if(eventLog.length) {
		lagSinceActive = curTime - eventLog[eventLog.length-1].timestamp;
	} else {
		lagSinceActive = 0;
	}
	if((curTime - lastUserEvent) > 20000 && (!lastLogEvent ) && eventLog.length > 20) {
		// Disabled re-saving || (curTime - lastLogEvent) > 90000
		//alert("Lag Save");
		triggerSave(0);
		
	}
}

function unloadLog() {
	//alert('saved po');
	triggerSave(1);
	if(!debriefed) {
		var debriefed = getDebrief();
	}
	
}

function getDebrief() {
	
	
}

function delay(ms)
{
	var curDate = new Date();
	var nowDate;
	do { nowDate = new Date(); }
	while(nowDate-curDate < ms);
} 

function triggerSave(isComplete) {
	//alert('framing')
	if(!isComplete) isComplete = 0;

		//MochiKit.Signal.connect(logFrame, "onload", saveData);
	lastLogEvent = new Date().getTime();
	var innerDoc = (logFrame.contentDocument) ? logFrame.contentDocument : logFrame.contentWindow.document; 
	//alert(innerDoc + innerDoc.getElementById("sessionIdForm"));
	logFrame.contentWindow.eventLog = eventLog;
	logFrame.contentWindow.visitData = visitData;
	//logFrame.contentDocument.visitData.model =  Save Model, TODO
	innerDoc.getElementById("sessionIdForm").value = visitData.guid;
	innerDoc.getElementById("isCompleteForm").value = isComplete;
	
	MochiKit.Signal.disconnect("onload");
	myWddxSerializer = new WddxSerializer();
			//alert(visitData);
 	xvisitData = myWddxSerializer.serialize(visitData);
 	xeventLog = myWddxSerializer.serialize(eventLog);
	innerDoc.getElementById("eventLogForm").value = xeventLog;
	innerDoc.getElementById("visitDataForm").value = xvisitData;
			
 	innerDoc.getElementById("saveForm").submit();
			
	//logFrame.contentWindow.savePopulate();
	delay(1500);
	//MochiKit.Signal.connect(logFrame, "onload", postSave);

}

function postSave() {
	//document.body.removeChild(document.getElementById("logFrame"));
	//alert('saved')
	logFrame.src = "/lab/funnel/debrief/save.cfm";
	
}

function populateVisitData() {
	visitData.referer = document.referrer;
	visitData.useragent = navigator.userAgent;	
	visitData.width = screen.width;
	visitData.height = screen.height;
}

function getNodeTypeOffset(node) {
	var count = 0;
	var offset = 0;
	var parent = node.parentNode;
	while (parent.childNodes.item(offset) != node && parent.childNodes.length > offset){
		if(parent.childNodes.item(offset).nodeName == node.nodeName) count++		
		offset++;
	}
	return count;
}

function getNodeInfo(node) {
	var id = MochiKit.DOM.getNodeAttribute(node, "id");
	var className = node.className;
	var nodeName = node.nodeName + "(" + getNodeTypeOffset(node) + ")";
	return id + ',' + className + ',' + nodeName;
	
}
function getDomPath(node) {
	var path; 
	if(node.nodeName != 'BODY') {
	path = getNodeInfo(node);
	return path + ';' + getDomPath(node.parentNode);
	} else {
		return '';
	}
}
function logEvent(e) {
	if(e) {
	lagSinceActive = 0;
	offset = eventLog.length;
	var curTime = new Date().getTime();
	eventLog[offset] = new Object();
	eventLog[offset].type = e.type();
	eventLog[offset].timestamp = curTime - startTime;
	if(e.type().indexOf("resize") > -1) {
		eventLog[offset].swidth = screen.width;
		eventLog[offset].sheight = screen.height;
	}

	if(e.type().indexOf("key") > -1 ) {
		eventLog[offset].keycode = e.key().code;
		eventLog[offset].keystring = e.key().string;	
	}
	lastUserEvent = curTime;
	if(e.mouse()) {	
		eventLog[offset].x = e.mouse().page.x;
		eventLog[offset].y = e.mouse().page.y;
	}
	if(e.type().indexOf("click") > -1) {
		if(e.target() && e.target().href) eventLog[offset].href = e.target().href
	}
	if(e.type().indexOf("blur") == -1) eventLog[offset].domPath = getDomPath (e.target());
	}
}

function logScroll(e) {
	logEvent(e);
}
function logResize(e) {
	logEvent(e);
}
function logKey(e) {
	//alert(e.key().string);
	//alert(eventLog.length);
	logEvent(e);	
}

function logBlur(e){
	if(inFocus) {
		inFocus = false;
	} else {
		inFocus = true;
	}
	logEvent(e);
	
}

function logFocus(e){
	logEvent(e);
}

function logMove(e) {
	var offset;
	if(e.target() != lastTarget) {
		lastTarget = e.target();	
		logEvent(e);
		
	}
}

function logClick(e) {
	
	//alert(startTime + ' ' + e.mouse().page.y + ' ' + e.mouse().page.x);
	logEvent(e);
	
}
