function hasXMLHttpObject()
{
	try {
		var xmlhttp = new XMLHttpRequest();
		if (xmlhttp) {
			xmlhttp = null;
			return true;
		}
	}

	catch (e) {
	}

	return false;
}

/*
	js arrays don't know inArray...
*/
function inArray(array, value)
{
	for (var i=0; i < array.length; i++) {
		if (array[i] === value)
			return true;
	}
	return false;
};

function readNumAttribute (xmlItem, name)
{
	var value = parseInt(xmlItem.getAttribute(name));
	if (isNaN(value)) return 0; else return value;
}

function readArrayAttribute (xmlItem, name)
{
	var value = xmlItem.getAttribute(name);
	if (value && value.length>0)
		return value.split(",");
	else
		return new Array();
}

/*
 * Cross-browser event handling, by Scott Andrew
 */
function addEvent(element, eventType, lamdaFunction, useCapture) {
	if (!element) return false;

    if (element.addEventListener) {
        element.addEventListener(eventType, lamdaFunction, useCapture);
        return true;
    } else if (element.attachEvent) {
        var r = element.attachEvent('on' + eventType, lamdaFunction);
        return r;
    } else {
        return false;
    }
}

/*
 * Kills an event's propagation and default action
 */
function knackerEvent(eventObject) {
    if (eventObject && eventObject.stopPropagation) {
        eventObject.stopPropagation();
    }
    if (window.event && window.event.cancelBubble ) {
        window.event.cancelBubble = true;
    }

    if (eventObject && eventObject.preventDefault) {
        eventObject.preventDefault();
    }
    if (window.event) {
        window.event.returnValue = false;
    }
}

/*
 * Safari doesn't support canceling events in the standard way, so we must
 * hard-code a return of false for it to work.
 */
function cancelEventSafari() {
    return false;
}

/*
 * Cross-browser style extraction, from the JavaScript & DHTML Cookbook
 * <http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap5/index5.html>
 */
function getElementStyle(elementID, CssStyleProperty) {
    var element = document.getElementById(elementID);
    if (element.currentStyle) {
        return element.currentStyle[toCamelCase(CssStyleProperty)];
    } else if (window.getComputedStyle) {
        var compStyle = window.getComputedStyle(element, '');
        return compStyle.getPropertyValue(CssStyleProperty);
    } else {
        return '';
    }
}

/*
 * CamelCases CSS property names. Useful in conjunction with 'getElementStyle()'
 * From <http://dhtmlkitchen.com/learn/js/setstyle/index4.jsp>
 */
function toCamelCase(CssProperty) {
    var stringArray = CssProperty.toLowerCase().split('-');
    if (stringArray.length == 1) {
        return stringArray[0];
    }
    var ret = (CssProperty.indexOf("-") == 0)
              ? stringArray[0].charAt(0).toUpperCase() + stringArray[0].substring(1)
              : stringArray[0];
    for (var i = 1; i < stringArray.length; i++) {
        var s = stringArray[i];
        ret += s.charAt(0).toUpperCase() + s.substring(1);
    }
    return ret;
}

/*
 * Disables all 'test' links, that point to the href '#', by Ross Shannon
 */
