var ONCLICKVALS = null;
var toID = null;
// isPrototype is modified by the page
var isPrototype = false;

function dcmnr_setFormActionVar(section,id) {
	if (document.getElementById('formActionValue_' + section)){
		document.getElementById('formActionValue_' + section).value = id;
	}
}

function dcmnr_submitFormRow(tableName, rowNumber,formId, formAction)
{
	var rowNum = parseInt(rowNumber) -1;
	if (document.getElementById(tableName +"_rowNumber_" + rowNumber )) {
		var elemen = document.getElementById(tableName +"_rowNumber_" + rowNumber );		
		if (elemen.type=="hidden") {
			elemen.checked = true;
		}
		else if (elemen.type=="radio") {
			elemen.checked = true;
		}
	}
	var elem = document.getElementById(tableName+"_rowNumHidden");
	if (elem!=null) {
		elem.value = "" + rowNum;
	}

	if (toID==null)
        {
		dcmnr_disableAllButtons();
		dcmnr_submit(formId, formAction);
	} 
}

function dcmnr_submitFormRowAction(tableName, rowNumber,formId, formAction, actionVar) {
	dcmnr_setFormActionVar(formId,actionVar);
	dcmnr_submitFormRow(tableName, rowNumber,formId, formAction);
}


function dcmnr_submitFormRowConfirm(tableName, rowNumber,formId, formAction, message) {
	if (confirm(message)) {
		 dcmnr_submitFormRow(tableName, rowNumber,formId, formAction);
        }
}

function dcmnr_submitFormRowConfirmAction(tableName, rowNumber,formId, formAction, message, action) {
	dcmnr_setFormActionVar(formId,action);
	dcmnr_submitFormRowConfirm(tableName, rowNumber,formId, formAction, message);
}

function dcmnr_disableAllButtonsOnly() {
  objLinks = document.links;
  if (objLinks!=null) {
     ONCLICKVALS = new Array(objLinks.length);
     for(i=0;i<objLinks.length;i++){
       objLinks[i].disabled = true;
       ONCLICKVALS[i] =  objLinks[i].onclick; //.toString();
       // iti is not enough to just disable the link, the onclick must also return false;
       objLinks[i].onclick = function(){return false;};
       //objLinks[i].onclick = new Function("{return false;}");
     }
  }
}

function dcmnr_disableAllButtons() {
  dcmnr_disableAllButtonsOnly();
  var dur = 30000;
  if (isPrototype==true) dur = 2000;
  toID = window.setTimeout("dcmnr_enableAllButtons()", dur);
}

function dcmnr_enableAllButtons() {
  window.clearTimeout(toID);
  objLinks = document.links;
  if (objLinks!=null) {
     for(i=0;i<objLinks.length;i++){
       objLinks[i].disabled = false;
       if(objLinks[i].onclick ){  
    	 objLinks[i].onclick = ONCLICKVALS[i]; //.getFuncBody();
       }
     }
  }
  toID = null;
}

function dcmnr_submitForm(formId, formAction)
{
	if (toID==null)
        {
		dcmnr_disableAllButtons();
		dcmnr_submit(formId, formAction);
	}
}

function dcmnr_submitFormAction(formId, formAction, actionVar)
{
	dcmnr_setFormActionVar(formId,actionVar);
 	dcmnr_submitForm(formId, formAction);
}

function dcmnr_submitFormConfirm(formId, formAction, message) {
	//if (toID!=null) return;
	
	if (confirm(message)) {
		dcmnr_submitForm(formId, formAction);
	}
}

function dcmnr_submitFormConfirmAction(formId, formAction, message, actionVar) {
	dcmnr_setFormActionVar(formId,actionVar);
	dcmnr_submitFormConfirm(formId, formAction, message);
}

function dcmnr_select(formId, formAction)
{
	dcmnr_submit(formId,formAction);
}

function dcmnr_validateInteger( strValue ) {
  var objRegExp  = /(^-?\d\d*$)/;
  //check for integer characters
  return objRegExp.test(strValue);
 }

function dcmnr_updateNumberOfRecords(formId,pageSize)	{
	var pageSizeString = document.getElementById(pageSize).value;
	//alert("event.keyCode is " + event.keyCode);
	if(dcmnr_validateInteger(pageSizeString) &&event.keyCode!=46)	{
		if (pageSizeString > 50)	{
			document.getElementById(pageSize).value=50;
		}
		return;
	}
	else if(event.keyCode==8){
		return;
	}
	else if(event.keyCode==46){
		document.getElementById(pageSize).value=document.getElementById(pageSize).value.substring(0,document.getElementById(pageSize).value.length-1);
		return;
	}
	else	{
		document.getElementById(pageSize).value=5;
		return;
	}
}

function dcmnr_submit(formId, formAction)
{
  dcmnr_preSubmitSetMultipleSelectElements(formId);
  if ((formAction==null)||(formAction==''))
  {
    dcmnr_submitNoAction(formId);
    return;
  }
  if (!isPrototype) {
	  var formObj = document.getElementById(formId);
	  formObj.setAttribute("action", formAction);
	  formObj.submit();	
  } else {
    document.location=formAction;
  }
}

function dcmnr_submitAction(formId, formAction, actionVar) {
	dcmnr_setFormActionVar(formId,actionVar);
	dcmnr_submit(formId, formAction)
}


function dcmnr_submitNoAction(formId)
{
   var formObj = document.getElementById(formId);
   formObj.submit();	
}

function dcmnr_setLocation(formId, url)
{
  document.location=url;
}

// specifically opens in a new window using blank
function dcmnr_popupNewDocument(formId, url)
{
  popupWindowBare(url,"_blank",800,600);
}

function dcmnr_goToRecordNumber(formId, url, tableName, recordNumber)
{
   var formObj = document.getElementById(formId);
   if (recordNumber != 0)
   {
   	var currentRecord = document.getElementById(tableName + "_currentRecord");
	dcmnr_selectRecord(currentRecord, recordNumber);
	formObj.setAttribute("action", url);
   	formObj.submit();	
   }
}

function dcmnr_getSelectText(variableObject, val) {
	var retVal = "";
	var i=0;
	for(i=0;i<variableObject.length;i++) {
		if (variableObject.options[i].value==val) {
			retVal = variableObject.options[i].text;
			break;
		}
	}
	return retVal;
}

function dcmnr_getSelectMultipleText(variableObject) {
	var retVal = "";
	var i=0;
	for(i=0;i<variableObject.length;i++) {
		if (retVal!="") {
			retVal = retVal + "," + variableObject.options[i].text;
		} else {
			retVal = variableObject.options[i].text;
		}
	}
	return retVal;
}

function dcmnr_getSelectMultipleValue(variableObject) {
	var retVal = "";
	var i=0;
	for(i=0;i<variableObject.length;i++) {
		if (retVal!="") {
			retVal = retVal + "," + variableObject.options[i].value;
		} else {
			retVal = variableObject.options[i].value;
		}
	}
	return retVal;
}

function dcmnr_selectRecord(currentRecord, numb)
{
	//alert(numb+ " " + currentRecord.length);
	var i = 0;
	if (currentRecord && (eval("currentRecord.length"))) {
		while(i < currentRecord.length)
		{
			if(currentRecord.options[i].value==numb)
			{
				//alert(i + " " + currentRecord.options[i].value  + " " + numb);
				currentRecord.options[i].selected = true;
				currentRecord.id = numb;
				return;
			}
			i = i + 1;
		}
	} else {
		currentRecord.value = numb;	
	}
}


function dcmnr_print() {
	window.print();
}


function dcmnr_print_with_landscape_alert() {
	alert("Please ensure you have set up your printer to print in landscape orientation or this page might not print correctly.");
	window.print();
}


function dcmnr_print(formId, formAction) {
//print action
	if(window.print != null)
	{
		window.print();
	}
	else
	{
		alert("Unfortunately, your browser does not support this shortcut. Please select the Print from the File menu");	
	}
}

var previousButtonBGColor = null;
var previousButtonColor = null;

  function buttonMouseOver(element) {
		previousButtonBGColor = element.style.backgroundColor;
		previousButtonColor = element.style.color;
		element.style.backgroundColor = '#336699';
		element.style.color = '#ffffff';
  }
  function buttonMouseOut(element) {
		element.style.backgroundColor = previousButtonBGColor;
		element.style.color = previousButtonColor;
		element.style.borderStyle = 'outset';
  }
	function buttonMouseDown(element) {
		element.style.borderStyle = 'inset';
	}
	function buttonMouseUp(element) {
		element.style.borderStyle = 'outset';
	}


function dcmnr_getPopUpUrlOrBlank(i)
{
	var val = "";
	if (self["onLoadPopUpUrl"+i])
	{
		val = eval("onLoadPopUpUrl" + i);	
	}
	return val;
}

function dcmnr_evalOnLoadVar(onLoadVarName)
{
	var val = "";
	if (self[onLoadVarName])
	{
		val = eval(onLoadVarName);	
		//alert(onLoadVarName + ':' + val)
		eval(val);
	}
	return val;
}

function dcmnr_activatePopUps() {

	var i = 1;
	var val;
	val = dcmnr_getPopUpUrlOrBlank(i);
	var currentPopup;

	while (val!="") {
		// Close the window if it is already open. This is to get over 
		// the bug where an already opened popup window cannot be refocused 
		// if it is not html, i.e. a pdf document. Only happens in IE, not Firefox.
		currentPopup = window.open("", "popup" + i, "");
		currentPopup.close();
		
		currentPopup = window.open(val, "popup" + i, "toolbar=no,scrollbars=yes,location=no,statusbar=yes,menubar=no,resizable=yes,width=800,height=600,left=240,top=212");
		currentPopup.focus();
		i = i + 1;
		val = dcmnr_getPopUpUrlOrBlank(i);
	}

}

