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);
}
function getSelection(ta)
{
if (document.selection && document.selection.createRange) {
	var range=document.selection.createRange();
	return range.text;
} else if (typeof(ta["setSelectionRange"]) != "undefined") {
	return ta.value.substring(ta.selectionStart, ta.selectionEnd);
}
return false;
}

function replaceSelection(ta, text)
{
if (document.selection && document.selection.createRange) {
    var range=document.selection.createRange().text=text;
    ta.caretPos-=text.length;
	return true;
} else if (typeof(ta["setSelectionRange"]) != "undefined") {
	var sstart, send, scrollPos;

	start=ta.selectionStart;    
	send=ta.selectionEnd;
	scrollPos=ta.scrollTop;

	ta.value=ta.value.substring(0, start)+text+ta.value.substring(send);
	ta.setSelectionRange(start+text.length, start+text.length);
	ta.scrollTop=scrollPos;
	return true;
}
return false;
}

function sortSelection(ta, reverse)
{
var sel, subst;

sel=getSelection(ta);
if (sel==false || sel=="") {
	return;
}

subst=sel.split("\n").sort();
if (reverse)
	subst.reverse();
return replaceSelection(ta, subst.join("\n"));
}

function trimSelection(ta)
{
sel=getSelection(ta);
if (sel==false || sel=="") {
	return;
}
return replaceSelection(ta, jQuery.trim(sel));
}

function doTextSubst(prefix, suffix, stext, rows) {
var subst;
var a=stext.split("\n");

if (typeof(prefix)=='undefined' || prefix==false)
	prefix='';

if (typeof(suffix)=='undefined' || suffix==false)
	suffix='';

if (a.length==1) {
	return prefix+stext+suffix;
}
for (l in a)
	a[l]=(a[l]!='') ? prefix+a[l]+suffix : '';
return a.join("\n");
}

function doSelectionPrompt(ta, prefix, suffix, promptmsg, pre) {
var sel, subst;

ta.focus();
sel=getSelection(ta);
if ((sel=="" || sel==false) && promptmsg!=null) {
	sel=prompt(promptmsg, pre ? pre : "");
	if (!sel) return;
}
return replaceSelection(ta, doTextSubst(prefix, suffix, sel ? sel : " "));
}

function doSelection(ta, prefix, suffix, rows) {
var sel, subst;

ta.focus();
sel=getSelection(ta);
if ((sel==false || sel=="") && typeof(suffix)!='undefined') {
	return;
}
return replaceSelection(ta, doTextSubst(prefix, suffix, sel, rows));
}

function linkSelection(ta, ltype, msg, pre)
{
ta.focus();
sel=getSelection(ta);

link=prompt(msg, pre ? pre : '');
if (!link)
	return;
link=jQuery.trim(link);
switch (ltype) {
	case 1:
		link=link.replace(' ','_');
		subst=doTextSubst('[['+link+' ',']]', sel ? sel : 'Link text goes here');
	break;
	case 0:
	default:
		subst=doTextSubst('['+link+' ',']', sel ? sel : 'Link text goes here');
	break;
}

return replaceSelection(ta, subst);
}

function FormatingToolbar(i,ta)
{
var t=new toolbar('ftoolbar_'+i);
if (t==false)
	return false;
t.add("heading", "Heading level 1","stock_insert-header", function() {doSelection(ta, "=", "=", true);});
t.add("heading", "Heading level 2","stock_insert-header2", function() {doSelection(ta, "==", "==", true);});
t.add("heading", "Heading level 3","stock_insert-header3", function() {doSelection(ta, "===", "===", true);});
t.separator();
t.add("strong", "Mark as Bold text","stock_text_bold", function() {doSelection(ta, "'''", "'''", false);});
t.add("em", "Mark as Italic text", "stock_text_italic", function() {doSelection(ta, "''", "''", false);});
t.add("u", "Underline", "stock_text_underlined", function() {doSelection(ta, "___", "___", false);});
t.separator();
t.add("list_bullet", "Create Bullet List", "stock_list_bullet", function() {doSelection(ta, "* ");});
t.add("list_bullet", "Create Numbered List", "stock_list_enum", function() {doSelection(ta, "# ");});
t.separator();
t.add("sort", "Sort ascending selected rows", "stock_sort-ascending", function() {sortSelection(ta, false);});
t.add("sort", "Sort descending selected rows", "stock_sort-descending", function() {sortSelection(ta, true);});
t.separator();
t.add("link", "Add URL", "stock_insert-url", function() {linkSelection(ta, 0, "URL:", "http://");});
t.add("ilink", "Internal link", "stock_hyperlink", function() {linkSelection(ta, 1, "Pagename:", "");});
t.separator();
t.add("template", "Add template tag", "stock_new-template", function() {doSelectionPrompt(ta, "\n{{template|", "}}\n", "Template:");});
t.add("image", "Add Image", "stock_insert_image", function() {doSelectionPrompt(ta, "[[image:", "]]", "Image:");});
t.add("attach", "Add article attachment tag", "stock_attach", function() {doSelection(ta, "\n{{attachments}}\n");});

return t;
}