function disableTestLinks() {
  var pageLinks = document.getElementsByTagName('a');
  for (var i=0; i<pageLinks.length; i++) {
    if (pageLinks[i].href.match(/[^#]#$/)) {
      addEvent(pageLinks[i], 'click', knackerEvent, false);
    }
  }
}

/*
 * Cookie functions
 */
function createCookie(name, value, days) {
    var expires = '';
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = '; expires=' + date.toGMTString();
    }
    document.cookie = name + '=' + value + expires + '; path=/';
}

function readCookie(name) {
    var cookieCrumbs = document.cookie.split(';');
    var nameToFind = name + '=';
    for (var i = 0; i < cookieCrumbs.length; i++) {
        var crumb = cookieCrumbs[i];
        while (crumb.charAt(0) == ' ') {
            crumb = crumb.substring(1, crumb.length); /* delete spaces */
        }
        if (crumb.indexOf(nameToFind) == 0) {
            return crumb.substring(nameToFind.length, crumb.length);
        }
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, '', -1);
}

function trim(s)
{
	while (s.substring(0, 1) == ' ')
	{
		s = s.substring(1, s.length);
	}
	while (s.substring(s.length-1, s.length) == ' ')
	{
		s = s.substring(0, s.length-1);
	}
	return s;
}

function popup(w, h, filename) {
	var x = screen.availWidth/2-w/2;
	var y = screen.availHeight/2-h/2;
	var popupWindow = window.open(
		"./htm/"+filename+".htm",'','width='+w+',height='+h+',left='+x+',top='+y+',screenX='+x+',screenY='+y);
}

function isVisible( targetId )
{
	if (document.getElementById){
		var target = document.getElementById( targetId );
		if (target && target.style.display != "none") return true;
	}

	return false;
}

function show( targetId ) {
	if (document.getElementById){
		var target = document.getElementById( targetId );
		if (target) target.style.display = "";
	}
}

function hide( targetId ) {
	if (document.getElementById){
		var target = document.getElementById( targetId );
		if (target) target.style.display = "none";
	}
}

function toggle( targetId ) {
  if (document.getElementById){
		var target = document.getElementById( targetId );
		if (target.style.display == "none"){
		  target.style.display = "";
		} else {
		  target.style.display = "none";
		}
	}
}

function togglePlusMinus( targetId, msg ){

	var open = true;

	if (document.getElementById){
		var target = document.getElementById( targetId );
		if (target.style.display == "none"){
		  target.style.display = "";
		  open = false;
		} else {
		  target.style.display = "none";
		}
	}

	if (open)
		setText(targetId+"_link", "[+] " + msg);
	else
		setText(targetId+"_link", "[-] " + msg);
}

function dummy() {
}

function setText(id,txt) {
	var elem=document.getElementById(id);
	elem.removeChild(elem.firstChild);
	elem.appendChild(document.createTextNode(txt));
}

function removeChilds(n) {
	if (n)
		for (var i = n.childNodes.length; i > 0; i--)
			n.removeChild(n.childNodes[0]);
}

function change_option(targ,selObj,restore){
     eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
     if (restore) selObj.selectedIndex=0;
}

function moveBy(obj, x, y) {
	if (obj) {
		var left = findPosX(obj) + x;
		var top = findPosY(obj) + y;
		obj.style.left = left + "px";
		obj.style.top = top + "px";
	}
}

function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;

	// we calculate the position relativ to the main_wrapper origin, this way we are independend of the center position
	curleft -= document.getElementById("wrapper").offsetLeft;

	return curleft;
}

function findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function mousePosX(event) {
	var x = 0;
	if (self.pageYOffset) // all except Explorer
	{
		x = self.pageXOffset;
	}
	else if (document.documentElement && document.documentElement.scrollLeft) // Explorer 6 Strict
	{
		x = document.documentElement.scrollLeft;
	}
	else if (document.body && document.body.scrollLeft) // all other Explorers
	{
		x = document.body.scrollLeft;
	}

	return event.clientX + x;
}

function mousePosY(event) {
	var y = 0;
	if (self.pageYOffset) // all except Explorer
	{
		y = self.pageYOffset;
	}
	else if (document.documentElement && document.documentElement.scrollTop) // Explorer 6 Strict
	{
		y = document.documentElement.scrollTop;
	}
	else if (document.body && document.body.scrollTop) // all other Explorers
	{
		y = document.body.scrollTop;
	}

	return event.clientY + y;
}

function getXOffset()
{
	if (self.pageXOffset) return parseInt(self.pageXOffset); else
	if (document.documentElement && document.documentElement.scrollLeft) return parseInt(document.documentElement.scrollLeft); else
	if (document.body && document.body.scrollLeft) return parseInt(document.body.scrollLeft); else
	return 0;
}

