var browser_type;
var is_ie=false;
var is_nn=false;
var is_opera=false;
var is_gecko=false;
var is_tablet=false;
var mouse_pos;
var menu_id=false;
var toc_down='<img src="'+baseurl+'images/icons/minus.png" width="16" height="16" border="0"/>';
var toc_up='<img src="'+baseurl+'images/icons/plus.png" width="16" height="16" border="0" />';
var loading_icon='<img src="'+baseurl+'images/loading.gif" width="32" height="32" border="0" alt="Loading..." />';

if (document.layers) { 
	browser_type="nn4"; 
	is_nn=true;
} else if (document.all) {
	browser_type="ie";
	is_ie=true;
} else if (window.navigator.userAgent.toLowerCase().match("gecko")) {
	browser_type="gecko";
	is_gecko=true;
} else {
	browser_type="none";
}

function load_url(atarget, aurl, pglink)
{
if (!atarget)
	return true;
if (typeof pglink=='undefined')
	$(atarget).html(loading_icon);
else
	$(pglink).addClass('loading');
$(atarget).load(aurl, function(r,t,xml) 
	{ if (t=='error') 
		$(atarget).html("Request failed! Try again.");
	  if (typeof pglink!='undefined')
	     $(pglink).removeClass('loading');
	}); 
return false;
}

function load_preview(bt, ct, url)
{
$(bt).html(loading_icon);
$(ct).show();
$(bt).load(url, function(r,t,xml) 
	{ if (t=='error')
		$(bt).html("Request failed! Try again.");
	});
return false;
}

function handle_mouse_move(e) 
{
e=e || window.event;
mouse_pos=mouse_coords(e);
}

function mouse_coords(e) 
{
if (e.pageX || e.pageY)
	return {x:e.pageX, y:e.pageY};

/* Handle IE braindamage */
return {x:e.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:e.clientY + document.body.scrollTop  - document.body.clientTop};
}

/* Set our mouse move handler */
document.onmousemove=handle_mouse_move;

function OpenWindow(url,bb,hh) 
{
var win;

if (hh >screen.height) hh=hh/2;
if (bb >screen.width) bb=bb/2;

b=0;b+=bb+40;h=0;h+=hh+40;

text = "width=";text += b.toString();
text += ",height=";
text+= h.toString();
text+=",resizable=1,status=0,scrollbars=1"
win=window.open(url,"",text);
}

function isEmailAddr(email)
{
var result = false;
var theStr = new String(email);
var index = theStr.indexOf("@");

/* 1@3.5 */
if (theStr.length<6)
	return false;

if (index>0) {
	var pindex=theStr.indexOf(".",index);
	if ((pindex>index+1) && (theStr.length > pindex+1))
		result=true;
}
return result;
}

function allDigits(str)
{
return inValidCharSet(str,"0123456789");
}

function isPhoneNumber(str)
{
if (str.length<6)
	return false;
p=str.substr(0,1);
if (p!='+')
	return false;
return allDigits(str.substr(1));
}

function inValidCharSet(str,charset)
{
var result = true;

// Note: doesn't use regular expressions to avoid early Mac browser bugs
for (var i=0;i<str.length;i++)
if (charset.indexOf(str.substr(i,1))<0) {
	result=false;
	break;
}
return result;
}

function isEmpty(str) {
if (str.length==0) return false; else return true;
}

function check_text(tcheck, v) {
switch (tcheck) {
	case "email":
		return isEmailAddr(v);
	break;
	case "integer":
		return allDigits(v);
	break;
	case "phone":
		return isPhoneNumber(v)
	break;
	case "empty":
		return isEmpty(v);
	break;
	default:
		return true;
	break;
	}
return true;
}

function check_radio_group(e, mins, maxs)
{
s=0;
for (i=0;i<e.length;i++) {
	if (e[i].checked==true)
		s++;
}
if (mins>0 && s<mins)
	return false;
if (maxs>0 && s>=maxs)
	return false;
return true;
}

function check_selection(e, c)
{
switch (c) {
	case "positive":
		return e.value>-1 ? true : false;
	break;
}
return true;
}

function validateForm(f, fe) {
return validateFormFull(f, fe, false);
}