function addTextareaEditingToolbars(tc) {
$('.'+tc).each(function(i,e) { t=FormatingToolbar(i,e); t.place(e); });
}
function isEmailAddr(email)
{
var theStr=new String(email);
var index;

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

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

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) {
return (str.length==0) ? true : false;
}

function isUrl(str) {
if (str.length==0) return false;
return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(str);
}

function check_text(tcheck, v) {
switch (tcheck) {
	case "url":
		return isUrl(v);
	case "email":
		return isEmailAddr(v);
	case "integer":
		return allDigits(v);
	case "phone":
		return isPhoneNumber(v)
	case "empty":
		return !isEmpty($.trim(v));
	default:
		return true;
	}
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 form_validate(f, fe)
{
return form_validate_full(f, fe, new array(), false);
}

function form_validate_element(element,type,check)
{
result=true;
switch(type) {
	case "text":
	case "textarea":
		result=check_text(check, element.value);
	break;
	case "password":
	case "file":
		result=check_text("empty", element.value);
	break;
	case "select-one":
		result=check_selection(element, check);
	break;
	case "select-multiple":
		result=check_selection(element, 1);
	break;
	case "radio":
		if (element && check=="selected")
			result=check_radio_group(element, 1, 0);
	break;
	default:
		result=true;
	break;
}
return result;
}

function form_validate_full(form, fields, msgs, check_all) {
var evalue;
var check;
var fres=true;

f=document.forms[form.id];

for (var fname in fields) {
	e=f[fname];
	if (!e)
		continue;
	tf=fields[fname];
	if (!tf)
		continue;
	type=e && e.type ? e.type : tf[0];
	check=tf[1];
	switch (type) {
			case "radio":
				ec='#form_radio_'+fname+'_container';
			break;
			default:
				ec=e;
	}
	result=form_validate_element(e,type,check);
	if (result==false) {
		$(ec).addClass('field_error');
		form_set_element_focusout_handler(ec,e,type,check);
	} else {
		$(ec).removeClass('field_error');
	}

	if (result==false && fres==true) {
		fres=false;
		$(e).focus();
		if (check_all==false)
			return false;
	}
}
if (fres==false && msgs['msg_validation_error'])
	alert(msgs['msg_validation_error']);
return fres;
}

function form_set_element_focusout_handler(ec,e,type,check)
{
switch (type) {
	case "radio":
		$(e).bind('click',function() { $(ec).removeClass('field_error'); });
	break;
	default:
		$(e).bind('focusout', function() {
		if (form_validate_element(ec,type,check))
			$(e).removeClass('field_error'); 
		else
			$(e).addClass('field_error'); 
		});
	break;
}
}

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 confirmClick(question, url) {
if (confirm(question)) {
	document.location.href=url;
	return false;
	}
}

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

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

function checkboxes_check(prefix,c) {
$("input:checkbox[name^='"+prefix+"']").attr('checked', c);
}

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 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 toolbar(id) {
tic=document.createElement("ul");
tbc=document.createElement("div");
tbc.className="toolbar";
tbc.id=id;
tbc.appendChild(tic);
this.tic=tic;
this.tbc=tbc;

this.add=addButton;
this.separator=addSeparator;
this.place=insertToolbar;
}

function createButton(id, title, icon, fn) {
var a=document.createElement("a");
a.href="#";
a.id='tb_'.id;
a.title=title;
a.onclick=function() { try { fn() } catch (e) { } return false };
a.tabIndex=400;
if (icon!="") {
	var img=new Image(24,24);
	img.src="/images/icons/24x24/"+icon+".png";
	img.border=0;
	img.alt=title;
	a.appendChild(img);
} else {
	a.appendChild(document.createTextNode(title));
}
li=document.createElement("li");
li.appendChild(a);
li.className='btn';
return li;
}

function addSeparator()
{
var sep=document.createElement("li");
sep.className='sep';
this.tic.appendChild(sep);
return sep;
}

function addButton(id, title, icon, fn)
{
btn=createButton(id,title,icon,fn);
this.tic.appendChild(btn);
return btn;
}

function insertToolbar(item)
{
item.parentNode.insertBefore(this.tbc, item);
}
