function error_handler(a,b,c)
{
	window.status = (a +"\n" + b + "\n\n" + c + "\n\n" + error_handler.caller);
	return true;
}
window.onerror = error_handler;
String.prototype.trim=function(){return this.replace(/(^\s+)|\s+$/g,"");}
self.WD = {
	/*begin of functions==============================*/
	browser:new Object(),
	dull:function (){},
	addEvent:function(obj, evType, fn)
	{
		if (obj.addEventListener)
		{
			obj.addEventListener(evType, fn, false);  return true;
		}
		else if (obj.attachEvent)
		{
			var r = obj.attachEvent("on"+evType, fn);
			WD.EventCache.add(obj, evType, fn);
			return r;
		}
		else
		{
			//Mac IE5 sucks here
			return false;
		}
	},
	removeEvent:function (obj, evType, fn)
	{
		if (obj.removeEventListener){  obj.removeEventListener(evType, fn, false);  return true; }
		else if (obj.detachEvent){   var r = obj.detachEvent("on"+evType, fn);    return r; }
		else { return false; }
	},
	getObjById:function(id)
	{
		return document.getElementById(id);
	},
	getChildByClass:function(el,tagName,className)
	{
		var els = el.getElementsByTagName(tagName);
		className = className.split(" ");
		for( var i=0;i<els.length;i++)
		{
			for(var c=0;c<className.length;c++)
			{
				if( els[i].className.trim() == className[c].trim() ){ return els[i] ;}
			}
		}
		return null;
	},
	getChildByName:function(el,tagName,Name)
	{
		var els = el.getElementsByTagName(tagName);
		className = className.split(" ");
		for( var i=0;i<els.length;i++)
		{
			if( els[i].Name == Name){ return els[i] ;}
		}
		return null;
	},
	getNextObjByTagName:function(el,tagName)
	{
		while(el && el.nextSibling)
		{
			el = el.nextSibling;
			if(el.nodeName.toLowerCase()==tagName.toLowerCase()){return el;}
		}
		return null;
	},
	getNextPreviousByTagName:function(el,tagName)
	{
		while(el && el.previousSibling)
		{
			el = el.previousSibling;
			if(el.nodeName.toLowerCase()==tagName.toLowerCase()){return el;}
		}
		return null;
	},
	getObjByClass:function (el,tagName,className,level)
	{
		level = level || 1000;
		var p= 0;
		var exit = function(el){ return ( (p>level) || (el==null) || (el.parentNode==null) || (el.tagName==null) || (el.className==null) || (el==document.body) );}
		while( !exit(el)  )
		{
			if( (el.tagName.toLowerCase() == tagName) )
			{
				var c = el.className.split(" ");
				for(var i=0;i<c.length;i++)
				{
					if( (c[i]==className) || (className==""))
					{
						return el;
					}
				}
			}
			el = el.parentNode;
			p++;
		}
		return null;
	},
	getObjByName:function (el,tagName,Name,level)
	{
		level = level || 1000;
		var p= 0;
		var exit = function(el){ return ( (p>level) || (el==null) || (el.parentNode==null) || (el.tagName==null) || (el.name==null) || (el==document.body) );}
		while( !exit(el)  )
		{
			if( (el.tagName.toLowerCase() == tagName) && (el.name == Name) )
			{;return el;};
			el = el.parentNode;
			p++;
		}
		return null;
	},
	getDimension:function(el)
	{
		var d = new Object();
		if(el.getBoundingClientRect)
		{
			d.x = el.getBoundingClientRect().left + Math.max(document.body.scrollLeft, document.documentElement.scrollLeft);
			d.y = el.getBoundingClientRect().top + Math.max(document.body.scrollTop, document.documentElement.scrollTop);
			d.w = el.getBoundingClientRect().right - el.getBoundingClientRect().left;
			d.h =  el.getBoundingClientRect().bottom - el.getBoundingClientRect().top;
		}
		else if(document.getBoxObjectFor)
		{
			d.x = document.getBoxObjectFor(el).x;
			d.y =  document.getBoxObjectFor(el).y;
			d.w = document.getBoxObjectFor(el).width;
			d.h = document.getBoxObjectFor(el).height;
		}
		else
		{
			function offsetBy(el, type)
			{
				if (this===el) return 0;
				var v=999, owner=this, border='client'+type;
				type = 'offset'+type;
				do { v += owner[type];  } while ((owner=owner.offsetParent) && owner!==el && (v+=owner[border]))
				return v-999;
			}
			d.x = offsetBy.call(el, null, 'Left');
			d.y= offsetBy.call(el, null, 'Top');
			d.w = el.offsetWidth;
			d.h = el.offsetHeight;
		}
		return d;
	},
	isTagName:function (el,tagName)
	{
		return (el.nodeName.toLowerCase() == tagName.toLowerCase() );
	},
	hasClass:function (el,className)
	{
		var c = el.className.split(" ");
		for(var i=0;i<c.length;i++)
		{
			if(c[i] == className){return true;};
		}
		return false;
	},
	getEvent:function (e)
	{
		e = window.event ||e;
		e.leftButton=false;
		if(e.srcElement==null && e.target!=null)
		{
			e.srcElement = e.target ;
			e.leftButton = ( e.button==1);
		}
		else if(e.target==null && e.srcElement!=null)
		{
			e.target = e.srcElement;
			e.leftButton = ( e.button==0);
		}
		else if(e.srcElement!=null && e.target!=null)
		{
			//opera sucks and have both e.srcElement & e.target.
		}
		else{return null}
		e.mouseX = e.pageX || (e.clientX +  Math.max(document.body.scrollLeft, document.documentElement.scrollLeft));
		e.mouseY = e.pageY || (e.clientY + Math.max(document.body.scrollTop, document.documentElement.scrollTop));
		return e;
	},
	stopEvent:function(e)
	{
		if(e && e.cancelBubble!=null)
		{
			e.cancelBubble = true;
			e.returnValue = false;
		}
		if(e && e.stopPropagation && e.preventDefault)
		{
			e.stopPropagation();
			e.preventDefault();
		}
		return false;
	},
	addClass:function(el,className)
	{
		var c = el.className.split(" ");
		for(var i=0;i<c.length;i++)
		{
			if(c[i]==className){return;};
		}
		if(c.length>0)
		{
			el.className = (el.className + " " +className).trim();
		}
		else
		{
			el.className = className.trim();
		}
	},
	removeClass:function(el,className)
	{
		var c = el.className.split(" ");
		for(var i=0;i<c.length;i++)
		{
			if(c[i]==className){c[i]="";};
		}
		el.className = c.join(" ").trim();
	}
	/*endof functions==============================*/
}
WD.EventCache = function()
{
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler, bCapture){listEvents[listEvents.length] = arguments;},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1)
			{
				item = listEvents[i];
				if(item[0].removeEventListener){item[0].removeEventListener(item[1], item[2], item[3]);};
				if(item[1].substring(0, 2) != "on"){	item[1] = "on" + item[1];};
				if(item[0].detachEvent){item[0].detachEvent(item[1], item[2]);};
				item[0][item[1]] = null;
			};
		}
	};
}();
WD.addEvent(window,"unload",WD.EventCache.flush);
WD.browser["ie"] =  (document.all!=null)  && (window.opera==null);
WD.browser["ie4"]  =  WD.browser["ie"] && (document.getElementById==null);
WD.browser["ie5"]  =   WD.browser["ie"] && (document.namespaces==null) && (!WD.browser["ie4"]) ;
WD.browser["ie6"]  =  WD.browser["ie"] && (document.implementation!=null) && (document.implementation.hasFeature!=null)
WD.browser["ie55"]  =  WD.browser["ie"] && (document.namespaces!=null) && (!WD.browser["ie6"]);
WD.browser["ns4"]  = !WD.browser["ie"] &&  (document.layers !=null) &&  (window.confirm !=null) && (document.createElement ==null);
WD.browser["opera"] =  (self.opera!=null);
WD.browser["gecko"] =  (document.getBoxObjectFor!=null);
WD.browser["khtml"] = (navigator.vendor =="KDE");
WD.browser["konq"] =  ((navigator.vendor == 'KDE')||(document.childNodes)&&(!document.all)&&(!navigator.taintEnabled));
WD.browser["safari"] = (document.childNodes)&&(!document.all)&&(!navigator.taintEnabled)&&(!navigator.accentColorName);
WD.browser["safari1.2"] = (parseInt(0).toFixed==null) && (WD.browser["safari"] && (window.XMLHttpRequest!=null));
WD.browser["safari2.0"] = (parseInt(0).toFixed!=null) && WD.browser["safari"] && !WD.browser["safari1.2"] ;
WD.browser["safari1.1"] = WD.browser["safari"] && !WD.browser["safari1.2"]  &&!WD.browser["safari2.0"] ;
for(i in self.WD)
{
	if(self[i]==null)
	{
		self[i] = self.WD[i];//synchronize for faster deelopement
	}
}