function validateFormFull(theForm, theFields, checkAll) {
var evalue;
var check;
var fres=true;

for (var fname in theFields) {
	result=true;
	tf=theFields[fname];
	check=tf[1];
	element=get_the_element(fname);
	if (element)
		type=element.type;
	else
		type=tf[0];
	switch(type) {
		case "text":
			result=check_text(check, element.value);
		break;
		case "textarea":
			result=check_text(check, element.value);
		break;
		case "password":
			result=check_text("empty", element.value);
		break;
		case "radio":
			elements=document.getElementsByName(fname);
			if (elements && check=="selected")
				result=check_radio_group(elements, 1, 0);
			element=elements[0];
		break;
		case "select-one":
			result=check_selection(element, check);
		break;
		case "select-multiple":
			result=check_selection(element, 1);
		break;
		case "file":
			result=do_check("empty", element.value);
		break;
		default:
			result=true;
		break;
	}
	$(element).each(function(i) {
		if (result==false) {
			$(this).addClass('field_error');
			switch (this.type) {
				case "radio":
					tmp='label[for='+this.id+']';
					$(tmp).addClass('field_error');
				break;
			}
		} else {
			$(this).removeClass('field_error');
			switch (this.type) {
				case "radio":
					tmp='label[for='+this.id+']';
					$(tmp).removeClass('field_error');
				break;
			}
		}
	});

	if (result==false && fres==true) {
		fres=false;
		element.focus();
		if (checkAll==false)
			return false;
	}
}
return fres;
}

function dialogSubmit(theform, question, field, nvalue) {
f=document.get_the_element(theform);
if (!f) return false;
if (confirm(question)) {    
	if (field!='') {
		set_value(theform,field,nvalue);
		/*document[theform][field]=nvalue;*/
	}
	f.style.cursor="wait";
	f.submit();
	return true;
}
return false;
}

function PopupMessage(msg) {
OpenWindow("/msgbox.php/?msg="+msg, 300, 150);
}

function PopupMessage64(msg) {
OpenWindow("/msgbox.php/?msg64="+msg, 300, 150);
}

function confirmClick(question, url) {
if (confirm(question)) {
	document.location.href = url;
	return false;
	}
}

function get_the_element(eid) {
try {
	element=document.getElementById(eid);
} catch (e) {
	if (document.all)
		element=document.all[eid];
	else if (document.layers)
		element=document.layers[eid];
	else
		element=false;
}
return element;
}

function show_element(element) {
if (!element) return 0;
element.style.visibility='visible';
if (element.tagName.toLowerCase()=='tbody' && is_gecko==true)
	element.style.display = 'table-row-group';
else
	element.style.display = 'block';
return 2;
}

function hide_element(element) {
if (!element) return 0;
element.style.visibility='hidden';
element.style.display='none';
return 1;
}

function show_elements(elements) {
for (var i=0; i<elements.length; i++)
	show_element(elements[i]);
}

function hide_elements(elements) {
for (var i=0; i<elements.length; i++)
	hide_element(elements[i]);
}

function show(id) {
return show_element(get_the_element(id));
}

function hide(id) {
return hide_element(get_the_element(id));
}

function ie_menu_show(id) {
if (is_ie==false)
	return;
show(id);
}

function ie_menu_hide(id) {
if (is_ie==false)
	return;
hide(id);
}

function toggle_elements(elements)
{
for (var i=0; i<elements.length; i++) {
	if (elements[i].style.visibility=='hidden') {
		show_element(elements[i]);
	} else {
		hide_element(elements[i]);
	}
}
}

function toggle_element(id) {
element=get_the_element(id);
if (!element) return 0;

if (element.style.visibility=='hidden') {
	return show_element(element);
} else {
	return hide_element(element);
}
return 0;
}

function hide_boolean_checked(check, depid) {
checkbox=get_the_element(check);
if (checkbox.checked) {
	r=hide(depid);
} else {
	r=show(depid);
}
blur();
return r;
}

function show_boolean_checked(check, depid) {
checkbox=get_the_element(check);
if (checkbox.checked) {
	show(depid);
} else {
	hide(depid);
}
blur();
}

function select_table_row(id, sel) {
if (sel)
	$(id).addClass('selected');
else
	$(id).removeClass('selected');
}

function mail(name, domain, params)
{
var at_="@";
var fat_="(at)";
document.write('<a href="mailto:'+name+at_+domain+params+'">'+name+fat_+domain+'</a>');
}

