/** This is to deal with Money.  It displays it if you put it in a display format.
 	It should magically work with DWR.
**/
function Money(doubleVal) {
	if(typeof(doubleVal) == 'undefined')
		this.value=''
	else
		this.value=doubleVal.toString().replace(/\$|\,/g,'')
}
Money.prototype.toString = function() { return this.value };
Money.prototype.formattedString = function() 
{ 
	var num = this.value;
	if(isNaN(this.value))
		return this.value;
	this.value = Math.abs(num)
	sign = (num == this.value );
	num = Math.floor(Math.abs(num)*100+0.50000000001);
	cents = num %100;
	num = Math.floor(num/100).toString();
	if(cents<10)
		cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	return (((sign)?'':'-') + '$' + num + '.' + cents);
};

function StringEST(v, h, t) {
	this.value=v;
	this.html=h;
	this.textArea=t;
}
StringEST.prototype.toString = function() { return this.value };

/*===================================================================
 Author (of the date portion): Matt Kruse
 
 View documentation, examples, and source code at:
     http://www.JavascriptToolbox.com/

 NOTICE: You may use this code for any purpose, commercial or
 private, without any further permission from the author. You may
 remove this notice from your final code if you wish, however it is
 appreciated by the author if at least the web site address is kept.

 This code may NOT be distributed for download from script sites, 
 open source CDs or sites, or any other distribution method. If you
 wish you share this code with others, please direct them to the 
 web site above.
 
 Pleae do not link directly to the .js files on the server above. Copy
 the files to your own server for use with your site or webapp.
 ===================================================================*/
/*
Date functions

These functions are used to parse, format, and manipulate Date objects.
See documentation and examples at http://www.JavascriptToolbox.com/lib/date/

The form functions are stored in this file below the date ones.

*/
Date.$VERSION = 1.01;

// Utility function to append a 0 to single-digit numbers
Date.LZ = function(x) {return(x<0||x>9?"":"0")+x};
// Full month names. Change this for local month names
Date.monthNames = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
// Month abbreviations. Change this for local month names
Date.monthAbbreviations = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
// Full day names. Change this for local month names
Date.dayNames = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
// Day abbreviations. Change this for local month names
Date.dayAbbreviations = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
// Used for parsing ambiguous dates like 1/2/2000 - default to preferring 'American' format meaning Jan 2.
// Set to false to prefer 'European' format meaning Feb 1
Date.preferAmericanFormat = true;

// If the getFullYear() method is not defined, create it
if (!Date.prototype.getFullYear) { 
  Date.prototype.getFullYear = function() { var yy=this.getYear(); return (yy<1900?yy+1900:yy); } 
} 

