function toggleMenu(objectID)
{
	if (isID)
	{
		var c = getCookie('_menustate');
		var n = '_' + objectID;
		var domStyle = findDOM(objectID,1);
		var olddisplay = domStyle.display;
		if (domStyle.display == 'none')
		{
			domStyle.display='';
			var pos = c.indexOf(n);
			if (pos != -1)
			{
				c = c.substring(0,pos) + c.substring(pos + n.length);
			}
		}
		else
		{
			domStyle.display='none';
			if (c.indexOf(n) == -1)
			{
				c = c + n;
			}
		}
		setCookie('_menustate', c);
	}
	else if (isALL)
	{
		var c = getCookie('_menustate');
		var n = '_' + objectID;
		var domStyle = findDOM(objectID,1);
		var olddisplay = domStyle.display;
		if (domStyle.display == 'none')
		{
			domStyle.display='';
			var pos = c.indexOf(n);
			if (pos != -1)
			{
				c = c.substring(0,pos) + c.substring(pos + n.length);
			}
		}
		else
		{
			domStyle.display='none';
			if (c.indexOf(n) == -1)
			{
				c = c + n;
			}
		}
		setCookie('_menustate', c);
	}
}

function setMenuState(objectID, state)
{
	if (isALL || isID)
	{
		var c = getCookie('_menustate');
		var n = '_' + objectID;
		var domStyle = findDOM(objectID,1);
		if (state == 'none')
		{
			if (c.indexOf(n) == -1)
			{
				c = c + n;
			}
		}
		else
		{
			var pos = c.indexOf(n);
			if (pos != -1)
			{
				c = c.substring(0,pos) + c.substring(pos + n.length);
			}
			state = '';
		}
		domStyle.display = state;
		setCookie('_menustate', c);
	}
}

function getMenuState(objectID)
{
	var state = '';
	if (isALL)
	{
		state = 'block';
	}

	if (isALL || isID)
	{
		var c = getCookie('_menustate');
		var n = '_' + objectID;
		if (c.indexOf(n) != -1)
		{
			state = 'none';
		}
	}
	return (state);
}

function hideObject(objectID)
{
	setObjectState(objectID, 'none');
}

function showObject(objectID)
{
	setObjectState(objectID, '');
}

function setObjectState(objectID, state)
{
	if (isALL || isID)
	{
		var domStyle = findDOM(objectID,1);
		if (state == 'block')
		{
			state = '';
		}
		domStyle.display = state;
	}
}

function isObjectHidden(objectID)
{
	var state = getObjectState(objectID);
	if (state == 'none')
	{
		return (true);
	}
	else
	{
		return (false);
	}
}

function getObjectState(objectID)
{
	var state = '';
	if (isALL)
	{
		state = 'block';
	}

	if (isALL || isID)
	{
		var domStyle = findDOM(objectID,1);
		state = domStyle.display;
		if (state == '')
		{
			state = 'block';
		}
	}

	return (state);
}

function getCookies()
{
	var pairs = document.cookie.split(";");
 	//var cookies = {};
 	var cookies = [];
 	for (var i=0; i<pairs.length; i++)
 	{
		var pair = pairs[i].split("=");
		//cookies[pair[0]] = unescape(pair[1]);
		cookies[i] = trim(pair[0]);
	}
	return cookies;
}
function getCookie(name)
{
	var dc = document.cookie;
	var prefix = name + "=";
	var begin = dc.indexOf("; " + prefix);
	if (begin == -1)
	{
		begin = dc.indexOf(prefix);
		if (begin != 0)
		{
			return "";
		}
	}
	else
	{
		begin += 2;
	}

	var end = document.cookie.indexOf(";", begin);
	if (end == -1)
	{
		end = dc.length;
	}

	return unescape(dc.substring(begin + prefix.length, end));
}

function setCookie (name, value)
{
	setCookie(name, value, null, null, null, null);
}

