//Miscellaneos javascripts for making life easier.

// 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 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) {
	if (has_class(e, c)) return;
	e.className=e.className+" "+c;
}

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

function has_class(e, c) {
	return (e.className.indexOf(c) != -1) 
}

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) {
		if (sel.multiple) {
			selected = new Object();
			for (var i = 0; i < sel.options.length; i++) {
				if (sel.options[i].selected) {
					selected[sel.options[i].value] = 1;
				}
			}
		} else {
			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++) {
		if (sel.multiple) {
			sel_flag = (selected[options[i]['k']] != null);
		} else {
			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;
}

//Select this value on the specified form
function form_selectValue(el, value) {
	for (var i = 0; i < el.options.length; i++) {
		if (el.options[i].value == value) {
			el.selectedIndex = i;
			return;
		}
	}
}

//Expects a prototype Array of checkbox elements
function form_toggleCheckboxes(els) {
	els.each( function (el) {
		el.checked = !(el.checked);
	});
}

//Expects a prototype Array of checkbox elements
function form_setCheckboxes(els, state) {
	els.each( function (el) {
		el.checked = state;
	});
}

function form_autoSubmit(form) {
	form.submit();
}

function form_setupAutoSubmit() {
	var els = $$('select.autoSubmit');
	els.each(function (el) {
		Event.observe(el, 'change', function () { form_autoSubmit(el.form); }, false);
	});
}

jQuery(document).ready(form_setupAutoSubmit);

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

function zebra_stripe() {
	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
				}
				
				remove_class(trs[i], 'even');
				
				if(even)
					trs[i].className += " even";
				
				even = !even;
			}
		}
	}
}

jQuery(document).ready(zebra_stripe);

//Scriptaculous-related functions
function st_toggle(target, link, ontext, offtext) {
	if (!$ID(target)) return;
	if (Element.visible(target)) {
		$ID(link).innerHTML = offtext;
		Effect.BlindUp(target);
	} else {
		$ID(link).innerHTML = ontext;
		Effect.BlindDown(target);
	}
	return false;
}

function st_createContentToggler(target, link, ontext, offtext) {
	var toggler = ( function () {
		st_toggle(target, link, ontext, offtext);
	});
	
	Element.hide(target);
	
	Event.observe(link, 'click', toggler, false);
	//link.href = "javascript: return false;"
}