function dcmnr_setupRedirectIfPresent() {

	var i = 1;
	var val;
	val = "";
	if (self["onLoadRedirectUrl"])
	{
		val = eval("onLoadRedirectUrl");	
	}
	var currentPopup;

	if (val!="") {
		window.location = val;
	}
}

// due to nested loops, it is there could be 
// dcmnr_onLoadDDD1
//   dcmnr_onLoadDDD11
//   dcmnr_onLoadDDD12
function dcmnr_runDDDOnloads() {

	var i = 1;
	var ii = 1;
	var parentVal = null;
	var childVal = null;
	do {
        parentVal = dcmnr_evalOnLoadVar('dcmnr_onLoadDDD'+i);
        if (parentVal!="") {
          do {
            childVal = dcmnr_evalOnLoadVar('dcmnr_onLoadDDD'+i + ii);
            ii++;
          } while (childVal!='');
        }
		i++;
		ii = 1;
	} while (parentVal!="");
}

function dcmnr_setLoadJavaScript() {
	var i = 1;
	while (true) {
    var la = document.getElementById('loadaction_x' + i);
    if (la == null) break;
//alert('');
		eval(la.value);
		i = i + 1;
	}	
}

function dcmnr_onLoad() {
	dcmnr_runDDDOnloads();
	dcmnr_activatePopUps();
	dcmnr_setupRedirectIfPresent();
	dcmnr_trimEmptyTextareas();
 	dcmnr_setFocusOnFirstInputElement();
 	dcmnr_setLoadJavaScript();
}

function dcmnr_submitFormPopUp(name, url)
{
	dcmnr_submitFormPopUpDimensions("name", url, 800, 600);
}

function dcmnr_submitFormPopUpDimensions(name, url, height, width)
{
	popupWindow(url,"name",height,width);
}

function dcmnr_submitPostFormPopUp(tableName, rowNumber, formName, action)
{
    // this is to get around the legacy function which does not actually do a form submit!

	var rowNum = parseInt(rowNumber) -1;
	if (document.getElementById(tableName +"_rowNumber_" + rowNumber )) {
		var elemen = document.getElementById(tableName +"_rowNumber_" + rowNumber );
		if (elemen.type="radio") {
			elemen.checked = true;
		}
	}

	var elem = document.getElementById(tableName+"_rowNumHidden");
	if (elem!=null) {
		elem.value = "" + rowNum;
	}


    // open the window to use
    var windowName = "name";
	var newWin = popupWindowBare('',windowName,800,600);
	newWin.focus(); // incase it was already open, but behind other windows.
	var form = document[formName];
	var origAction = form.action;
	var origTarget = form.target;
    // then, change the form target (to the new window) and action (to the url), submit it, then reset
    form.action = action;
    form.target = windowName;
    form.submit();
    form.action = origAction;
    form.target = origTarget;
    
}


function dcmnr_submitPostFormPopUpAction(formName, action)
{
    var windowName = "name";
	var newWin = popupWindowBare('',windowName,800,600);
	newWin.focus(); // incase it was already open, but behind other windows.
	var form = document[formName];
	var origAction = form.action;
	var origTarget = form.target;
    // then, change the form target (to the new window) and action (to the url), submit it, then reset
    form.action = action;
    form.target = windowName;
    form.submit();
    form.action = origAction;
    form.target = origTarget;
}


function dcmnr_submitPostFormPopUpDimensions(formName, action, width, height)
{
    // open the window to use
	var windowName = "gis";
	var newWin = popupWindowBareNoAdjust('',windowName,width,height);
	newWin.focus(); // incase it was already open, but behind other windows.
	var form = document[formName];
	var origAction = form.action;
	var origTarget = form.target;
	form.action = action;
	form.target = windowName;
	form.submit();
	form.action = origAction;
	form.target = origTarget;
}


function popupWindowBare(url,title,winwidth,winheight){
		leftToCenter=(screen.width-winwidth)/2;
		topToCenter=(screen.height-winheight)/2;
		windowFeatures='menu=no,toolbar=no,scrollbars=yes,resizable=yes,status=yes'
		windowFeatures=windowFeatures.concat(',width='+winwidth+',height='+winheight+'');
		if (navigator.appName.indexOf("Microsoft")>=0) {
    		windowFeatures=windowFeatures.concat(',left='+leftToCenter+',top='+topToCenter+'');
    	}
		else{
    		windowFeatures=windowFeatures.concat(',screenX='+leftToCenter+',screenY='+topToCenter+'');
    	}
		return window.open(url,title,windowFeatures);
}

function popupWindowBareNoAdjust(url,title,winwidth,winheight){
		windowFeatures='menu=no,toolbar=no,scrollbars=yes,resizable=yes,status=yes,left=0,top=0,width=' + winwidth + ',height=' + winheight;
		return window.open(url,title,windowFeatures);
}


function popupWindow(url,title,winwidth,winheight){
	leftToCenter=(screen.width-winwidth)/2;
	topToCenter=(screen.height-winheight)/2;
	windowFeatures='toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width='+winwidth+',height='+winheight;
	if (navigator.appName.indexOf("Microsoft")>=0) {
    		windowFeatures=windowFeatures.concat(',left='+leftToCenter+',top='+topToCenter+'');
    	}
		else{
    		windowFeatures=windowFeatures.concat(',screenX='+leftToCenter+',screenY='+topToCenter+'');
    	}
	window.open(url,title,windowFeatures);
}

function dcmnr_submitFormPopUpAction(name, url, actionVar)
{
	dcmnr_setFormActionVar(name,actionVar);
	dcmnr_submitFormPopUp(name, url);
}




function dcmnr_setSelectMultipleOptions(value)
{
	var options = value.options;
	for(var j=0;j<options.length;j++)
	{
		options[j].selected = true;
	}

}


function dcmnr_preSubmitSetMultipleSelectElements(formName)
{
	var elemen = document[formName].elements;
	for(var i=0;((elemen!=null)&& (i<elemen.length));i++)
	{
		if (elemen[i].type=="select-multiple")
		{
			if(elemen[i].getAttribute("isShuttleBox"))	{
				dcmnr_setSelectMultipleOptions(elemen[i]);
			}
		}
	}
}	

function dcmnr_trimEmptyTextareas() {
	var aryForms = document.forms;
	for( var iForm = 0; ((aryForms!=null)&&(iForm < aryForms.length)); iForm++ ) {
		var aryElements = document.forms[iForm].elements;
		for( var i = 0; i < aryElements.length; i++ ) {
			if( aryElements[i].type == "textarea" ) {
				aryElements[i].value = trimNBSP( aryElements[i].value );
			}
		}
	}
}

function dcmnr_setFocusOnFirstInputElement() {
	var aryForms = document.forms;
	if (!document.getElementById('DONTSETFOCUSONFIRSTFIELD')) {
	for( var iForm = 0; iForm < aryForms.length; iForm++ ) {
		var aryElements = document.forms[iForm].elements;
		var type;
		var name;
		for( var i = 0; ((aryElements!=null)&&(i < aryElements.length)); i++ ) {
			type = aryElements[i].type;
			name = aryElements[i].name;
			if (aryElements[i].disabled == false && (
			                      ( aryElements[i].type == "text" )||
                            ( aryElements[i].type == "select-one" )|| 
                            ( aryElements[i].type == "textarea" )||
                            ( aryElements[i].type == "checkbox" ))) {
				if ((name.lastIndexOf("_currentRecord")==-1)&&
				    (name.lastIndexOf("_pageSize")==-1)) {
					aryElements[i].focus();
					return;
				}
			}
		}
	}
	}
}

function trim( s ) {
	while( s.substring( 0,1 ) == ' ' ) {
		s = s.substring( 1,s.length );
	}
	while( s.substring( s.length-1,s.length ) == ' ' ) {
		s = s.substring( 0,s.length-1 );
	}
	// handle case where there is no character other than one or more spaces
	var isStringAllBlank = true;
	for( var i = 0; i < s.length; i++ ) {
		var code = s.charCodeAt( 0 );
		// remember that &#160; is non-breaking space and must be accounted for -- it won't show up as a simple space (' ')	
		if( code != 160 && s.substring( i,1 ) != ' ' ) {
			isStringAllBlank = false;
			break;
		}
	}
	if( isStringAllBlank ) {
		return '';
	}
	else {
		return s;
	}
}

//Removes leading and trailing white space from a string
function dcmnr_trim( s ){
  if ((null==s) || (''==s)) return '';
  var patt = new RegExp( "^ *(.*[^ ]) *$" );
  var parse = s.match( patt );
  if (parse==null) return '';
  return parse[1];
}


function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}

function dcmnr_getDateMatch(dateStr) {
  var re = new RegExp("(\\d{1,2})[\\/\\-](\\d{1,2})[\\/\\-](\\d{2,4})");
  var m = re.exec(dateStr);
  if (m==null) {
	re = new RegExp("(\\d{1,2})(\\d{2})(\\d{4})");
	m = re.exec(dateStr);
        if (m==null) {
		re = new RegExp("(\\d{1,2})(\\d{2})(\\d{2})");
		m = re.exec(dateStr);
	        if (m==null) {
			return null;
		}
	}
  } 
  return m;
}