function getYOffset()
{
	if (self.pageYOffset) return parseInt(self.pageYOffset); else
	if (document.documentElement && document.documentElement.scrollTop) return parseInt(document.documentElement.scrollTop); else
	if (document.body && document.body.scrollTop) return parseInt(document.body.scrollTop); else
	return 0;
}

function getObjHeight(obj){
  return document.layers?
         obj.clip.height:(obj.offsetHeight||obj.style.pixelHeight||0);
}

function getObjWidth(obj){
  return document.layers?
         obj.clip.width:(obj.offsetWidth||obj.style.pixelWidth||0);
}

function getInnerSize() {
	var width=0,height=0;
	if (self.innerHeight) // all except Explorer
	{
		width = self.innerWidth;
		height = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight)
		// Explorer 6 Strict Mode
	{
		width = document.documentElement.clientWidth;
		height = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		width = document.body.clientWidth;
		height = document.body.clientHeight;
	}

	return {width:width, height:height};
}

function addsmiley(obj_id, smiley){
	var obj = document.getElementById(obj_id);
	if (obj) obj.value+=smiley;
}

function addTable(obj, cn, width) {
	var table = document.createElement('table'); if (cn) table.className=cn; if (typeof(width) != "undefined" ) table.style.width = width; obj.appendChild(table);
	var tbody = document.createElement('tbody'); table.appendChild(tbody);
	return tbody;
}

function addRow(table, cn) {
	var tr = document.createElement('tr'); if (cn) tr.className=cn; table.appendChild(tr); return tr;
}

function addColumn(tr, cn) {
	var td = document.createElement('td'); if (cn) td.className=cn; tr.appendChild(td); return td;
}

function addImg(obj, filename, w, h) {
	var img = document.createElement('img'); obj.appendChild(img); img.src = filename; img.width = w; img.height = h;  return img;
}

function addJSLink(obj, cn, trigger, name) {
	var linkA = document.createElement('a');
	if (cn) linkA.className = cn;
	linkA.setAttribute("href", "javascript:"+trigger );
	linkA.appendChild(document.createTextNode( name ));
	eval("linkA.onmouseup = function () { "+trigger+"; return false; };");
	obj.appendChild(linkA);
	return linkA;
}

function addLink(obj, cn, url, name) {
	var linkA = document.createElement('a');
	if (cn) linkA.className = cn;
	linkA.setAttribute('href', url );
	linkA.appendChild(document.createTextNode( name ));
	obj.appendChild(linkA);
	return linkA;
}

function addSpan(obj, cn, text) {
	var span = document.createElement('span'); if (cn) span.className=cn; obj.appendChild(span);
	if (text) span.innerHTML= text;
	return span;
}

function addText(obj, text) {
	var txt = document.createTextNode(text);
	obj.appendChild(txt);
	return txt;
}

function addDiv(obj, cn, text) {
	var div = document.createElement('div'); if (cn) div.className=cn; obj.appendChild(div);
	if (text) div.appendChild(document.createTextNode( text ));
	return div;
}

function addBr(obj) {
	obj.appendChild(document.createElement("br"));
}

function addTextArea(obj, cols, text) {
	var textarea = document.createElement('textarea');
	textarea.setAttribute('cols', cols );
	obj.appendChild(textarea);
	if (text) textarea.innerHTML = text;
	return textarea;
}

function clearOptions(id) {
	var element = document.getElementById(id);
	if (element) {
		for(var i=0; i<element.length; i++)
			element.options[i].selected = false;
	}
}

function URLEncode(msg) {
    //return escape(msg).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F').replace(/\?/g,'%2F');

	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var plaintext = msg;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    alert( "Unicode Character '"
                        + ch
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
}

function debug(msg) {
	var debugdiv = document.getElementById('debug');
	if (debugdiv)
	{
		debugdiv.style.visibility = "";

		removeChilds(debugdiv);
		addSpan(debugdiv, "infovalue", "Debug: " + msg);
	}
}
