if (!Array.indexOf) Array.prototype.indexOf=function(searchElement,fromIndex){if (fromIndex==null || typeof(fromIndex)!="number" || fromIndex<0 || fromIndex!=Math.round(fromIndex)) fromIndex=0; for (var num1=fromIndex; num1<this.length; num1++) {if (this[num1]===searchElement) return num1;} return -1;}
if (!Array.lastIndexOf) Array.prototype.lastIndexOf=function(searchElement,fromIndex){if (fromIndex==null || typeof(fromIndex)!="number" || fromIndex<0 || fromIndex!=Math.round(fromIndex)) fromIndex=this.length-1; if (!fromIndex<this.length) fromIndex=this.length-1; for (var num1=fromIndex; num1>-1; num1--) {if (this[num1]===searchElement) return num1;} return -1;}

if (!String.endsWith) String.prototype.endsWith=function(pattern){var num1=this.length-pattern.length; return num1>=0 && this.lastIndexOf(pattern)===num1;}
if (!String.startWith) String.prototype.startWith=function(pattern){return this.indexOf(pattern)===0;}
if (!String.trim) String.prototype.trim=function(){return this.replace(/^\s+/, '').replace(/\s+$/, '');}

function getElement(htmlElement){return (htmlElement && typeof(htmlElement)!="object")?document.getElementById(htmlElement.toString()):htmlElement;}
function getParentElement(htmlElement){return htmlElement.parentNode?htmlElement.parentNode:htmlElement.parent;}
function getElementProperty(htmlElement,property)
{
	while (htmlElement && !htmlElement[property]) htmlElement=getParentElement(htmlElement);
	return htmlElement?htmlElement[property]:null;
}
function clearElementStyleProperty(htmlElement,property)
{
	if (htmlElement.style && htmlElement.style[property]) htmlElement.style[property]=null;
	for (var num1=0;num1<htmlElement.childNodes.length;num1++) clearElementStyleProperty(htmlElement.childNodes[num1],property);
}
function encodeInputValue(input)
{
	input=getElement(input);
	if (input && input.value) input.value=encodeURIComponent(input.value);
}
function decodeInputValue(input)
{
	input=getElement(input);
	if (input && input.value) input.value=decodeURIComponent(input.value);
}

function findNode(node,name)
{
	var array1=new Array();
	var array2=node.childNodes;
	for(var num1=0;num1<array2.length;num1++)
	{
		var node1=array2[num1];
		if (node1.nodeName==name) array1.push(node1);
		if (node1.hasChildNodes()) array1=array1.concat(findNode(node1,name));
	}
	return array1;
}

function switchHider(element,hider,imageElement,minusImageSrc,plusImageSrc,forced,hide)
{
    if (imageElement)
    {
        imageElement=getElement(imageElement);
        var hide2=imageElement.src.endsWith(minusImageSrc);
        imageElement.src=hide2?plusImageSrc:minusImageSrc;
        if (forced && hide==null) hide=hide2;
    }
    
    element=getElement(element);
    if (element)
    {
        if (element.getAttribute)
        {
            var text1=element.getAttribute("hider");
            if (text1)
            {
                var array1=text1.split('|');
                var num1=array1.indexOf(hider);
                if (num1!=-1)
                {
                    if (!forced) element.style.display=(element.style.display=="none"?"":"none");
                    else
                    {
                        if (hide==null) hide=element.style.display=="";
                        var text2=element.getAttribute("firstHider");
                        if (hide)
                        {
                            element.style.display="none";
                            if (text2==null) element.setAttribute("firstHider",hider);
                        }
                        else
                        {
                            if (text2==null || text2==hider)
                            {
                                element.style.display="";
                                element.removeAttribute("firstHider");
                            }
                        }
                    }
                }
            }
        }
        for(var num1=0;num1<element.childNodes.length;num1++) 
        {
            var hide2=switchHider(element.childNodes[num1],hider,null,null,null,forced,hide);
            if (hide==null) hide=hide2;
        }
    }
    
    return hide;
}

