// **** DEBUG UTILITIES **** //
// **** DEBUG UTILITIES **** //
// **** DEBUG UTILITIES **** //
gDebug.version = 20090527;
// check browsers //
for(var x in gBrowser.browsers){
	if(navigator.userAgent.indexOf(gBrowser.browsers[x]) != -1){
		gBrowser.vendor = gBrowser.browsers[x]
		gBrowser.version = navigator.vendorSub;
		break;
	}
	
	gBrowser.os = (navigator.platform == "Win32")? "windows" : navigator.platform;
	gBrowser.ie6 = false;
	gBrowser.safari_win = false;
}

// check for IE //
if(!gBrowser.vendor){
	if(navigator.appMinorVersion){
		gBrowser.vendor = navigator.appName.split(" ")[0];
	}
}

switch(gBrowser.vendor){
	case "Microsoft":
		gBrowser.vendor = "IE";
		lUserAgent = navigator.userAgent.split(";");
		gBrowser.version = lUserAgent[1].split(" ")[2];
		// Only support IE versions 5.0+ //
		if(gBrowser.version >= "6.0"){
			gBrowser.supported = true;
		}
		if(gBrowser.version < "7.0"){
			gBrowser.support_png = false;
			gBrowser.ie6 = true;
		}
		
		break;
	case "Netscape":
		// Only support Netscape versions 7.1+ //
		if(gBrowser.version >= "7.1"){
			gBrowser.supported = true;
		}
		break;
	case "Firefox":
			gBrowser.supported = true;
			// Support al Firefox browsers //
			if(gBrowser.version == ""){
				var lVersion = navigator.userAgent.split("/");
				gBrowser.version = lVersion[lVersion.length-1];
			}
		break;
	case "Flock":
			gBrowser.supported = true;
			if(gBrowser.version == ""){
				var lVersion = navigator.userAgent.split("/");
				gBrowser.version = lVersion[lVersion.length-1];
			}
		break;
	case "Opera":
			gBrowser.supported = true;
			if(!gBrowser.version){
				var lVersion = navigator.userAgent.split("/");
				gBrowser.version = lVersion[1].split(" ")[0];
			}
		break;
	case "Safari":
			gBrowser.supported = true;
			var lVersion = navigator.userAgent.split("/");
			gBrowser.version = lVersion[lVersion.length-2].split(" ")[0];
			gBrowser.safari_win = (gBrowser.os == "windows")? true : false;
		break;
	case "Chrome":
			gBrowser.supported = true;
			var lVersion = navigator.userAgent.split("/");
			gBrowser.version = lVersion[lVersion.length-2].split(" ")[0];
		break;
		default:
		 	gBrowser.supported = false;
			gBrowser.version = navigator.userAgent;
			break
}

// redirect unsupported browser //
if(!gBrowser.supported){
	location.href = gPaths.debug + "browser.html";
}