function dcmnr_reformatDate(formName, field) {
  var dateVal = document.getElementById(field);
  var dateStr = dateVal.value;
  var dateDay, dateMonth, dateYr;

  if (dateStr=="") {
	return;
  }
  dateStr = dcmnr_trim(dateStr);
  var dateStrUpper = dateStr.toUpperCase();
  var date = null;;
  if (dateStrUpper == 'NOW' || dateStrUpper == 'TODAY') {
    date = new Date();
  } else {
	  var mch = dcmnr_getDateMatch(dateStr);
	  if (mch==null) {
		return null;
	  }
	
	  dateDay   =  new Number(mch[1]);
	  dateMonth   = new Number(mch[2]) -1;
	  dateYr   = new Number(mch[3]);
	
	  if (dateMonth < 0 || dateMonth > 11) {
		// Error
		return;
	  }
	
	  if (dateYr < 70) dateYr += 2000;
	  if (dateYr >= 70 && dateYr < 100) dateYr += 1900;
	
	
	  date = new Date(dateYr, dateMonth, dateDay);
	  if (date.getDate()!=dateDay) {
		// Error
		return;
	  }
  }

  if (date!=null)  {
  	dateVal.value = dcmnr_padLeft(date.getDate(),2,'0') + "-" + dcmnr_padLeft(date.getMonth()+1,2,'0') + "-" + date.getFullYear();
  }
}

function dcmnr_reformatTime(formName, field) {
  var timeField = document.getElementById(field);
  //alert('2');
  var timeVal = dcmnr_trim(timeField.value);
  // formats a time input as follows
  // 0 -> Error
  // 1 -> Error
  // 20 -> Error
  // 201 -> 02:01
  // 260 -> Error
  // -201 -> Error
  // 3: -> Error
  // 3:0 -> Error
  // 3:01 -> 03:01
  // 14 -> Error
  // 23:0 -> 24:00
  // Basically, hr can be 0-23, mm must be 0-59

  if (timeVal=='') {
	return;
  }
  if (timeVal.match(/^(\d{1,2})[:\.]?(\d{2})$/)){
    hh = new Number(RegExp.$1);
    mm = new Number(RegExp.$2);
    if (hh > 23 || hh < 0 || mm < 0 || mm > 59) {
      return;
    }
  } else {
    // don't know what format it is
    return;
  }
  timeField.value = dcmnr_padLeft(hh,2,'0') + ":" + dcmnr_padLeft(mm,2,'0');
}


function dcmnr_removeChar( formName, field, character )
{
		var field = document.getElementById( field );
		var val = field.value;
		while( val.indexOf( ',' ) > 0 ) {
			val = val.substring( 0, val.indexOf( ',' ) ) + val.substring( val.indexOf( ',' ) + 1 );
		}
		field.value = val;
}


function dcmnr_padLeft(val, len, c) {
  var ret = val;
  var x = len - new String(val).length;
  for (var i = 0; i < x; i++) {
    ret = c + ret;
  }
  return ret;
}


function dcmnr_submitFormWindowClose(a,b,c) {
	window.close();
}


function dcmnr_enterKeySubmitter(e)
{
  var pressedKey;
  if (document.all) {
    e = window.event;
    pressedKey = e.keyCode;
  } else if (document.layers) {
    pressedKey = e.which;
  } else {
    return;
  }
  if (pressedKey == 13) {
    if (e.srcElement.form != null) {
      var fm = e.srcElement.form;
      dcmnr_submit(fm.id,fm.action);
    }
  }
  return;
}


/* This function hides the dependentField under the following conditions:
		--  if equalTo is true and the independentField's value matches the independentTargetValue
		--  if equalTo is false and the independentField's value does NOT match the independentTargetValue
	Note that the assumption is that the field starts off as visible by default.
*/
function dcmnr_hideDependent(dependentField, independentField, independentTargetValue, equalTo) {
	var dep = document.getElementById( dependentField );
	var indep = document.getElementById( independentField );
	//alert('dependentField ( '+dependentField+' ) ='+dep.value+', independentField ( '+independentField+' ) ='+indep.value+', independentTargetValue='+independentTargetValue+", independentField's value should = target value: "+equalTo);
	if ((equalTo && (indep.value == independentTargetValue)) || (!equalTo && !(indep.value == independentTargetValue))) {
		if ( document.getElementById( dependentField ) != null ) {
			document.getElementById( dependentField ).style.display = 'none';
		}
		// Also, hide LABEL for this input field, if it exists
		var labelId = "LABEL_" + dependentField;
		if ( document.getElementById( labelId ) != null ) {
			document.getElementById( labelId ).style.display = 'none';
		}
	} else {
		if ( document.getElementById( dependentField ) != null ) {
			document.getElementById( dependentField ).style.display = 'block';
		}
		// Also, show LABEL for this input field, if it exists
		var labelId = "LABEL_" + dependentField;
		if ( document.getElementById( labelId ) != null ) {
			document.getElementById( labelId ).style.display = 'block';
		}
	}
}


/* This function shows the dependentField under the following conditions:
		--  if equalTo is true and the independentField's value matches the independentTargetValue
		--  if equalTo is false and the independentField's value does NOT match the independentTargetValue
	Note that the assumption is that the field starts off as invisible by default.
*/
function dcmnr_showDependent(dependentField, independentField, independentTargetValue, equalTo) {
	var dep = document.getElementById( dependentField );
	var indep = document.getElementById( independentField );
	//alert('dependentField ( '+dependentField+' ) ='+dep.value+', independentField ( '+independentField+' ) ='+indep.value+', independentTargetValue='+independentTargetValue+", independentField's value should = target value: "+equalTo);
	if ((equalTo && (indep.value == independentTargetValue)) || (!equalTo && !(indep.value == independentTargetValue))) {
		if ( document.getElementById( dependentField ) != null ) {
			document.getElementById( dependentField ).style.display = 'block';
		}
		// Also, show LABEL for this input field, if it exists
		var labelId = "LABEL_" + dependentField;
		if ( document.getElementById( labelId ) != null ) {
			document.getElementById( labelId ).style.display = 'block';
		}
	} else {
		if ( document.getElementById( dependentField ) != null ) {
			document.getElementById( dependentField ).style.display = 'none';
		}
		// Also, hide LABEL for this input field, if it exists
		var labelId = "LABEL_" + dependentField;
		if ( document.getElementById( labelId ) != null ) {
			document.getElementById( labelId ).style.display = 'none';
		}
	}
}

var msg = 'That functionality is restricted.';
var asciiBack       = 8;
var asciiTab        = 9;
var asciiEnter      = 13;
var asciiSHIFT      = 16;
var asciiCTRL       = 17;
var asciiALT        = 18;
var asciiEnd        = 35;
var asciiHome       = 36;
var asciiLeftArrow  = 37;
var asciiUpArrow    = 38;
var asciiRightArrow = 39;
var asciiDownArrow  = 40;
var asciiDel        = 46;
var asciiMS         = 92;
var asciiView       = 93;
var asciiF1         = 112;
var asciiF2         = 113;
var asciiF3         = 114;
var asciiF4         = 115;
var asciiF5         = 116;
var asciiF6         = 117;
var asciiF11        = 122;
var asciiF12        = 123;
var asciiF11        = 122;

//===================================================================== ==============//
// browsers are funny things.
// It would seam that:
//   IE keydown can access when ctrl and other special keys are pressedm but they are generally not available to keypress
//   FF keydown / keypress can access when ctrl and other keys are pressed, but keypress will only have the correct ascii keys 
// keypress event is the best by far for really telling what key was pressed
// but, ie needs keydown to capture F5 etc.
// and FF needs keydown to capture arrows
// All of this is explained in http://unixpapa.com/js/key.html
if(document.all){ //ie has to trap F5 etc in the key down
    document.onkeydown = DCMNR_onKeyDownIE;
    document.onkeypress = DCMNR_onKeyPress;
}else if (document.layers || document.getElementById){ //NS and mozilla have to block in the key press
    document.onkeydown = DCMNR_onKeyDownFF;
    document.onkeypress = DCMNR_onKeyPress;
}

var lastDCMNR_onKeyPressEvent = null;

// only trap F5 etc for IE.
function DCMNR_onKeyDownIE(evt) {
    //get the event object
    //alert('evt=' + evt + ', event=' + window.event);
    var oEvent = (window.event) ? window.event : evt;
    //alert(oEvent.keyCode);

    var nKeyCode =  oEvent.keyCode;

    //alert('keyDown:' + nKeyCode + ' charCode:' + oEvent.charCode );
    if(oEvent.charCode == null || oEvent.charCode == 0){
      // For convenience, the prototype support F5 refresh.
      if (isPrototype == true && nKeyCode == asciiF5) {
        return true;
      } 
      var oTarget = (oEvent.target) ? oEvent.target : oEvent.srcElement;
      //alert(oTarget.tagName);
      // back key in ie on anything other than editable input will go back a page!
     if ((nKeyCode >= asciiF2 && nKeyCode <= asciiF12) || (((oTarget.tagName!='INPUT' && oTarget.tagName!='TEXTAREA') || (oTarget.tagName=='INPUT' && (oTarget.readOnly || oTarget.disabled)) || (oTarget.tagName=='TARGET' && (oTarget.readOnly || oTarget.disabled))) && nKeyCode == asciiBack)) {
          try{
              oEvent.returnValue = false;
              oEvent.cancelBubble = true;
  
              if(document.all){ //IE
                  oEvent.keyCode = 0;
              }else{ //NS
                  oEvent.preventDefault();
                  oEvent.stopPropagation();
              }
              window.status = msg;
          }catch(ex){
              //alert(ex);
          }
      }
    }
}

