  var isDebug = false;
  var sDebugMsg;
  var lb = "\n";
  
  var isKHTML = false  // safari detection currently not supported.

	var sUserAgent = navigator.userAgent;
	sDebugMsg += 'sUserAgent = ' + sUserAgent + lb;
	//alert('sUserAgent = ' + sUserAgent);
	
	var fAppVersion = parseFloat(navigator.appVersion);
	sDebugMsg += 'fAppVersion = ' + fAppVersion + lb;
	//alert('fAppVersion = ' + fAppVersion);
	
	
	/***************************************************/
	/* D E T E C T   --   O P E R A                    */
	/***************************************************/
	var isOpera = sUserAgent.indexOf("Opera") > -1;
  sDebugMsg += 'isOpera = ' + isOpera + lb;
  //alert('isOpera = ' + isOpera);
  
  var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = isMinOpera8 = isMinOpera9 = false;
  var fOperaVersion;

  if(isOpera) {
 
    if(navigator.appName == "Opera") {
      fOperaVersion = fAppVersion;    
    }
    else {
      var reOperaVersion = new RegExp("Opera (\\d+\\.\\d+)");
      reOperaVersion.test(sUserAgent);
      fOperaVersion = parseFloat(RegExp["$1"]);          
    }
    
    sDebugMsg += 'fOperaVersion = ' + fOperaVersion + lb;
    
    isMinOpera4 = fOperaVersion >= 4;
    isMinOpera5 = fOperaVersion >= 5;
    isMinOpera6 = fOperaVersion >= 6;
    isMinOpera7 = fOperaVersion >= 7;
    isMinOpera7_5 = fOperaVersion >= 7.5;
    isMinOpera8 = fOperaVersion >= 8;
    isMinOpera9 = fOperaVersion >= 9;
    
    
		sDebugMsg += 'isMinOpera4 = ' + isMinOpera4 + lb;
		sDebugMsg += 'isMinOpera5 = ' + isMinOpera5 + lb;
		sDebugMsg += 'isMinOpera6 = ' + isMinOpera6 + lb;
		sDebugMsg += 'isMinOpera7 = ' + isMinOpera7 + lb;
		sDebugMsg += 'isMinOpera7_5 = ' + isMinOpera7_5 + lb;
		sDebugMsg += 'isMinOpera8 = ' + isMinOpera8 + lb;
		sDebugMsg += 'isMinOpera9 = ' + isMinOpera9 + lb;
		
	  //alert('isMinOpera4 = ' + isMinOpera4);
	  //alert('isMinOpera5 = ' + isMinOpera5);
	  //alert('isMinOpera6 = ' + isMinOpera6);
	  //alert('isMinOpera7 = ' + isMinOpera7);
	  //alert('isMinOpera7_5 = ' + isMinOpera7_5);  
		    
  }
  


	/***************************************************/
	/* D E T E C T   --   IE                           */
	/***************************************************/
  var isIE = sUserAgent.indexOf("compatible") > -1
            && sUserAgent.indexOf("MSIE") > -1
            && !isOpera;
            
  sDebugMsg += 'isIE = ' + isIE + lb;          
  //alert('isIE = ' + isIE);
  
  var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = isMinIE7 = false;
  var fIEVersion;
  
  if(isIE) {
    var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
    
    sDebugMsg += 'reIE = ' + reIE + lb;
    //alert('reIE = ' + reIE);
    reIE.test(sUserAgent);
    
    fIEVersion = parseFloat(RegExp["$1"]);
    sDebugMsg += 'fIEVersion = ' + fIEVersion + lb;
    //alert('fIEVersion = ' + fIEVersion);
    
    isMinIE4 = fIEVersion >= 4;
    isMinIE5 = fIEVersion >= 5;
    isMinIE5_5 = fIEVersion >= 5.5;
    isMinIE6 = fIEVersion >= 6.0;
    isMinIE7 = fIEVersion >= 7;
    
    sDebugMsg += 'isMinIE4 = ' + isMinIE4 + lb;
    sDebugMsg += 'isMinIE5 = ' + isMinIE5 + lb;
    sDebugMsg += 'isMinIE5_5 = ' + isMinIE5_5 + lb;
    sDebugMsg += 'isMinIE6 = ' + isMinIE6 + lb;
    sDebugMsg += 'isMinIE7 = ' + isMinIE7 + lb;
    
	  //alert('isMinIE4 = ' + isMinIE4);
	  //alert('isMinIE5 = ' + isMinIE5);
	  //alert('isMinIE5_5 = ' + isMinIE5_5);
	  //alert('isMinIE6 = ' + isMinIE6);
	  //alert('isMinIE7 = ' + isMinIE7);    
  }
  
  
  /***************************************************/
	/* D E T E C T   --   M O Z I L L A                */
	/***************************************************/
	
	var isMoz = sUserAgent.indexOf("Gecko") > -1
	           && !isKHTML;
	           
  sDebugMsg += 'isMoz = ' + isMoz + lb;    	 
  //alert('isMoz = ' + isMoz);      
  
  var isMinMoz1 = isMinMoz1_4 = isMinMoz1_5 = false;
  
  if(isMoz) {
    //var reMoz = new RegEx("rv:(\\d+\\.\\d+(?:\\.\\d+)?");
    //reMoz.test(sUserAgent);
    
    // todo add versioning....
  
  }    
	
	


	/***************************************************/
	/* Display version in alert                        */
	/***************************************************/
  if(isDebug) {
   	alert(sDebugMsg);
  }
  
  
  /*********************************************************/
  /* IE 6 select z-index bug fix.  hides select elements   */
  /* on in screen pop up                                   */
  /*********************************************************/
  function hideTags(tagName, popUpDiv) {
   
    //alert(isIE);
    if(isIE)
    {
      //alert(fIEVersion);
      if(fIEVersion < 7)
      {
        
        
		    var selectArray = document.getElementsByTagName(tagName);
		    //alert(selectArray.length);
		    for(var i=selectArray.length-1; i>=0; i--) 
		    {		      	      
		      var obj = selectArray[i];
		      
		      var objOffsetParent = null;   
					var objLeft = objTop = 0;				
					//alert(obj.offsetParent);
					if (obj.offsetParent) 
					{
						objLeft = obj.offsetLeft
						objTop = obj.offsetTop
						
	          objHeight = obj.offsetHeight;
	          objWidth = obj.offsetWidth;						
									  
					  objOffsetParent = obj.offsetParent;
						while (objOffsetParent != null) 
						{
							objLeft += objOffsetParent.offsetLeft
							objTop += objOffsetParent.offsetTop
							
							objOffsetParent = objOffsetParent.offsetParent
						}
					}		      
					
					
					/*
          alert('popUpDiv = ' + popUpDiv);
          alert('popUpDiv.offsetLeft = ' + popUpDiv.offsetLeft);
          alert('popUpDiv.offsetWidth = ' + popUpDiv.offsetWidth);
          alert('popUpDiv.offsetTop = ' + popUpDiv.offsetTop);
          alert('popUpDiv.offsetHeight = ' + popUpDiv.offsetHeight);
          
          alert(objLeft);
          alert('objLeft = ' + objLeft);
          alert('objTop = ' + objTop);
          alert('objHeight = ' + objHeight);
          alert('objWidth = ' + objWidth);			
          */		
      
          if(( popUpDiv.offsetLeft + popUpDiv.offsetWidth ) <= objLeft );
          else if(( popUpDiv.offsetTop + popUpDiv.offsetHeight ) <= objTop );
          else if( popUpDiv.offsetTop >= ( objTop + objHeight ));
          else if( popUpDiv.offsetLeft >= ( objLeft + objWidth ));
          else
          {
            //alert(obj);
            obj.style.visibility = "hidden";
          }	
		      
		    }  // end for  		  
		    
		                
      }
    }
  }
  
  function showTags( elmID )
  {
    //alert('showTags');
    
    if(isIE)
    {
      if(fIEVersion < 7)
      {
    
				var selectArray = document.getElementsByTagName(elmID);
				//alert(selectArray.length);
				
				for(var i=selectArray.length-1; i>=0; i--) 
				{    
				  var obj = selectArray[i];
				  var objOffsetParent = null;
				  
				  //obj.style.display = 'block';
				  obj.style.visibility = 'visible';
				  
				}      
			}
		}        
  }  
  