function changeUrlParam(url,param,value)
{
	var regExp=new RegExp("("+param+"=)(\\w*)(&|$)"); 
	if (regExp.test(url)) url=url.replace(regExp,"$1"+value+"$3");
	else url+=(url.indexOf("?")==-1?"?":"&")+param+"="+value;
	return url;
}

function getElementSize(element)
{
	var size=new Object();
	element=getElement(element);
	var style=getElementStyle(element);
	size.height=element.clientHeight?element.clientHeight:element.offsetHeight;
	size.width=element.clientWidth?element.clientWidth:element.offsetWidth;
	size.paddingTop=getPixelLength(style.paddingTop);
	size.paddingBottom=getPixelLength(style.paddingBottom);
	size.paddingLeft=getPixelLength(style.paddingLeft);
	size.paddingRight=getPixelLength(style.paddingRight);
	size.borderTop=getPixelLength(style.borderTopWidth);
	size.borderBottom=getPixelLength(style.borderBottomWidth);
	size.borderLeft=getPixelLength(style.borderLeftWidth);
	size.borderRight=getPixelLength(style.borderRightWidth);
	
	if (navigator.appName=="Netscape") 
	{
		size.height-=(size.paddingTop+size.paddingBottom);
		size.width-=(size.paddingLeft+size.paddingRight);
	}
	else if (navigator.appName.indexOf("Explorer")) 
	{
		size.height+=(size.borderTop+size.borderBottom);
		size.width+=(size.borderLeft+size.borderRight);	
	}

	return size;
}

function getElementStyle(element)
{
	var element = getElement(element);
	if (element.currentStyle) return element.currentStyle;
	else if (window.getComputedStyle) return document.defaultView.getComputedStyle(element,null);
	return element.style;
}
function getPixelLength(length)
{
	var newLength=0;
	if (length!=null)
	{
		var match=length.toString().match(/(\d+\.?\d*)(.{0,2})/);
		if (match && match.length==3)
		{
			newLength=parseFloat(match[1]);
			var unit=match[2].toString().toLowerCase();
			switch(unit)
			{
				//case "%":
				//case "ex":
				//case "px":  
				case "pt": newLength/=0.75; break;
				case "mm": newLength/=0.265; break;
 				case "em": newLength/=0.0626; break;
				case "pc": newLength/=0.0626; break;
 				case "cm": newLength/=0.0265; break;
				case "in": newLength/=0.01044; break;
			}
		}
	}
	return newLength;
}

function getOffsets (evt) {
  var target = evt.target;
  if (typeof target.offsetLeft == 'undefined') target = target.parentNode;

  var pageCoords = getPageCoords(target);
  var eventCoords = 
  { 
	x: window.pageXOffset + evt.clientX,
	y: window.pageYOffset + evt.clientY
  };
  var offsets = 
  {
	offsetX: eventCoords.x - pageCoords.x,
	offsetY: eventCoords.y - pageCoords.y
  }
  return offsets;
}

function getPageCoords (element) {
  var coords = {x : 0, y : 0};
  while (element) 
  {
	coords.x += element.offsetLeft;
	coords.y += element.offsetTop;
	element = element.offsetParent;
  }
  return coords;
}

function exploreObject(obj,includeFunctions)
{
	var count=0;
	var properties=new Array();
	for (var prop in obj) if (includeFunctions || typeof(obj[prop])!="function") properties[count++]=prop;
	properties.sort();

	var text="";
	var propPerPage=10;
	var pages=Math.ceil(properties.length/propPerPage);
	for (var num1=0;num1<properties.length;num1++) 
	{
		text+=properties[num1]+" = "+obj[properties[num1]]+"\n";
		if (num1>0 && num1%propPerPage==0)
		{
			alert("Page "+num1/propPerPage+"/"+pages+":\n"+text);
			text="";
		}
	}
	alert("Page "+pages+"/"+pages+":\n"+text);
}