/*
	JS dbg v2
	(c) gosha bine, 2001
	
	http://www.stereofrog.com/js
	
*/

//--------------------------------------------------------------------------------------------------------------------
// Utils

function _dbgFmt(q){
	for(var a=_dbgFmt.arguments,ii=1;ii<a.length;ii++)
		q=q.replace(/~/,a[ii]);
	q=q.replace(/~/g,a[a.length-1]);
	return q;
}

function _dbgFuncName(fp){
	var p=/function\s+(\w+)/.exec(fp+"");
	return p?p[1]:null;
}

function _dbgHandleEvt(obj,evt,proc){
	var h=obj[evt]+"";
	if(h)h=h.substring(h.indexOf("{")+1,h.lastIndexOf("}"));
	obj[evt]=new Function ("e","e=window.event||e;"+proc+";"+h);
}


//--------------------------------------------------------------------------------------------------------------------
// Error handling

var _dbgCONTEXT=0;
var _dbgTimer=0;

function _dbgENTER() { _dbgCONTEXT=1; }
function _dbgLEAVE() { _dbgCONTEXT=0; }

function _dbgERROR(q,url,line){
	if(window._dbgOFF) return false;
	if(_dbgCon && !_dbgCon.isVisible()) return true;

	var stack=(_dbguMoz)?"":_dbgStack(_dbgERROR.caller);
	q=(_dbguMoz)?"See js console":q;
	line=line||"?";
	
	if(_dbgCONTEXT==2)  
		_dbgCon.write(_dbgFmt("?? ~",q));
	else if(_dbgCONTEXT==1)
		alert(_dbgFmt("DEBUGGER ERROR.\n~\nLine:~\n~",q,line,stack));
	else if(_dbgCONTEXT==0)
		_dbgCon.write(_dbgFmt("ERROR: ~ (~)\n~",q,line,stack));
	if(_dbgCONTEXT==1) _dbgCLOSE();
		else _dbgCONTEXT=0;
	return _dbguMoz?false:true;
}

function _dbgCLOSE(){
	if(_dbgCon) _dbgCon.show(0,0);
	if(_dbgTimer) clearInterval(_dbgTimer);
	window._dbgOFF=1;
}

//--------------------------------------------------------------------------------------------------------------------
// UA detection

function _dbgUA(){
	var n=window.navigator,an=n.appName.toLowerCase(),ag=n.userAgent.toLowerCase(),k=0;
	_dbguSys=((ag.indexOf("win")+1)?1:((ag.indexOf("mac")+1)?2:0));
	_dbguOpera=_dbguNav=_dbguIE=0;
	if((k=ag.indexOf("opera"))>=0) _dbguOpera=parseFloat(ag.substring(k+6));
		else if((k=ag.indexOf("msie"))>=0) _dbguIE=parseFloat(ag.substring(k+5));
			else if(an.indexOf("netscape")>=0) _dbguNav=parseFloat(n.appVersion);
	_dbguMoz=(_dbguNav>=5);
	_dbguDom=(_dbguMoz)||(_dbguIE>=5)||(_dbguOpera>=5.11);
}

//--------------------------------------------------------------------------------------------------------------------
// Dbg core

function _dbgPrint(t){
	if(typeof(t)=="string"){
		for(var ii=0,q="";ii<t.length;ii++) {
			var c=t.charCodeAt(ii);
			q+=(c<32)?("#"+c):(t.charAt(ii));
		}
		return "\""+q+"\"";
	} else if(typeof(t)=="function"){
		t=t+"";
		t=t.replace(/\n/g,"");
		t=t.replace(/\r/g,"");
		t=t.replace(/\t/g,"");
		return t;
	} else return t+"";
}

function _dbgPrintObj(o){
	if(typeof(o)=="object"){
		var q="{"+o+":";
		var err=_dbgEnum(o);
		if(err)
			q+=err;
		else for(var p in o)
			q+="\n   "+p+":"+_dbgPrint(_dbgGetProp(o,p));
		return q +"}";
	} else return _dbgPrint(o)
}

function _dbgStack(fp){
	var space="",q="";
	while(fp){
		q+=(space+=" ")+_dbgFuncName(fp)+" (";
		var args=fp.arguments;
		for(var ii=0;ii<args.length;ii++)
			q+=_dbgPrint(args[ii])+((ii<args.length-1)?", ":"");
		q+=")\n";
		fp=(fp.caller==fp)?0:fp.caller;
	}
	return q;
}

//--------------------------------------------------------------------------------------------------------------------
// Console interface 
	
var _dbgCon=null;