function setPermCookie (name, value)
{
	var nextYear = new Date();
	nextYear.setFullYear(nextYear.getFullYear() + 1);
	setCookie(name, value, null, nextYear, null, null);
}

function setCookie (name, value, path, expires, domain, secure)
{
	document.cookie = name + "=" + escape (value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "") +
    ((path) ? "; path=" + path : "; path=") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}

function deleteCookie (name, path, domain)
{
	document.cookie = name + "=" +
	    ((path) ? "; path=" + path : "; path=") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  // for backward comptability, we need to do path="/" as old setcookie used to use "path=/" as the default
  if (!path)
  {
  	deleteCookie(name, "/");
  }
}

function addToSelect(l, f, t, v, unique, selectlast)
{
	if (f != null)
	{
		v = f.value;
		t = f.text;
	}

	if (t == null || t.length == 0)
	{
		return;
	}
	t = trim(t);
	v = trim(v);

	for (var i=0; i<t.length; i++)
	{
		if (t[i] == ',' || t[i] > 127)
		{
			alert("Invalid characters in " + t);
			return;
		}
	}
	for (var i=0; i<v.length; i++)
	{
		if (v[i] == ',' || v[i] > 127)
		{
			alert("Invalid characters in " + v);
			return;
		}
	}

	var len = l.options.length;
	var index = len;
	if (unique == null || unique == true)
	{
		for (index=0; index<len; index++)
		{
			if (l.options[index].text == t)
			{
				return;
			}
		}
	}
	l.options.length++;
	l.options[index] = new Option(t, v);
	if (selectlast == null || selectlast == true)
	{
	l.selectedIndex = index;
}
}

function editSelect(l, f, t, v, index)
{
	if (index != null)
	{
		index = l.selectedIndex;
	}
	if (index == -1)
	{
		return;
	}

	if (f != null)
	{
		t = f.value;
		v = f.value;
	}

	if (t == null || t.length == 0)
	{
		return;
	}
	t = trim(t);
	v = trim(v);

	for (var i=0; i<t.length; i++)
	{
		if (t[i] == ',' || t[i] > 127)
		{
			alert("Invalid characters in " + t);
			return;
		}
	}
	for (var i=0; i<v.length; i++)
	{
		if (v[i] == ',' || v[i] > 127)
		{
			alert("Invalid characters in " + v);
			return;
		}
	}

	l.options[index].text = t;
	l.options[index].value = v;
	l.selectedIndex = index;
}

function removeFromSelect(l, selIndex)
{
	if (selIndex == null)
	{
		selIndex = l.selectedIndex;
	}
	if (selIndex == -1 || selIndex > l.options.length)
	{
		return;
	}

	l.options[selIndex] = null;
	if (selIndex < l.options.length)
	{
		l.selectedIndex = selIndex;
	}
	else
	{
		l.selectedIndex = selIndex - 1;
	}
}

function trim(s)
{
	if (s == null || s.length == 0)
	{
		return (s);
	}
	while (s.substring(0,1) == ' ') s = s.substring(1);
	while (s.substring(s.length-1,s.length) == ' ') s = s.substring(0,s.length-1);
	return s
}