// only trap arrow keys for FF (for autoComplete)
function DCMNR_onKeyDownFF(evt) {
    //get the event object
    //alert('evt=' + evt + ', event=' + window.event);
    var oEvent = (window.event) ? window.event : evt;
    //alert(oEvent.keyCode);

    var nKeyCode =  oEvent.keyCode;
    if (nKeyCode == asciiUpArrow || nKeyCode  == asciiDownArrow) {
      lastDCMNR_onKeyPressEvent = oEvent;
    }
}

/* courtesy of http://www.codetoad.com/javascript_get_selected_text.asp */
function dcmnr_getSelText() {
    var txt = '';
    if (window.getSelection) {
        txt = window.getSelection();
    } else if (document.getSelection) {
        txt = document.getSelection();
    } else if (document.selection) {
        txt = document.selection.createRange().text;
    }
    return txt;
}

/* call from keypress */
function dcmnr_isSpecialKey(nKeyCode, charCode) {
  // different for all browsers
  // if called from keypress, then, IE will not let special keys through to here anyway
  // if called from FF, a special key is when charCode is 0
  return (charCode == 0);
}

/* courtesy of
  http://javascript.nwbox.com/cursor_position/cursor.js
  Author: Diego Perini <dperini@nwbox.com>
 */
function dcmnr_getSelectionStart(o) {
  if (o.createTextRange) {
    var r = document.selection.createRange().duplicate()
    r.moveEnd('character', o.value.length)
    if (r.text == '') return o.value.length
    return o.value.lastIndexOf(r.text)
  } else return o.selectionStart
}

function dcmnr_getSelectionEnd(o) {
  if (o.createTextRange) {
    var r = document.selection.createRange().duplicate()
    r.moveStart('character', -o.value.length)
    return r.text.length
  } else return o.selectionEnd
}

function dcmnr_replaceSection(o, c) {
  // inserts the char c at the slection/cursor in an input (not text area)
  var s = dcmnr_getSelectionStart(o);
  var e = dcmnr_getSelectionEnd(o);
  var t = o.value;
  var l = o.getAttribute('maxLength');
  /*
  if (s == e == l) {
    // append to end
    return t + c;
  } else {
  }
  */
    return t.substring(0, s) + c + t.substring(e);
}

document.onhelp = dcmnr_helpKeyPressed;

function dcmnr_helpKeyPressed() {
  //alert('help');
  var helpA = document.getElementById("help");
  if (helpA && helpA.tagName == 'A') {
    eval(helpA.href);
    return false;
  }
  return true; // we hav'nt enabled help
}

function DCMNR_onKeyPress(evt) {
    window.status = '';
    //get the event object
    //alert('evt=' + evt + ', event=' + window.event);
    //var oEvent = evt?evt:typeof event!='undefined'?event:null;
    var oEvent = (window.event) ? window.event : evt;
    //alert(oEvent.keyCode);

    lastDCMNR_onKeyPressEvent = oEvent;

    //hmmm in mozilla this is jacked, so i have to record these seperate
    //what key was pressed
    var nKeyCode =  oEvent.keyCode ? oEvent.keyCode :
                    oEvent.which ? oEvent.which :
                    void 0;

    var bIsFunctionKey = false;

    if (!document.all) {
      // not ie
      // trap F5 etc
      //hmmm in mozilla the keycode would contain a function key ONLY IF the charcode IS 0
      //else key code and charcode read funny, the charcode for 't'
      //returns 116, which is the same as the ascii for F5
      //SOOO,... to check if a the keycode is truly a function key,
      //ONLY check when the charcode is null OR 0, IE returns null, mozilla returns 0
      if(oEvent.charCode == null || oEvent.charCode == 0){
          if (nKeyCode == asciiF1) {
            dcmnr_helpKeyPressed();
            return false;
          }
          bIsFunctionKey = (nKeyCode >= asciiF2 && nKeyCode <= asciiF12) || ( nKeyCode == asciiALT || nKeyCode == asciiMS || nKeyCode == asciiView || nKeyCode == asciiHome || nKeyCode == asciiBack);
          // For convenience, the prototype support F5 refresh.
          if (isPrototype == true && nKeyCode == asciiF5) bIsFunctionKey = false; 
      }
    }

    //convert the key to a character, makes for more readable code
    var sChar = String.fromCharCode(nKeyCode).toUpperCase();

    //get the active tag that has the focus on the page, and its tag type
    var oTarget = (oEvent.target) ? oEvent.target : oEvent.srcElement;
    var sTag = oTarget.tagName.toLowerCase();
    var sTagType = oTarget.getAttribute("type");

    var bAltPressed = (oEvent.altKey) ? oEvent.altKey : oEvent.modifiers & 1 > 0;
    var bShiftPressed = (oEvent.shiftKey) ? oEvent.shiftKey : oEvent.modifiers & 4 > 0;
    var bCtrlPressed = (oEvent.ctrlKey) ? oEvent.ctrlKey : oEvent.modifiers & 2 > 0;
    //var bMetaPressed = (oEvent.metaKey) ? oEvent.metaKey : oEvent.modifiers & 8 > 0;

    var bRet = true; //assume true as that will be the case most times
    //alert (nKeyCode + '(' + oEvent.charCode + ') ' + sChar + ' ' + sTag + ' ' + sTagType + ' ' + bShiftPressed + ' ' + bCtrlPressed + ' ' + bAltPressed);
    var mask = oTarget.getAttribute("mask");
    var maskFormat = oTarget.getAttribute("maskFormat");

    if(sTagType != null){sTagType = sTagType.toLowerCase();}

    if (mask) {
      if (nKeyCode == asciiBack || nKeyCode == asciiHome || nKeyCode == asciiLeftArrow || nKeyCode == asciiRightArrow || nKeyCode == asciiTab || nKeyCode == asciiEnd || nKeyCode == asciiDel) {
        return true;
      }
      // further filter based on mask.
      // at the moment, we will only provide a regex pattern which this key must be in
      bRet = new RegExp( mask ).test(sChar);
      //if (!bRet) alert (mask + ' ' + sChar + ' ' + String.fromCharCode(nKeyCode) + ' ' + oEvent.charCode);
    } else if (maskFormat) {
      if (nKeyCode == asciiBack || nKeyCode == asciiHome || nKeyCode == asciiLeftArrow || nKeyCode == asciiRightArrow || nKeyCode == asciiTab  || nKeyCode == asciiEnd || nKeyCode == asciiDel) {
        return true;
      }
      // further filter based on mask against the current input fields value.
      // provide a regex pattern which must match all posibilities
      //alert (maskFormat + ' ' + oTarget.value + ' ' + nKeyCode);
      //if (document.selection == oTarget)
      //alert('Selected:' + document.selection );
      var testVal = dcmnr_replaceSection(oTarget, sChar);
      bRet = new RegExp( maskFormat ).test(testVal);
      /* TODO - can put in multiple . for some reason */
      //if (!bRet) 
      //alert (maskFormat + ' ' + testVal);
    } else if (sTag == "textarea" || (sTag == "input" && (sTagType == "text" || sTagType == "password" || sTagType == "file")) &&
        (
            nKeyCode == asciiBack || nKeyCode == asciiSHIFT || nKeyCode == asciiHome ||
            bShiftPressed || (nKeyCode == asciiLeftArrow || nKeyCode == asciiRightArrow))
        )
    {
      //default keys allowed inside any text box/input
      return true;
    } else if(bAltPressed && bCtrlPressed && (sChar == '4')){ // Allow CTRL + ALT + 4 to get the Euro symbol.
		    bRet = true;
    }else if(bAltPressed && (nKeyCode == asciiLeftArrow || nKeyCode == asciiRightArrow)){ // block alt + left or right arrow
        bRet = false;
    }else if(bCtrlPressed && (sChar == 'A' || sChar == 'C' || sChar == 'V' || sChar == 'X' || sChar == 'P')){ // ALLOW cut, copy and paste, and SELECT ALL, CTRL+P
        bRet = true;
    }else if(bCtrlPressed && (sChar == '=' || sChar == '-' || sChar == '0')){ // ALLOW CTRL and 0,+,- for page resizing.
      bRet = true;
    }else if(bShiftPressed && nKeyCode == asciiTab){//allow shift + tab
        bRet = true;
    }else if(bIsFunctionKey){ // Capture and stop these keys
        bRet = false;
    }else if(bCtrlPressed || bShiftPressed || bAltPressed){ //block ALL other sequences, includes CTRL+O, CTRL+N, etc....
        bRet = false;
    }

    if(!bRet){
        try{
            oEvent.returnValue = false;
            oEvent.cancelBubble = true;

            if(document.all){ //IE
                oEvent.keyCode = 0;
            }else{ //NS
                oEvent.preventDefault();
                oEvent.stopPropagation();
            }
            window.status = msg;
        }catch(ex){
            //alert(ex);
        }
    }
    return bRet;
}

function dcmnr_onblurAutoComplete(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere) {
  //alert('ac onBlur');
  // as much as anything, this is a sanity check to make sure that once the field is left, everything is consistent.
  // if one identical match found, then use it.
  // always hide the options list - they are no longer on the field
  // if no identical match, clear the display field
  // BUT - only do all of this if the scroll bar is not being used on the list!
  var formObj = document.getElementById(formId);
  var inputObj = formObj[inputFieldId];
  var listObj = document.getElementById(listFieldId);
  var hiddenObj = formObj[hiddenFieldId];
  //alert();
  //if (listObj.overlist==true) {
  //  return;
  //}
  dcmnr_autoCompleteFinal(inputObj, hiddenObj, aclistArray, listObj, valueIndex, searchIndex, descIndex);
}