function _dbgConsole()
{
	var style='font:11px tahoma,sans-serif;color:black;';
	var html=
		'<form name=DCONF>'+
		'<table border=1 cellspacing=0 cellpadding=0 width=200>'+
		'<tr><td><input type=text ~ name=E size=8 title="Expression">'+
		'<input name="CBprint"  type=button ~ value=" = " title="Evaluate">'+
		'<input name="CBclear" type=button ~ value=" o " title="Clear">'+
		'<input name="CBmove" type=button ~ value=" + " title="Move">'+
		'<input name="CBtree" type=button ~ value=" @ " title="DOM tree">'+
		'<input name="CBclose" type=button ~ value=" x " title="Close">'+
		'</td></tr>'+
		'<tr><td><span ~><textarea ~ wrap=off name=D rows=15></textarea></span></td></tr>'+
		'</table></form>';
	var optr,ostyle,fptr;
	var varray=0;
	var pos=3;
	var visible=0;
	var created=0;
	
	function _create(){
		var d=document,b=d.body;
		if(d.layers) {
			var def=_dbgFmt(_dbgFmt("<style>.dc1 { ~ }</style>",style)+html,"class=dc1");
			d.layers["DCON"]=new Layer(200);
			d.layers["DCON"].document.write(def);
			d.layers["DCON"].document.close();
			ostyle=optr=d.layers.DCON;
			fptr=optr.document.forms.DCONF;
			varray=["hide","show"];
		} else {
			var def=_dbgFmt(html, _dbgFmt("style='~'", style));
			if(d.getElementById){
				optr=d.createElement("div");
				optr.id="DCON";
				optr.innerHTML=def;
				b.appendChild(optr);
			} else if(d.all) {
				b.insertAdjacentHTML("BeforeEnd","<div id='DCON' style='position:absolute'>"+def+"</div>");
				optr=d.all.DCON;
			}
			ostyle=optr.style;
			ostyle.position="absolute";
			ostyle.width="200px";
			fptr=d.forms.DCONF;
			fptr.D.style.width="100%";
			fptr.E.style.width="100px";
			varray=["hidden","visible"];
		}
		fptr.onsubmit=new Function("return false");
		fptr.E.onkeydown=_CB;
		for(var ii=0,fp=fptr.elements;ii<fp.length;ii++)
			if((fp[ii].name||"").indexOf("CB")==0)
				fp[ii].onclick=_CB
		created=1;
	}
	
	function _seval(__e){
		_dbgCONTEXT=2;
		var __p=eval(__e);
		_dbgCONTEXT=1;
		return __p;
	}

	_test=new Function("__e",
		_dbguDom?
			"try{eval(__e);}catch(e){return (e.description||e.message)};return 0":
			"_dbgCONTEXT=2;eval(__e);_dbgCONTEXT=1;return 0"
	);

	this.isVisible=function _isVisible(){
		return visible;
	}
	this.show=function _show(vis,pos){
		var 
			d=document,b=d.body,w=window,
			l=isNaN(w.pageXOffset)?b.scrollLeft:w.pageXOffset,
			t=isNaN(w.pageYOffset)?b.scrollTop:w.pageYOffset,
			nl=(pos&1)?((w.innerWidth||b.clientWidth)-(optr.offsetWidth||optr.clip.width)):0,
			nt=(pos&2)?((w.innerHeight||b.clientHeight)-(optr.offsetHeight||optr.clip.height)):0;
		if(nl)nl-=16;
		if(nt)nt-=16;
		ostyle.pixelLeft=ostyle.left=nl+l;
		ostyle.pixelTop=ostyle.top=nt+t;
		ostyle.visibility=varray[vis];
		visible=vis;
	}
	this.move=function _move(){
		pos=(pos+1)%4;
		this.show(1,pos);
	}
	this.update=function _update(){
		if(visible)
			this.show(1,pos);
	}
	this.evaluate=function _evaluate(){
		var e=fptr.E.value;
		if(e){
			var p=_test(e);
			if(p) this.write("??? "+p);
				else this.write(e+" is "+_dbgPrintObj(_seval(e)));
		}
	}
	this.write=function _write(q){
		if(window._dbgOFF)
			return;
		if(!created)
			_create();
		if(!visible)
			this.show(1,pos);
		fptr.D.value=(q+"")+"\n"+(fptr.D.value||"");
	}
	this.clear=function _clear(){
		fptr.D.value=" ";
	}
}		


//--------------------------------------------------------------------------------------------------------------------
// console buttons