function getDateFromValue(v, format)
{
	var d = null;

	if (format == null || format.length == 0)
	{
		format = "DD/MM/YYYY";
	}
	format = format.toUpperCase();

	var dd = "";
	var mm = "";
	var yy = "";
	if (v.length != 0)
	{
		var pos = 0;
		var vpos = 0;
		while (pos < format.length)
		{
			if (format.charAt(pos) == 'D')
			{
				while (pos < format.length && format.charAt(pos) == 'D')
				{
					pos++;
				}
				var endc;
				if (pos >= format.length)
				{
					endc = '\n';
				}
				else
				{
					endc = format.charAt(pos);
				}

				while (vpos < v.length && v.charAt(vpos) != endc)
				{
					dd += v.charAt(vpos);
					vpos++;
				}
			}
			else if (format.charAt(pos) == 'M')
			{
				while (pos < format.length && format.charAt(pos) == 'M')
				{
					pos++;
				}
				var endc;
				if (pos >= format.length)
				{
					endc = '\n';
				}
				else
				{
					endc = format.charAt(pos);
				}

				while (vpos < v.length && v.charAt(vpos) != endc)
				{
					mm += v.charAt(vpos);
					vpos++;
				}
			}
			else if (format.charAt(pos) == 'Y')
			{
				while (pos < format.length && format.charAt(pos) == 'Y')
				{
					pos++;
				}
				var endc;
				if (pos >= format.length)
				{
					endc = '\n';
				}
				else
				{
					endc = format.charAt(pos);
				}

				while (vpos < v.length && v.charAt(vpos) != endc)
				{
					yy += v.charAt(vpos);
					vpos++;
				}
			}
			else
			{
				pos++;
				vpos++;
			}
		}
		if (yy < 100)
		{
			if (yy >= 49)
			{
				yy = "19" + yy;
			}
			else
			{
				yy = "20" + yy;
			}
		}
		d = new Date(yy, mm-1, dd);
	}

	return (d);
}

// ---------------
// Date/Time formating
// ---------------

var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}

function isDate(val,format)
{
	var date=getDateFromFormat(val,format);
	if (date==0) { return false; }
	return true;
}

function compareDates(date1,dateformat1,date2,dateformat2)
{
	var d1=getDateFromFormat(date1,dateformat1);
	var d2=getDateFromFormat(date2,dateformat2);
	if (d1==0 || d2==0) {
		return -1;
		}
	else if (d1 > d2) {
		return 1;
		}
	return 0;
}
	
function formatDate(date,format)
{
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
}
	
// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function getDateFromFormat(val,format)
{
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";
	
	while (i_format < format.length) {
		// Get next token from format string
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		// Extract contents of value based on format token
		if (token=="yyyy" || token=="yy" || token=="y") {
			if (token=="yyyy") { x=4;y=4; }
			if (token=="yy")   { x=2;y=2; }
			if (token=="y")    { x=2;y=4; }
			year=_getInt(val,i_val,x,y);
			if (year==null) { return 0; }
			i_val += year.length;
			if (year.length==2) {
				if (year > 70) { year=1900+(year-0); }
				else { year=2000+(year-0); }
				}
			}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name=MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if (token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if (month>12) { month -= 12; }
						i_val += month_name.length;
						break;
						}
					}
				}
			if ((month < 1)||(month>12)){return 0;}
			}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<DAY_NAMES.length; i++) {
				var day_name=DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;
					break;
					}
				}
			}
		else if (token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)){return 0;}
			i_val+=month.length;}
		else if (token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)){return 0;}
			i_val+=date.length;}
		else if (token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)){return 0;}
			i_val+=hh.length;}
		else if (token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)){return 0;}
			i_val+=hh.length;}
		else if (token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){return 0;}
			i_val+=hh.length;}
		else if (token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){return 0;}
			i_val+=hh.length;hh--;}
		else if (token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)){return 0;}
			i_val+=mm.length;}
		else if (token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)){return 0;}
			i_val+=ss.length;}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
			else {return 0;}
			i_val+=2;}
		else {
			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
			else {i_val+=token.length;}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) { return 0; }
	// Is date valid for month?
	if (month==2) {
		// Check for leap year
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
			if (date > 29){ return 0; }
			}
		else { if (date > 28) { return 0; } }
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return 0; }
		}
	// Correct hours value
	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
	else if (hh>11 && ampm=="AM") { hh-=12; }
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
}

// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats, in this order:
// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------
function parseDate(val)
{
	var preferEuro=(arguments.length==2)?arguments[1]:false;
	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
	var d=null;
	for (var i=0; i<checkList.length; i++) {
		var l=window[checkList[i]];
		for (var j=0; j<l.length; j++) {
			d=getDateFromFormat(val,l[j]);
			if (d!=0) { return new Date(d); }
			}
		}
	return null;
}
	