/********************************************************************/
/*  javascript fade-in, fade-out animation routines                 */  
/********************************************************************/
	function closeInfoMessage() {
	  
	  //alert('closeInfoMessage');
	  
		var dvInfoMsg = document.getElementById('dvInfoMsg');	
		//alert(dvInfoMsg);
		
		if(dvInfoMsg != null) {
		
		  changeOpac(0, 'dvInfoMsg');
		  
		  dvInfoMsg.style.display = 'none';
		}
	}
	
	function closeInfoMessageIE6() {	  
	  
	  showTags('select');
	  
		var dvInfoMsg = document.getElementById('dvInfoMsg');	
		
		if(dvInfoMsg != null) {
		  dvInfoMsg.style.display = 'none';
		  
		  // however for ie6 if we are on the createExpense page then explicily hide the drop.
		  if(document.getElementById('frmMain:ddHcpState') != null) {
		    document.getElementById('frmMain:ddHcpState').style.visibility = 'hidden';
		  }		  
		}
	}	
	
	function fadeInAnimation(startOpacity, endOpacity, fadeInMs) {
	  //alert('fadeInAnimation');
	  var dvInfoMsg = document.getElementById('dvInfoMsg');
	  if(dvInfoMsg != null) {
	    dvInfoMsg.style.display = 'block';
	    //opacity('dvInfoMsg', 0, 70, 800);	
	    opacity('dvInfoMsg', startOpacity, endOpacity, fadeInMs);	
	  }
	}
	
	function fadeInAnimationIE6() {
	  //alert('fadeInAnimationIE6');
	  
	  var dv = document.getElementById('dvInfoMsg');
	  //alert(dv);
	  hideTags('select', dv);

	}
				
	function opacity(id, opacStart, opacEnd, millisec) { 
		//speed for each frame 
		var speed = Math.round(millisec / 100); 
		var timer = 0; 
	
		//determine the direction for the blending, if start and end are the same nothing happens 
		if(opacStart > opacEnd) { 
			for(i = opacStart; i >= opacEnd; i--) { 
				setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
				timer++; 
			} 
		} 
		else if(opacStart < opacEnd) { 
			for(i = opacStart; i <= opacEnd; i++) { 
				setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
				timer++; 
			} 
		} 
	 } 			
	//change the opacity for different browsers 
	function changeOpac(opacity, id) { 
	    //alert('changeOpac');
			var object = document.getElementById(id).style; 
			object.opacity = (opacity / 100); 
			object.MozOpacity = (opacity / 100); 
			object.KhtmlOpacity = (opacity / 100); 
			object.filter = "alpha(opacity=" + opacity + ")"; 
	} 		  
	
	
	// common function to handle motif for remove button 
  function onCheckboxRemoveClickGlobal(cb, btn, dt, cbbaseid) {

    //alert('onCheckboxRemoveClickGlobal');
    
    if(cb.checked == true) {
	    //alert('onCheckboxRemoveClickGlobal true');
	    //alert(btn);
      document.getElementById(btn).disabled = false;
    }
    else if(cb.checked == false) {
      
      document.getElementById(btn).disabled = true;
      
      // test the other check box
	    var tbRecipients = document.getElementById(dt);	    
	    var tbInputsArr = tbRecipients.getElementsByTagName('input');
	    
	    for(var i=0; i<tbInputsArr.length; i++) {
	      var obj = tbInputsArr[i];
	      var id = obj.id;
	      
	      if(id != null ) {	      
		      if(id.indexOf(cbbaseid) > -1) {
				    if(obj.checked == true) {
				      document.getElementById(btn).disabled = false;
				      break;
				    }		      
		      }
		    }	    
	    }  // end for 
    }  
  }	
	
  function displayConfirmationGlobal(topElem, confirmElem)  {
  
  	document.getElementById(topElem).style.display = 'none';
  
  	document.getElementById(confirmElem).style.display = 'block';
 
  }
  
  function closeConfirmationGlobal(topElem, confirmElem) {
  
    document.getElementById(topElem).style.display = 'block';
  
  	document.getElementById(confirmElem).style.display = 'none';
  }
  
  
  
  ///////////////////////////////////////////////////////////////