function dcmnr_autoCompleteFinal(inputObj, hiddenObj, aclistArray, listObj, valueIndex, searchIndex, descIndex) {
  var searchFor = inputObj.value.toUpperCase();
  var i, count = 0, firstMatch = null;

  var listArray = eval(aclistArray);
  for (i = 0; i < listArray.length; i++) {
    if (listArray[i][searchIndex] == searchFor) {
      // match
      if (firstMatch == null) {
        firstMatch = i;
      }
      count++;
    }
  }
  // if only one match, use it
  if (count==1) {
    hiddenObj.value = listArray[firstMatch][valueIndex];
    inputObj.value = listArray[firstMatch][descIndex];
  } else {
    hiddenObj.value = '';
    inputObj.value = '';
  }
  listObj.style.visibility = "hidden";
  listObj.acSelection=null;

}

function dcmnr_onmouseoverAutoCompleteList(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere) {
  //alert('aclist mouseover');
  this.overlist=true;
}

function dcmnr_onmouseoutAutoCompleteList(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere) {
  //alert('aclist mouseout');
  this.overlist=false;
}

function dcmnr_onchangeAC(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere)
{
  //alert("onChange");
  dcmnr_onblurAutoCompleteList(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere);
}

function dcmnr_onblurAutoCompleteList(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere) {
  //alert('dcmnr_onblurAutoCompleteList');
  var listObj = document.getElementById(listFieldId);
  if (listObj.acSelection!=null) {
    // we have not selected anything yet, but we should run the ac final to make sure everything is consistent
    //alert('aclist onblur');
    var formObj = document.getElementById(formId);
    var inputObj = formObj[inputFieldId];
    var hiddenObj = formObj[hiddenFieldId];
    dcmnr_autoCompleteFinal(inputObj, hiddenObj, aclistArray, listObj, valueIndex, searchIndex, descIndex);
  }
}

function dcmnr_keyupAutoComplete(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere) {
  //alert('dcmnr_keyupAutoComplete');
  // take the value in the text area, and perform a case insensitive string match
  // the array is assumed to be 2d with the following index meanings ...
  // the first index represents the id
  // the 2nd the description in uppercase (to search)
  // 3rd, description in normal case for display

  //get the event object
  var oEvent = lastDCMNR_onKeyPressEvent;
  // because we trap keydown as well on ie, we sometimes end up here when we don't want to be.
  if (!oEvent) return;

  // if it is a cursor key ...
  // down - move into options
  // else return
  var formObj = document.getElementById(formId);
  var inputObj = formObj[inputFieldId];
  var listObj = document.getElementById(listFieldId);
  var hiddenObj = formObj[hiddenFieldId];
  var listArray = eval(aclistArray);


  //hmmm in mozilla this is jacked, so i have to record these seperate
  //what key was pressed
  var nKeyCode =  oEvent.keyCode ? oEvent.keyCode :
                  oEvent.which ? oEvent.which :
                  void 0;
  //alert('keyCode=' + oEvent.keyCode + ', which=' + oEvent.which);

  if (listObj.style.visibility == "hidden" && nKeyCode == asciiTab) {
    return;
  } else if (nKeyCode == asciiDownArrow || nKeyCode == asciiUpArrow) {
    // focus on the next option
    var currentChildSelected = listObj.acSelection;
    var newChildSelected = null;
    var scrollTop = listObj.scrollTop;
    //var scrollLeft = (listObj.style.scrollLeft==null)?0:listObj.style.scrollLeft;
    if (currentChildSelected != null) {
      // just move around within here
      if (nKeyCode == asciiDownArrow && currentChildSelected < listObj.childNodes.length -1) {
        newChildSelected = currentChildSelected + 1;
        scrollTop+=10;
      } else if (nKeyCode == asciiUpArrow && currentChildSelected > 0) {
        newChildSelected = currentChildSelected - 1;
        scrollTop-=10;
      }
      listObj.scrollTop = scrollTop;
      if (newChildSelected != null) {
        listObj.acSelection=newChildSelected;
        listObj.childNodes[currentChildSelected].className='dcmnr_acListOption';
        listObj.childNodes[newChildSelected].className='dcmnr_acListOptionSelected';
      }
      return;
    }

  } else if (nKeyCode == asciiEnter) {
    // populate the field input with the selected desc
    // populate the hidden field with the selected id
    // clear the ACselection, list and xxx
    currentChildSelected = listObj.acSelection;
    
    if(listObj.childNodes!=null && listObj.childNodes[currentChildSelected]!=null){
    
      hiddenObj.value = listObj.childNodes[currentChildSelected].acId;
      inputObj.value = listObj.childNodes[currentChildSelected].acDesc;
      listObj.style.visibility = "hidden";
      listObj.acSelection=null;

  	  var count = listObj.getAttribute('dependentCount');
  	  if (count) {
  	    //alert(count);
  	    //alert('Dependent:' + listObj.dependentCount);
  	    for (i = 1; i <= count; i++) {
  	      //alert(i);
  		    var dependentParentId = listObj.getAttribute('dependentParentId'+i);
  		    var dependentId = listObj.getAttribute('dependentId'+i);
  		    var dependentList = listObj.getAttribute('dependentList'+i);
  		    var dependentValues = listObj.getAttribute('dependentValues'+i);
  		    dcmnr_changeACDependentDD(listObj.acFormId, dependentParentId, dependentId, eval(dependentList), eval(dependentValues), '');
  		  }
  	  }
  	}
    
    return;
  } else if (nKeyCode == asciiLeftArrow || nKeyCode == asciiRightArrow) {
    // nothing has changed
    return;
  } else if (nKeyCode == asciiTab || nKeyCode == asciiEnter) {
    // we are moving off the field
    dcmnr_autoCompleteFinal(inputObj, hiddenObj, aclistArray, listObj, valueIndex, searchIndex, descIndex);
    return;
  }
  //alert(nKeyCode);

  var searchFor = inputObj.value.toUpperCase();

  // clear out all the options
  listObj.innerHTML='';
  listObj.style.height=null; // clear the height, so that smaller lists of options shrink
  var maxDropInPixels = listObj.getAttribute('maxDropInPixels');

  // perform the search, creating a new option for each match found
  var i, count = 0;
  if (searchFor != '') {
    for (i = 0; i < listArray.length; i++) {
      var listRow = listArray[i];
      var foundAt = listRow[searchIndex].indexOf(searchFor);
      if ((matchAnywhere == true && foundAt != -1) || (matchAnywhere == false && foundAt == 0)) {
        // match
        listObj.style.visibility = 'visible';
        var listOption = document.createElement('div');
        listOption.className='dcmnr_acListOption';
        listOption.style.whiteSpace='nowrap';
        listOption.innerHTML = highlightMatch(listRow[descIndex], searchFor, foundAt);
        listOption.acId = listRow[valueIndex];
        listOption.acDesc = listRow[descIndex];
        // for some reason, firefox does not get the parentElement correctly for these, so, refer to the form.
        listOption.acListObj=listObj;
        listOption.onmouseover=dcmnr_mouseoverAutoComplete;
        listOption.onmouseout=dcmnr_mouseoutAutoComplete;
        listOption.onmousedown=dcmnr_mousedownAutoComplete;
        //listOption.style.maxWidth = inputObj.offsetWidth;
        //listOption.style.width = inputObj.offsetWidth;
        if (maxDropInPixels != null && listObj.offsetHeight > maxDropInPixels) {
          listObj.style.height=maxDropInPixels+'px';
        }
        
        listObj.appendChild(listOption);
        count++;
        if (count > 30) {
          var listOptionMore = document.createElement('div');
          listOptionMore.className='dcmnr_acListOption';
          listOptionMore.innerHTML = '...';
          listOptionMore.acId = -1;
          listOptionMore.acDesc = '...';
          // for some reason, firefox does not get the parentElement correctly for these, so, refer to the form.
          listOptionMore.acListObj=listObj;
          listOptionMore.onmouseover=dcmnr_mouseoverAutoComplete;
          listOptionMore.onmouseout=dcmnr_mouseoutAutoComplete;
          listOptionMore.onmousedown=dcmnr_mousedownAutoComplete;
          listObj.appendChild(listOptionMore);
          break;
        }
      }
    }
  }
  // if there are options, make them visible
  if (count==0) {
    listObj.style.visibility = "hidden";
    listObj.acSelection=null;
  } else {
    //listObj.style.maxWidth = inputObj.offsetWidth;
    //listObj.style.width = inputObj.offsetWidth;
    listObj.firstChild.className='dcmnr_acListOptionSelected';
    listObj.acSelection=0;
    // set up references on the listObj to the form, field input and hidden input
    listObj.acFormId=formId;
    listObj.acInputFieldId=inputFieldId;
    listObj.acHiddenFieldId=hiddenFieldId;
  }
  // always clear the hidden input, when the input has changed since the last time
  // todo - is this necessary when the onblur cleans up
}

