	function checkEmail(emailStr)
	{
	    if (emailStr.length == 0) {
	        return true;
	    }
	    var emailPat=/^(.+)@(.+)$/;
	    var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	    var validChars="\[^\\s" + specialChars + "\]";
	    var quotedUser="(\"[^\"]*\")";
	    var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
	    var atom=validChars + '+';
	    var word="(" + atom + "|" + quotedUser + ")";
	    var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	    var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
	    var matchArray=emailStr.match(emailPat);
	    if (matchArray == null) {
	        return false;
	    }
	    var user=matchArray[1];
	    var domain=matchArray[2];
	    if (user.match(userPat) == null) {
	        return false;
	    }
	    var IPArray = domain.match(ipDomainPat);
	    if (IPArray != null) {
	        for (var i = 1; i <= 4; i++) {
	           if (IPArray[i] > 255) {
	              return false;
	           }
	        }
	        return true;
	    }
	    var domainArray=domain.match(domainPat);
	    if (domainArray == null) {
	        return false;
	    }
	    var atomPat=new RegExp(atom,"g");
	    var domArr=domain.match(atomPat);
	    var len=domArr.length;
	    if ((domArr[domArr.length-1].length < 2) ||
	        (domArr[domArr.length-1].length > 3)) {
	        return false;
	    }
	    if (len < 2) {
	        return false;
	    }
	    return true;
	 }

	function checkPhone(phoneNum)
	{
 		var rePhoneNumber = new RegExp(/^\d{10}$/);
		if (!rePhoneNumber.test(phoneNum)) {
          return false;
		}
		return true;
	}


	function propertyEditValidate(form)
	{
		var status = validatelists( form );
		if (formSaved)
		{
			if ( form.status.value == 'N' && onLoadStatus == 'N' )
			{
				var ans=window.confirm('NOTE: This property is currently INACTIVE.  \nSelect OK to change the status to ACTIVE ' +
				'(and save your changes) -OR- Select CANCEL to leave it INACTIVE (and save your changes).');
				if ( ans == true )
				{
					form.status.value = 'A';
				}
			}
		}

		return status;
	}

	function validatelists( form )
	{
		if ( form.amenity != null )
		{
			validatelist(form.amenity);
		}
		if ( form.appliance != null )
		{
			validatelist(form.appliance);
		}
		if ( form.heatingType != null )
		{
			validatelist(form.heatingType);
		}
		return true;
	}

	function validatelist( checkboxgroup )
	{
		var len = checkboxgroup.length;
		var something_checked = false;

		for ( var i=0; i < len; i++ )
		{
			if ( checkboxgroup[i].checked )
			{
				something_checked = true;
			}
		}
		if ( !something_checked )
		{
			var new_len = len + 1;
			checkboxgroup[new_len] = checkboxgroup[0];
			checkboxgroup[new_len].value = "99";
			checkboxgroup[new_len].checked = true;
		}
	}

	function isblank(s)
	{
	   if ( s == null || s=="") return true;
	   for (var i=0; i < s.length; i++) {
	     var c = s.charAt(i);
	     if (( c != ' ') && (c != '\n') && (c != '\t')) return false;
	   }
	   return true;
	}


	function prepopulate(field, val)
	{
		if ( isblank(field.value) )
		{
			field.value = val;
		}
	}

	function validateSearch(f)
	{
		if ( isblank(f.state.value) )
		{
			alert("State is required, please select a US state");
			f.state.focus();
			return false;
		}
		if ( isblank(f.county.value) )
		{
			alert("County is required, please select a county");
			f.county.focus();
			return false;
		}
		return true;
	}

	function goCountyMap(f)
	{
		var state_field = f.state.value;
		var county_field = f.county.options[f.county.selectedIndex].value;

		// fullhostname = GLOBAL
		var redirect = fullhostname + "/searchcounty.rwx?state=" + state_field + "&county=" +
			county_field;
		f.location.options.length=1; // this is so user can not select a city

		return redirect;
	}

	function goStateMap(f)
	{
		var stateName = f.state.options[f.state.selectedIndex].text.toLowerCase();
		var __value = f.state.options[f.state.selectedIndex].value;
		if ( isblank(__value) )
		{
			return false;
		}
		// replace spaces with underscores
		stateName = stateName.replace(/ /g, "_");

		var redirect = fullhostname + "/" + stateName + "_rental_homes.rwx";
		f.county.options.length=1; // this is so user can not select a county or state
		f.location.options.length=1;
		window.location=redirect;
		return true;
	}


	function validateSelect(selectbox)
	{
		if ( isblank(selectbox.value) )
		{
			alert("Please make a choice");
			selectbox.focus();
			return false;
		}
	}