function extractNumber(obj, decimalPlaces, allowNegative)
{
	var temp = obj.value;
	
	// avoid changing things if already formatted correctly
	var reg0Str = '[0-9]*';
	if (decimalPlaces > 0) {
		reg0Str += '\\.?[0-9]{0,' + decimalPlaces + '}';
	} else if (decimalPlaces < 0) {
		reg0Str += '\\.?[0-9]*';
	}
	reg0Str = allowNegative ? '^-?' + reg0Str : '^' + reg0Str;
	reg0Str = reg0Str + '$';
	var reg0 = new RegExp(reg0Str);
	if (reg0.test(temp)) return true;

	// first replace all non numbers
	var reg1Str = '[^0-9' + (decimalPlaces != 0 ? '.' : '') + (allowNegative ? '-' : '') + ']';
	var reg1 = new RegExp(reg1Str, 'g');
	temp = temp.replace(reg1, '');

	if (allowNegative) {
		// replace extra negative
		var hasNegative = temp.length > 0 && temp.charAt(0) == '-';
		var reg2 = /-/g;
		temp = temp.replace(reg2, '');
		if (hasNegative) temp = '-' + temp;
	}
	
	if (decimalPlaces != 0) {
		var reg3 = /\./g;
		var reg3Array = reg3.exec(temp);
		if (reg3Array != null) {
			// keep only first occurrence of .
			//  and the number of places specified by decimalPlaces or the entire string if decimalPlaces < 0
			var reg3Right = temp.substring(reg3Array.index + reg3Array[0].length);
			reg3Right = reg3Right.replace(reg3, '');
			reg3Right = decimalPlaces > 0 ? reg3Right.substring(0, decimalPlaces) : reg3Right;
			temp = temp.substring(0,reg3Array.index) + '.' + reg3Right;
		}
	}
	
	obj.value = temp;
}