// ------------------------------------------------------------------
// Utility functions for parsing in getDateFromFormat()
// ------------------------------------------------------------------
function _isInteger(val)
{
	var digits="1234567890";
	for (var i=0; i < val.length; i++) {
		if (digits.indexOf(val.charAt(i))==-1) { return false; }
		}
	return true;
}
function _getInt(str,i,minlength,maxlength)
{
	for (var x=maxlength; x>=minlength; x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { return null; }
		if (_isInteger(token)) { return token; }
		}
	return null;
}

// ---------------

// ---------------
// Function used by the ComponentArt Upload
// ---------------
function format_file_size(n,fmt)
{
	if (!fmt) {        //    no formatting specified; automatically select the best format
		if (n < 1000) fmt = "b";
		else if (n < 1000000) fmt = "kb";
		else if (n < 1000000000) fmt = "mb";
		else fmt = "gb";
	}
	switch(fmt.toLowerCase()) {
		case "kb": return String((n * 0.001).toFixed(2)) + "&nbsp;KB";break;
		case "mb": return String((n * 0.000001).toFixed(2)) + "&nbsp;MB";break;
		case "gb": return String((n * 0.000000001).toFixed(2)) + "&nbsp;GB";break;
		default: return String(n.toFixed(2)) + "&nbsp;B";
	}
}
function get_percentage(n) { return String(Math.round(n * 100)); }
function format_time(t)
{
	var s = Math.floor(t);
	var m = Math.floor(s / 60);
	var h = Math.floor(m / 60);

	s = pad_time(s % 60);
	m = pad_time(m % 60) + ":";
	h = (h == 0) ? "" : pad_time(h % 60) + ":";

	return (h + m + s);
}
function pad_time(t) { return String(((t > 9) ? "" : "0") + t); }

// ---------------

function GetAbsolutePosition (image)
{

  var rd = { x:0, y:0 };

  if (document.layers)
  {
    // Netscape we can just read the attributes directly
    rd.x = image.x;
    rd.y = image.y - 12;  // for some reason we need to subtract 12 fromthe actual
                          // value to get the text aligned correctly
  }
  else
  {
    // start with the image's coordinates and walk through it's ancestory of
    // elements (tables, div's, spans, etc...) until we're at the top. Along
    // the way we add in each element's coordinates to get the final answer
    
    // seems ie position doesn't take account of left scroll
		if (is_ie)
		{
			var iebody = (document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
			rd.x = 0 - (document.all? iebody.scrollLeft : window.pageXOffset);
			rd.y = 0 - (document.all? iebody.scrollTop : window.pageYOffset);
		}
		
    do
    {
      rd.x += image.offsetLeft;
      rd.y += image.offsetTop;
      image = image.offsetParent;
    }  while( image );
  }

  return (rd);
}

function openChildWindow(url, loc, options)
{
	if (loc == null)
	{
		loc = "";
	}
	if (options == null)
	{
		options = "dependent=yes,menubar=no,toolbar=no,location=no,resizable=yes,scrollbars=yes,width=780,height=400";
	}
	return window.open(url, loc, options);
}

function browserWidthHeight()
{
	var myWidth = 0, myHeight = 0;
	if( typeof( window.innerWidth ) == 'number' )
	{
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	}
	else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
	{
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;

	}
	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
	{
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	}
	return [ myWidth, myHeight ];
}

function addEvent(obj, evType, fn)
{ 
	if (obj.addEventListener)
	{ 
		obj.addEventListener(evType, fn, false); 
		return true; 
	}
	else if (obj.attachEvent)
	{ 
		var r = obj.attachEvent("on"+evType, fn); 
		return r; 
	}
	else
	{ 
		return false; 
	} 
}

function swapNodes(a, b)
{
	// if IE just use swapNode
	if (a.swapNode)
	{
		a.swapNode(b);
	}
	else
	{
		var n = a.nextSibling;
		var p = a.parentNode;
		b.parentNode.replaceChild(a, b);
		p.insertBefore(b, n);
	}
}


// ===============================================
// getElementsByClassName for IE that doesn't support it
// ===============================================

var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};