gDebug.init = function(){
	
	// Assign the keypress if gDebug.tools //
	gDebug.functions = [];
	gDebug.functions[0] = {title:"Get Variable",script:"gDebug.getVar()"};
	gDebug.functions[1] = {title:"Browser Info",script:"gDebug.browserInfo()"};
	gDebug.functions[2] = {title:"Show Elements",script:"gDebug.divShow()"};
	gDebug.functions[3] = {title:"View Source",script:"gDebug.viewSource()"};
	gDebug.functions[4] = {title:"Source Files",script:"gDebug.showScripts()"};
	gDebug.functions[5] = {title:"JavaConsole",script:"gDebug.javaConsole()"};
	gDebug.functions[6] = {title:"document.all",script:"gDebug.viewDoc()"};
	gDebug.functions[7] = {title:"Hide Debug",script:"gDebug.hide()"};
	gDebug.functions[8] = {title:"Intranet",script:"gDebug.redirect('intranet')"};
	gDebug.functions[9] = {title:"Print Preview",script:"gDebug.printPreviewIE()"};
	gDebug.functions[10] = {title:"Staff Page",script:"gDebug.redirect('staff')"};

	// SSK 20070319 - Safari has now been added it's own debug section //
	switch(gBrowser.vendor){
		case "IE":
			gDebug.debugList = [0,1,2,4,7,8,9,10];
			window.attachEvent("onscroll", gDebug.scroll);
			//window.attachEvent("onresize", Alert_resize);
			break;
		default:
			window.addEventListener("scroll", gDebug.scroll, false);
			//window.addEventListener("resize", Alert_resize, false);
			if(gBrowser.vendor == "Safari"){
				//gDebug.debugList = [0,1,7];
				gDebug.debugList = [0,1,2,7];
			}else{
				// this is for Firefox error console command //
				if(parseInt(gBrowser.version) >= 3 ){
					gDebug.debugList = [0,1,2,3,7,10];
				}else{
					gDebug.debugList = [0,1,2,3,5,7,10];
				}
			}
			break;
	}
	
	gDebug.initKeyboard();

	var lType = gDebug.title || "DEBUG";
	var s = '<div id="debugtop" class="debugText_titles" style="background:' + gDebug.colors.bgcolor + ';"><span id="debugtitle" class="debugText">'+ lType +'<\/span><\/div>'
	// build the button debug tools //		
	
	for(var i = 0; i<gDebug.debugList.length; i++){
		var lNumber = (gDebug.keyboard)? "#" + (parseInt(i)+1) + " " : "";
		var lStyle = (gDebug.keyboard)? "text-align:left" : "text-align:center";
		s += '<div id="debugbutton_' + i + '" onmouseup="gDebug.debugButtonClick(' + i + ',1);" onmousedown="gDebug.debugButtonClick(' + i + ',0);" onclick="'+ gDebug.functions[gDebug.debugList[i]].script +'; return false;" class="debugButtons"><div id="debugbutton' + i + '"  style="' + lStyle + ';"><span class="debugbutton_number">' + lNumber + '</span>' + gDebug.functions[gDebug.debugList[i]].title +'<\/div><\/div>';
	}
	s += '<div id="debugbottom" class="debugText_titles" style="background:' + gDebug.colors.bgcolor + ';"><span id="debugversion" class="debugText">v' + gDebug.version + '<\/span><\/div>';
	s += '<div id="debugTracerLyr"><\/div>';
	
	gDebug.div = document.createElement('div');
	gDebug.div.id = "debugButtonLayer";
	gDebug.div.innerHTML = s;
	//gDebug.div.style.background = gDebug.colors.bgcolor;
	gDebug.div.style.background = gDebug.colors.bgcolor;
	//gDebug.div.style.borderColor = gDebug.colors.bgcolor;
	// only show the debug tools if the gDebug.tools are enabled //
	if(gDebug.tools){gDebug.div.style.display = "block"};
	document.body.appendChild(gDebug.div);
}


gDebug.initKeyboard = function(){
	if(!gDebug.tools){
		if(gDebug.code){
			(gBrowser.vendor == "IE")? document.onkeypress = gDebug.enable : document.addEventListener("keyup",gDebug.enable,false);
		}
	}else{
		if(gBrowser.vendor == "IE"){
			if(gDebug.keyboard){document.onkeypress = gDebug.debugKeys_ON};
			document.ondblclick = gDebug.mouseDoubleClick;
		}else{
			if(gDebug.keyboard){document.addEventListener("keyup",gDebug.debugKeys_ON,false)};
			document.addEventListener("dblclick",gDebug.mouseDoubleClick,false);
		}
	}
}

gDebug.enable = function(e){
	if(gDebug.code){
		
		if(gBrowser.vendor == "IE"){
			var lCtrlKey = window.event.ctrlLeft;
		}else{
			var lCtrlKey = e.ctrlKey;
		}
		if(!gDebug.code_typed){gDebug.code_typed = ""}
		gDebug.code_typed += (gBrowser.vendor == "IE")? event.keyCode : e.keyCode;
		//gDebug.tracer(gDebug.code_typed,true);
		//if(gDebug.code_typed == "7269827583727370848376797980"){
		if(gDebug.code_typed == gDebug.code){
			//MultiCookieSet("LogOn","HD",1);
			gDebug.code = false;
			gDebug.div.style.display = 'block';
			gDebug.tools = true;
			gDebug.initKeyboard();
			
		}
	}
}