function mail_link(name, domain, params, link)
{
var at_="@";
document.write('<a href="mailto:'+name+at_+domain+params+'">'+link+'</a>');
}

function set_parent_fields(myform,kfield,ifield, key, id, close) 
{
window.opener.document[myform][kfield].value = key;
window.opener.document[myform][ifield].value = id;
if (close)
	window.close();
}

function set_content(id, data)
{
$(id).html(data);
}

function clear_content(id)
{
$(id).html('');
}

/* 
 * Set a new value to given form element in given form. 
 */
function set_value(mf,me,nv) {
f=get_the_element(mf);
if (!f) return false;
for (i=0;i<f.elements.length;i++) {
	if (f.elements[i].name==me) {
		f.elements[i].value=nv;
		return true;
	}
}
return false;
}

/**
 * POST an action back with given key=value pair 
 */
function post_action(fo,a,key,val) {
var k;
var f;
var v;
f=get_the_element(fo);
if (!f)
	return false;
k=get_the_element(key);
if (!k)
	return false;

f.action.value=a;
k.value=val;
f.submit();
return true;
}

/**
 * POST action depends on answer to question
 */
function post_action_confirm(q,fo,atrue,afalse,key,val) {
if (confirm(q))
	return post_action(fo,atrue,key,val);
else
	return post_action(fo,afalse,key,val);
}

/**
 * POST action only if confirmed
 */
function post_action_confirm2(q,fo,a,key,val) {
if (confirm(q))
	return post_action(fo,a,key,val);
else
	return false;
}

/**
 * Simple pop-up menu helper functions
 *
 */
function show_hide_menu_new(t,m,sp)
{
if (menu_id==false) {
	$(m).show();
	menu_id=m;
} else if (menu_id==m) {
	$(m).hide();
	menu_id=false;
} else {
	$(menu_id).hide();
	$(m).show();
	menu_id=m;
}
}

function show_hide_menu(t,e,sp) {
var m=document.getElementById(e);
if (sp)
	set_position(e,mouse_pos.x-5,mouse_pos.y-5);

if (menu_id==false) {
	show_element(m);
	menu_id=m;
} else if (menu_id==m) {
	hide_element(m);
	menu_id=false;
} else {
	hide_element(menu_id);
	show_element(m);
	menu_id=m;
}
}

function set_position_relative_to(pe,ce) {
if (!ce || !pe) return false;
ce.style.left=pe.offsetLeft+pe.style.width+"px";
ce.style.top=pe.offsetTop+pe.offsetHeight+"px";
return true;
}

function set_position(e,x,y) {
var pe=get_the_element(e);
if (!pe) return;
pe.style.left=""+x+"px;";
pe.style.top=""+y+"px;";
}

function toggle_checkboxes(me, nbase) {
}

/*
 * Table of Contents handling
 */
function toggle_toc() {
r=toggle_element('toc_list');
if (r==1) {
	set_content('toc_toggler',toc_up)
	set_cookie('toc_hidden',1);
} else if (r==2) {
	set_content('toc_toggler',toc_down)
	set_cookie('toc_hidden',2);
}
return false;
}

function check_toc_state() {
toch=get_cookie('toc_hidden');
if (toch==1) {
	hide('toc_list');
	set_content('toc_toggler',toc_up)
} else if (toch==2) {
	set_content('toc_toggler',toc_down)
	show('toc_list');
}
}

/* 
 * Drag & Drop functions 
 */
function enable_drag_and_drop() {
drag_enabled=true;
document.onmousemove=do_drag;
}

function disable_drag_and_drop() {
drag_enable=false;
document.onmousemove='';
}

function do_drag(e) {
if (!drag_enabled) return;

if (browser_type=='ie') {
	whichDog.style.left=nowX+event.clientX-offsetx;
	whichDog.style.top=nowY+event.clientY-offsety;
} else {
	whichDog.style.left=nowX+e.clientX-offsetx;
	whichDog.style.top=nowY+e.clientY-offsety;
}
return false;  
}

function form_popup_window(fname) {
popup_name=fname+'_popup';
document.getElementById(fname).target=popup_name;
document.getElementById(fname).action=baseurl+'popup.php/'+pagename;
return window.open(baseurl+'popup.php/'+pagename,popup_name,'width=600,height=400');
}