function dcmnr_mouseoverAutoComplete() {
  if (this.className!='dcmnr_acListOptionSelected') {
    this.className='dcmnr_acListOptionMouseOver';
  }
}
function dcmnr_mouseoutAutoComplete() {
  if (this.className!='dcmnr_acListOptionSelected') {
    this.className='dcmnr_acListOption';
  }
}
function dcmnr_mousedownAutoComplete() {
  //alert('dcmnr_mousedownAutoComplete');
  // populate the field input with the selected desc
  // populate the hidden field with the selected id
  // clear the ACselection, list and xxx
  var listObj = this.acListObj;
  var formObj = document.getElementById(listObj.acFormId);
  var inputObj = formObj[listObj.acInputFieldId];
  var hiddenObj = formObj[listObj.acHiddenFieldId];
  
  hiddenObj.value = this.acId;
  inputObj.value = this.acDesc;
  listObj.style.visibility = "hidden";
  listObj.acSelection=null;

  //alert(listObj.getAttribute('dependentCount'));

  var count = listObj.getAttribute('dependentCount');
  if (count) {
    for (i = 1; i <= count; i++) {
	  var dependentParentId = listObj.getAttribute('dependentParentId'+i);
	  var dependentId = listObj.getAttribute('dependentId'+i);
	  var dependentList = listObj.getAttribute('dependentList'+i);
	  var dependentValues = listObj.getAttribute('dependentValues'+i);
	  dcmnr_changeACDependentDD(listObj.acFormId, dependentParentId, dependentId, eval(dependentList), eval(dependentValues), '');
	}
  }
}

function dcmnr_initAutoComplete(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere) {
  // initialise the desc from the id in the hidden input.
  var formObj = document.getElementById(formId);
  var inputObj = formObj[inputFieldId];
  var listObj = document.getElementById(listFieldId);
  var hiddenObj = formObj[hiddenFieldId];
  var matchFound = false;
  //alert('hiddenFieldId=' + hiddenFieldId);

  var searchFor = hiddenObj.value.toUpperCase();
  var listArray = eval(aclistArray);

  var i;
  if (searchFor != '') {
    //alert('searchFor=' + searchFor + ' valueIndex=' + valueIndex);
    for (i = 0; i < listArray.length; i++) {
      if (listArray[i][valueIndex] == searchFor) {
        // match
        inputObj.value = listArray[i][descIndex];
        matchFound = true;
      }
    }
    if (!matchFound){
      inputObj.value = searchFor;
    }
  }
}

function highlightMatch(desc, searchFor, foundAt) {
  // hightlights (in bold) the matching part of the string desc
  var a = desc.substring(0, foundAt);
  var b = desc.substring(foundAt, foundAt + searchFor.length);
  var c = desc.substring(foundAt + searchFor.length);
  return a + '<b>'+b+'</b>' + c;
}

function dcmnr_checkAutoCompleteBlankInput(formId, inputFieldId, hiddenFieldId, aclistArray, listFieldId, valueIndex, searchIndex, descIndex, matchAnywhere) {
  var formObj = document.getElementById(formId);
  var inputObj = formObj[inputFieldId];
  var hiddenObj = formObj[hiddenFieldId];
  var listObj = document.getElementById(listFieldId);
  // If the autocomplete text box has been cleared, the user must not want to use this criteria after all, so blank out the hidden field too
  if(dcmnr_trim(inputObj.value)=='') {
  	hiddenObj.value="";  
  }
  listObj.style.visibility = "hidden";
  listObj.acSelection=null;  
}

function dcmnr_rebuildDynamicTableHeader(tableName) {

	var retVal = "<tr class=\"dcmnr_shadedDark\"> ";
	var tableMetaData = eval("tablemetadata_" + tableName);
	var tableData = eval("tabledata_" + tableName);
	var i;
	var cellName;
	for(i=0;i<tableMetaData.length;i++) {
		if (tableMetaData[i].type!="hidden") {
			cellName=tableMetaData[i]['name'];
			//This <th needs the space in order to render it correctly when the column does not have a name.
			if(cellName=="")	{
				cellName='&nbsp;';
			}
			retVal = retVal + "<th class=\"dcmnr_tableHeaderCenter\">" +  cellName  + " </th>\r\n";
		}
	}
	retVal = retVal  + "</tr>\r\n";
	if(tableData=="")	{ //If no table data then display it as such.
		retVal = retVal +  "<tr class=\"evenRow\">\r\n";
		retVal = retVal + "<td class=\"dcmnr_tableDataValueLeft\" colspan=\"" + tableMetaData.length + "\">\r\n";
		retVal = retVal + "No Data Found";
		retVal=retVal + "</td>\r\n";
		retVal=retVal + "</tr>\r\n";
		
	}
	
	return retVal;
}

function dcmnr_rebuildDynamicTableBody(formName, tableName) {
	var retVal = "";
	var retValTemp = "";
	var tableMetaData = eval("tablemetadata_" + tableName);
	var tableData = eval("tabledata_" + tableName);
	var row;
	var checkedStr='checked=\""+checkedVal+"\"';

	var type;
	var editable;
	var i = 0;
	var j;
	for(i=0;i<tableData.length;i++) {
		row = tableData[i];
		if ((i % 2) == 1 ) {
			retVal = retVal + "<tr class=\"dcmnr_shadedLight\">\r\n";
		} else {
			retVal = retVal + "<tr class=\"evenRow\">\r\n";
		}
		j = 0;
		for (j=0; j < row.length; j++ ) {
			type = row[j]['celltype'];
			editable = row[j]['editable'];
			row[j]['actualid'] =  tableName + "_" + row[j]['id'] + "_" + i;
			var valueToSet = row[j]['value'];
			var hiddenValueToSet =  row[j]['hiddenDataValue'];
			
			if (((hiddenValueToSet == null) || (hiddenValueToSet == "")) && ((valueToSet != null) && (valueToSet != ""))){
				hiddenValueToSet = valueToSet;
			} 

			if (type == "hidden") {	
				retVal = retVal + "<input type=\"hidden\" name=\"" + row[j]['actualid']  + "\"  id=\"" + 
					   row[j]['actualid']  + "\"  value=\"" + hiddenValueToSet + "\"/>\r\n";
			} else {
				if (type=="radio") {
					retVal = retVal + "<td class=\"dcmnr_tableDataValueCenter\" style=\"width:10px;\">\r\n<input id=\"" + 
						tableName + "_" + row[j]['id'] + "_" + i + "\" name=\""+
						tableName + "_" + row[j]['id'] +"\" type=\"radio\" value=\""+ i +"\" + "+checkedStr+"/>\r\n</td>\r\n";
				} else {

					if ((editable=="true") && ((type=="DATE") || (type=="TIMESTAMP"))){
						var previousFieldObject = document.getElementById(row[j]['actualid']);
						if (previousFieldObject != null){
							valueToSet = previousFieldObject.value;
						}

						retValTemp = "<td class=\"dcmnr_tableDataValueLeft\">\r\n" +
						"<div style=\"white-space: nowrap;\">" + 
						"<input class=\"dcmnr_tableDatePickerInput\" name=\"" + row[j]['actualid']  + "\"  id=\"" + row[j]['actualid']  + "\" value=\"" + valueToSet + "\" " + 
						" onChange=\"dcmnr_reformatDate('" + formName +	"','" +	row[j]['actualid'] + "')\"" +
						" size=\"10\" maxlength=\"10\" mask=\"[nowNOWtdayTDAY0-9\.\-]\" />\r\n" + 
						"   <img class=\"dcmnr_tableDatePickerImage\" src=\"/static/images/datepicker_enabled.gif\" alt=\"Pick a date\" align=\"absmiddle\" width=\"24\" height=\"24\" " + 
						"     onClick=\"show_calendar('document." + formName + "." + row[j]['actualid'] + "', document." +	formName + "." + row[j]['actualid'] + ".value, '');\">" +  
						"</div>" + 
						"</td>\r\n";

						retVal = retVal + retValTemp;
					} 
					else if (editable=="true")	{
						
						var previousFieldObject = document.getElementById(row[j]['actualid']);
						if (previousFieldObject != null){
							valueToSet = previousFieldObject.value;
							hiddenValueToSet = previousFieldObject.value;
						}

						var maskToUse = '';
						if (type == "NUMBER"){
							maskToUse = " mask=\"[0-9\.\-]\"";
						}
						
						retVal = retVal + "<td class=\"dcmnr_tableDataValueLeft\">\r\n" + "<input type=\"text\" class=\"dcmnr_tableInputValue\" name=\"" + row[j]['actualid']  + "\"  id=\"" + row[j]['actualid']  + "\" value=\"" + valueToSet + "\"" +
						"<input type=\"hidden\" name=\"" + row[j]['actualid']  + "\"  id=\"" + row[j]['actualid']  + "\"  value=\"" + hiddenValueToSet + "\"" + maskToUse + " />\r\n</td>\r\n";
					}
					else	{
						retVal = retVal + "<td class=\"dcmnr_tableDataValueLeft\">\r\n" + valueToSet +
						"<input type=\"hidden\" name=\"" + row[j]['actualid']  + "\"  id=\"" + row[j]['actualid']  + "\"  value=\"" + hiddenValueToSet + "\"/>\r\n</td>\r\n";
						
					}
					
					
				}
				//Always select the 1st radio button
				checkedStr="";
			}	

		}
		retVal = retVal + "</tr>";
	}
	return retVal;
}

function dcmnr_rebuildDynamicTable(formName, tableName, ignore2) {
	//var tableText = "<table id=\"" + tableName + "\" class=\"dcmnr_tableWithBorder\" cellpadding=\"2\" cellspacing=\"0\">\r\n";
	var tableText = "<TBODY>\r\n" + dcmnr_rebuildDynamicTableHeader(tableName);
	tableText = tableText + dcmnr_rebuildDynamicTableBody(formName, tableName);
	tableText = tableText + "</TBODY>\r\n";
	//alert("tableText is " + tableText);
	document.all["dynamic_" + tableName].innerHTML = "<table id=\"" + tableName + "\" class=\"dcmnr_tableWithBorder\" cellpadding=\"2\" cellspacing=\"0\">\r\n" + tableText + "</TABLE>";
}