// ===============================================
// Tooltips
// ===============================================

// ------------------------------------------------------------------
// Utility functions removing tags out of innerHTML
// ------------------------------------------------------------------
var m_removeTagExp = /<\/?[^>]+>/gi;
function removeTags(s)
{
	s = s.replace(m_removeTagExp, "");
	return s;
}

// ------------------------------------------------------------------
// Initialise the tooltips by finding all tags with class of tooltip
// and adding the mouseover/out events
// ------------------------------------------------------------------
function initTooltips()
{
	// new tooltips don't work in safari, just use old ones
	var links = document.getElementsByClassName('tooltip');
	for (var i=0; i<links.length; i++)
	{
		var t = links[i];
		if (is_safari == false)
		{
			Event.observe(t, "mouseover", showTooltip);
			Event.observe(t, "mouseout", hideTooltip);
		}
		else
		{
			addEvent(t, "mouseover", showTooltip);
			addEvent(t, "mouseout", hideTooltip);
			//t.title = t.tooltip;
		}
	}
	//if (is_safari == false)
	//{	
		// <div id="tooltip"
		//		style="position: absolute; display:none; width: 200px;
		//						text-align: left; margin: 5px; padding: 5px;
		//						background-color: #ffffcc;
		//						color: #333; font-size: 9px;">
		//	</div>

		var objBody = document.getElementsByTagName("body").item(0);		
		var obj = document.createElement("div");
		obj.setAttribute('id','tooltip');
		obj.style.position = 'absolute';
		obj.style.display = 'none';
		obj.style.width = '200px';
		obj.style.textAlign = 'left';
		obj.style.margin = '5px';
		obj.style.padding = '5px';
		obj.style.border = 'solid 1px #333';
		obj.style.backgroundColor = '#ffffcc';
		obj.style.color = '#333';
		obj.style.fontSize = '10px';
		obj.style.zIndex = 999;
		objBody.appendChild(obj);
	//}	
}

// ------------------------------------------------------------------
// Show the tooltip
// ------------------------------------------------------------------
function showTooltip(e)
{
	doTooltip(e, true);
}

// ------------------------------------------------------------------
// Hide the tooltip
// ------------------------------------------------------------------
function hideTooltip(e)
{
	doTooltip(e, false);
}

// ------------------------------------------------------------------
// Hide or show a tooltip
// ------------------------------------------------------------------
function doTooltip(e, show)
{
	if (show == null)
	{
		show = true;
	}

	var t = $('tooltip');
	if (show == false)
	{
		t.style.display = 'none';
		return;
	}

	// set the text
  var obj = Event.element(e);
  var title = removeTags(obj.innerHTML);
	var text = (title.length != 0 ? "<strong>" + title + "</strong><br />" : "");
  if (is_safari == true)
  {
  	// safari shows the actual html...and can't ref attributes
		text += obj.getAttribute('tooltip');
  }
  else
  {
		text += obj.attributes['tooltip'].value;
	}
	t.innerHTML = text;

	var mouse_x = Event.pointerX(e);
	var mouse_y = Event.pointerY(e);

	var dimensions = Element.getDimensions(t);
	var element_width = dimensions.width;
	var element_height = dimensions.height;

	var windowWidth = (navigator.appVersion.indexOf('MSIE')>0 ? document.body.clientWidth : window.innerWidth);
	var windowHeight = (navigator.appVersion.indexOf('MSIE')>0 ? document.body.clientHeight : window.innerHeight);

	if ( (element_width + mouse_x) >= ( windowWidth - 5) )
	{ // too big for X
		mouse_x = mouse_x - element_width;
		// apply delta to make sure that the mouse is not on the tool-tip
		mouse_x = mouse_x - 5;
	}
	else
	{
		mouse_x = mouse_x + 5;
	}

	if ( (element_height + mouse_y) >= ( windowHeight - 5) )
	{ // too big for Y
		mouse_y = mouse_y - element_height;
			// apply delta to make sure that the mouse is not on the tool-tip
		mouse_y = mouse_y - 5;
	}
	else
	{
		mouse_y = mouse_y + 5;
	} 

	// now set the right styles
	t.style.left = mouse_x + "px";
	t.style.top = mouse_y + "px";

	// show
	t.style.display = '';
}