function set_cookie(name, value, expires, path, domain, secure) {
document.cookie= name + "=" + escape(value) +
	((expires) ? "; expires=" + expires.toGMTString() : "") +
	((path) ? "; path=" + path : "") +
	((domain) ? "; domain=" + domain : "") +
	((secure) ? "; secure" : "");
}

function get_cookie(name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);

if (begin == -1) {
	begin = dc.indexOf(prefix);
	if (begin != 0)
		return null;
} else {
	begin += 2;
}
var end = document.cookie.indexOf(";", begin);
if (end == -1) {
	end = dc.length;
}
return unescape(dc.substring(begin + prefix.length, end));
}

function delete_cookie(name, path, domain) {
if (!get_cookie(name))
	return;
document.cookie = name + "=" +
	((path) ? "; path=" + path : "") +
	((domain) ? "; domain=" + domain : "") +
	"; expires=Thu, 01-Jan-70 00:00:01 GMT";
}

function get_text_length(text)
{
var c=document.getElementById(text);
if (!c)
	return 0;

var v=c.value
var vl=parseInt(v.length);
return vl;
}

function update_field_counter(textfield, infolabel, maxlen) {
var c=document.getElementById(infolabel);
var l=get_text_length(textfield);
c.innerHTML=parseInt(l).toString()+'/'+maxlen.toString();
}

function addHandler(element, attach, handler) {
if (window.addEventListener) {
	element.addEventListener(attach, handler, false);
	return true;
} else if (window.attachEvent) {
	element.attachEvent('on'+attach, handler);
	return true;
}
return false;
}

function addClickHandler(element, handler ) {
return addHandler(element, 'click', handler);
}

/*
	Written by Jonathan Snook, http://www.snook.ca/jonathan
	Add-ons by Robert Nyman, http://www.robertnyman.com
	Author says "The credit comment is all it takes, no license. Go crazy with it!:-)"
	From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
*/
function getElementsByClassName(oElm, strTagName, oClassNames){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var arrRegExpClassNames = new Array();
	if(typeof oClassNames == "object"){
		for(var i=0; i<oClassNames.length; i++){
			arrRegExpClassNames[arrRegExpClassNames.length] =
				new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)");
		}
	}
	else{
		arrRegExpClassNames[arrRegExpClassNames.length] =
			new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)");
	}
	var oElement;
	var bMatchesAll;
	for(var j=0; j<arrElements.length; j++){
		oElement = arrElements[j];
		bMatchesAll = true;
		for(var k=0; k<arrRegExpClassNames.length; k++){
			if(!arrRegExpClassNames[k].test(oElement.className)){
				bMatchesAll = false;
				break;
			}
		}
		if(bMatchesAll){
			arrReturnElements[arrReturnElements.length] = oElement;
		}
	}
	return (arrReturnElements)
}

/*
 * Table sorting script  by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/.
 * Based on a script from http://www.kryogenix.org/code/browser/sorttable/.
 * Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html .
 *
 * Copyright (c) 1997-2006 Stuart Langridge, Joost de Valk.
 *
 * Ripped from mediawiki
 *
 */

var ts_image_path = baseurl+"images/icons/12x12/";
var ts_image_up = "stock_sort-ascending.png";
var ts_image_down = "stock_sort-descending.png";
var ts_image_none = "stock_sort-none.png";
var ts_europeandate = true;
var ts_alternate_row_colors = true;
var SORT_COLUMN_INDEX;

function initSortTables() {
	var idnum = 0;
	// Find all tables with class sortable and make them sortable
	var tables = getElementsByClassName(document, "table", "sortable");
	for (var ti = 0; ti < tables.length ; ti++) {
		if (!tables[ti].id) {
			tables[ti].setAttribute('id','sortable_table_id_'+idnum);
			++idnum;
		}
		ts_makeSortable(tables[ti]);
	}
}