function dcmnr_addDynamicRow(formName, tableName, ignore2, editableFieldType, editableFieldTypeColumn, numberEditableFields, useNameAsValueForThisColumnText, editableConditionColumnsToSaveText) {
	var tableMetaData = eval("tablemetadata_" + tableName);
	var tableData = eval("tabledata_" + tableName);
	var numRows = 0;
	var tableMetaDataElement ;
	var type;
	var rowArray;
	var element;
	var id;
	var name;
	var pageValue;
	var pageActualValue;
	var pageVariable;
	var pageVariableName;
	var pageType;
	var selected;
	var mandatory;
	var checkType;
	var editable;
	var editableConditionColumn;
	var useNameAsValueForThisColumns;
  var editableConditionColumnsToSave;
  var numEditableConditionColumnsSaved;

	if (useNameAsValueForThisColumnText){
		useNameAsValueForThisColumns = useNameAsValueForThisColumnText.split(",");
	}

	if (editableConditionColumnsToSaveText){
	  editableConditionColumnsToSave = editableConditionColumnsToSaveText.split(",");
	  numEditableConditionColumnsSaved = 0;
	}

	if (tableData)	{
		numRows = tableData.length;
	}

	if (tableMetaData) {	
		var i=0;
		var editableFieldCount = 0;
		var isEditableConditionColumnToSave = false;
		
		rowArray = new Array();
		for(i=0;i<tableMetaData.length;i++) {
			element = new Array();	
			tableMetaDataElement = tableMetaData[i];
			isEditableConditionColumnToSave = false;
			
			type = tableMetaDataElement['type'];
			id = tableMetaDataElement['id'];
			name = tableMetaDataElement['name'];
			mandatory = tableMetaDataElement['mandatory'];
			pageVariableName = tableMetaDataElement['pageVariable'];
			checkType = tableMetaDataElement['checkType'];
			editable = tableMetaDataElement['editable'];
			editableConditionColumn = tableMetaDataElement['editable-condition-column'];
			
			// Check if this is a column we're setting manually
      if (editableConditionColumnsToSave){
        for (colIndex = 0; colIndex < editableConditionColumnsToSave.length; colIndex++){
          if (editableConditionColumnsToSave[colIndex] == id){
            isEditableConditionColumnToSave = true;
          }
        }
      }

			if (isEditableConditionColumnToSave){
        if (numberEditableFields <= numEditableConditionColumnsSaved ){
          pageValue = "N";
          pageActualValue = "N";
        } else {
          pageValue = "Y";
          pageActualValue = "Y";
          numEditableConditionColumnsSaved++;
        }
        // alert("Setting " + id + " = " + pageActualValue);
			} else if (editableFieldTypeColumn == id){
				 pageValue = editableFieldType;
				 pageActualValue = editableFieldType;
			} else if (pageVariableName!="") {
				pageVariable = document.all[pageVariableName];
				if (pageVariable) {
					if (pageVariable.type=="select-one") {
						pageValue = dcmnr_getSelectText(pageVariable, pageVariable.value);
						pageActualValue =  pageVariable.value;
						
						
						if (useNameAsValueForThisColumns){
							for (colIndex = 0; colIndex < useNameAsValueForThisColumns.length; colIndex++){
								if (useNameAsValueForThisColumns[colIndex] == id){
									pageActualValue = pageValue;
								}
							}
						}
						
					} else {
						if (pageVariable.type=="select-multiple") {
							pageValue = dcmnr_getSelectMultipleText(pageVariable);
							pageActualValue = dcmnr_getSelectMultipleValue(pageVariable);
						} else {
						    if ("true"==pageVariable.isAutoCompleteHiddenField) {
						        var autoCompleteValueName = document.getElementById(id+"AC");
						        pageValue = autoCompleteValueName.value;
							    pageActualValue = pageVariable.value;
						    } else {
							    pageValue = pageVariable.value;
							    pageActualValue = pageVariable.value;
							}
						} 
					}
				} else {
					pageValue = "";
					pageActualValue = "";
				}
			} else {	
				pageValue = "";
				pageActualValue = "";
			}
      
			if ((mandatory=="true")&&(trimNBSP(pageValue)=="")) {
				alert("Field " + name + " must be populated");
				return;
			}
			if (checkType!="") {
				if (checkType=="Integer") {
					if (dcmnr_validateInteger(pageValue)==false) {
						alert("Field " + name + " must be a whole number");
						return;
					}
				} else 
				if (checkType=="Float") {
					if (dcmnr_checkValidFloat(pageValue)==false) {
						alert("Field " + name + " must be a number");
						return;
					}
				} else 
				if (checkType=="PositiveFloat") {
					if ((dcmnr_checkValidFloat(pageValue)==false) || (parseFloat(pageValue) <=0 )) {
						alert("Field " + name + " must be a positive number");
						return;
					}
				} else 
				if (checkType=="Date") {
					if (dcmnr_isDate(pageValue)==false) {
						alert("Field " + name + " must be a date");
						return;
					}
				}
			}
			
			
			element['actualid'] = tableName + "_" + id + "_" + numRows;
			element['celltype'] = type;
			element['id'] = id;
			element['actualValue']  = pageActualValue;
			element['hiddenDataValue']  = pageActualValue;
			element['value']  = pageValue;
			element['editable'] = editable;
			
			// alert("editable = " + editable + ", editableConditionColumn = " + editableConditionColumn);
			if ((editable == "true" || editableConditionColumn != "") && (editableFieldType != "")) {
				// alert("numberEditableFields = " + numberEditableFields + ", editableFieldCount = " + editableFieldCount);
			  element['editable'] = "true";
				type = editableFieldType;
				element['celltype'] = type;
				if (numberEditableFields <= editableFieldCount) {
					element['editable'] = "false";
				}
				editableFieldCount ++;
			}
			
			rowArray[i] = element;
		}
		tableData[tableData.length] = rowArray;
	}

	dcmnr_rebuildDynamicTable(formName, tableName, '');
	var totalRec = document.all[tableName+"_totalRecords"];
	var pageSize = document.all[tableName+"_pageSize"];
	if (totalRec.value=="") {
		totalRec.value="0";
		pageSize.value="0";
	}
	totalRec.value = "" + (parseInt(totalRec.value) + 1);
	pageSize.value = "" + (parseInt(pageSize.value) + 1);
}

function dcmnr_addDynamicRowSpecialForReports(formName, tableName, ignore2) {
	
	
	var editableFieldChooserName = 'conditionColumnsAvailable';
	var numberEditableFields = 1;
	var editableFieldType = null;
	
	if (editableFieldChooserName != null){
		var editableFieldChooser = document.all[editableFieldChooserName];
		var editableFieldChooserIndex = 0;
		if (editableFieldChooser) {
			if (editableFieldChooser.type=="select-one") {
				editableFieldType =  editableFieldChooser.value;
				editableFieldChooserIndex = editableFieldType.indexOf(":");
				if (editableFieldChooserIndex > 0){
					editableFieldChooserIndex = editableFieldChooserIndex + 1;
					editableFieldType = editableFieldType.substring(editableFieldChooserIndex);
				}
			}
		}
	}

	var operationsChooserFieldName = 'conditionOperatorsAvailable';
	var operationToUse = null;
	
	if (operationsChooserFieldName != null){
		var operationsChooserField = document.all[operationsChooserFieldName];
		if (operationsChooserField) {
			if (operationsChooserField.type=="select-one") {
				operationToUse =  operationsChooserField.value;
				// alert("operationToUse = " + operationToUse);
				if (operationToUse == 200005121){ // BETWEEN
					numberEditableFields = 2;
				} else if (operationToUse == 200005122 || operationToUse == 200005123){ // EMPTY , NOT EMPTY
          numberEditableFields = 0;
        }
			}
		}
	}

	dcmnr_addDynamicRow(formName, tableName, ignore2, editableFieldType, 'conditionColumnType', numberEditableFields, 'conditionColumnText,conditionOperatorText', 'conditionValueAIsEditable,conditionValueBIsEditable');
}


function dcmnr_findDynamicRowSelected(tableName) {
	var count = 0;
	var val = document.getElementById(tableName + "_rowNumber_" + count);
	while (val) {
		if (val.checked) {
			return count;
		}
		count = count+1;
		val = document.getElementById(tableName + "_rowNumber_" + count);
	}
}

function dcmnr_deleteDynamicRow(formName, tableName, ignore2) {
	
	var tableMetaData = eval("tablemetadata_" + tableName);
	var tableData = eval("tabledata_" + tableName);
	
	if(tableData.length==0)	{
		return;
	}
	
	if(!confirm("Click OK to confirm this deletion"))	{
		return;
	}

	var roNo = dcmnr_findDynamicRowSelected(tableName);

	var tableData2 = new Array();
	var j=0;
	
	var oldRow;
	var newRow;
	var oldColumnId;
	var newColumnId;
	var oldObject;
	var newObject;
	
	for(var i=0;i<tableData.length;i++) {
		if (roNo!=i) {
			
			// Ensure the previous data is not lost.
			if (j != i){
				oldRow = tableData[i];
				newRow = tableData[j];
				
				for (colCount=0; colCount < oldRow.length; colCount++ ) {
					oldColumnId  =  tableName + "_" + oldRow[colCount]['id'] + "_" + i;
					newColumnId  =  tableName + "_" + newRow[colCount]['id'] + "_" + j;
					
					oldObject = document.getElementById(oldColumnId);
					newObject = document.getElementById(newColumnId);
					
					if ((oldObject != null) && (newObject != null)){
						newObject.value = oldObject.value;
					}
				}						
			}
			
			tableData2[j] = tableData[i];

			// End
			j = j + 1;
			
		}
	}
	tableData = tableData2;
	eval("tabledata_" + tableName + " = tableData2 ");

	dcmnr_rebuildDynamicTable(formName, tableName, '');

	var totalRec = document.all[tableName+"_totalRecords"];
	var pageSize = document.all[tableName+"_pageSize"];
	totalRec.value = "" + (parseInt(totalRec.value) - 1);
	pageSize.value = "" + (parseInt(pageSize.value) - 1);

}

