/*
	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;
};

/*
 * 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 showV( targetId ) {
	if (document.getElementById){
		var target = document.getElementById( targetId );
		if (target) target.style.visibility = "visible";
	}
}

function hideV( targetId ) {
	if (document.getElementById){
		var target = document.getElementById( targetId );
		if (target) target.style.visibility = "hidden";
	}
}

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 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("main_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};
}