function ts_makeSortable(table) {
	var firstRow;
	if (table.rows && table.rows.length > 0) {
		if (table.tHead && table.tHead.rows.length > 0) {
			firstRow = table.tHead.rows[table.tHead.rows.length-1];
		} else {
			firstRow = table.rows[0];
		}
	}
	if (!firstRow) return;

	// We have a first row: assume it's the header, and make its contents clickable links
	for (var i = 0; i < firstRow.cells.length; i++) {
		var cell = firstRow.cells[i];
		if ((" "+cell.className+" ").indexOf(" unsortable ") == -1) {
			cell.innerHTML += '&nbsp;&nbsp;<a href="#" class="sortheader" onclick="ts_resortTable(this);return false;"><span class="sortarrow"><img src="'+ ts_image_path + ts_image_none + '" alt="&darr;" border="0"/></span></a>';
		}
	}
	if (ts_alternate_row_colors) {
		ts_alternate(table);
	}
}

function ts_getInnerText(el) {
	if (typeof el == "string") return el;
	if (typeof el == "undefined") { return el };
	if (el.textContent) return el.textContent; // not needed but it is faster
	if (el.innerText) return el.innerText;     // IE doesn't have textContent
	var str = "";

	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				str += ts_getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

function ts_resortTableBody(tbody, column, reverse)
{
var rowStart;
var rowEnd;

if (tbody.rows.length <= 1) return;

rowStart=0;
rowEnd=tbody.rows.length;

var itm = "";
for (var i = rowStart; i < rowEnd; i++) {
	if (tbody.rows[i].cells.length > column) {
		itm = ts_getInnerText(tbody.rows[i].cells[column]);
		itm = itm.replace(/^[\s\xa0]+/, "").replace(/[\s\xa0]+$/, "");
		if (itm != "") break;
	}
}

sortfn = ts_sort_caseinsensitive;
if (itm.match(/^\d\d[\/. -][a-zA-Z]{3}[\/. -]\d\d\d\d$/))
	sortfn = ts_sort_date;
if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/))
	sortfn = ts_sort_date;
if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d$/))
	sortfn = ts_sort_date;
if (itm.match(/^[\u00a3$\u20ac]/)) // pound dollar euro
	sortfn = ts_sort_currency;
if (itm.match(/^[\d.,]+\%?$/))
	sortfn = ts_sort_numeric;

var newRows = new Array();
for (var j = rowStart; j < tbody.rows.length; j++) {
	var row = tbody.rows[j];
	var keyText = ts_getInnerText(row.cells[column]);
	var oldIndex = (reverse ? -j : j);

	newRows[newRows.length] = new Array(row, keyText, oldIndex);
}

newRows.sort(sortfn);
if (reverse)
	newRows.reverse();

// We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
// don't do sortbottom rows
for (var i = 0; i < newRows.length; i++) {
	if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") == -1)
		tbody.appendChild(newRows[i][0]);
}

// do sortbottom rows only
for (var i = 0; i < newRows.length; i++) {
	if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") != -1)
		tbody.appendChild(newRows[i][0]);
}

}

function ts_resortTable(lnk) {
// get the span
var span = lnk.getElementsByTagName('span')[0];

var td = lnk.parentNode;
var tr = td.parentNode;
var column = td.cellIndex;
var rowStart;
var rowEnd;

var table = tr.parentNode;
while (table && !(table.tagName && table.tagName.toLowerCase() == 'table'))
	table = table.parentNode;
if (!table) return;

// Work out a type for the column
if (table.tBodies.length < 1) return;

var reverse = (span.getAttribute("sortdir") == 'down');

for (var i = 0; i < table.tBodies.length; i++) {
	ts_resortTableBody(table.tBodies[i], column, reverse);
}

var arrowHTML;
if (reverse) {
	arrowHTML = '<img src="'+ ts_image_path + ts_image_down + '" alt="&darr;" border="0"/>';
	span.setAttribute('sortdir','up');
} else {
	arrowHTML = '<img src="'+ ts_image_path + ts_image_up + '" alt="&uarr;" border="0"/>';
	span.setAttribute('sortdir','down');
}

// Delete any other arrows there may be showing
var spans = getElementsByClassName(tr, "span", "sortarrow");
for (var i = 0; i < spans.length; i++) {
	spans[i].innerHTML = '<img src="'+ ts_image_path + ts_image_none + '" alt="&darr;" border="0"/>';
}
span.innerHTML = arrowHTML;

ts_alternate(table);		
}