// Keeps the debug tools available on long pages //
gDebug.scroll = function(){
	if(gDebug.tools){
		gDebug.div.style.top = document.documentElement.scrollTop + "px";
	}
}
// Hide the debug Tools // 
gDebug.hide = function(){
	gDebug.div.style.visibility = 'hidden';
}

gDebug.viewDoc = function(){
	
	if(window.event.ctrlLeft){
		var lNum = prompt("What # to start with?", (lNum)? lNum : 0)
	}
	gDebug.getVar("document.all["+lNum+"]")
	lNum++
}

// ***************************** //
// read a variable prompt key #1 //
var lLastVar = null; // init to null
gDebug.getVar = function(p_object, pReturn){
	var lNum = 0;
	if((lLastVar == null) && !p_object){lLastVar = "window.document"}
	
	if(!p_object){
		var lValue = prompt("Which variable do you want to read?", lLastVar)
	}else{
		var lValue = p_object
	}
	
	// Execute a function //
	if(typeof(lValue) == "string"){
		if(lValue.indexOf("()") > 0){
			eval(lValue);
			//lLastVar = lValue;
			return false;
		}
	}
	
	if(lValue != null && lValue != ""){
		lLastVar = lValue;
		if (eval(lValue)=="undefined"){
			alert(lValue + " is not defined")
			}else{
				var lVar = eval(lValue)
				
				if(typeof(lVar)=="object"){

					var s = lValue + "\n\n"
					var t = new String(lValue).bold() + "<br><br>"
					var lTempArray = []
					for(var i in lVar){
						//(typeof(lVar[i])!="function") && 
						if((i != "domConfig") && (typeof(lVar[i])!="unknown")){
							/* inter with gProps???
							if(i=="coookie"){
								//var lSetting = unescape(lVar[i]);
							}else{
								var lSetting = lVar[i];
							}
							*/
							var lSetting = lVar[i];
							
							if(typeof(lVar[i])=="function"){
								var lSetting = new String(lVar[i]).split("(")[0] + "();";
							}
						
							//gDebugOutput.innerHTML = gDebugOutput.innerHTML + "<br>" + i + " = " + typeof(lVar[i]);
							lTempArray.push(i + " = " + lSetting);
						}
					}
					
					lTempArray.sort();
					for(var i = 0; i<lTempArray.length; i++){
						s += lTempArray[i] + "\n";
						t += lTempArray[i] + "<br>";
						lNum += 1;
					}

					
					// long list use the masterAlert_debugTools
					if(lNum > 50){
						//showDebugLayer(t);
						if(pReturn){
							return t;
						}else{
							gDebug.model(t);
						}
					}else{
						if(pReturn){
						 return s;
						}else{
							alert(s);
						}
					}
					
				}else{
					if(pReturn){
						return lVar;
					}else{
						alert(lVar);
					}
					
				}
		}
	}
	
	return null;
}

// ***************************** //
// alert the browser info # 2 //
gDebug.browserInfo = function(){

	var s = "BROWSER INFO:\n\n"
	var lArray = [];
	
	for(prop in navigator){
		lArray.push(prop + " = " + navigator[prop])
	}
	
	for(prop in lArray.sort()){
		s += lArray[prop] + "\n";
	}

	alert(s)
}