// ===============================================


function getValueFromRadioButtonList(rblId)
{
	var f = document.forms[0];
	var e = f.elements[rblId];

	for (var i=0; i<e.length; i++)
	{
		if (e[i].checked)
		{
			return e[i].value;
		}
	}
	return null;
}


// ------------------------------------------------------------------
// Extract a query value from a url and return {value,url} object
// where r.value is value or null (if didn't exist) and .url is url
// with name=value extracted
// ------------------------------------------------------------------
function extractQueryFromUrl(url, name)
{
	var v = null;
	var qm = "?";
	var p = url.indexOf("?");
	if (p == -1)
	{
		if (url.indexOf("/") == -1)
		{
			url = "?" + url;
		}
		else
		{
			url = url + "?";
		}
	}
	p = url.indexOf("?" + name + "=");
	if (p == -1)
	{
		qm = "&";
		p = url.indexOf("&" + name + "=");
	}
	if (p != -1)
	{
		var q = url.indexOf("&", p+1);
		if (q != -1)
		{
			v = url.substring(p + name.length + 2, q);
		}
		else
		{
			v = url.substring(p + name.length + 2);
		}

		var newurl = url.substring(0, p);
		if (q != -1)
		{
			newurl += qm + url.substring(q+1);
		}
		url = newurl;
	}

	var rd = { value:null, url:"" };
	rd.value = v;
	rd.url = url;

	return rd;
}

// Merge extra querystring with an existing url (or qs)
// e.g mergeQuerystring("test.aspx?a=1&b=2", "b=3") returns test.aspx?a=1&b=3
function mergeQuerystring(orig, extra)
{
	if (extra == null || extra.length == 0)
	{
		return orig;
	}
	if (orig == null || orig.length == 0)
	{
		return extra;
	}

	var qs = "";
	var pairs = [];
	var hash = "";

	var p = orig.indexOf("#");
	if (p != -1)
	{
		hash = orig.substring(p);
		if (hash.length == 1)
		{
			hash = "";
		}
		orig = orig.substring(0, p);
	}
	
	var p = orig.indexOf("?");
	if (p != -1)
	{
		qs = orig.substring(0, p+1);
		orig = orig.substring(p+1);
	}
	else if (orig.indexOf("&") == -1 && orig.indexOf("=") == -1)
	{
		qs = orig;
		orig = "";
	}
	var qs1 = orig.split("&");
	for (var i=0; i<qs1.length; i++)
	{
		var pair = qs1[i].split("=");
		if (pair[0].length != 0)
		{
			pairs.push([pair[0], (pair.length > 1 ? pair[1] : "")]);
		}
	}

	var p = extra.indexOf("?");
	if (p != -1)
	{
		extra = extra.substring(p+1);
	}
	var qs2 = extra.split("&");
	for (var i=0; i<qs2.length; i++)
	{
		var pair = qs2[i].split("=");
		if (pair[0].length != 0)
		{
			var name = pair[0];
			var value = (pair.length > 1 ? pair[1] : "");

			var found = false;
			for (var j=0; j<pairs.length; j++)
			{
				if (pairs[j][0] == name)
				{
					pairs[j][1] = value;
					found = true;
					break;
				}
			}
			if (found == false)
			{
				pairs.push([name, value]);
			}
		}
	}

	if (qs.length != 0 && pairs.length > 0 && qs.indexOf("?") == -1)
	{
		qs += "?";
	}
	for (var j=0; j<pairs.length; j++)
	{
		if (j != 0)
		{
			qs += "&";
		}
		qs += pairs[j][0] + "=" + pairs[j][1];
	}
	
	qs += hash;

	return qs;
}

