


/*---------------------------------------------------------------------*/
/* Misc functions */

function debug(txt) {
	var debug_mode = false;
	
	if (debug_mode)
		alert(txt);
}
 
function openPopup(url, name, width, height) {
	mywidth = width;
	myheight = height;
	myleft = (screen.width - mywidth) / 2;
	mytop = (screen.height - myheight) / 2;
	new_win = window.open(url, name, "width="+mywidth+",height="+myheight+",scrollbars=1,resizable=1,menubar=0,toolbar=0,status=1,location=0,directories=0,left="+myleft+",top="+mytop);
	new_win.opener.top.name = "opener";
	new_win.focus();
}

function bindEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener){
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent){
		var r = elm.attachEvent("on"+evType, fn);
		return r;
	} else {
    	elm["on"+evType] = fn;
	}
}

document.getElementsByClassName = function(className) {
	var children = document.getElementsByTagName("*") || document.all;
	var elements = new Array();

	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var classNames = child.className.split(" ");
		for (var j = 0; j < classNames.length; j++) {
			if (classNames[j] == className) {
				elements.push(child);
				break;
			}
		}
	}
	return elements;
}

if (!Array.prototype.push) {
	Array.prototype.push = function() {
		var startLength = this.length;
		for (var i = 0; i < arguments.length; i++)
			this[startLength + i] = arguments[i];
		return this.length;
	}
}

function get_repr(obj) {
	var repr = "";
	
	repr += "Type: " + typeof obj + "\n";
	repr += "Value: ";
	if (typeof obj == "object" || typeof obj == "array") {
		repr += "{ ";
		for (var i in obj)
			repr += i + ": " + obj[i] + ", ";
		repr = repr.substr(0, repr.length-2) + " }";
	} else {
		repr += obj;
	}
	return repr;
}

function elem() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var name = arguments[i];
		var val = name;
		if (typeof name == "string") {
			val = document.getElementById(name);
			if (! val) {
				alert("Could not find element " + name);
				return false;
			}
		}
		if (arguments.length == 1) 
			return val;
		elements.push(val);
	}
	return elements;
}



/*---------------------------------------------------------------------*/
/*	Hover-over rows 

		To use, include hovertable.css, assign a class of "hover" to the
		table(s) you want, and then do
		
		HoverTable.init();
		
 */	
 
var HoverTable = { 
	init: function() {
		var tables;
		var this_table;
		var i;
	
		if (!document.getElementsByTagName) return;
		tables = document.getElementsByTagName("table");
		for (i = 0; i < tables.length; i++) {
			this_table = tables[i];
			if (this_table.className == "hover" ||
					this_table.className.search(/\bhover\b/) != -1) {
				HoverTable.prepTable(this_table);
			}
		}
	},
	
	prepTable: function(table) {
		var i;
		var this_row;
	
		if (! table ||
				! table.rows ||
				! table.rows.length > 1) {
			return;
		}
		
		for (i = 1; i < table.rows.length; i++) {
			this_row = table.rows[i];
			if (! this_row) return;
			bindEvent(this_row, "mouseover", HoverTable.mouseOver);
			bindEvent(this_row, "mousedown", HoverTable.mouseDown);
			bindEvent(this_row, "mouseout", HoverTable.mouseOut);
		}
	},

	mouseOver: function(e) {	
		var t = null;
		if (e && e.target) t = e.target;
		if (window.event && window.event.srcElement) t = window.event.srcElement;
	
		if (t.tagName == "TD") {
			var children = t.parentNode.childNodes;
			var i;
			
			for (i = 0; i < children.length; i++)
				children[i].className = children[i].className + " hoverover ";
				
		} else {
			t.className = t.className + " hoverover ";
		}
		debug(t.tagName + " - " + t.className);
	},
	
	mouseDown: function(e)
	{
		var t = null;
		if (e && e.target) t = e.target;
		if (window.event && window.event.srcElement) t = window.event.srcElement;
		
		if (t.tagName == "TD") {
			var children = t.parentNode.childNodes;
			var i;
			
			for (i = 0; i < children.length; i++) {
				t = children[i];
		    	if (t.className.search(/\bhoverdown\b/) != -1) 
		    		t.className = t.className.replace(/\bhoverdown\b/, "");
		    	else 
 	   			t.className = t.className + " hoverdown ";
			}		
		} else {
 	   	if (t.className.search(/\bhoverdown\b/) != -1) 
 	   		t.className = t.className.replace(/\bhoverdown\b/, "");
 	   	else 
 	   		t.className = t.className + " hoverdown ";
		}
		debug(t.tagName + " - " + t.className);
	},
	
	mouseOut: function(e)
	{
		var t = null;
		if (e && e.target) t = e.target;
		if (window.event && window.event.srcElement) t = window.event.srcElement;

		if (t.tagName == "TD") {
			var children = t.parentNode.childNodes;
			var i;
			
			for (i = 0; i < children.length; i++) {
				t = children[i];
				t.className = t.className.replace(/\bhoverover\b/, "");
			}
		}
		else {
			t.className = t.className.replace(/\bhoverover\b/, "");
		}
	}	
}



/*---------------------------------------------------------------------*/
/*	Cookies */

var Cookies = {

	get: function(name, or_value) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++)
		{
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return or_value;
	},

	set: function(name, value, days) {
		if (days)
		{
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		} else
			var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}
	
}



/*---------------------------------------------------------------------*/
/*	HTML elements */