// ***************************** //
// Show divs #3 //
gDebug.divShow = function(){
	
	var lName = prompt("Enter the Layer name to show, or press OK to view the entire layout.", "document")
	var lColors = gDebug.colors.elements;
	var lContainer = null;
	var lLists = {};
	var lBackground = gDebug.colors.background || false;
	
	// get the container, default is the whole document //
	if(lName == "document"){
		lContainer = document;
	}else{
		lContainer = document.getElementById(lName);
	}
	
	if(lContainer){
		if(lColors){
			var lTracer = '';
			for(var x in lColors){
				lLists[x] = lContainer.getElementsByTagName(x);
				if(lLists[x]){
					// add the matrix to the tracer //
					lTracer += "&lt;" + x + "&gt; = " + lColors[x] + "<br />";
				}
			} 
		
			gDebug.tracer(lTracer,true);
			
			for(var x in lLists){
				var Element = lLists[x];
				for(var i = 0; i<Element.length; i++){
					if(Element[i].style && (Element[i].id.toLowerCase().indexOf("debug")==-1) && (Element[i].className.toLowerCase().indexOf("debug")==-1)){
						if(lBackground){
							Element[i].style.background = lColors[x];
						}else{
							// default is to show the border //
							Element[i].style.border = "1px solid " + lColors[x];
						}
					}
				}
			}
			if(lContainer.style){
				lContainer.style.background = '#e7e7e7';
			}
		}
	}else{
		alert(lName + " is not a element on this page.");
	}
	
}

// ***************************** //
// view the html file #4 //
gDebug.viewSource = function(){
	location="view-source:" + window.location.href;
}

// ***************************** //
// show the javascript files #5 //
gDebug.showScripts = function(p_return){
	var s = "JAVASCRIPTS:\n\n";

	for (var i=0; i<document.scripts.length; i++){
		if(document.scripts[i].src != ""){
	        s += document.scripts[i].src + "\n";
			//s += getFileDate(document.scripts[i].src,"m") + "\n";
		}
    }

	s += '\nSTYLESEETS:\n\n';
	
	for (var i=0; i<document.styleSheets.length; i++){
		if(document.styleSheets[i].src != ""){
	        s += document.styleSheets[i].href + "\n";
			//s += getFileDate(document.styleSheets[i].href,"m") + "\n";
		}
    }
	
	if(p_return){
		return s;
	}else{
		alert(s);
	}
	
	return false;
}

// ***************************** //
// view java console #0
gDebug.javaConsole = function(){
	if(parseInt(gBrowser.version) >= 3 ){
		// firefox 3 does not allow acess to chrome: @!:( //
		//location = "chrome://global/content/console.xul";
	}else{
		location="javaScript:";
	}
}

// ******************************************************

gDebug.debugButtonClick = function(p_num,p_up){
	//gDebugButton = document.getElementById(window.event.srcElement.id);
	var gDebugButton = document.getElementById("debugbutton_" + p_num)
	// debugbutton //
	switch(p_up){
		case 0:
			gDebugButton.style.border = "2px inset buttonhighlight";
			break;
		case 1:
			gDebugButton.style.border = "2px outset buttonhighlight";
			break;
	}
	
}



// Debug Tools case statement //
gDebug.debugKeys_ON = function(e) {
	
	if(gBrowser.vendor == "IE"){
		var lNum = (event.keyCode-49);
	}else{
		var lNum = (e.which-49);
	}

	if(typeof(gDebug.debugList[lNum]) == "number"){
		eval(gDebug.functions[gDebug.debugList[lNum]].script);
	}
	
}

gDebug.moveDebugLayer = function(){

	//var lDLT = parseInt(gDebugLayer.currentStyle.top);
	//var lBT = document.body.scrollTop;
	document.getElementById("debugLayer").style.top = document.body.scrollTop + "px";

}

// ********************************* //
// show variable in hidden layer //
gDebug.tracer = function(p_var,p_replace){
	
	var gDebugTracerLyr = document.getElementById("debugTracerLyr")
	
	if(gDebugTracerLyr){
		gDebugTracerLyr.style.display = "block";

		if(p_replace){
			gDebugTracerLyr.innerHTML = p_var;
		}else{
			gDebugTracerLyr.innerHTML += "<br>" + p_var;
		}
		//setTimeout("tracer_debugTool(" + AV.curPos + ")", 2000);
	}
}

