function error_handler(a,b,c)
{
 window.status = (c +"\n" + b + "\n\n" + a + "\n\n" + error_handler.caller);
 return true;
}
window.onerror = error_handler;
String.prototype.trim=function(){return this.replace(/(^\s+)|\s+$/g,"");}

$d = document;
$root = document.documentElement;


/*
name       Name of the cookie
value      Value of the cookie
[expires]  Expiration date of the cookie (default: end of current session)
[path]     Path where the cookie is valid (default: path of calling document)
[domain]   Domain where the cookie is valid (default: domain of calling document)
[secure]   Boolean value indicating if the cookie transmission requires a	secure transmission
*/






function $id()
{
	var objs = new Array();
	for(var i=0;i<$id.arguments.length;i++)
	{
		objs[i] = document.getElementById($id.arguments[i]);
	}
	if(objs.length==1){objs = objs[0];}
	else if(objs.length==0){objs = null;}
	return objs;
}

function $names(elName)
{
	return document.getElementsByName(elName);
}

function $attr(srcNode,attributeName,setValueAs)
{
	attributeName = attributeName || "";
	if(setValueAs)
	{
		 srcNode.setAttribute(attributeName,setValueAs);
	}
	else
	{
		return srcNode.getAttribute(attributeName);
	}	
}

function $tags(nodeName,srcDoc)
{
	srcDoc = srcDoc || document;
	nodeName = nodeName || "*";
	return srcDoc.getElementsByTagName(nodeName);
}


$setId.x = 0;
function $setId(el)
{
	var randomID = "wd_random_id_for_element_" + Math.ceil ( Math.random() * 100000 + Date.parse(new Date())	) ;
	while($id(randomID))
	{
		 randomID = "wd_random_id_for_element_" + Math.ceil ( Math.random() * 100000 + Date.parse(new Date())	) ;
	}

	if(el==null)
	{
		return randomID;
	}
	if( (el.id==null) || (el.id=="") )
	{ 
		$setId.x++; 
		el.id = randomID;
	}
	return el.id;
}




function $newNode(elementTagName)
{
	if(document.createElement)
	{
		return document.createElement(elementTagName);
	}
	else
	{
		return null;
	}
}

function $false()
{
	return false;
}

function $true()
{
	return true;
}

function $null()
{
	return null;
}

function $dull()
{
	/*nothing*/
}



self.WD = {
/*begin of functions==============================*/
browser:new Object(),
dull:function (){},


setCookie:function (name, value, expires, path, domain, secure)
{
	if(expires==false)
	{
		//never expire
		expires = new Date();
		expires.setTime(expires.getTime()+1000*60*60*24*365);
	}
		
	document.cookie= name + "=" + escape(value) +
	((expires) ? "; expires=" + expires.toGMTString() : "") +
	((path) ? "; path=" + path : "") +
	((domain) ? "; domain=" + domain : "") +
	((secure) ? "; secure" : "");
},


getCookie:function(name)
{
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1)
    {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else
    {
        begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end == -1)
    {
        end = dc.length;
    }
    return unescape(dc.substring(begin + prefix.length, end));
},

/*
[path]    path of the cookie (must be same as path used to create cookie)
[domain]  domain of the cookie (must be same as domain used to create cookie)
 */
deleteCookie:function (name, path, domain)
{
    if (getCookie(name))
    {
        document.cookie = name + "=" + 
            ((path) ? "; path=" + path : "") +
            ((domain) ? "; domain=" + domain : "") +"; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}
,

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;
},


getPreviousObjByTagName: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;
},


setDimension:function(el,x,y,w,h)
{
	if(el)
	{
		if(x)
		{
			el.style.left = x;
		}

		if(y)
		{
			el.style.top = y;
		}

		if(w)
		{
			el.style.width = w;
		}

		if(h)
		{
			el.style.height = h;
		}
	}
},


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}

	if(document.body &&  document.documentElement)
	{
		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));
	}
	else
	{
		e.mouseX = -1;
		e.mouseY = -1;
	}
	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);

var BO = WD.browser;
var c =[];
BO["ie"] =  (document.all!=null)&&(window.opera==null); 
BO["ie4"]  =  BO["ie"] && (document.getElementById==null); 
BO["ie5"]  =   BO["ie"] && (document.namespaces==null) && (!BO["ie4"]) ; 
BO["ie55"]  =  BO["ie"] && (document.namespaces!=null) && (document.compatMode==null); 
BO["ie6"]  =  BO["ie"] && (document.implementation!=null) && (document.compatMode!=null) && (window.XMLHttpRequest==null) ;
BO["ie7"] = BO["ie6"] && (window.XMLHttpRequest!=null) ;
BO["ie5_6"] =  BO["ie5"] || BO["ie55"] || BO["ie6"];/*rules for IE5~IE6*/
BO["ie55_6"] =  BO["ie55"] || BO["ie6"] ;/*rules for IE5.5~IE6*/
BO["ie6_7"] =  BO["ie6"] || BO["ie7"] ;/*rules for IE6~IE7*/
BO["ie5_7"] =  BO["ie55_6"] || BO["ie6_7"] ;/*rules for IE5~IE7*/
BO["ns4"]  = !BO["ie"] &&  (document.layers !=null) &&  (window.confirm !=null) && (document.createElement ==null); 
BO["opera"] =  (self.opera!=null); 
BO["gecko"] =  (document.getBoxObjectFor!=null); 
BO["firefox15"] = BO["gecko"] && (c.map!=null);
BO["khtml"] = (navigator.vendor =="KDE"); 
BO["konq"] =  ((navigator.vendor == 'KDE')||(document.childNodes)&&(!document.all)&&(!navigator.taintEnabled)); 
BO["safari"] = (document.childNodes)&&(!document.all)&&(!navigator.taintEnabled)&&(!navigator.accentColorName); 
BO["safari12"] = (parseInt(0).toFixed==null) && (BO["safari"] && (window.XMLHttpRequest!=null)); 
/*BO["safari13"] = (parseInt(0).toFixed!=null) && BO["safari"] && !BO["safari12"] ;*/
BO["safari13"] = (document.implementation!=null) && (document.implementation.createHTMLDocument!=null) && (window.opera==null);/*I found this method from http://www.quirksmode.org/dom/w3c_html.html*/
BO["safari11"] = BO["safari"] && !BO["safari12"]  &&!BO["safari13"] ;
BO["macie"] = document.createElement!=null && (document.createElement("tr").insertCell==null);


for(i in BO) {if(BO[i]){c[c.length]=i;}; };
for(i in BO) {if(!BO[i]){c[c.length]="not_"+i;}; };

document.documentElement.className = c.join(" ");


for(i in self.WD)
{
 if(self[i]==null)
	{
		self[i] = self.WD[i];//synchronize for faster deelopement
	}
}