dojo.provide('mq.diagnostics');

/**
 * Diagnostic tools.  Please note that if changing the public functions, the corresponding
 * diagnostics.prod.js needs to be updated as well.
 */
mq.diagnostics=new (function() {
	var bufferTimeout,buffer=null;

	function setBuffer(newBuffer) {
		buffer=newBuffer;
		if (bufferTimeout) clearTimeout(bufferTimeout);
		if (typeof newBuffer=='string') {
			bufferTimeout=setTimeout(function() {
				buffer=null;
				bufferTimeout=null;
			}, 1000);
		}
	}
	
	function handleKey(evt) {
		var c;
		if (evt.charCode) c=String.fromCharCode(evt.charCode); 
		//var c=String.fromCharCode(evt.keyCode || evt.charCode);
		if (typeof buffer=="string") {
			if(c){
				setBuffer(buffer+c);
			}
			processBuffer(buffer);
			return true;
		}
		
		// Note that on Safari keyCode seems to be more significant than charCode
		/*debug("KEY: ctrlKey=" + !!evt.ctrlKey + ", shiftKey=" + !!evt.shiftKey +
			", char='" + c + "', keyCode='" + evt.keyCode + "', charCode='" + evt.charCode + "'");*/
		if (evt.ctrlKey && evt.shiftKey) {
		  if ((c=='M' || c=='m')) {
		    // This picks up CTRL-SHIFT-M on most browsers
		    setBuffer("");
		    processBuffer(buffer);
		    
		    return true;
		  }
		}
		return false;
		
	}

	function initialize() {
		dojo.connect(document, "onkeypress", handleKey);
	}
	
	function processBuffer(buffer) {
		if (buffer=="a") {
			setBuffer(null);
			activateDiagWindow("Ad_Report");
		} else if (buffer=="j") {
			setBuffer(null);
			jsanalDump();
		}else if (buffer=="o") {
			setBuffer(null);
			showDebugger();
		}else if(buffer=="i"){
			//import gps device
			$d("gps").innerHTML='<iframe name="iframe_gps" id="iframe_gps" src="/controller/mainui/gps?import" style="width:0;height:0;visibility:hidden;"></iframe>'
		}else if(buffer=="e"){
			$d("gps").innerHTML='<iframe name="iframe_gps" id="iframe_gps" src="/controller/mainui/gps?export" style="width:0;height:0;visibility:hidden;"></iframe>'
		}
	}
	
	// JSAnal
	function jsanalDump() {
		if (window.JSAnal) {
			window.JSAnal.printBanner();
			window.JSAnal.dump();
		} else {
			debug("JSAnal not installed");
		}
	}
	
	// Window management
	var diagWins={};
	
	function activateDiagWindow(name) {
		var w=diagWins[name];
		if (!w) w=openDiagWindow(name);
		if (w) w.focus();
	}
	
	function openDiagWindow(name) {
		var w=window.open("about:blank", "dg_"+name, "height=640,width=480,scrollbars,resizable", true);
		if (!w) {
			alert("Popup blocker blocked window opening");
			return null;
		}
		w.opener=window;
		diagWins[name]=w;
		dojo.connect(w, "onunload", function() {
			debug("Closed window");
			delete diagWins[name];
		});
		w.document.write("<html><head><title>Diagnostic " + name + "</title></head><body></body></html>");
		w.document.close();
		return w;
	}
	
	/**
	 * Setup key bindings for on load
	 */
	this.hookLoad=function() {
		dojo.addOnLoad(initialize);
	};
	
	/**
	 * Whether we have a diagnostic window
	 */
	this.hasDiagWindow=function(name) {
		return !!diagWins[name];
	};
	
	/**
	 * Add HTML to a diagnostic window
	 */
	this.diagWindowAdd=function(name, html) {
		var w=diagWins[name];
		if (!w) return;
		var body=w.document.body;
		if (!body) return;
		
		var dv=w.document.createElement("div");
		dv.className="group";
		if (body.firstChild) body.insertBefore(dv, body.firstChild);
		else body.appendChild(dv);
		
		var h=w.document.createElement("h3");
		h.className="group-header";
		h.appendChild(w.document.createTextNode("Event log " + new Date().toString()));
		dv.appendChild(h);
		
		var bdv=w.document.createElement("div");
		bdv.className="group-body";
		dv.appendChild(bdv);
		bdv.innerHTML=html;
	};
	
	
	showDebugger = function(){
		dojo.removeClass(document.getElementById("userActionDebugger").parentNode, 'hiddenButPresent');
		document.getElementById("userActionDebugger").style.visibility = 'visible';
		document.getElementById("clearLogger").style.visibility = 'visible';
		document.getElementById("closeLogger").style.visibility = 'visible';
	};
	
	clear = function(){
		//Clears debugger
		document.getElementById("userActionDebugger").value = "";
	};	
})();

debug = function(logThis){
      //Provides a debugger helpful for QAing the reporting requests
      var dbgr = document.getElementById("userActionDebugger");
      if(dbgr){
           var current = dbgr.value;
           dbgr.value = current + "\n" + logThis;
           dbgr.value = dbgr.value;
           dbgr.scrollTop = dbgr.scrollHeight;
      }
};