var Element = {

	getLeft: function(element) {
		element = elem(element);
		var left = 0;
		
		while (element.tagName != "BODY") {
			left = left + element.offsetLeft;
			element = element.offsetParent;
		}
		
		return left;
	},

	getTop: function(element) {
		element = elem(element);
		var top = 0;
		
		while (element.tagName != "BODY") {
			top = top + element.offsetTop;
			element = element.offsetParent;
		}
	},

	getHeight: function(element) {
		return elem(element).offsetHeight;
	},
	
	getWidth: function(element) {
		return elem(element).offsetWidth;
	},
	
	toggle: function() {
		for (var i = 0; i < arguments.length; i++) {
			var element = elem(arguments[i]);
			element.style.display = 
				(element.style.display == "none" ? "" : "none");
		}
	},

	hide: function() {
		for (var i = 0; i < arguments.length; i++) {
			var element = elem(arguments[i]);
			element.style.display = "none";
		}
	},

	show: function() {
		for (var i = 0; i < arguments.length; i++) {
			var element = elem(arguments[i]);
			element.style.display = "";
		}
	},

	remove: function(element) {
		element = elem(element);
		element.parentNode.removeChild(element);
	},
		
	getValue: function(element) {
		var element = elem(element);
		var tag = element.tagName.toLowerCase();
		if (Element.Values[tag]) 
			return Element.Values[tag](element);
		else
			return Element.Values.other(element);
	},
	
	/* 
	 * A series of functions to obtain the value of an HTML element
	 * be it a regular element, an INPUT, etc..
	 *
	 */
	Values: {
		checkbox: function(element) {
			if (element.checked) 
				return element.value;
			else
				return false;	// should this be ""?
		},
		input: function(element) {
			switch (element.type.toLowerCase()) {
				case "hidden":
				case "password":
				case "text":
					return Element.Values.textarea(element);
				case "checkbox":
				case "radio":
					return Element.Values.checkbox(element);
				default:
					debug("Cannot get value for " + element.name);
					return false;
			}
		},
		other: function(element) {
			return element.innerHTML;
		},
		select: function(element) {
			var idx = element.selectedIndex;
			if (idx >= 0) 
				return element.options[idx].value || element.options[idx].text;
			else
				return "";
		},
		textarea: function(element) {
			return element.value;
		}
	}
}



/*---------------------------------------------------------------------*/
/*	Select manipulation */

var Select = {
	get: function(element) {
		return Element.getValue(element);
	},
	
	getIdx: function(element, val) {
		var e = elem(element);
		for (var i = e.options.length; i < e.options.length; i++) {
			if (e.options[i].value == val || e.options[i].text == val) {
				return i;
			}
		}
		return false;
	},
	
	set: function(element, val) {
		var i = Select.getIdx(element, val);
		if (i) {
			elem(element).selectedIndex = i;
			return true;
		}
		return false;
	},
	
	add: function(element, val, text) {
		var e = elem(element);
		if (! text)
			text = val;
		e.options[e.options.length] = new Option(text, val);
	},
	
	remove: function(element, val) {
		var e = elem(element);
		var i = Select.getIdx(e, val);
		if (i) {
			e.options[i] = null;
			return true;
		}
		return false;
	},
	
	clear: function(element) {
		elem(element).options.length = 0;
	}
}



/*---------------------------------------------------------------------*/
/*	Effects to use on a DIV */

var Effect = {
	appear: function(element) {
		var x = new Object();
		x.element = elem(element);
		
		x.init = function() {
			x.start = 0;
			x.finish = 100;
			x.delay = 65;
			x.current = x.start;
			x.fade();
		}
		
		x.fade = function() {
			if (x.current > x.finish) return;
			if (x.timer) clearTimeout(x.timer);
			x.setOpacity(x.element, x.current);
			x.current += 10;
			x.timer = setTimeout(x.fade, x.delay);
		}
		
		x.setOpacity = function(element, opacity) {
			opacity = (opacity == 100) ? 99.999 : opacity;
			element.style.filter = "alpha(opacity:"+opacity+")";
			element.style.opacity = opacity/100 /*//*/;
			element.style.display = "";			
		}
		
		x.init();
	},

	disappear: function(element) {
		var x = new Object();
		x.element = elem(element);
		
		x.init = function() {
			x.start = 100;
			x.finish = 0;
			x.delay = 85;
			x.current = x.start;
			x.fade();
		}
		
		x.done = function() {
			Element.remove(x.element)
		}
		
		x.fade = function() {
			if (x.current < x.finish) {
				setTimeout(x.done, x.delay*2);
				return;
			}
			if (x.timer) clearTimeout(x.timer);
			x.setOpacity(x.element, x.current);
			x.current -= 10;
			x.timer = setTimeout(x.fade, x.delay);
		}
		
		x.setOpacity = function(element, opacity) {
			opacity = (opacity == 100) ? 99.999 : opacity;
			element.style.filter = "alpha(opacity:"+opacity+")";
			element.style.opacity = opacity/100 /*//*/;
			element.style.display = "";			
		}
		
		x.init();
	},
	
	flash: function(element) {
		var x = new Object();
		x.element = elem(element);
		
		x.init = function() {
			x.curPops = 0;
			x.nPops = 3;
			x.delay = 75;
			x.popColor = "#ff0000";
			x.background = x.element.style.backgroundColor == "" ? "#ffffff" : x.element.style.backgroundColor;
			x.setPop();
		}
		
		x.setPop = function() {
			if (x.curPops >= x.nPops) 
				return;
				
			x.element.style.background = x.popColor;
			x.curPops = x.curPops + 1;
			setTimeout(x.unPop, x.delay);
		}
		
		x.unPop = function() {
			x.element.style.background = x.background;
			setTimeout(x.setPop, x.delay);
		}
		
		x.init();
	}
}