// Parse a string and convert it to a Date object.
// If no format is passed, try a list of common formats.
// If string cannot be parsed, return null.
// Avoids regular expressions to be more portable.
Date.parseString = function(val, format) {
  // If no format is specified, try a few common formats
  if (typeof(format)=="undefined" || format==null || format=="") {
    var generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d','MMM-d','d-MMM');
    var monthFirst=new Array('M/d/y','M-d-y','M.d.y','M/d','M-d');
    var dateFirst =new Array('d/M/y','d-M-y','d.M.y','d/M','d-M');
    var checkList=new Array(generalFormats,Date.preferAmericanFormat?monthFirst:dateFirst,Date.preferAmericanFormat?dateFirst:monthFirst);
    for (var i=0; i<checkList.length; i++) {
      var l=checkList[i];
      for (var j=0; j<l.length; j++) {
        var d=Date.parseString(val,l[j]);
        if (d!=null) { 
          return d; 
        }
      }
    }
    return null;
  }

  this.isInteger = function(val) {
    for (var i=0; i < val.length; i++) {
      if ("1234567890".indexOf(val.charAt(i))==-1) { 
        return false; 
      }
    }
    return true;
  };
  this.getInt = function(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 (this.isInteger(token)) { 
        return token; 
      }
    }
  return null;
  };
  val=val+"";
  format=format+"";
  var i_val=0;
  var i_format=0;
  var c="";
  var token="";
  var token2="";
  var x,y;
  var year=new Date().getFullYear();
  var month=1;
  var date=1;
  var hh=0;
  var mm=0;
  var ss=0;
  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=this.getInt(val,i_val,x,y);
      if (year==null) { 
        return null; 
      }
      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;
      var names = (token=="MMM"?(Date.monthNames.concat(Date.monthAbbreviations)):Date.monthAbbreviations);
      for (var i=0; i<names.length; i++) {
        var month_name=names[i];
        if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
          month=(i%12)+1;
          i_val += month_name.length;
          break;
        }
      }
      if ((month < 1)||(month>12)){
        return null;
      }
    }
    else if (token=="EE"||token=="E"){
      var names = (token=="EE"?Date.dayNames:Date.dayAbbreviations);
      for (var i=0; i<names.length; i++) {
        var day_name=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=this.getInt(val,i_val,token.length,2);
      if(month==null||(month<1)||(month>12)){
        return null;
      }
      i_val+=month.length;
    }
    else if (token=="dd"||token=="d") {
      date=this.getInt(val,i_val,token.length,2);
      if(date==null||(date<1)||(date>31)){
        return null;
      }
      i_val+=date.length;
    }
    else if (token=="hh"||token=="h") {
      hh=this.getInt(val,i_val,token.length,2);
      if(hh==null||(hh<1)||(hh>12)){
        return null;
      }
      i_val+=hh.length;
    }
    else if (token=="HH"||token=="H") {
      hh=this.getInt(val,i_val,token.length,2);
      if(hh==null||(hh<0)||(hh>23)){
        return null;
      }
      i_val+=hh.length;
    }
    else if (token=="KK"||token=="K") {
      hh=this.getInt(val,i_val,token.length,2);
      if(hh==null||(hh<0)||(hh>11)){
        return null;
      }
      i_val+=hh.length;
      hh++;
    }
    else if (token=="kk"||token=="k") {
      hh=this.getInt(val,i_val,token.length,2);
      if(hh==null||(hh<1)||(hh>24)){
        return null;
      }
      i_val+=hh.length;
      hh--;
    }
    else if (token=="mm"||token=="m") {
      mm=this.getInt(val,i_val,token.length,2);
      if(mm==null||(mm<0)||(mm>59)){
        return null;
      }
      i_val+=mm.length;
    }
    else if (token=="ss"||token=="s") {
      ss=this.getInt(val,i_val,token.length,2);
      if(ss==null||(ss<0)||(ss>59)){
        return null;
      }
      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 null;
      }
      i_val+=2;
    }
    else {
      if (val.substring(i_val,i_val+token.length)!=token) {
        return null;
      }
      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 null; 
  }
  // 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 null; 
      }
    }
    else { 
      if (date > 28) { 
        return null; 
      } 
    }
  }
  if ((month==4)||(month==6)||(month==9)||(month==11)) {
    if (date > 30) { 
      return null; 
    }
  }
  // Correct hours value
  if (hh<12 && ampm=="PM") {
    hh=hh-0+12; 
  }
  else if (hh>11 && ampm=="AM") { 
    hh-=12; 
  }
  return new Date(year,month-1,date,hh,mm,ss);
}

// Check if a date string is valid
Date.isValid = function(val,format) {
  return (Date.parseString(val,format) != null);
}

// Check if a date object is before another date object
Date.prototype.isBefore = function(date2) {
  if (date2==null) { 
    return false; 
  }
  return (this.getTime()<date2.getTime());
}

// Check if a date object is after another date object
Date.prototype.isAfter = function(date2) {
  if (date2==null) { 
    return false; 
  }
  return (this.getTime()>date2.getTime());
}

// Check if two date objects have equal dates and times
Date.prototype.equals = function(date2) {
  if (date2==null) { 
    return false; 
  }
  return (this.getTime()==date2.getTime());
}

// Check if two date objects have equal dates, disregarding times
Date.prototype.equalsIgnoreTime = function(date2) {
  if (date2==null) { 
    return false; 
  }
  var d1 = new Date(this.getTime()).clearTime();
  var d2 = new Date(date2.getTime()).clearTime();
  return (d1.getTime()==d2.getTime());
}

