function Event()
{
}
 
var p = Event.prototype;
 
p.add = function(name,func,obj)
{
	if(!this.events)
	{
		this.events = new Object();
		this.eventhandle = 0;
	}
	if(!this.events[name]) this.events[name] = new Object();
	this.eventhandle++;
	var i = this.eventhandle;
	this.events[name][i] = new Object();
	this.events[name][i].obj = obj;
	this.events[name][i].func = func;
	return this.eventhandle;
};
 
p.count = function(name)
{
	var i = 0;
	if(this.events[name]) for(var i1 in this.events[name]) i++;
	return i;
}
 
p.remove = function(name,handle)
{
	if(this.events&&this.events[name]&&this.events[name][handle])
	{
		this.events[name][handle].obj = null;
		this.events[name][handle].func = null;
		delete(this.events[name][handle]);
	}
};
 
p.trigger = function(name)
{
	if(this.events&&this.events[name])
	{
		var a = arguments;
		var p = "";
		var s = a.length;
		var i;
		for(i=1;i<s;i++) p += ((i>1)? "," : "")+"a["+i+"]";
 
		for(i in this.events[name])
		{
			var o = this.events[name][i];
			if(o.obj[o.func]) eval("o.obj[o.func]("+p+")");
		}
	}
};
 
function Comp(k,pk,n,l,a,js,scpr,scpo)
{
	this._app = a;
	this._appSource = l.replace("app/","");
	this._appSource = this._appSource.substring(0,this._appSource.indexOf("/"));
	this._basePath = l;
	this._baseDir = l.substring(0,l.lastIndexOf("/"));
	this._key = k;
	this._parentKey = pk;
	this._name = n;
	this._event = new Event();
	this._children = new Object();
	this._timers = new Object();
	this._timerHandle = 0;
	this._styleClassPostfix = scpo;
	this._styleClassPrefix = scpr;
	this._core = CORE;
	this._eventRespawn = 0;
	this._eventProxy = {};
	this._eventDebug = 0;
	this._maximized = 0;
	this.public = CORE.public;
	var p = CORE.getComp(pk);
	if(p) p._children[n] = k;
	this._setJs(js);
	
	var path = this._basePath.substr(4).replace("/comp/","/");
	path = "//"+path;
	path = path.replace(/[/]/g,"__").replace(/\./g,"__");
	this._handlerPath = path;	
}
 
var p = Comp.prototype;
 
p.call = function(f)
{
	var c = "0";
	if(f=="start") c = "2";
	if(f=="startInit")
	{
		c = "3";
		f = "start";
	}
	CORE.signalDefaultSocketStart();
	CORE.sendSocketState(this._key,this._basePath,this._app,this._parentKey,c,this._styleClassPrefix,this._styleClassPostfix);
 
	var a = arguments;
	var s = a.length;
	var p = new Object();
	for(var i=1;i<s;i++) p[i-1] = a[i];
	CORE.sendSocketFunc(this._key,f,p);
}
 
p.pageRedirect = function(url)
{
	window.location = url;
}
 
p.reload = function()
{
	var s = arguments.length;
	var str = "";
	for(i=0;i<s;i++) str += ',evalVarArguments['+i+']';
	var evalVarArguments = arguments;
	eval('this.call("start"'+str+');');
}
 
p.alert = function(msg)
{
	alert(msg);
}
 
p.debug = function(d,l)
{
	debug(d,l);
}
 