function ts_dateToSortKey(date) {	
	// y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
	if (date.length == 11) {
		switch (date.substr(3,3).toLowerCase()) {
			case "jan": var month = "01"; break;
			case "feb": var month = "02"; break;
			case "mar": var month = "03"; break;
			case "apr": var month = "04"; break;
			case "may": var month = "05"; break;
			case "jun": var month = "06"; break;
			case "jul": var month = "07"; break;
			case "aug": var month = "08"; break;
			case "sep": var month = "09"; break;
			case "oct": var month = "10"; break;
			case "nov": var month = "11"; break;
			case "dec": var month = "12"; break;
			// default: var month = "00";
		}
		return date.substr(7,4)+month+date.substr(0,2);
	} else if (date.length == 10) {
		if (ts_europeandate == false) {
			return date.substr(6,4)+date.substr(0,2)+date.substr(3,2);
		} else {
			return date.substr(6,4)+date.substr(3,2)+date.substr(0,2);
		}
	} else if (date.length == 8) {
		yr = date.substr(6,2);
		if (parseInt(yr) < 50) { 
			yr = '20'+yr; 
		} else { 
			yr = '19'+yr; 
		}
		if (ts_europeandate == true) {
			return yr+date.substr(3,2)+date.substr(0,2);
		} else {
			return yr+date.substr(0,2)+date.substr(3,2);
		}
	}
	return "00000000";
}

function ts_parseFloat(num) {
	if (!num) return 0;
	num = parseFloat(num.replace(/,/g, ""));
	return (isNaN(num) ? 0 : num);
}

function ts_sort_date(a,b) {
	var aa = ts_dateToSortKey(a[1]);
	var bb = ts_dateToSortKey(b[1]);
	return (aa < bb ? -1 : aa > bb ? 1 : a[2] - b[2]);
}

function ts_sort_currency(a,b) {
	var aa = ts_parseFloat(a[1].replace(/[^0-9.]/g,''));
	var bb = ts_parseFloat(b[1].replace(/[^0-9.]/g,''));
	return (aa != bb ? aa - bb : a[2] - b[2]);
}

function ts_sort_numeric(a,b) {
	var aa = ts_parseFloat(a[1]);
	var bb = ts_parseFloat(b[1]);
	return (aa != bb ? aa - bb : a[2] - b[2]);
}

function ts_sort_caseinsensitive(a,b) {
	var aa = a[1].toLowerCase();
	var bb = b[1].toLowerCase();
	return (aa < bb ? -1 : aa > bb ? 1 : a[2] - b[2]);
}

function ts_sort_default(a,b) {
	return (a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : a[2] - b[2]);
}

function ts_alternate(table) {
	// Take object table and get all it's tbodies.
	var tableBodies = table.getElementsByTagName("tbody");
	// Loop through these tbodies
	for (var i = 0; i < tableBodies.length; i++) {
		// Take the tbody, and get all it's rows
		var tableRows = tableBodies[i].getElementsByTagName("tr");
		// Loop through these rows
		// Start at 1 because we want to leave the heading row untouched
		for (var j = 0; j < tableRows.length; j++) {
			// Check if j is even, and apply classes for both possible results
			var oldClasses = tableRows[j].className.split(" ");
			var newClassName = "";
			for (var k = 0; k < oldClasses.length; k++) {
				if (oldClasses[k] != "" && oldClasses[k] != "even" && oldClasses[k] != "odd")
					newClassName += oldClasses[k] + " ";
			}
			tableRows[j].className = newClassName + (j % 2 == 0 ? "even" : "odd");
		}
	}
}

/* End of table sorting code */

function initPopupBoxes() {
var idnum = 0;
var boxes=getElementsByClassName(document, "table", "popupbox");
for (var ti = 0; ti < boxes.length ; ti++) {
	if (!boxes[ti].id) {
		boxes[ti].setAttribute('id','popup_table_id_'+idnum);
		idnum++;
	}
	makePopupBox(boxes[ti], 'caption', 'tbody');
}
}

function makePopupBox(container, toggler , body) {
var Caption=container.getElementsByTagName(toggler)[0];
var Bodies=container.getElementsByTagName(body);

if (!Caption)
	return;

if (!Bodies || Bodies.length==0)
	return;

if (!addClickHandler(Caption, function() { toggle_elements(Bodies); }))
	return;

hide_elements(Bodies);
}