/* Miscellaneous functions */
var isIE=document.all;
var isNN=!document.all&&document.getElementById;
var isN4=document.layers;

function windowLoaded(evt) {
    // prevent IE text selection while dragging!!! Little-known trick!
    document.body.ondrag = function () { return false; };
    document.body.onselectstart = function () { return false; };
}

function $() {
  var a = arguments;
  var r = new Array();
  for (var i=0; i<a.length; i++) {
    var o = a[i];
    if (typeof(o) == 'string') r.push(document.getElementById(o));
    else r.push(o);
  }
  if (r.length == 1) return r[0];
  return r;
}

function tags() {
    var a = arguments;
    var r = new Array();
    for (var i=1; i<a.length; i++)
	r[a[i]] = a[0].getElementsByTagName(a[i]);

    if (i == 2) return r[a[1]];
    return r;
}

function elementize() {
  var type = arguments[0];
  var nel;
  nel = document.createElement(type);
  for (var i=1; i<arguments.length; i++) {
    var attr = arguments[i].split(/=/);
    eval("nel." + attr[0] + " = '" + attr[1] + "';");
  }
  
  return nel;
}

function texit(node, tex) {
    var texel = document.createTextNode(tex);
    foster(node, texel);
}

function foster() {
  var parent = arguments[0];
  for (var i=1; i<arguments.length; i++) {
    parent.appendChild(arguments[i]);
  }
  return parent;
}

function createClient() {
    var client;
    try {
        client = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {
        alert("Sorry, your browser is not AJAX-enabled!");
    }
    return client;
}

function eventer (target,type,func,bubbles) {
    if (document.addEventListener) {
        target.addEventListener(type,func,bubbles);
    } else if (document.attachEvent) {
        target.attachEvent("on"+type,func,bubbles);
    } else {
        target["on"+type] = func;
    }
}

function reventer (target,type,func,bubbles) {
    if (document.removeEventListener) {
        target.removeEventListener(type,func,bubbles);
    } else if (document.detachEvent) {
        target.detachEvent("on"+type,func,bubbles);
    } else {
        target["on"+type] = null;
    }
}

function getX(node) { return parseInt(node.style.left);   }
function getOX(node) { return parseInt(node.offsetLeft);   }
function getY(node) { return parseInt(node.style.top);    }
function getOY(node) { return parseInt(node.offsetTop);    }
function getW(node) { return parseInt(node.style.width);  }
function getOW(node) { return parseInt(node.offsetWidth); }
function getH(node) { return parseInt(node.style.height); }
function getOH(node) { return parseInt(node.offsetHeight); }

function setX(node, x) { node.style.left = x + "px";   }
function setY(node, y) { node.style.top = y + "px";    }
function setW(node, w) { node.style.width = w + "px";  }
function setH(node, h) { node.style.height = h + "px"; }
function setPos(node, x, y) { 
	setX(node, x); 
	setY(node, y); 
}
function setSize(node, w, h) {
	setW(node, w);
	setH(node, h);
}

function setStyle() {
    var styles = arguments;
    var node = styles[0];
    for (var i=1; i<styles.length; i++) {
	var style = styles[i].split('=');
	eval ("node.style." + style[0] + " = '" + style[1] + "';"); 
    }
}

function setSelect(node, value) {
    for (var i=0; i<node.options.length; i++) {
	if (node.options[i].value == value) {
	    node.selectedIndex = i;
	    break;
	}
    }
}

function fit(node, holder) {
    setSize(node, getOW(holder), getOH(holder));
}


function Evt(evt) {
    this.evt = evt ? evt : window.event; 
    this.source = evt.target ? evt.target : evt.srcElement;
    this.x = evt.pageX ? evt.pageX : evt.clientX;
    this.y = evt.pageY ? evt.pageY : evt.clientY;
}

Evt.prototype.toString = function () {
    return "Evt [ x = " + this.x + ", y = " + this.y + " ]";
};

Evt.prototype.consume = function () {
    if (this.evt.stopPropagation) {
	this.evt.stopPropagation();
	this.evt.preventDefault();
    } else if (this.evt.cancelBubble) {
	this.evt.cancelBubble = true;
	this.evt.returnValue  = false;
    }
};

Evt.addEventListener = function (target,type,func,bubbles) {
    if (document.addEventListener) {
	target.addEventListener(type,func,bubbles);
    } else if (document.attachEvent) {
	target.attachEvent("on"+type,func,bubbles);
    } else {
	target["on"+type] = func;
    }
};

Evt.removeEventListener = function (target,type,func,bubbles) {
    if (document.removeEventListener) {
	target.removeEventListener(type,func,bubbles);
    } else if (document.detachEvent) {
	target.detachEvent("on"+type,func,bubbles);
    } else {
	target["on"+type] = null;
    }
};

function getOpacity(node) {
    var o;
    if (node.filters) {
	try {
	    o = node.filters["alpha"].opacity/100;
	} catch (e) { }
    } else if (node.style.opacity) {
	o = node.style.opacity;
    }
    
    return parseFloat(o);
}

function setOpacity(node,val) {
    if (node.filters) {
        try {
            node.filters["alpha"].opacity = val*100;
        } catch (e) { }
    } else {
	node.style.opacity = val;
    }
}

function blink(id, by, to, rate, brake) {
    
}

// runs with setTimeout
function fadeIn_TO(id, to, by, rate, brake) {
    var arr = new Array("'" + id + "'", "'" + to + "'", by, rate+brake, brake);
    var node = $(id);
    var o = getOpacity(node) + by;
    if (o < 1) {
	setOpacity(node, o);
	eval(to + " = setTimeout(\"fadeIn(" + arr.join(', ') + ")\", " + rate + ")");
    } else {
	eval("clearTimeout(" + to + ")");
	setOpacity(node, 1);
    }
}

function fadeOut_TO(id, to, by, rate, brake) {
    var arr = new Array("'" + id + "'", "'" + to + "'", by, rate+brake, brake);
    var node = $(id);
    var o = getOpacity(node) - by;
    if (o > 0) {
	setOpacity(node, o);
	eval(to + " = setTimeout(\"fadeOut(" + arr.join(', ') + ")\", " + rate + ")");
    } else {
	eval("clearTimeout(" + to + ")");
	setOpacity(node, 0);
    }
}

// runs with setInterval
function fadeIn(id, to, by) {
    var node = $(id);
    var o = getOpacity(node) + by;
    if (o < 1) {
	setOpacity(node, o);
    } else {
	eval("clearInterval(" + to + "); " + to + " = null;");
	setOpacity(node, 1);
    }
}

function fadeOut(id, to, by) {
    var node = $(id);
    var o = getOpacity(node) - by;
    if (o > 0) {
	setOpacity(node, o);
    } else {
	eval("clearInterval(" + to + "); " + to + " = null;");
	setOpacity(node, 0);
    }
}
