//Miscellaneos javascripts for making life easier.

// From http://simon.incutio.com/archive/2004/05/26/addLoadEvent
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}

// From http://www.scottandrew.com/weblog/jsjunk#events
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla

function addEvent(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 {
		alert("Handler could not be added");
	}
} 

function removeEvent(elm, evType, fn, useCapture)
{
	if (elm.removeEventListener){
		elm.removeEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.detachEvent){
		var r = elm.detachEvent("on"+evType, fn);
		return r;
	} else {
		alert("Handler could not be removed");
	}
}

function triggerEvent(elm, evType) {
	if (elm.dispatchEvent){
		return elm.dispatchEvent({type: evType});
	} else if (elm.detachEvent){
		var r = elm.fireEvent("on"+evType);
		return r;
	} else {
		alert("Handler could not be triggered");
	}
	
}

function getQueryArgs(global)
{
	var args = {};
	var loc = window.location.href;
	var q = loc.indexOf("?");
	if (q==-1) return false;
	loc = loc.substring(q+1);
	var pairs = loc.split("&");
	for (var i=0; i<pairs.length;i++){
		if (global) eval(pairs[i]);
		var keyval = pairs[i].split("=");
		args[keyval[0]] = unescape(keyval[1]);
	}
	return args;
}

// Add or remove a class on an element object.
function add_class(e,c) {
	e.className=e.className+" "+c;
}

function remove_class(e,c) {
	cn=e.className;
	p=cn.indexOf(c);
	if (p == -1) return;
	e.className=cn.substr(0,p)+cn.substr(p+c.length);
}

function toggleDisplay(id) {
	var el = document.getElementById(id);
	if (!el) return;
	if (el.style.display == 'none') {
		el.style.display = '';
	} else {
		el.style.display = 'none';
	}
}

function hideDisplay(el) {
	el.style.display = 'none';
}

function showDisplay(el) {
	el.style.display = '';
}

//Forms
function replaceSelectOptions(sel, options, selected, null_val) {
	var sel_flag = false;
	if (!selected) {
		selected = sel.value;
	}
	if (!null_val) {
		null_val = '--Select--';
	}
	//Clear previous options
	sel.options.length = 0;
	sel.options[0] = new Option(null_val, "", true, false);
	for (var i = 0; i < options.length; i++) {
		sel_flag = (selected && options[i]['k'] == selected); 
		sel.options[i+1] = new Option(options[i]['v'], options[i]['k'], sel_flag, sel_flag);
	}
	return true;
}

function doMenuAction(sel) {
	selopt = sel.options[sel.selectedIndex];
	
	if (selopt.value != "") {
		window.location = selopt.value;
	}
	return false;
}

/* 
	Javascript to style odd/even table rows
	Derived from 'Zebra Tables' by David F. Miller (http://www.alistapart.com/articles/zebratables/)
	
	Modified by Jop de Klein, february 2005
	jop at validweb.nl
	http://validweb.nl/artikelen/javascript/better-zebra-tables/
*/

var stripe = function() {
	var tables = document.getElementsByTagName("table");	

	for(var x=0;x!=tables.length;x++){
		var table = tables[x];
		if (! table) { return; }
		
		if (table.className.indexOf('zebra') == -1) continue;
		
		var tbodies = table.getElementsByTagName("tbody");
		
		for (var h = 0; h < tbodies.length; h++) {
			var even = true;
			var trs = tbodies[h].getElementsByTagName("tr");
			
			for (var i = 0; i < trs.length; i++) {
				trs[i].onmouseover=function(){
					this.className += " ruled"; return false
				}
				trs[i].onmouseout=function(){
					this.className = this.className.replace("ruled", ""); return false
				}
				
				if(even)
					trs[i].className += " even";
				
				even = !even;
			}
		}
	}
}

//Hook to allow FireBug logging.
function printfire()
{
    if (document.createEvent)
    {
        printfire.args = arguments;
        var ev = document.createEvent("Events");
        ev.initEvent("printfire", false, true);
        dispatchEvent(ev);
    }
}