// routines for checking boxes when checkbox element is indexed or part of
// a column in a list of items
			// on checkbox click change row bg color
			var backgroundColor = '#EDF7FF';
			function setRowBackground (childCheckbox)
			{
				var row = childCheckbox.parentNode;
				while (row && row.tagName.toLowerCase() != 'tr')
				{
					row = row.parentNode;
				}
				if (row && row.style)
				{
					if (childCheckbox.checked)
					{
						row.style.backgroundColor = backgroundColor;
					}
					else
					{
						row.style.backgroundColor = '';
					}
				}
			}


	function ToggleAll(e)
	{
		var theform = e.form;

		if (e.checked) {
		    CheckAll(theform);
		}
		else {
		    ClearAll(theform);
		}
	}

	function CheckAll(form)
	{
		var len = form.elements.length;
		for (var i = 0; i < len; i++)
		{
		    var e = form.elements[i];
		    if (e.type == "checkbox")
		    {
				e.checked = true;
		    }
		    if (e.type == "select-one")
		    {
		    	e.selectedIndex=1;
		    }
		}
		form.toggleAll.checked = true;
	}

	function ClearAll(form)
	{
		var len = form.elements.length;
		for (var i = 0; i < len; i++) {
		    var e = form.elements[i];
		    if (e.type == "checkbox")
		    {
				e.checked = false;
		    }
		    if (e.type == "select-one")
		    {
		    	e.selectedIndex=0;
		    }
		}
		form.toggleAll.checked = false;
	}

	function Toggle(e)
	{
		var theform = e.form;
		if (!e.checked)
		{
		    theform.toggleAll.checked = false;
		}
	}

	function ToggleAndSelectQuantity(e, element)
	{
		Toggle(e);
		var form = e.form;
		if ( e.checked )
		{
			form.elements[element].selectedIndex=1;
		}
		else
		{
			form.elements[element].selectedIndex=0;
		}

	}

	function AddTotalListing(selectbox, _rowId, _rowIdIndex, _totalId, amount)
	{
		var totalElem = document.getElementById(_totalId);
		var rowElem = document.getElementById(_rowId + _rowIdIndex);
		var freq = selectbox.options[selectbox.selectedIndex].value;
		var rowTotal = amount * freq;
		rowElem.innerHTML = "$" + roundNumber(rowTotal,2).toFixed(2);
		var i=0;
		var rowId = _rowId + i;
		rowElem = document.getElementById(rowId);
		var sum = 0.0;
		while ( rowElem )
		{
			sum = sum + rowElem.innerHTML.substring(1);
			i = i + 1;
			rowId = _rowId + i;
			rowElem = document.getElementById(rowId);
		}
		totalElem.innerHTML = "$" + roundNumber(sum,2).toFixed(2);
	}

	function AddTotal(e, id, amount)
	{
		var totalId = document.getElementById(id);
		var total = totalId.innerHTML.substring(1);
		if ( e.checked )
		{
			total = total *1;
			total = total + amount;
			totalId.innerHTML= "$" + roundNumber(total,2).toFixed(2);
		}
		else
		{
			total = total *1;
			total = total - amount;
			totalId.innerHTML= "$" + roundNumber(total,2).toFixed(2);
		}
	}

	function roundNumber(number, rlength)
	{
		var newnumber = Math.round(number*Math.pow(10,rlength))/Math.pow(10,rlength);
		newnumber.toFixed(rlength);
		return newnumber;
	}


	function validateRenewalForm(form)
	{
		var len = form.elements.length;
		var onechecked = false;
		for (var i = 0; i < len; i++)
		{
			var e = form.elements[i];
		    if (e.type == "checkbox")
		    {
		    	if ( e.checked )
		    	{
		    		onechecked = true;
		    	}
		    }
		}
		if ( !onechecked )
		{
			alert("No rentals were selected for renewal. \n" +
				"Please select at least 1 (one) rental property for renewal.");
			return false;
		}
		return true;
	}



	function openNewWindow(sURL)
	{
	    var winNewWindow = window.open(sURL, "",
	    	"status=yes,toolbar=yes,menubar=yes,resizable=yes,scrollbars=yes,location=yes,width=750,height=550");

	}

	function openNewWindow(sURL, sName, iWidth, iHeight)
	{
	    var winNewWindow = window.open(sURL, sName,
	    	"status=yes,toolbar=no,menubar=yes,resizable=yes,scrollbars=yes,location=no,width="
	    	+ iWidth + ",height=" + iHeight);

	}

	function openBasicWindow(sURL)
	{
	    var winNewWindow = window.open(sURL, "",
	    	"status=no,toolbar=no,menubar=no,resizable=no,scrollbars=no,location=no,width=259,height=290");

	}

	function selectOptionExists(optionText, optionArray)
	{
		var len=optionArray.length;
		for(var i=0; i<len; i++)
		{
			var optionItem = optionArray[i].value;
			if ( optionText == optionItem )
			{
				// the option already exists in the array
				return true;
			}
		}
		return false;
	}

	function selectListMoveItem(source, dest)
	{
		// source and dest are select or multi-select boxes
		var destOptions = dest.options;
		var sourceOptions = source.options;
		for (var i=0; i < sourceOptions.length; i++)
		{
			var option = sourceOptions[i];
			if (option.selected == true )
			{
				var newOption = new Option(option.text, option.value, false, false);
				if ( !selectOptionExists(newOption.value, dest.options) )
				{
					dest.options[dest.options.length] = newOption;
					//sourceOptions[i] = null;
					//i = i-1;
				}
			}
		} // end for loop
	}

	function selectListRemoveItem(list)
	{
		var opts = list.options;
		for (var i=0; i < opts.length; i++)
		{
			var option = opts[i];
			if (option.selected == true )
			{
				opts[i] = null;
				i = i-1;
			}
		}
	}

	function wordCounter(field, countfield, maxlimit)
	{
		wordcounter=0;
		for (x=0;x<field.value.length;x++)
		{
      		if (field.value.charAt(x) == " " && field.value.charAt(x-1) != " ")
      		{
      			wordcounter++
      		}
      		// Counts the spaces while ignoring double spaces, usually one in between each word.
      		if (wordcounter > 250)
      		{
      			field.value = field.value.substring(0, x);
      		}
      		else
      		{
      			countfield.value = maxlimit - wordcounter;
      		}
      	}
	}

	function textCounter(field, countfield, maxlimit)
	{
  		if (field.value.length > maxlimit)
		{
			field.value = field.value.substring(0, maxlimit);
		}
		else
		{
			var divid = document.getElementById(countfield);
			//var divid = document.all[countfield];
			var numLeft = maxlimit - field.value.length;
			var txtMsg = "";
			if ( numLeft != 1 )
			{
				txtMsg = " characters left";
			}
			else
			{
				txtMsg = " character left";
			}
			divid.innerHTML = maxlimit - field.value.length + txtMsg;
		}
	}

	function doTooltip(e, msg) {
	  if ( typeof Tooltip == "undefined" || !Tooltip.ready ) return;
	  Tooltip.clearTimer();
	  Tooltip.show(e, msg);
	}

	function hideTip() {
	  if ( typeof Tooltip == "undefined" || !Tooltip.ready ) return;
	  Tooltip.timerId = setTimeout("Tooltip.hide()", 300);
	}

	function deletePropFromList(id)
	{
		location.href = fullhostname +  '/propsrchdel.rwx?propid=' + id;
	}



	function clearErrorElement(errorDiv)
	{
		var div = document.getElementById(errorDiv);
		div.innerHTML = '';
		//div.style.visibility = "hidden";
		//div.style.display = "none";
	}

	// error processing and div special effects
	function addErrorElement(parentDiv, errorTitle, errorMsg)
	{
		var outer = document.getElementById(parentDiv);
		var newdiv = document.createElement('div');
		var divIdName = parentDiv + '_innerContent';
		newdiv.id = divIdName;
		newdiv.className = 'FORM_hint';

		newdiv.innerHTML = '<div class="FORM_in" >' + '<h4>' + errorTitle + '</h4><p>' +
				errorMsg + '</p><span class="FORM_close" onclick="clearErrorElement(\'' +
				parentDiv + '\');"></span></div><div class="FORM_dart"></div>';

		outer.appendChild(newdiv);
		outer.style.visibility = "visible";
		outer.style.display = "block";
	}

	// error processing and div special effects (used :find manager)
	// position - complex element with left and top attributes
	// elem00 - top/left reference point for absolute postioning
	function addErrorElementStyle2(targetDiv, errorTitle, errorMsg, posElem, elem00)
	{
		var pos = getElementRelPosition(posElem, elem00);
		if ( posElem.offsetWidth )
		{
			pos.left = pos.left + posElem.offsetWidth;
		}
		else
			pos.left = pos.left + 50; // default

		var target = document.getElementById(targetDiv);
		target.className = 'formErrorHint';
		target.innerHTML = '<div class="inner" >' + '<h4>' + errorTitle + '</h4><p>' +
				errorMsg + '</p><span class="closebutton" onclick="clearErrorElement(\'' +
				targetDiv + '\');"></span></div><div class="dart"></div>';

		target.style.visibility = "visible";
		target.style.display = "block";
		target.style.left = pos.left + 'px';
		target.style.top = pos.top + 'px';
	}


	// error processing and div special effects
	function addElementTester(parentDiv, errorTitle, errorMsg)
	{
		var outer = document.getElementById(parentDiv);
		var newdiv = document.createElement('div');
		var divIdName = parentDiv + '_innerContent';
		newdiv.id = divIdName;
		newdiv.className = 'FORM_hint';

		newdiv.innerHTML = 'xxx';

		outer.appendChild(newdiv);
		outer.style.visibility = "visible";
		outer.style.display = "block";
	}