function _CB(e){	
	_dbgENTER();

	e=window.event||e;
	var t=e.srcElement||e.target;
	var n=t.name;
	
	if(n=="CBclose"){
		_dbgCLOSE();
	} else if(n=="CBprint" || (n=="E"&&((e.which||e.keyCode)==13))) 
		_dbgCon.evaluate();
	else if(n=="CBclear")	
		_dbgCon.clear();
	else if(n=="CBmove") 
		_dbgCon.move();
	else if(n=="CBtree"){
		var url=(window._dbgPATH||"")+"dbgdom.html?opener"
		window.open(url,"debugTreeWindow","status=1,location=0,toolbar=0,scrollbars=1,menubar=0,resizable=1,top=320,left=0,width=300,height=400");
	}
	_dbgLEAVE();
}

//--------------------------------------------------------------------------------------------------------------------
// dbg front-end

// _D - print variable to console

function _D(){
	_dbgENTER();
	var q=">"+_dbgFuncName(_D.caller) + "(", a=_D.arguments;
	for(var ii=0;ii<a.length;ii++)
		q+=_dbgPrint(a[ii])+((ii<a.length-1)?", ":"");
	_dbgCon.write(q+")");
	_dbgLEAVE();
}

// _O - print object contents to console

function _O(){
	_dbgENTER();
	var q=">"+_dbgFuncName(_O.caller) + "(", a=_O.arguments;
	for(var ii=0;ii<a.length;ii++)
		q+=_dbgPrintObj(a[ii])+((ii<a.length-1)?"\n":"");
	_dbgCon.write(q+")");
	_dbgLEAVE();
}

// _S - print stack to console

function _S(){
	_dbgENTER();
	_dbgCon.write("STACK{\n"+_dbgStack(_S.caller)+"}")
	_dbgLEAVE();
}

// _C - clear debug console

function _C(){	
	_dbgENTER();
	_dbgCon.clear();
	_dbgLEAVE();
}

// _E - event inspector

var _dbgEventList=[
"onabort","onblur","onbroadcast","onchange","onclick","onclose","oncommand","oncommandupdate","oncontextmenu",
"oncreate","ondblclick","ondestroy","onDOMAttrModified","onDOMCharacterDataModified","onDOMNodeInserted",
"onDOMNodeInsertedIntoDocument","onDOMNodeRemoved","onDOMNodeRemovedFromDocument","onDOMSubtreeModified",
"ondragdrop","ondragenter","ondragexit","ondraggesture","ondragover","onfocus","oninput","onkeydown","onkeypress",
"onkeyup","onload","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmove","onoverflow",
"onoverflowchanged","onpaint","onreset","onresize","onscroll","onselect","onsubmit","ontext","onunderflow","onunload"
];

function _E(obj,proc,andMask,notMask){
	_dbgENTER();
	andMask=andMask||/^on/;
	notMask=notMask||/^onmousemove/;
	if(document.all) for(var p in obj){
		if(p.match(andMask)&&!p.match(notMask))
			_dbgHandleEvt(obj,p,proc);
	} else for(var ii=0;ii<_dbgEventList.length;ii++){
		var p=_dbgEventList[ii];
		if(p.match(andMask)&&!p.match(notMask))
			_dbgHandleEvt(obj,p,proc);
	}
	_dbgLEAVE();
}

// _T - time profiler

var _dbgTimers=null;
var _dbgTimeMarks=new Array();

function _T(cmd,name){
	if(cmd<2){
		var tm=(new Date).getTime();
		var cf=_dbgFuncName(_T.caller)+"."+(name||"");
		if(!_dbgTimers)
			_dbgTimers=new Array();
		if(cmd==1)
			_dbgTimers[cf]=_dbgTimers[cf]||0;
		else if(_dbgTimeMarks[cf]) 
			_dbgTimers[cf]+=(tm-_dbgTimeMarks[cf]);
		_dbgTimeMarks[cf]=tm;
	} else if(cmd==3){
		var q="";
		for(var ii in _dbgTimers)
			q+=_dbgFmt("~=~\n",ii,_dbgTimers[ii]);
		return q;
	} else if(cmd==4){
		_dbgTimers=null;
	}
	return 0;
}

//--------------------------------------------------------------------------------------------------------------------
// Init code

function _dbgInit(){
	if(!window._dbgOFF){
		_dbgUA()
		if(_dbguNav>=4.08||_dbguIE>=4){
			window.onerror=_dbgERROR;
			_dbgGetProp=new Function("obj","p",_dbguDom?"try{return obj[p]}catch(e){return (e.description||e.message)}":"return obj[p]");
			_dbgEnum=new Function("obj",_dbguDom?"try{for(var p in obj);}catch(e){return (e.description||e.message)};return 0":"return 0");
			_dbgCon=new _dbgConsole();
			_dbgTimer=setInterval("_dbgCon.update()",1000);
			_dbgHandleEvt(window,"onload","_dbgCon.write(' ')");
		} else window._dbgOFF=1;
	}
}

_dbgInit();