// Format a date into a string using a given format string
Date.prototype.format = function(format) {
  format=format+"";
  var result="";
  var i_format=0;
  var c="";
  var token="";
  var y=this.getYear()+"";
  var M=this.getMonth()+1;
  var d=this.getDate();
  var E=this.getDay();
  var H=this.getHours();
  var m=this.getMinutes();
  var s=this.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+1900);
  }
  value["y"]=""+y;
  value["yyyy"]=y;
  value["yy"]=y.substring(2,4);
  value["M"]=M;
  value["MM"]=Date.LZ(M);
  value["MMM"]=Date.monthNames[M-1];
  value["NNN"]=Date.monthAbbreviations[M-1];
  value["d"]=d;
  value["dd"]=Date.LZ(d);
  value["E"]=Date.dayAbbreviations[E];
  value["EE"]=Date.dayNames[E];
  value["H"]=H;
  value["HH"]=Date.LZ(H);
  if (H==0){
    value["h"]=12;
  }
  else if (H>12){
    value["h"]=H-12;
  }
  else {
    value["h"]=H;
  }
  value["hh"]=Date.LZ(value["h"]);
  value["K"]=value["h"]-1;
  value["k"]=value["H"]+1;
  value["KK"]=Date.LZ(value["K"]);
  value["kk"]=Date.LZ(value["k"]);
  if (H > 11) { 
    value["a"]="PM"; 
  }
  else { 
    value["a"]="AM"; 
  }
  value["m"]=m;
  value["mm"]=Date.LZ(m);
  value["s"]=s;
  value["ss"]=Date.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;
}

// Get the full name of the day for a date
Date.prototype.getDayName = function() { 
  return Date.dayNames[this.getDay()];
}

// Get the abbreviation of the day for a date
Date.prototype.getDayAbbreviation = function() { 
  return Date.dayAbbreviations[this.getDay()];
}

// Get the full name of the month for a date
Date.prototype.getMonthName = function() {
  return Date.monthNames[this.getMonth()];
}

// Get the abbreviation of the month for a date
Date.prototype.getMonthAbbreviation = function() { 
  return Date.monthAbbreviations[this.getMonth()];
}

// Clear all time information in a date object
Date.prototype.clearTime = function() {
  this.setHours(0); 
  this.setMinutes(0);
  this.setSeconds(0); 
  this.setMilliseconds(0);
  return this;
}

// Add an amount of time to a date. Negative numbers can be passed to subtract time.
Date.prototype.add = function(interval, number) {
  if (typeof(interval)=="undefined" || interval==null || typeof(number)=="undefined" || number==null) { 
    return this; 
  }
  number = +number;
  if (interval=='y') { // year
    this.setFullYear(this.getFullYear()+number);
  }
  else if (interval=='M') { // Month
    this.setMonth(this.getMonth()+number);
  }
  else if (interval=='d') { // Day
    this.setDate(this.getDate()+number);
  }
  else if (interval=='w') { // Weekday
    var step = (number>0)?1:-1;
    while (number!=0) {
      this.add('d',step);
      while(this.getDay()==0 || this.getDay()==6) { 
        this.add('d',step);
      }
      number -= step;
    }
  }
  else if (interval=='h') { // Hour
    this.setHours(this.getHours() + number);
  }
  else if (interval=='m') { // Minute
    this.setMinutes(this.getMinutes() + number);
  }
  else if (interval=='s') { // Second
    this.setSeconds(this.getSeconds() + number);
  }
  return this;
}