// screen position helpers
function getScreenCenterY()
{
	var y = 0;
	y = getScrollOffset()+(getInnerHeight()/2);

	return(y);
}

function getScreenCenterX()
{
	return(document.body.clientWidth/2);
}

function getInnerHeight()
{
	var y;
	if (self.innerHeight) // all except Explorer
	{
		y = self.innerHeight;
	}
	else if (document.documentElement &&
			document.documentElement.clientHeight)
	// Explorer 6 Strict Mode
	{
		y = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		y = document.body.clientHeight;
	}
	return(y);
}

function getScrollOffset()
{
	var y;
	if (self.pageYOffset) // all except Explorer
	{
		y = self.pageYOffset;
	}
	else if (document.documentElement &&
		document.documentElement.scrollTop)
	// Explorer 6 Strict
	{
		y = document.documentElement.scrollTop;
	}
	else if (document.body) // all other Explorers
	{
		y = document.body.scrollTop;
	}
	return(y);
}

// not used, TODO : remove
function _getElementPosition(el)
{
	var curleft = curtop = 0;
	if (el.offsetParent) {

		do {
			curleft += el.offsetLeft;
			curtop += el.offsetTop;
		}while (el = el.offsetParent);
	}
	return {left:curleft,top:curtop};
}

// find absolute postion
function getElementPosition(el)
{
	var curleft = findPosX(el);
	var curtop = findPosY(el);
	return {"left":curleft,"top":curtop};
}

