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_script(src,cb)
{
var t=document.createElement("script");
t.type="text/javascript";
t.src=src;
if (cb!=null) {
	t.onreadystagechange=cb;            
	t.onload=cb;
}
$('head').append(t);
}

function load_script_if_not_define(t,src,cb)
{
if (typeof(t)=='undefined')
	load_script(src,cb);
}

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 dialog_show(a, doreload)
{
h=$(window).height();
h=h>380 ? 380 : h;
w=$(window).width();
w=w>600 ? 600 : w;
link=$(a);
if (a.popup_dialog!=null && doreload==false) {
	a.popup_dialog.dialog('option', 'height', h);
	a.popup_dialog.dialog('option', 'width', w);
	a.popup_dialog.dialog('open');
	return false;
}
url=link.attr('href');
url.replace('index.php', 'ajax.php');
dialog=$('<div></div>').dialog({
	autoOpen: false,
	title: link.attr('title'),
	modal: true,
	resizable: false,
	draggable: true,
	position: 'top',
	width: w,
	height: 100,
	
});
dialog.data=null;
if (dialog.data==null || doreload==true) {
	dialog.html(loading_icon+' Loading, please wait...');
	dialog.load(url, function(r,t,xml) {
	if (t=='error') {
		dialog.html("404 - Not found.");
	} else {
		a.popup_dialog.dialog('option', 'height', h);
		dialog.data=dialog.html;
		$(dialog).bind("dialogbeforeclose", function(event, ui) {
			ui.html='';
			return true;
		});
	}
	});
}
a.popup_dialog=dialog;
a.popup_dialog.dialog('open');
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 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 select_table_row(input, sel, rid) {
if ($(input).attr('checked'))
	$(rid).addClass('selected');
else
	$(rid).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('');
}

/**
 * Simple pop-up menu helper functions
 *
 */
function show_hide_menu(t,e)
{
m='#'+e;
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;
}
return false;
}

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;";
}

/*
 * 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');
}
}

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 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);
}