// ********************************* //
// doubleClick Alert object info //
// ********************************* //
gDebug.mouseDoubleClick = function(e){
	//alert(event.button)
	//alert(e.target)
	if(gBrowser.vendor == "IE"){
		var lObj = event.srcElement;
		var lAbort = false;
		var lCtrlKey = window.event.ctrlLeft;
		var lBreak = "<br />";
	}else{
		var lObj = e.target;
		var lAbort = false;
		var lCtrlKey = e.ctrlKey;
		var lBreak = "\n";
	}
	
	//gDebug.tracer(lObj);
	
	//if(typeof(lObj)=="object" && window.event.ctrlLeft){
	if(typeof(lObj)=="object" && lCtrlKey){
		if(typeof(lObj.id)=="string"){
		
			if(lAbort){
				gObject = document.getElementById(e.target.id);
				//gObject = e.originalTarget.id;
				//getVariable_debugTool("gObject");
				if(gObject){
					gDebug.getVar(gObject)
				}
				return;
			}

			var s = "OBJECT INFO:" + lBreak;
			s += "id = " + lObj.id + lBreak;
			s += "tag = " + lObj.tagName + lBreak;
			s += "class = " + lObj.className + lBreak;
			s += "IMG.src = " + lObj.src + lBreak;

			s += "\nOBJECT STYLE:\n"
			
			
			if(lObj.currentStyle){
				for(var i in lObj.currentStyle){
					if(lObj.currentStyle[i] != "" && typeof(lObj.currentStyle[i]) != "function"){
						s += i + " = " + lObj.currentStyle[i] + lBreak;
					}
				}
			}else{
			
				if(lObj.style){
					s += "width = " + lObj.clientWidth + lBreak;
					s += "height = " + lObj.clientHeight + lBreak;
					for(var i in lObj.style){
						if(lObj.style[i] != "" && typeof(lObj.style[i]) != "function"){
							s += i + " = " + lObj.style[i] + lBreak;
							//s += i + " = " + lObj.style.getPropertyValue(i) + lBreak;
						}
					}
				}
			}
			
			if(lObj.tagName == "IMG"){
				//s += "fileCreatedDate = " + lObj.fileCreatedDate +"\n";			
				s += "fileModifiedDate = " + document.fileModifiedDate + lBreak;
			}
			
			if(typeof(lObj.innerHTML)=="string" && lObj.innerHTML != ""){
				s += "innerHTML = " + lObj.innerHTML + lBreak;
			};

			if(gBrowser.vendor == "IE"){
				gDebug.model(s);
			}else{
				alert(s);
			}
		}
	}
}


// **************************** //
// model_DebugTool()
// opens the model window
// IE only function
// **************************** //
gDebug.model = function(p_var){
	var lVars = ""
	if(p_var){
		lVars = p_var
	}else{
		lVars = returnInfo_debugTool();
	}
	
	if(gBrowser.vendor == "IE"){
		showModalDialog(gPaths.debug + "debug.html",lVars,"dialogWidth:"+screen.width+"px;,dialogHeight:"+screen.height+"px;");
	}else{
		if(parent.frames.length == 0){
			document.body.innerHTML = lVars;
			document.body.style.textAlign = "left";
			document.body.style.padding = "25px";
			document.body.style.color = "#000000";
			document.body.style.background = "#ffffff";
		}
	}	
}

gDebug.redirect = function(p){
	switch(p){
		case "intranet":
			PMG_newWindow({loc:"http://intranet.patientmarketing.com"})
			break;
		case "staff":
			PMG_newWindow({loc:"/00_Staff/ContentListing.aspx"})
			break;
	}
}

/* IE ONLY PRINT PREVIEW */
gDebug.printPreviewIE = function(){
	var OLECMDID = 7;
	/* OLECMDID values:
	* 6 - print
	* 7 - print preview
	* 1 - open window
	* 4 - Save As
	*/
	var PROMPT = 1; // 2 DONTPROMPTUSER
	var WebBrowser = '<OBJECT ID="WebBrowser1" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>';
	document.body.insertAdjacentHTML('beforeEnd', WebBrowser);
	WebBrowser1.ExecWB(OLECMDID, PROMPT);
	WebBrowser1.outerHTML = "";
}

// **************************** //
// Add the debug Layer?
// **************************** //
if(!this.frameElement && !this.opener){
	if(gDebug.tools || gDebug.code){
		if(window.attachEvent){
			window.attachEvent("onload", gDebug.init);
		}else{
			window.addEventListener("load", gDebug.init, false);
		}
	}
}