// find absolute postion (left)
 function findPosX(obj)
  {
    var curleft = 0;
    if(obj.offsetParent)
        while(1)
        {
          curleft += obj.offsetLeft;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
  }

// find absolute postion (top)
  function findPosY(obj)
  {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
  }

function getElementRelPosition(el, parentObj)
{
	var curleft = findPosRelX(el, parentObj);
	var curtop = findPosRelY(el, parentObj);
	return {"left":curleft,"top":curtop};
}

// find postion relative to a partent
 function findPosRelX(obj, parentObj)
  {
    var curleft = 0;
    if(obj.offsetParent)
        while(1)
        {
          curleft += obj.offsetLeft;
          if(obj.offsetParent.id == parentObj.id)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
  }

// find position relative to a parent
  function findPosRelY(obj, parentObj)
  {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
          curtop += obj.offsetTop;
          if(obj.offsetParent.id == parentObj.id)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
  }


function grayOut(vis, options, background)
{
	// Pass true to gray out screen, false to ungray
	// options are optional.  This is a JSON object with the following (optional) properties
	// opacity:0-100
	// Lower number = less grayout higher = more of a blackout
	// zindex: #
	// HTML elements with a higher zindex appear on top of the gray out
	// bgcolor: (#xxxxxx)
	// Standard RGB Hex color code
	// grayOut(true, {'zindex':'50', 'bgcolor':'#0000FF', 'opacity':'70'});
	// Because options is JSON opacity/zindex/bgcolor are all optional and can appear
	// in any order.  Pass only the properties you need to set.
	var options = options || {};
	var zindex = options.zindex || 50;
	var opacity = options.opacity || 20;
	var opaque = (opacity / 100);
	var bgcolor = options.bgcolor || '#000000';
	var pageHeight= options.height || '100%';
	var dark=document.getElementById('darkenScreenObject');
	if (!dark) {
		// The dark layer doesn't exist, it's never been created.  So we'll
		// create it here and apply some basic styles.
		// If you are getting errors in IE see: http://support.microsoft.com/default.aspx/kb/927917
		var tbody = document.getElementsByTagName("body")[0];
		var tnode = document.createElement('div');
		// Create the layer.
		tnode.style.position='absolute';
		// Position absolutely
		tnode.style.top='0px';
		// In the top
		tnode.style.left='0px';
		// Left corner of the page
		tnode.style.overflow='hidden';
		// Try to avoid making scroll bars
		tnode.style.display='none';
		// Start out Hidden
		tnode.id='darkenScreenObject';
		// Name it so we can find it later
		tbody.appendChild(tnode);
		// Add it to the web page
		dark=document.getElementById('darkenScreenObject');
		// Get the object.
	}
	if (vis) {
		var pageWidth='100%';

		//set the shader to cover the entire page and make it visible.
		dark.style.opacity=opaque;
		dark.style.MozOpacity=opaque;
		dark.style.filter='alpha(opacity='+opacity+')';
		dark.style.zIndex=zindex;
		dark.style.backgroundColor=bgcolor;
		dark.style.width= pageWidth;
		dark.style.height= pageHeight;
		dark.style.display='block';
		if ( background != null )
		{
			dark.style.backgroundImage = 'url(images/example.gif)';
		}
	}
	else {
		dark.style.display='none';
	}
}


function addLoadEventHandler(functionToAdd)
{
      if ( typeof window.onload != 'function' )
      {
            window.onload = functionToAdd;
      }
      else
      {
            var oldWindowOnLoad = window.onload;

            window.onload = function()
            {
                  oldWindowOnLoad();
                  functionToAdd();
            }
      }
}

// fix for z-index ie6 bug
// params can be 'visible' and 'hidden'
function showOrHideAllDropDowns(newState)
{
	var elements = document.documentElement.getElementsByTagName('select');
	for (var i=0; i<elements.length; i++) {
	    elements[i].style.visibility = newState;
	}
}
