function URLDecode(value)
{
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef"; 
   var encoded = value;
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2) 
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while
   //document.URLForm.F1.value = plaintext;
   return plaintext;
};


//create row eleemnt
function create_row(args)
{	var tr = document.createElement("tr");
	//for every arg, create a td
	var i;
	for(i=0;i<args.length;i++)
	{	var td = document.createElement("td");
		td.innerHTML = args[i];
		tr.appendChild(td);
	}	
	return tr;
}
//create th element
function create_hdr(args)
{	var tr = document.createElement("tr");
	//for every arg, create a th
	var i;
	for(i=0;i<args.length;i++)
	{	var th = document.createElement("th");
		th.innerHTML = args[i];
		tr.appendChild(th);
	}	
	return tr;
}


//add functions to elements' event, while not interfering with other scripts that may use that event
function addEvent(obj, evType, fn, useCapture){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    //alert("Handler could not be attached");
  }
}

function removeEvent(obj, evType, fn, useCapture){
  if (obj.addEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else {
    alert("Handler could not be removed");
  }
}

//-------------------------------------add, remove or change classes to elements -------------------
//--------------------------while not interfering with other scripts that may use that element's 
//------------------------------------class names--------------------------------------------
function addClass(obj, style)
{	var originalClass = obj.className;
	if (originalClass.indexOf(style) == -1)
	{	obj.className = originalClass + " " + style;
	}
}

function removeClass(obj, style)
{	var originalClass = obj.className;
	var pos = originalClass.indexOf(style);
	
	if (pos != -1)
	{	var firstPart = originalClass.substring(0, pos);
		var secondPart = originalClass.substring(pos+style.length, originalClass.length);
		obj.className = firstPart + secondPart;
	}
}

function changeClass(obj, oldStyle, newStyle)
{	removeClass(obj, oldStyle);
	addClass(obj, newStyle);
}

/*************************************Read XML***************************************/
function read_xml(url)
{	var xml_doc;
	// For IE based browsers:
	if (window.ActiveXObject) 
	{	xml_doc = new ActiveXObject("Microsoft.XMLDOM");	}
	// For Mozilla based (standards compliant) browsers:
	else if (document.implementation && document.implementation.createDocument) 
	{	xml_doc = document.implementation.createDocument("","doc",null);	}
	
	xml_doc.async=false;
	xml_doc.load(url);
	return xml_doc;
}

function parse_xml(str)
{	// code for IE
	if (window.ActiveXObject)
  	{	var doc=new ActiveXObject("Microsoft.XMLDOM");
	    doc.async="false";
		doc.loadXML(str);
	}
	// code for Mozilla, Firefox, Opera, etc.
	else
	{
	var parser=new DOMParser();
	var doc=parser.parseFromString(str,"text/xml");
	}
	
	return doc.documentElement;
}

/*********************************Rollovers***************************************/
function rollover_btn(id)
{	//if element does not exist, return
	if(!document.getElementById(id))
	{	return false;	}

	this.original_image; this.hover_image; this.down_image;
	this.ele = document.getElementById(id);
	this.original_image = new Image();
	this.original_image.src = this.ele.src;
	
	//get the hover src and store in a image object, attach the hover event to the ele
	if(this.ele.getAttribute("hover"))
	{	this.hover_image = new Image();	
		this.hover_image.src = this.ele.getAttribute("hover");
		//attach event
		var obj = this;
		var func = function()
		{	obj.hover();	}
		addEvent(this.ele, "mouseover", func, false);
		
		//attach mouseout function
		var func = function()
		{	obj.out();	}
		addEvent(this.ele, "mouseout", func, false);
	}
	
	//get the down src and store in a image object
	if(this.ele.getAttribute("down"))
	{	this.down_image = new Image();	
		this.down_image.src = this.ele.getAttribute("down");
		//attach mousedown event
		var obj = this;
		var func = function()
		{	obj.down();	}
		addEvent(this.ele, "mousedown", func, false);		
		
		//if there is hover, on m-up shld be back to hover im
		if(this.hover_image)
		{	var func = function()
			{	obj.hover();	}
		}
		else//else return to original image
		{	var func = function()
			{	obj.out();	}
		}
		addEvent(this.ele, "mousedown", func, false);		
	}
	
	
	//hover
	this.hover = function()
	{	this.ele.src = this.hover_image.src;
	}
	
	this.out = function()
	{	this.ele.src = this.original_image.src;
	}
	
	this.down = function()
	{	this.ele.src = this.down_image.src;
	}
}
/**********************************AJAX**********************************/
function GetXmlHttpObject()
{ 	var objXMLHttp=null
	if (window.XMLHttpRequest)
	{	objXMLHttp=new XMLHttpRequest();	}
	else if (window.ActiveXObject)
	{	objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");	
	}
	return objXMLHttp;
}

function ajax_response(url, func, parameters)
{	xmlHttp = GetXmlHttpObject();
	
	xmlHttp.onreadystatechange = func;
	if(!parameters)
	{	xmlHttp.open("GET",url,true);	
		xmlHttp.send(null);
	}
	else
	{	xmlHttp.open("POST",url,true);	
		xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xmlHttp.send(parameters);	
	}
}

/********************************************MMPRELOAD ETC***************************************/
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}




/******************************** ELEMENT COORDS ***********************************/

function get_coords(ele)
{
	var left, top;
	left = 0;
	top = 0;
	if(!ele.parentNode)
	{	
		var coords =  {
			left : left,
			top: top
		};
		
		return coords;
	}
	
	while(ele.offsetParent){
		left += ele.offsetLeft;
		top += ele.offsetTop;
		ele = ele.offsetParent;
	}
	
	var coords = {
		left : left,
		top: top
	}
	
	return coords;
}




function calendar_on_change(input)
{
	//if its start date, configure the end date to be same mth as end date
	if(input.name.indexOf('start') != -1)
	{
		var end_date_name = input.name.replace(/start/g, 'end');
		if(document.forms[0].elements[end_date_name])
		{
			if(document.forms[0].elements[end_date_name].value == '' || document.forms[0].elements[end_date_name].value == '0000-00-00')
			{
				document.forms[0].elements[end_date_name].value = input.value;
			}
		}
	}
}


/**
*compare to dates to see if 1st date is later than 2nd. returns true if so. (assumes format is yyyy-mm-dd)
*/
function date_is_later(date1, date2)
{	
	var split1 = date1.split('-');
	var split2 = date2.split('-');
	
	if(split1.length != 3 || split2.length != 3)
	{
		return false;
	}
	
	var date_obj1 = new Date();
	var date_obj2 = new Date();
	
	date_obj1.setFullYear(split1[0],(split1[1]-1),split1[2]);
	date_obj2.setFullYear(split2[0],(split2[1]-1),split2[2]);
	
	if(date_obj1 > date_obj2)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function date_is_later_than_today(date)
{	
	var today_obj = new Date();
	
	var split = date.split('-');
	
	if(split.length != 3)
	{
		return false;
	}
	
	var date_obj = new Date();
	
	date_obj.setFullYear(split[0],(split[1]-1),split[2]);
	
	if(date_obj >= today_obj)
	{
		return true;
	}
	else
	{
		return false;
	}
}