function replaceParamInUrl(h, name, value)
{
	if (h && h.length != 0 && h[h.length-1] == "#")
	{
		h = h.substring(0, h.length-1);
	}
	
	var p = h.indexOf(name + "=");
	if (p == -1 && value != null)
	{
		h = h + (h.indexOf("?") == -1 ? "?" : "&") + name + "=" + value;
	}
	else if (value == null)
	{
		var re = new RegExp(name + "=[^&]*&?", "i");
		h = h.replace(re, "");
	}
	else
	{
		var re = new RegExp(name + "=[^&]*", "i");
		h = h.replace(re, name + "=" + (value == null ? "" : value));
	}
	return h;
}

function removeClassInButtonsForSafari(c)
{
	if (is_safari && is_mac)
	{
		var bs = document.getElementsByTagName('input');
		for (var i=0; i<bs.length; i++)
		{
			var t = bs[i].getAttribute("type");
			if ((t == "button" || t == "submit") && bs[i].className == c)
			{
				bs[i].className = "";
			}
		}
	}
}

// ====================================

function sendXmlRequest(url,callback,postData) {
	var req = createXMLHTTPObject();
	if (!req) return;
	var method = (postData) ? "POST" : "GET";
	req.open(method,url,true);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	req.onreadystatechange = function () {
		if (req.readyState != 4) return;
		if (req.status != 200 && req.status != 304) {
//			alert('HTTP error ' + req.status);
			return;
		}
		callback(req);
	}
	if (req.readyState == 4) return;
	req.send(postData);
}

var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}

// ====================================


var agt=navigator.userAgent.toLowerCase();

var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);

var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
			&& (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
			&& (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
var is_nav2 = (is_nav && (is_major == 2));
var is_nav3 = (is_nav && (is_major == 3));
var is_nav4 = (is_nav && (is_major == 4));
var is_nav4up = (is_nav && (is_major >= 4));
var is_navonly      = (is_nav && ((agt.indexOf(";nav") != -1) ||
					  (agt.indexOf("; nav") != -1)) );
var is_nav6 = (is_nav && (is_major == 5));
var is_nav6up = (is_nav && (is_major >= 5));
var is_gecko = (agt.indexOf('gecko') != -1);

var is_ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie3    = (is_ie && (is_major < 4));
var is_ie4    = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
var is_ie4up  = (is_ie && (is_major >= 4));
var is_ie5    = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
var is_ie5_5  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
var is_ie5up  = (is_ie && !is_ie3 && !is_ie4);
var is_ie5_5up =(is_ie && !is_ie3 && !is_ie4 && !is_ie5);
var is_ie6    = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
var is_ie6up  = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5);

var is_aol   = (agt.indexOf("aol") != -1);
var is_aol3  = (is_aol && is_ie3);
var is_aol4  = (is_aol && is_ie4);
var is_aol5  = (agt.indexOf("aol 5") != -1);
var is_aol6  = (agt.indexOf("aol 6") != -1);

var is_safari = (agt.indexOf("safari") != -1);
var is_safari2 = (agt.indexOf("safari/4") != -1 || agt.indexOf("safari/3") != -1);

var is_mac = (agt.indexOf("mac os") != -1 || agt.indexOf("mac_") != -1);

var is_opera = (agt.indexOf("opera") != -1);
var is_opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
var is_opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
var is_opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
var is_opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
var is_opera5up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4);

var is_webtv = (agt.indexOf("webtv") != -1);

var is_TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1));
var is_AOLTV = is_TVNavigator;

var is_hotjava = (agt.indexOf("hotjava") != -1);
var is_hotjava3 = (is_hotjava && (is_major == 3));
var is_hotjava3up = (is_hotjava && (is_major >= 3));