function dcmnr_isDate(x)
{
  var xDate;
  xDate = new Date(x);
  if (xDate.toString() == 'NaN' || xDate.toString() == 'Invalid Date')
    return false;
  else
    return true;
}

function dcmnr_validateInteger( strValue ) {
  var objRegExp  = /(^-?\d\d*$)/;
 	
  
 //check for integer characters
  return objRegExp.test(strValue);
  
 }

function dcmnr_validateDate( strValue ) {
  var objRegExp  = /(^\d\d?(-|\/)\d\d?(-|\/)\d\d\d\d$)/;
 	
  
 //check for integer characters
  return objRegExp.test(strValue);
  
 }

function dcmnr_checkValidFloat(value)
  {
  	var string=".1234567890";
 	var valid = "true";
 	var decimal =0;
 	num= value
 	
 	for(k=0; k<num.length; k++) {
 		no = num.charAt(k);
 	 	if (string.indexOf(no)==-1) {
 	 		
 	 		valid ="false";
 	 	}
 	 	if (no =="."){
 	 		decimal += 1;
 	 	}
 	 
 	}
 	
 	
 	 if (valid=="true"){
 	 	if (num.indexOf(".")!= -1){
 					
 	 		if (decimal!=1){
 	 		   	return false;	
 	 		}
 	 		else
 	 		{
 	 			if ( num.indexOf(".")!= 0){
 	 				
 	 				return true;
 	 			}
 	 			else
 	 			{
 	 				return false;
 	 			}
 	 		}
 	 	}
 	 	else{
 	 		
 	 		return true;
 	 	}
 	 }
 	 else
 	 {	
 	
 	 	return false
 	 }
}


var whRatio = 1.4;
function dcmnr_getMapWidth()
{
      var windowWidth = screen.width;
      windowWidth = windowWidth - 350;
      //windowWidth = parseInt(windowWidth * 0.75);//20% for layerlist & 80% for map
      //if map width > 1000, server returns null map???
      if(windowWidth > 1000)
      {
      	windowWidth = 990;
      }
      return windowWidth;
}

function dcmnr_getMapHeight(width)
{
   var windowHeight = screen.height;
   return parseInt(parseInt(windowHeight)*0.70);
}

var newWin;
// use this function so that the current form is submitted, but with a target of the new popup window
function dcmnr_popupMap(formName,url,c)
{
   var day = new Date();
   var id = day.getTime();
   var windowName = "name"+id;
   var mapWidth = dcmnr_getMapWidth();
   var mapHeight = dcmnr_getMapHeight(mapWidth);
	var mw = document.getElementById("mapWidth");
	mw.value = mapWidth;
	var mh = document.getElementById("mapHeight");
	mh.value = mapHeight;
	newWin = window.open("/static/html/nothing.html", windowName, "toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=" + 
		screen.width +",height=" + (screen.height*0.84) + ",left=0,top=0");
	var form = document[formName];
	newWin.focus();
	var origAction = form.action;
	var origTarget = form.target;
    form.action = url;
    form.target = windowName;
    form.submit();
    form.action = origAction;
    form.target = origTarget;
}

// use this function when the complete url is available for the new popup window
function dcmnr_popupMapFullUrl(formName,url,c)
{
   var day = new Date();
   var id = day.getTime();
   var windowName = "popupnamxe"+id;
   var mapWidth = dcmnr_getMapWidth();
   var mapHeight = dcmnr_getMapHeight(mapWidth);
   newWin = window.open(url + "&mapWidth="+mapWidth+"&mapHeight=" + 
		mapHeight, windowName, "toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=" + 
		screen.width +",height=" + (screen.height*0.84) + ",left=0,top=0");

   newWin.focus();
}

// remove any non-breaking spaces from a text string
function trimNBSP(str)
{
   return str.replace(/\xA0+/g,"");
}

// This will check all the boxes for a given table/column.
// The "fieldToCheck" should be formatted like "<tableName>_<columnName>"
function dcmnr_checkAllBoxes(formName, fieldToCheck, ignore)
{
	var tableNameAndColumnName = fieldToCheck + "_";
	var fieldToCheckLength = tableNameAndColumnName.length;
	var inputField = document[formName].elements;
	for(var i = 0; ((inputField != null) && (i < inputField.length)); i++)
	{
		var subStringName = inputField[i].id.substring(0,fieldToCheckLength);
		if (subStringName == tableNameAndColumnName)
		{
      if(!inputField[i].disabled) {
  			inputField[i].checked = 'true';
  		}
		}
	}
}	

// This will uncheck all the boxes for a given table/column.
// The "fieldToUncheck" should be formatted like "<tableName>_<columnName>"
function dcmnr_uncheckAllBoxes(formName, fieldToUncheck, ignore)
{
	var tableNameAndColumnName = fieldToUncheck + "_";
	var fieldToUncheckLength = tableNameAndColumnName.length;
	var inputField = document[formName].elements;
	for(var i = 0; ((inputField != null) && (i < inputField.length)); i++)
	{
		var subStringName = inputField[i].id.substring(0,fieldToUncheckLength);
		if (subStringName == tableNameAndColumnName)
		{
      if(!inputField[i].disabled) {
  			inputField[i].checked = '';
  		}
		}
	}
}	

// This will uncheck all the boxes for a given table/column, 
// except the current one, which is left untouched.
// The "currentField" should be formatted like "<tableName>_<columnName>_<rowIndex>"
function dcmnr_uncheckAllBoxesExceptCurrent(formName, currentField, ignore)
{
  var currentIndex = currentField.lastIndexOf('_');
  var tableNameAndColumnName = currentField.substring(0,currentIndex + 1);
  var tableNameAndColumnNameLength = tableNameAndColumnName.length;
  
  var inputField = document[formName].elements;
  for(var i = 0; ((inputField != null) && (i < inputField.length)); i++)
  {
    var subStringName = inputField[i].id.substring(0,tableNameAndColumnNameLength);
    if (subStringName == tableNameAndColumnName)
    {
      if(!inputField[i].disabled) {
        if (inputField[i].id != currentField){
          inputField[i].checked = '';
        }
      }
    }
  }
} 

function dcmnr_doNothing() {
  // exactly what it says on the tin.
  // Can be of use when assigning event handlers dynamically, onload variables (see xslt) etc. 
}

// Can be used to call the print preview option. Will only work under IE
// Maybe useful for development, as opposed to being used in Production
// Taken from: http://jguru.com/faq/view.jsp?EID=490852
function dcmnr_print_preview()
{
	var OLECMDID = 7;
	/* OLECMDID values:
	* 6 - print
	* 7 - print preview
	* 1 - open window
	* 4 - Save As
	*/
	var PROMPT = 1; // 2 DONTPROMPTUSER
	var WebBrowser = '<OBJECT ID="WebBrowser1" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>';
	document.body.insertAdjacentHTML('beforeEnd', WebBrowser);
	WebBrowser1.ExecWB(OLECMDID, PROMPT);
	WebBrowser1.outerHTML = "";
}

/*
 * 
 * 
 */
function dcmnr_updateTableOrdering(formId, tableName, columnId)
{
  // alert("dcmnr_updateTableOrdering(" + formId + ", " + tableName + ", " + columnId);
	var formObj = document.getElementById(formId);
	var currentOrderByColumnId = document.getElementById(tableName + "_orderByColumnId");
	var currentOrderByDirection = document.getElementById(tableName + "_orderByDirection");

  var currentOrderByColumnIdValue = currentOrderByColumnId.value;
  var currentOrderByDirectionValue = currentOrderByDirection.value;
  
  // alert("currentOrderByColumnIdValue = " + currentOrderByColumnIdValue + ", currentOrderByDirectionValue = " + currentOrderByDirectionValue);
  
  if (currentOrderByColumnId.value != columnId || currentOrderByDirectionValue == ''){
    //alert("Ordering new column by ASC");
    currentOrderByColumnId.value = columnId;
    currentOrderByDirection.value = 'ASC';
	} else if (currentOrderByDirectionValue == 'ASC'){
	  //alert("Ordering existing column by DESC");
    currentOrderByDirection.value = 'DESC';
	} else {
	  //alert("Resetting ordering of table.");
    currentOrderByColumnId.value = '';
    currentOrderByDirection.value = '';
	}
  formObj.submit(); 
	
	// dcmnr_selectRecord(currentRecord, recordNumber);
	// formObj.setAttribute("action", url);
}

/*
Effect.BlindLeft = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false,
      scaleY: false,
      scaleMode: 'box',
      scaleContent: false,
      restoreAfterFinish: true,
      afterSetup: function(effect) {
        effect.element.makeClipping().setStyle({
          height: effect.dims[0] + 'px'
        }).show();
      },
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping();
      }
    }, arguments[1] || { })
  );
};

*/