function checkLength ( obj, l, key){


    if ( obj.value.length == ( l - 4 )){
       
       if (obj.value.length > 0){
       
          var pos = obj.value.indexOf('.');
        
      
          if ( (key == 46) || (pos >= 0 )){
             return true;
          }else{
    	     return false;
          }    
       }
    }
   
    if ( obj.value.length + 1 > l  ){
       return false;
    }else{
    	return true;
    
    }


}

function blockNonNumbers(obj, e, allowDecimal, allowNegative)
{
	var key;
	var isCtrl = false;
	var keychar;
	var reg;
		
	if(window.event) {
		key = e.keyCode;
		isCtrl = window.event.ctrlKey
	}
	else if(e.which) {
		key = e.which;
		isCtrl = e.ctrlKey;
	}
	
	if (isNaN(key)) return true;
	
	keychar = String.fromCharCode(key);
	
	// check for backspace or delete, or if Ctrl was pressed
	if (key == 8 || isCtrl)
	{
		return true;
	}

	reg = /\d/;
	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;
	
	return isFirstN || isFirstD || reg.test(keychar);
}

function blockNonNumbersAndLength(obj, e, allowDecimal, allowNegative, l)
{
  //alert('start blockNonNumbersAndLength');
  //alert(e.keyCode);
  
	var key;
	var isCtrl = false;
	var keychar;
	var reg;
		
	if(window.event) {
		key = e.keyCode;
		isCtrl = window.event.ctrlKey
	}
	else if(e.which) {
		key = e.which;
		isCtrl = e.ctrlKey;
	}
	

	
	if (isNaN(key)) return true;
	
	keychar = String.fromCharCode(key);
	
	//alert(keychar);
	if (checkLength(obj, l, key)){
	}else{
		return false;
	
	}
	

	// check for backspace or delete, or if Ctrl was pressed
	if (key == 8 || isCtrl)
	{
		return true;
	}
	
	
	reg = /\d/;
	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;
	
	return isFirstN || isFirstD || reg.test(keychar);
}

function currencyFormatted(amount)
{
	var i = parseFloat(amount);
	if(isNaN(i)) { i = 0.00; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	i = parseInt((i + .005) * 100);
	i = i / 100;
	s = new String(i);
	if(s.indexOf('.') < 0) { s += '.00'; }
	if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
	s = minus + s;
	s = "$" + s;
	return s;
}
  


//page