p._formSubmit = function(form)
{
	var c = "0";
 
	CORE.sendSocketState(this._key,this._basePath,this._app,this._parentKey,c,this._styleClassPrefix,this._styleClassPostfix);
 
	var input;
	var i=0, found = 0;
	var l=form.elements.length;
	for(i=0;i<l;i++) if(form.elements[i].name=="_system") { found=1; input = form.elements[i];}
	if(found==0)
	{
		input = document.createElement("input");
		input.type = "hidden";
		input.name = "_system";
		form.appendChild(input);
	}
 
	CORE.sendSocketFunc(this._key,"post",null);
	var s = serial_getstring(CORE.getSocketData());
	input.value = s.replace(/\n/g,"|n|").replace(/\r/g,"|r|").replace(/\t/g,"|t|").replace(/'/g,"|q|").replace(/"/g,"|qq|");
}
 
p._removeChildren = function()
{
	var keys = new Object();
	for(var i in this._children) keys[i] = i;
	for(var i in keys) try{CORE.getComp(this._children[i])._remove();}catch(e){}
	this._children = new Object();
}
 
p._remove = function()
{
	this._removeChildren();
	CORE.comp[this._key] = null;
	delete(CORE.comp[this._key]);
	delete(this.parent()._children[this._name]);
	var o = this.id("ROOT");
	if(o) try{ o.parentNode.removeChild(o); } catch (e){};
	o = null;
}
 
p._setHtml = function(html)
{
	var o = this.id("ROOT");
	if(o) o.innerHTML = html;
}
 
p._setJs = function(js)
{
	try{ eval(js); }
	catch(e){ CORE.messageJsError(this._basePath,"Loading Javascript",e.message); }
}
 
p.id = function(id)
{
	return document.getElementById("c_"+this._key+"_"+id);
}
 
p.parent = function()
{
	return CORE.getComp(this._parentKey);
}
 
p.child = function(name)
{
	if(this._children[name])
		return CORE.getComp(this._children[name]);
	else
		return null;
}
 
p.childAdd = function(id,name,path)
{
	var date = new Date();
	var rand = Math.random()+"";
	rand = rand.substr(2,3);
	var key = "C"+date.getTime()+rand;
	this.id(id).innerHTML = "<div style='width:100%;height:100%;overflow:visible' id='c_"+key+"_ROOT'><span class='text'>Loading...</span></div>";
 
	var data = new Object();
	data.p = this._key;
	data.n = name;
	data.j = '';
	
	if(path.substr(0,1)=="/")
	{
		if(path.substr(1,1)=="/")
		{
			path = path.substr(2);
			var p = path.indexOf("/");
			path = 'app/'+path.substr(0,p)+"/comp"+path.substr(p);
		}
		else path = 'app/'+this._appSource+'/comp'+path;
	}
	else path = this._baseDir+"/"+path;
 
	data.l = path;
	data.a = this._app;
	data.scpo = this._styleClassPostfix;
	data.scpr = this._styleClassPrefix;
	CORE.newComp(key,data);
 
	str = "";
	var a = arguments;
	var s = a.length;
	for(var i=3;i<s;i++) str+= ",evalVarA["+i+"]";
	
	var evalVarA = a;
	var evalVarName = name;
	
	eval("this.child(evalVarName).call('startInit'"+str+");");
}
 
p.childAll = function()
{
	var data = new Object();
	for(var i in this._children) data[i] = this.child(i);
	return data;
}
 
p.sibling = function(name)
{
	return this.parent().child(name);
}
 
p.formSubmit = function(id)
{
	var form;
	if(typeof(id)=="string") form = this.id(id);
	else form = id;
	this._formSubmit(form);
	form.submit();
}
 
p.eventAdd = function(name,func,obj)
{
	if(!obj) obj = this;
	return this._event.add(name,func,obj);
}
 
p.eventHook = function(name,func,child)
{
	if(!func)
	{
		func = name.split("/");
		var s = func.length;
		for(var i=1;i<s;i++) func[i] = func[i].substr(0,1).toUpperCase()+func[i].substr(1);
		func = func.join("");
	}
 
	var o = this;
	if(child) o = this.child(child);
	o.eventAdd(name,func,this);
}
 
p.eventRemove = function(name,handle)
{
	this._event.remove(name,handle);
}
 
p.eventChildProxyAll = function()
{
	var children = this.childAll();
	for(var i in children) this.child(i).eventAdd("all","eventTrigger",this);
}
 
p.eventChildProxy = function(child)
{
	this.child(child).eventAdd("all","eventTrigger",this);
}
 
p.eventTrigger = function(name)
{
	try
	{
		var a = arguments;
		var p = "";
		var s = a.length;
		var i;
		for(i=1;i<s;i++) p += ",evalVarA["+i+"]";
		
		var evalVarA = a;
		var evalVarName = name;
		
		eval("this._event.trigger(evalVarName"+p+")");
		eval("this._event.trigger('all',evalVarName"+p+")");
	}
	catch(e){ CORE.messageJsError(this._basePath,"eventTrigger '"+name+"'",e.message); }
}
 
p.eventCount = function(name)
{
	return this._event.count(name);
}
 
p._eventHandlerGet = function(name)
{
	var path = this._handlerPath;
	var handler = "H_"+path+"_H_"+name;
	return handler;
}
 
p.eventFire = function(name)
{
	var path = this._handlerPath;
	
	var a = arguments;
	var p = "";
	var s = a.length;
	var i;
	var handler = this._eventHandlerGet(name);
	
	var event = {comp:this, name:name, parm:{}, handler:handler, parmstring:""}
	for(i=1;i<s;i++)
	{
		event.parm[i-1] = a[i];
		event.parmstring += ((i>1)? "," : "") + "evalVarP["+(i-1)+"]";
	}
	
	event.serverparmstring = event.parmstring;
	event.parmstring += ((i>1)? "," : "") + "evalVarEvent";
	i++;
	
	return this.eventFireRemote(event);
}
 
p.eventFireRemote = function(event)
{
	if(this._eventRespawn==1)
	{
		event.comp = this;
		event.handler = this._eventHandlerGet(event.name);
	}
	
	if(this._eventDebug==1)
	{
		var handlerString = "H--\""+event.comp._basePath.replace("app/","//").replace("/comp/","/")+"\"|"+event.name+"--H()";
		debug({handler:handlerString, comp:event.comp._basePath, name:event.name, parms:event.parm},5);
	}
 
	var p = event.parm;
	var localResult = true;
	var parentResult = true;
	var result = true;
	
	var evalVarEvent = event;
	var evalVarP = p;
	
	if(this[event.handler]) eval("localResult = this[evalVarEvent.handler]("+event.parmstring+");");
	if(this[event.handler+"_P"]) eval("this[evalVarEvent.handler+'_P']("+event.serverparmstring+");");
	var parent = this.parent();
	if(parent&&localResult!="[STOPEVENT]") parentResult = parent.eventFireRemote(event);
	if(parentResult==false||localResult==false) result=false;
	this.eventFireRemoteProxies(event);
	return result;
}
 
p.eventFireRemoteProxies = function(event)
{
	for(var i in this._eventProxy)
		this._eventProxy[i].eventFireRemote(event);
}
 
p.eventProxyAdd = function(comp){this._eventProxy[comp._key] = comp;}
 
p.eventProxyRemove = function(comp)
{
	delete(this._eventProxy[comp._key]);
}
 
p.eventRespawnEnable = function(){this._eventRespawn=1;}
p.eventRespawnDisable = function(){this._eventRespawn=0;}
p.eventDebugEnable = function(){this._eventDebug=1;}
p.eventDebugDisable = function(){this._eventDebug=0;}
 
p.fieldSet = function(name, value)
{
	var field = this.id(name);
	if(field) field.value = value;
}
 
p.fieldGet = function(name)
{
	var field = this.id(name);
	if(field)
	{
		if(field.type.toLowerCase()=="checkbox"||field.type.toLowerCase()=="radio") return ((field.checked) ? 1 : 0 );
		return field.value;
	}
	else return null;
}
 
p.fieldsSet = function(data)
{
	for(var i in data) this.fieldSet(i,data[i]);
}
 
p.fieldsGet = function()
{
	var fields = this.fields.split(',');
	var data = new Object();
	for(var i in fields) data[fields[i]] = this.fieldGet(fields[i]);
	return data;
}
 
p.htmlSet = function(name, value)
{
	var item = this.id(name);
	if(item) item.innerHTML = value;
}
 
p.htmlGet = function(name)
{
	var result = "";
	var item = this.id(name);
	if(item) result = item.innerHTML;
	return result;
}
 
p.timerSet = function(func,timeout)
{
	this._timerHandle++;
	this._timers[this._timerHandle] = new Object();
	var o = this._timers[this._timerHandle];
	o.object = this;
	o.func = func;
	o.timer = timeout;
	s = arguments.length;
	o.parms = new Object();
	for(var i=2;i<s;i++) o.parms[i-2] = arguments[i];
	o.handle = this._timerHandle;
	
	var evalVarO = o;
	
	eval("evalVarO.jHandle = window.setTimeout(function(){CORE.getComp('"+this._key+"').timerExecute('"+this._timerHandle+"');},"+timeout+")");
	return this._timerHandle;
}
 
p.timerExecute = function(h)
{
	var o = this._timers[h];
	if(o)
	{
		var s = "";
		for(var i in o.parms) s +=  ((s!="")? "," : "") + "o.parms["+i+"]";
		
		var evalVarO = o;
		eval('evalVarO.object[evalVarO.func]('+s+')');
		this.timerClear(h);
	}
}
 
p.timerClear = function(h)
{
	var o = this._timers[h];
	if(o)
	{
		window.clearTimeout(o.jHandle);
 
		this._timers[h].object = null;
		this._timers[h].parms = null;
		delete(this._timers[h]);
	}
}
 
p.compMaximize = function()
{
	if(this._maximized==0)
	{
		var o = this.id("ROOT");
		this._compParentNode = o.parentNode;
		o.style.position = "absolute";
		o.style.left = "0px";
		o.style.top = document.body.scrollTop+"px";
		document.body.appendChild(o);
		this._maximized = 1;
	}
}
p.compUnmaximize = function()
{
	if(this._maximized==1)
	{
		var o = this.id("ROOT");
		o.style.position = "";
		o.style.left = "";
		o.style.top = "";
		this._compParentNode.appendChild(o);
		this._maximized = 0;
	}
}
 
p.compMaximizeToggle = function()
{
	if(this._maximized==1)
		this.compUnmaximize();
	else
		this.compMaximize();
}
 
function ID(id)
{
	return document.getElementById(id);
}
 
function socketLoaded()
{
	if(window.CORE) window.CORE.socketLoaded();
}
 
function Core()
{
	document.write("<iframe onload='socketLoaded()' style='position:absolute;left:-10000px;top:-10000px' id='CORE_SOCKET' name='CORE_SOCKET'></iframe><form method='post' enctype='multipart/form-data' style='position:absolute;left:-10000px;top:-10000px' action='comp.php' target='CORE_SOCKET' id='CORE_DEFAULT_FORM'><input type='hidden' id='CORE_DEFAULT_FORM_VALUE' name='data'></form>");
	this.socketForm = ID("CORE_DEFAULT_FORM");
	this.socketValue = ID("CORE_DEFAULT_FORM_VALUE");
	this.socketMode = 'idle';
	this.keyPressBufferLength = 5;
	this.keyPressBuffer = new Object();
	this.debugMode = 0;
	this.messageCounter = 0;
	this.app = 'default';
	this.public = new Object();
	this.version = 1.0;
	this.showMessages = 1;
	this.showDialogs = 1;
	this.showJsErrors = 1;
	for(var i=0;i<this.keyPressBufferLength;i++) this.keyPressBuffer[i] = "";
}
 
var p = Core.prototype;
p.comp = new Object();
 
p.setApp = function(app)
{
	this.app = app;
	this.socketForm.action = 'comp.php?'+this.app;
}
 
p.getComp = function(k)
{
	return this.comp[k];
}
 
p.newComp = function(k,d)
{
	this.comp[k] = new Comp(k,d.p,d.n,d.l,d.a,d.j,d.scpr,d.scpo);
}
 
p.setCompState = function(k,s)
{
	this.comp[k].state = s;
}
 
p.receiveSocketStream = function(s)
{
	var d = serial_getobject(s);
	this.receiveSocketData(d);
}
 
p.receiveSocketData = function(d)
{
	try{ if(d.controlstart) this.receiveSocketFunc(d.controlstart); }
	catch(e){ CORE.messageJsError("CORE: ControlStart","Executing Functions",e.message+", "+e.name+", "+e.type); }
 
	try{ if(d.comp) this.receiveSocketComp(d.comp); }
	catch(e){ CORE.messageJsError("CORE: SocketComp","Constructing Components",e.message+", "+e.name+", "+e.type); }
 
	try{ if(d.state) this.receiveSocketState(d.state); }
	catch(e){ CORE.messageJsError("CORE: ComponentState","Restoring State Variables",e.message+", "+e.name+", "+e.type); }
 
	try{ if(d.func) this.receiveSocketFunc(d.func); }
	catch(e){ CORE.messageJsError("CORE: ComponentFunc","Executing Functions",e.message+", "+e.name+", "+e.type); }
 
	try{ if(d.controlend) this.receiveSocketFunc(d.controlend); }
	catch(e){ CORE.messageJsError("CORE: ControlEnd","Executing Functions",e.message+", "+e.name+", "+e.type); }
}
 
p.receiveSocketComp = function(c)
{
	for(var i in c)
	{
		try{ this.newComp(i,c[i]); }
		catch(e){ CORE.messageJsError(c[i].l,"Initializing Script",e.message+", "+e.name+", "+e.type); }
	}
}
 
p.receiveSocketState = function(s)
{
	for(var i in s)
	{
		try { this.setCompState(i,s[i]); }
		catch(e){ /* CORE.messageJsError(i,"Restoring State Variables",e.message+", "+e.name+", "+e.type); */ }
	}
}
 
 
p.receiveSocketFunc = function(f)
{
	this.receiveSocketFuncFilter(f,"startInit");
	this.receiveSocketFuncFilter(f,"start");
	this.receiveSocketFuncNoStart(f);
}
 
p.receiveSocketFuncFilter = function(f,filter)
{
	var n,p,s,j, c;
	var evalVarC, evalVarN, evalVarP;
	for(var i in f)
	{
		c = this.getComp(f[i].k);
		n = f[i].f;
		if(filter==n)
		{
			p = f[i].p;
			if(c&&c[n])
			{
				s = "";
				if(p)
				{
					for(j in p)
					{
						if(s!="") s+= ",";
						s+= "evalVarP["+j+"]";
					}
				}
				evalVarC = c;
				evalVarN = n;
				evalVarP = p;
				
				try{ eval("evalVarC[evalVarN]("+s+")"); }
				catch(e){ CORE.messageJsError(c._basePath,n,e.message+", "+e.name+", "+e.type);}
			}
		}
	}
}
 
p.receiveSocketFuncNoStart = function(f)
{
	var n,p,s,j, c;
	var evalVarC, evalVarN, evalVarP;
	for(var i in f)
	{
		c = this.getComp(f[i].k);
		n = f[i].f;
		if(n!="startInit"&&n!="start")
		{
			p = f[i].p;
			if(c&&c[n])
			{
				s = "";
				if(p)
				{
					for(j in p)
					{
						if(s!="") s+= ",";
						s+= "evalVarP['"+j+"']";
					}
				}
				evalVarC = c;
				evalVarN = n;
				evalVarP = p;
				try{ eval("evalVarC[evalVarN]("+s+")"); }
				catch(e){ CORE.messageJsError(c._basePath,n,e.message+", "+e.name+", "+e.type);}
			}
		}
	}
}
 
p.sendSocketState = function(k,path,app,parentKey,create,styleClassPrefix,styleClassPostfix)
{
	if(!this.nextSocket) this.nextSocket = new Object();
	if(!this.nextSocket.state) this.nextSocket.state = new Object();
	this.nextSocket.state[k] = new Object();
	this.nextSocket.state[k].p = path;
	this.nextSocket.state[k].c = create;
	this.nextSocket.state[k].a = app;
	this.nextSocket.state[k].pk = parentKey;
	this.nextSocket.state[k].scpr = styleClassPrefix;
	this.nextSocket.state[k].scpo = styleClassPostfix;
	this.nextSocket.state[k].s = this.getComp(k).state;
	if(this.debugMode==1) this.nextSocket.debug = 1;
}
 
p.getSocketData = function()
{
	var d = this.nextSocket;
	this.nextSocket = null;
	return d;
}
 
 
p.sendSocketFunc = function(k,f,p)
{
	if(!this.nextSocket) this.nextSocket = new Object();
	if(!this.nextSocket.func) this.nextSocket.func = new Object();
	var i = 0;
	while(this.nextSocket.func[i]) i++;
	this.nextSocket.func[i] = new Object();
	this.nextSocket.func[i].k = k;
	this.nextSocket.func[i].f = f;
	this.nextSocket.func[i].p = p;
	if(this.debugMode==1)
	{
		this.nextSocket.debug = 1;
		this.messageCreateBasic("Function call added: "+f);
	}
}
 
 
p.signalDefaultSocketStart = function()
{
	if(!this.defaultSocketHandle) this.defaultSocketHandle = window.setTimeout(function(){CORE.submitDefaultSocket()},0);
}
 
p.socketLoaded = function()
{
}
 
p.submitDefaultSocket = function()
{
	this.defaultSocketHandle = 0;
	var s = serial_getstring(this.nextSocket);
	this.socketValue.value = s.replace(/\n/g,"|NN|").replace(/\r/g,"|RR|").replace(/\t/g,"|TT|").replace(/'/g,"|QQ|").replace(/"/g,"|QQQQ|").replace(/\\/g,"|BB|");
	this.socketForm.submit();
	
	this.nextSocket = null;
}
 
p.debugEnable = function()
{
	this.debugMode = 1;
	this.messageCreateBasic("Debug Mode Enabled!",2000);
}
 
p.debugSocket = function()
{
	var o = ID('CORE_SOCKET');
	o.style.left = "2000px";
	o.style.top = "0px";
	o.style.width = "2000px";
	o.style.height = "900px";
	this.messageCreateBasic("Socket Debug Enabled!",2000);
	try{
		document.body.scrollLeft = 2000;
		document.body.scrollTop = 0;
	}
	catch(e){};
}
 
p.debugComp = function()
{
	var rootKey = "";
	for(var i in this.comp)
	{
		rootKey = this.comp[i]._key;
		break;
	}
 
	var id = "c_"+rootKey+"_compcrawler";
 
	if(!document.getElementById(id))
	{
		var d = document.createElement("DIV");
		d.id = id;
		document.body.appendChild(d);
		CORE.getComp(rootKey).childAdd("compcrawler","compcrawler","//.entity/widget/debug/compcrawler");
	}
}
 
p.eventKeyDown = function(event)
{
	for(var i=0;i<this.keyPressBufferLength-1;i++) this.keyPressBuffer[i] = this.keyPressBuffer[i+1];
	this.keyPressBuffer[this.keyPressBufferLength-1] = event.keyCode;
 
	var keyFill = this.keyPressBuffer[this.keyPressBufferLength-1];
	for(var i=this.keyPressBufferLength-1;i>=0;i--) if(keyFill != this.keyPressBuffer[i]) keyFill = "";
 
	if(keyFill==83) this.debugSocket();
	if(keyFill==68) this.debugEnable();
	if(keyFill==67) this.debugComp();
}
 
var p = Core.prototype;
 
p.messageJsError = function(comp,func,message)
{
	if(this.showJsErrors==1)	return this.messageCreateDialog("JS Error","COMPONENT:&nbsp;&nbsp;&nbsp;"+comp+"<br>INITIAL FUNC:&nbsp;&nbsp;&nbsp;"+func+"<br>ERROR:&nbsp;&nbsp;&nbsp;"+message+"","","","","#880000","#FFFFFF");
}
 
p.messageCreateDialog = function(caption,html,x,y,c,b,bor)
{
	if(this.showDialogs==1)
	{
		if(!c) c = '#FFFFFF';
		if(!b) b = '#FF0000';
		if(!bor) bor = "";
		else bor = "border:2px solid "+bor;
		if(!x) x = '10';
		if(!y) y = '10';
		if(document.body.scrollTop)
			y = parseInt(y)+document.body.scrollTop;
		if(document.body.scrollLeft)
			x = parseInt(x)+document.body.scrollLeft;
		h = "";
		h += "<table width='300' style='background-color:"+b+";"+bor+"' cellpadding='0' cellspacing='0'><tr><td><table style='width:100%'><tr><td unselectable='on' style='font-family:Verdana;font-size:14px;width:100%;color:"+b+";background-color:"+c+";white-space:nowrap;cursor:move;font-weight:bold' onmousedown='CORE.messageMouseMove(\"[HANDLE]\"); event.cancelBubble=true; return false'>"+caption+"</td>";
		h += "<td style='font-family:Tahoma;font-size:14px;font-weight:bold;cursor:pointer;padding-left:5px;padding-right:5px;color:"+b+";background-color:"+c+"' onclick='CORE.messageDestroy(\"[HANDLE]\");'>X</td></tr></table></td></tr>";
		h += "<tr><td style='font-weight:bold;font-family:Verdana;font-size:14px;white-space:nowrap;color:"+c+";padding:5px' id='[HANDLE]_content'>"+html+"</td></tr>";
		h += "</table>";
		return this.messageCreate(h,null,x,y,c,b,bor);
	}
}
 
 
p.messageDialogSetContent = function(id,html)
{
	var o = document.getElementById(id+"_content");
	o.innerHTML = html;
}
 
 
p.messageCreateBasic = function(html,t,x,y,c,b,bor)
{
	if(!c) c = '#FFFFFF';
	if(!b) b = '#FF0000';
	if(!bor) bor = "";
	else bor = "border:1px solid "+bor;
	if(!x) x = '10';
	if(!y) y = '10';
	if(document.body.scrollTop)
		y = parseInt(y)+document.body.scrollTop;
	if(document.body.scrollLeft)
		x = parseInt(x)+document.body.scrollLeft;
	return this.messageCreate("<table style='background-color:"+b+";"+bor+"'><tr><td style='font-family:Courier New;font-size:12px;font-weight:bold;white-space:nowrap;color:"+c+"'>"+html+"</td></tr></table>",t,x,y);
}
 
p.messageGet = function(id)
{
	return document.getElementById(id);
}
 
p.messageCreate = function(html,t,x,y)
{
	if(this.showMessages==1)
	{
		if(!x) x = '10';
		if(!y) y = '10';
 
		this.messageCounter++;
		var o = document.createElement("DIV");
		o.id = "core_message_"+this.messageCounter;
		o.style.position = 'absolute';
		o.style.left = x+'px';
		o.style.top = y+'px';
		o.style.width = '1px';
		o.style.height = '1px';
		o.style.overflow = 'visible';
		o.onmousedown = function(){this.style.zIndex = CORE.messageOnTopZ();}
		document.body.appendChild(o);
		o.innerHTML = html.replace(/\[HANDLE\]/g,o.id);
		if(t) eval("window.setTimeout(function(){CORE.messageDestroy('"+o.id+"')},t);");
		return o.id;
	}
}
 
p.messageOnTopZ = function()
{
	if(!this.messageZ) this.messageZ = 1000;
	this.messageZ++;
	return this.messageZ;
}
 
p.messageDestroy = function(handle)
{
	var o = ID(handle);
	if(o)
	{
		o.parentNode.removeChild(o);
		o = null;
	}
}
 
p.messageMouseMove = function(id)
{
	var o;
	if(typeof(id)=="object") o = id;
	else o = document.getElementById(id);
 
	this.messageMouseDx = this.mouseX - o.offsetLeft;
	this.messageMouseDy = this.mouseY - o.offsetTop;
	this.messageMouseCanvas = o;
	if(this.messageMouseCanvas.onmovestart) this.messageMouseCanvas.onmovestart();
}
 
p.messageMouseMoveRun = function(event)
{
	if(this.messageMouseCanvas!=null)
	{
		this.messageMouseCanvas.style.left = (this.mouseX - this.messageMouseDx) + "px";
		this.messageMouseCanvas.style.top = (this.mouseY - this.messageMouseDy) + "px";
		if(this.messageMouseCanvas.onmoverun) this.messageMouseCanvas.onmoverun();
	}
}
 
p.messageMouseUpRun = function(event)
{
	if(this.messageMouseCanvas!=null&&this.messageMouseCanvas.onmovestop) this.messageMouseCanvas.onmovestop();
	this.messageMouseCanvas = null;
}
 
function serial_getstring(o)
{
	var s,n,r,v,t,i,l,ls;
	r="";
	for(i in o)
	{
		n=i+"";
		v=o[i];
		t=typeof(v);
		if(t=="object")
		{
			s=serial_getstring(v);
			l=n.length;
			ls=s.length;
			if(l==1)l="";
			if(ls==1)ls="";
			r+=l+":"+n+"a"+ls+":"+s;
		}
		else if(t!='function')
		{
			v+="";
			l=n.length;
			ls=v.length;
			if(l==1)l="";
			if(ls==1)ls="";
			r+=l+":"+n+ls+":"+v;
		}
	}
	o=null;
	return r;
}
 
function serial_getobject(s)
{
	var re=new Object();
	var l,n,t,p=0,r=1,sp,k,v,m=0,op=0;
	while(r)
	{
		n=s.charAt(p);
		if(n=="a"){t="a";p++;n=s.charAt(p)}
		else t="s";
 
		if(n==":"){l=1;p++}
		else{sp=s.indexOf(":",p);if(sp>-1){l=parseInt(s.substring(p,sp));p=sp+1}else r=0;}
 
		if(r==1)
		{
			v=s.substr(p,l);p+=l;
			if(t=='a')v=serial_getobject(v);
			if(m==0){k=v;m=1;}
			else{re[k]=v;m=0;}
			if(op==p)r=0;op=p;
		}
	}
	return re;
}
 
function serial_setobject(o,p,d)
{
	if(typeof(o)=='object')
	{
		var a,b,l;
		a=p.split('/');
		b=o;
		l=a.length;
		for(var i=0;i<l-1;i++)
		{
			if(typeof(b[a[i]])!='object')b[a[i]]=new Object();
			b=b[a[i]];
		}
		a = a[l-1].split("=",2);
		b[a[0]]=a[1];
	}
}
 
function serial_mergeobject(s,d)
{
	if(typeof(s)=='object'&&typeof(d)=='object')
	{
		for(var i in s)
		{
			if(typeof(s[i])=="object")
			{
				if(!d[i]||typeof(d[i])!="object")d[i]=new Object();
				serial_mergeobject(s[i],d[i]);
			}
			else d[i]=s[i];
		}
	}
	s=null;d=null;
}
 
function debug_string(o,d,s)
{
	if(!d) d = 2;
	var r = '';
	if(typeof(o)=="object")
	{
		if(!s) s = "";
		for(var i in o)
		{
			if(typeof(o[i])=="object")
			{
				r += s+i+' = [OBJECT]\n';
				if(d>1) r += debug_string(o[i],d-1,s+"         ");
			}
			else r += s+i+' = '+(o[i]+"").replace(/\n/g,"\n"+s).replace(/\r/g,"")+'\n';
		}
	}
	else
		r = o+"";
	return r;
}
 
function debug_alert(o,d)
{
	alert(debug_string(o,d));
}
 
function debug(o,d,color,bgcolor)
{
	if(!color) color = "#FFFFAA";
	if(!bgcolor) bgcolor = "#019455";
 
	/*
	var message = "<table style='background-color:#888888' cellspacing='2'><tr><td style='color:#FFFFFF;background-color:#000000;padding:5px;font-size:12px;font-family:Courier New'><pre>";
	message += debug_string(o,d).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\n/g,"\n<br>").replace(/ /g,"&nbsp;").replace(/\t/g,"    &nbsp;&nbsp;&nbsp;&nbsp;");
	message += "</pre></td></tr></table>";
	*/
	var message = "<pre style='font-size:12px;font-family:Courier New'>";
	message += debug_string(o,d).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\n/g,"\n").replace(/ /g,"&nbsp;").replace(/\t/g,"    &nbsp;&nbsp;&nbsp;&nbsp;");
	message += "</pre>";
	CORE.messageCreateDialog("Client Debug",message, 0, 10, color, bgcolor);
}
 
document.onkeydown = function(event)
{
	if(!event) event = window.event;
	CORE.eventKeyDown(event);
}
 
document.onmousemove = function(event)
{
	if(!event) event = window.event;
	CORE.mouseX = event.clientX;
	CORE.mouseY = event.clientY;
	CORE.messageMouseMoveRun(event);
}
 
document.onmouseover = function(event)
{
	if(!event) event = window.event;
}
 
document.onmouseout = function(event)
{
	if(!event) event = window.event;
}
 
document.onmouseup = function(event)
{
	if(!event) event = window.event;
	CORE.messageMouseUpRun(event);
}
 
document.onmousedown = function(event)
{
	if(!event) event = window.event;
}
 
document.onclick = function(event)
{
	if(!event) event = window.event;
}
 
document.ondblclick = function(event)
{
	if(!event) event = window.event;
}
 
	var CORE = new Core();