DWRUtil.etdm = {
dateFormat:"MM/dd/yyyy"
, dateTimeFormat:"MM/dd/yyyy hh:mm:ss a"
, form2js: function(formId,attributeName) 
{
	if(typeof(attributeName)=='undefined')
		attributeName="name";
	var formstuff = DWRUtil.etdm.getElementsByAttributeName(formId,attributeName)//formId.elements	
	var test = new Object()
	for(i=formstuff.length-1; i>=0; i--)
	{ 
		if(formstuff[i].getAttribute(attributeName)!=null && formstuff[i].getAttribute(attributeName).length>0)
		{
			if(formstuff[i].type=='radio'){
				var radioValue = DWRUtil.etdm.element2string(formstuff[i]);
				if(radioValue){
					if(test[formstuff[i].getAttribute(attributeName)]==null)
						test[formstuff[i].getAttribute(attributeName)] = radioValue
					else
						test[formstuff[i].getAttribute(attributeName)] += "," + radioValue					
				}
			}
			else if(test[formstuff[i].getAttribute(attributeName)]!=null)
				test[formstuff[i].getAttribute(attributeName)]=new Array(DWRUtil.etdm.element2string(formstuff[i])).concat(test[formstuff[i].getAttribute(attributeName)])
			else
				test[formstuff[i].getAttribute(attributeName)] = DWRUtil.etdm.element2string(formstuff[i])
		}
	}
//	alert(DWRUtil.toDescriptiveString(test,3))
	return test
},
element2string:function(element)
{
	var value
	if(element.type=='checkbox' )
		return element.checked //?true:false
	else if(element.type=='radio'){
		if(element.value && (element.checked == true)) 
			return element.value
		else
			return element.checked //?true:false	
	}
	else if((element.nodeName=="INPUT")||(element.nodeName=="TEXTAREA" )||(element.nodeName=="BUTTON" ))
		value=element.value
	else if(element.nodeName=="SELECT" ){
		if(element.multiple){ 
			var optArray = element.options
			value = new Array()
			for (var ii=0; ii < optArray.length; ii++) {
				if (optArray[ii].selected) {
					value[value.length] = optArray[ii].value
				}
			}
		} else {
			value=element.value
		}
	}
	else value=element.innerHTML
		
	if(element.getAttribute("DWR:dataType")!=null && element.getAttribute("DWR:dataType")=="date")
	{
		var d = Date.parseString(value)
		if( ((value.length == 0) && (element.getAttribute("DWR:AllowNull")==null || element.getAttribute("DWR:AllowNull").toLowerCase()!="true")) 
			|| ((value.length > 0) && (d==null ))
			)
		{ 
			throw "The value \"" + value + "\" is either invalid or in an unrecognized date format.\nWe recommend the "+DWRUtil.etdm.dateFormat+ " format."
		} 
		return d
	}
	if(element.getAttribute("DWR:dataType")!=null && element.getAttribute("DWR:dataType")=="money")
		return DWRUtil.etdm.currency2number(value)

	if(
		((element.nodeName=="INPUT") || (element.nodeName=="TEXTAREA" )) 
		&& (value==null || value.length==0)
		&& element.getAttribute("DWR:AllowNull")!=null 
		&& element.getAttribute("DWR:AllowNull").toLowerCase()!="true" 
		){
			throw "Bad Empty Field"
	}
		
	return value
}
,formByName:function (formId,attributeName)
{ 
	if(typeof(attributeName)=='undefined')
		attributeName="name"
	var formstuff = DWRUtil.etdm.getElementsByAttributeName(formId,attributeName)//formID.elements
	var test= new Object()
	for(i=formstuff.length-1; i>=0; i--) {
		if(test[formstuff[i].getAttribute(attributeName)]!=null) {
			test[formstuff[i].getAttribute(attributeName)]= new Array().concat(formstuff[i],test[formstuff[i].getAttribute(attributeName)])
		} else 
			test[formstuff[i].getAttribute(attributeName)]=formstuff[i];
		try{
	  		if(formId.getAttribute("DWR:clear")!="false"){
	  			DWRUtil.etdm.formPopulate("",formstuff[i])
	  		}
		} catch (e) {}
  }
; return test
}
,js2form:function (jhash,formID,attributeName)
{ 
	var formReborn = DWRUtil.etdm.formByName(formID,attributeName)
	for(elem in jhash)
	{
		//If this element is not an object, then it can populate a form element directly.  Otherwise,
		//each of its values will.
		//alert(typeof(jhash[elem])+":"+jhash[elem]+":"+formReborn[elem].name);
		//alert(elem+":"+jhash[elem]);
		if(typeof(jhash[elem])!='object' && jhash[elem]!=null)
			DWRUtil.etdm.formPopulate(jhash[elem],formReborn[elem])
		else {
			if(jhash[elem]!=null){
				if(!jhash[elem].length){
					if(!jhash[elem].id){
						DWRUtil.etdm.formPopulate(jhash[elem],formReborn[elem])
					} else {
						DWRUtil.etdm.formPopulate(jhash[elem].id,formReborn[elem])
					}
				} else {
					try {
						//was jhash[elem].length
						if(formReborn[elem].type=="select-multiple"){
							for(var jj=0; jj<formReborn[elem].options.length; jj++){
								formReborn[elem][jj].selected=false;
								for(var ii=0; ii<jhash[elem].length; ii++) {
									if(formReborn[elem].options[jj].value == jhash[elem][ii] || ( jhash[elem][ii].id && (formReborn[elem].options[jj].value == jhash[elem][ii].id)) ){
										formReborn[elem].options[jj].selected=true;
									}
								}
							}  
						} else {
							for(var ii=0; ii<jhash[elem].length; ii++) {  
								DWRUtil.etdm.formPopulate(jhash[elem][ii],formReborn[elem][ii])
							}
						} 
					} catch (e) {;}
				}
			} else {
			  ;//This may need to be changed to properly handle null objects
			}
		}
	}
},
formPopulate:function(value,element)
{ 
	//alert(element.type+"|||"+element.nodeName+"|||"+value);
	if(typeof(element)=='undefined')
		return;
	if(element.type=='checkbox' )
	{	
		if(value=="N")
			element.checked = false;
		else
			element.checked = value;
	}
	else if(element.type=='radio')
	{	//TODO not sure this actually works
		if(element.value==value) element.checked = true;
	}
	//NO ERROR CHECKING HERE!  
	//Be sure that the value you're looking for actually exists in the list of possible values
	//before you convert a form in this manner.
	else if(element.nodeName=='SELECT') 
	{
		for(var i=0; i<element.options.length; i++)
	  		if(element.options[i].value==value)
	  		{
	  			element.value=value//element.options.getSelectedIndex=i
	  			return
	  		}
	}
	else if( (element.nodeName=='INPUT') || (element.nodeName=='TEXTAREA') || (element.nodeName=='BUTTON'))
	{ 
		if(value instanceof Date)
		{
			element.value = value.format(DWRUtil.etdm.dateFormat);
		}
		/*
		else if(element.getAttribute("DWR:dataType")!=null && element.getAttribute("DWR:dataType")=="money")
		{ element.value=DWRUtil.etdm.formatCurrency(value);
		} */
		else element.value=value;
	}
	else 
	{
		if(value instanceof Date)
		{
			//element.innerHTML = value.format(DWRUtil.etdm.dateFormat)
			DWRUtil.etdm.removeAllChildNodes(element)
			var tmpText = value.format(DWRUtil.etdm.dateFormat)
			var tmpTextElement = document.createTextNode(tmpText);
			element.appendChild(tmpTextElement)
		}
		else if(value instanceof Money)
		{
			//element.innerHTML=value.formattedString();
			DWRUtil.etdm.removeAllChildNodes(element)
			var tmpText = value.formattedString();
			var tmpTextElement = document.createTextNode(tmpText);
			element.appendChild(tmpTextElement)
		} 
		else {
			//element.innerHTML=value.toString().replace("\n","<br />");
			DWRUtil.etdm.removeAllChildNodes(element)
			var tmpText = value.toString().replace("\n","<br />");
			var tmpTextElement = document.createTextNode(tmpText);
			element.appendChild(tmpTextElement)
		}
	}
}, 
getElementsByAttributeName:function(parentID,attrN){
//	return parentID.elements
	var	cIterate=parentID.getElementsByTagName('*'),
	    aResponse=[],
	    attr,
	    iii=0,
	    elm;
    while((elm=cIterate.item(iii++))){
        attr=elm.getAttributeNode(attrN);
        if(attr && attr.specified)
            aResponse.push(elm);
    }
    return aResponse;
},
alertResult:function(result)
{ alert(DWRUtil.toDescriptiveString(result,3))
},addItemToList:function (theList,reply, propertyMap){
	newElem = document.createElement("OPTION");
//	newElem.text=reply[propertyMap.text]
//	newElem.value=reply[propertyMap.value];
	
	for(key in propertyMap)
		try{
			if(reply[propertyMap[key]] != null){
				newElem[key]=reply[propertyMap[key]];
				//if(key != "value" && key != "text" ) alert(key);
				}		
		} catch (e) {;}
	theList.add(newElem);
},populateTheList:function (reply, listName, zeroRowsText, zeroRowsValue, propertyMap, addItemFunction,addZeroRowsItemFunction ){
	if(propertyMap ==null) propertyMap = new Object();
	if(propertyMap.value == null) propertyMap.value = "id";
	if(propertyMap.text == null) propertyMap.text = "displayName";
	if(zeroRowsText == null) zeroRowsText = "No valid values returned.";
	if(zeroRowsValue == null) zeroRowsValue = "";
	if(addItemFunction == null) addItemFunction = DWRUtil.etdm.addItemToList;
	if(addZeroRowsItemFunction == null) addZeroRowsItemFunction = DWRUtil.etdm.addItemToList;
	//DWRUtil.etdm.alertResult(reply)
	
	//	Delete the current list.
	var theList =  $(listName).options;
	theList.length=0;
	if(reply == null || reply.length == 0 )
	{
		var tmp = new Array();
		tmp[propertyMap.value] = zeroRowsValue;
		tmp[propertyMap.text] = zeroRowsText;
		addZeroRowsItemFunction(theList,tmp,propertyMap);
		try{ $(listName+'Button').disabled=true; } catch (e) {}
	} else 
	{
		try{ $(listName+'Button').disabled=false; } catch (e) {}
		for(var ii=0; ii<reply.length; ii++){
			addItemFunction(theList,reply[ii], propertyMap);
		} 
	}
},removeAllChildNodes:function(elem){
    while ( elem.hasChildNodes() )
        elem.removeChild( elem.firstChild );       
},useLoadingMessage:function(message) {
	var loadingMessage;
	if (message) 
		loadingMessage = message;
	else 
		loadingMessage = "Loading";
	DWREngine.setPreHook(function() {
		var disabledZone = $('disabledZone');
		if (!disabledZone) {
			disabledZone = document.createElement('div');
			disabledZone.setAttribute('id', 'disabledZone');
			disabledZone.style.position = "absolute";
			disabledZone.style.zIndex = "1000";
			disabledZone.style.left = "0px";
			disabledZone.style.top = "0px";
			disabledZone.style.width = "100%";
			disabledZone.style.height = "100%";
			document.body.appendChild(disabledZone);
			var messageZone = document.createElement('div');
			messageZone.setAttribute('id', 'messageZone');
			messageZone.style.position = "absolute";
			messageZone.style.top = "0px";
			messageZone.style.right = "0px";	
			messageZone.style.background = "red";
			messageZone.style.color = "white";
			messageZone.style.fontFamily = "Arial,Helvetica,sans-serif";
			messageZone.style.padding = "4px";
			disabledZone.appendChild(messageZone);
			var text = document.createTextNode(loadingMessage);
			messageZone.appendChild(text);
		}
		else {
			var messageZone = $('messageZone');
			messageZone.style.top = "0px";
			messageZone.style.right = "0px";		
			$('messageZone').innerHTML = loadingMessage;
			disabledZone.style.display = 'block';
		}
	});

	DWREngine.setPostHook(function() {
		$('disabledZone').style.display = 'none';
	});
}, addOnloadEvent:function(eventFunction) {
	if (window.addEventListener){
		window.addEventListener("load", eventFunction, false)
	}else if(window.attachEvent){
		window.attachEvent('onload',eventFunction);
	} else {
		//Doesn't support either method of adding events
	}
}
}