// ENTRY VALIDATION & FORMATTING

// 11/10/97 - TJS Added functions
// 01/21/99 - SCC Added function isUniqueItem
// 02/11/99 - TJS Tweaked number formatting functions
// 03/22/99 - TJS Added scrub_beds & baths
// 04/12/99 - ANK Changed scrab_Beds, scrab_String and replace_Char
// 05/20/99 - ANK Added scrub_select_mult(elem, maxn)
// 05/20/2000 - JRP Added checkPostal(object)


function isUniqueItem (list,thisItemCode,delimChar,caseSensitive) {
// RETURNS TRUE IF thisItemCode IS NOT IN list, FALSE OTHERWISE. //
// DEFAULT FOR delimChar (OPTIONAL) IS COMMA, DEFAULT FOR caseSensitive (OPTIONAL) is FALSE. //
	if (list == '' || list == undefined || thisItemCode == '' || thisItemCode == undefined)
		return true;
	if (caseSensitive == undefined || caseSensitive == false) { // just convert both to upper case //
		list = list.toUpperCase();
		thisItemCode = thisItemCode.toUpperCase();
	}
	if (delimChar == undefined || delimChar == '')  // Assumes carriage return delim, will replace with ',' //
		delimChar = ',';
	
	if (list.charAt(0) != delimChar)				// In case the delimiter is not at the beginning //
		list = delimChar + list;
	if (list.charAt(list.length - 1) != delimChar)	// or end of the list //
		list = list + delimChar;
		
	thisItemCode = delimChar + thisItemCode + delimChar;
	
	var foundIndex = list.indexOf(thisItemCode);
	if (foundIndex == -1) 
		return true;
	else 
		return false;
}

function scrub_RollNum(theNum,otherAllowed,minWildcardPosition) {
// REMOVE ALL NON-NUMERIC CHARS EXCEPT FOR PROGRAMMER SPECIFIED 'OTHER' ALLOWABLE CHARS
	var result = "";
	var allowed = "";
	otherAllowed +="";
	if (otherAllowed == 'undefined')
		otherAllowed = "";
	allowed = "0123456789"+ otherAllowed;

	result = scrub_String(theNum,allowed);
	
	// remove commas from the end of the string
	for(i=result.length-1; i>=0; i--) {
		if(result.charAt(i) != ",")
			break;
		result = result.substring(0,i);
	}

	if (minWildcardPosition)
		result = parse_Wildcards (result,minWildcardPosition);

	return result;
}

function scrub_String(theStr,charsAllowed,charsAllowedOnce) {
	// eliminate all unwanted chars
	var result = "";
	var specialCharAt = -1;
	var specialChar = "";
	for(i=0;i<=theStr.length;i++) {
		theChar = theStr.charAt(i);
		if (charsAllowed.indexOf(theChar) != -1)
 			result +=theChar;
 		else if (charsAllowedOnce){
 			specialCharAt = charsAllowedOnce.indexOf(theChar);
 		 	if (specialCharAt != -1) {
 				result += theChar;
 				// remove the char from the list so it will not be allowed
				charsAllowedOnce = charsAllowedOnce.substring(0,specialCharAt) 
					+ charsAllowedOnce.substring(specialCharAt+1,charsAllowedOnce.length);
// specialChar = charsAllowedOnce.charAt(specialCharAt-1);      
// charsAllowedOnce = charsAllowedOnce.replace(specialChar,""); 
 			}
 		}
	}
	return result;
}


// build numbeds_str from above and below grade fields
function update_numbeds_str() {
	var sNumbedStr = "";
	var sAbove = "" + document.form1.numbeds_above.value;
	var sBelow = "" + document.form1.numbeds_below.value;
	
	if ((sAbove == "") || (sAbove == "null"))
		sAbove = "";
	if ((sBelow == "") || (sBelow == "null"))
		sBelow = "";
	
	if (sBelow == "") {
		sNumbedStr = sAbove;
	} else {
		if (sAbove == "") sAbove = "0";
		sNumbedStr = sAbove + "+" + sBelow; 		
	}
	
	document.form1.numbeds_str.value = sNumbedStr;

}

function scrub_Beds(theStr) {
	// Check baths entry
	var result = "";

	while ((x=theStr.indexOf(".")) != -1) {
//		x = theStr.indexOf(".");
		theStr = theStr.substring(0,x) + '+' + theStr.substring(x+1,theStr.length);
	}	
// theStr = theStr.replace(".","+"); 

	// eliminate all unwanted chars
	result = scrub_String(theStr,"0123456789","+")
	
	// don't start off the string with a plus
	if(result.charAt(0) == "+")
		result = result.substring(1);
	// don't end the string with a plus
	if(result.charAt(result.length-1) == "+")
		result = result.substring(0,result.length-1);
	return result;
}

function scrub_Baths(theStr) {
	// Check baths entry
	var result = "";
	
	// eliminate all unwanted chars
	result = scrub_String(theStr,"0123456789",".")
	
	// if decimal, last char must be 5
	var decAt = result.indexOf(".");
	if (decAt > -1) {
		lastChar = result.charAt(result.length-1);
		result = result.substring(0,decAt); // just the integer
		if (lastChar == "5")
			result += ".5";
	}
	return result;
}


function scrub_Beds_and_Baths(theNum) {
// Check beds and baths entry
	var result = "";
	var theChar = "";
	var allowed = "0123456789";
	for(i=0;i<=theNum.length;i++) {
		theChar = theNum.charAt(i);
		if (theChar=='.') {
			result = result + theChar;
			if (allowed.lastIndexOf(theNum.charAt(i+1)) != -1)
				result = result + theNum.charAt(i+1);
			else
				result = result + '0';
			return result;
		}
		if(allowed.lastIndexOf(theChar) != -1)
 			result = result + theChar;
	}
	return result;
}

//scrub_room_size
function scrub_RoomSize(objRoomSize) {
	var theStr=(objRoomSize.value||"");
	var result = "";
	// eliminate all unwanted chars
	result = scrub_String(theStr,"0123456789",".")
	
	// don't start off the string with a plus
	if(result.charAt(0) == ".")
		result = result.substring(1);
	// don't end the string with a plus
	if(result.charAt(result.length-1) == ".")
		result = result.substring(0,result.length-1);
	objRoomSize.value= result;
}


function filterNum(theNum) {
	var minusStr = "";
	var result = "";

	if (theNum.indexOf("-") != -1)
		minusStr = "-";

 	result = scrub_String(theNum,"0123456789",".")

 	if (result == "")
 		return "";
	else
		return minusStr + result;
}

function commaFmt(numEle) {
	var tempStr = ""+numEle;
	
	// already has commas
	var charCheck = tempStr.indexOf(",");
	if ((charCheck+0) >= 0) {
		return numEle;
	}

	// separate the decimal from the whole number
	var decStr = "";
	var decInt = tempStr.indexOf(".");
	if (decInt!=-1) {
		decStr = tempStr.substring(decInt,tempStr.length);
		tempStr = tempStr.substring(0,decInt);
	}

	// if negative - save sign
	var isNeg = false;
	if (tempStr.indexOf("-")!=-1) {
		isNeg=true;
        tempStr=tempStr.substring(1,tempStr.length);
	}

	// short - no commas needed
	if (tempStr.length<=3) { 
		return numEle;
	}

	// add commas
	var newStr = "";
	var jInt = 0;
	for (var iInt=tempStr.length-1;iInt>=0;iInt--) {
		jInt++;
		newStr = tempStr.charAt(iInt) + newStr;
		if (jInt%3==0) {
			if (iInt-1>=0) {
				newStr = ","+newStr;
			}
		}
	}

	// re-assemble the parts
	if (decInt!=-1)
		newStr = newStr + decStr;
	if (isNeg)
		newStr = "-"+newStr;

	return newStr;
}

function formatRealNum(theNum,decplaces) {
// *** STOP USING THIS ***
// USE format_Real
// FORMAT A REAL NUMBER TO THE DESIRED DECIMAL PLACE
	var str = Math.round(parseFloat(filterNum(theNum.value)) * Math.pow(10,decplaces));
	str = ""+str;
	while (str.length <= decplaces) {
		str = "0" + str;
	}
	var decpoint = str.length - decplaces;
	return str.substring(0,decpoint) + "." + str.substring(decpoint,str.length);
}

function formatInteger(theNum) {
// *** STOP USING THIS ***
// USE format_Integer
// FORMAT AN INTEGER
	var str = Math.round(parseFloat(filterNum(theNum.value)));
	str = ""+str;
	return str;
}

function formatNum(theNum,decplaces,addcommas) {
// *** STOP USING THIS ***
// USE format_NUMBER
// FORMAT NUMERIC DATA

	var str = ""+theNum.value;
	if ((str == "") || (str == "null")) {
		theNum.value = "";
		return false;
	}
	if (decplaces == 0) {
		var fmtdnum = formatInteger(theNum,decplaces);
	} else {
		var fmtdnum = formatRealNum(theNum,decplaces);
	}
	if (addcommas) {
		fmtdnum = commaFmt(fmtdnum);
	}
	theNum.value = fmtdnum;
	return true
}

function format_Real(theNum,decplaces) {
// FORMAT A REAL NUMBER TO THE DESIRED DECIMAL PLACE
	var str = filterNum(theNum);
	str = Math.round(parseFloat(str) * Math.pow(10,decplaces));
	str = ""+str;
	while (str.length <= decplaces) {
		str = "0" + str;
	}
	var decpoint = str.length - decplaces;
	return str.substring(0,decpoint) + "." + str.substring(decpoint,str.length);
}

function format_Integer(theNum) {
// FORMAT AN INTEGER
	var str = filterNum(theNum);
	str = Math.round(parseFloat(str));
	return ""+str;
}

function format_Number(theNum,decplaces,addcommas) {
// FORMAT NUMERIC DATA
	var str = ""+theNum;
	if ((str == "") || (str == "null"))
		return "";

	if (decplaces == 0)
		var fmtdnum = format_Integer(str,decplaces);
	else
		var fmtdnum = format_Real(str,decplaces);
		
	if (addcommas) 
		fmtdnum = commaFmt(fmtdnum);
//	if (isNaN(fmtdnum))
//		return ""; 
	return fmtdnum;
}

function validateNum(theNum,decplaces,min,max,addcommas) {
// VALIDATE & FORMAT USER INUPT
	var str = filterNum(theNum.value);
	if ((str == "") || (str == "null")) {
		theNum.value = "";
		return false;
	}
	var tmpFloat = parseFloat(filterNum(theNum.value));
	
	if (tmpFloat < min || tmpFloat > max) {
		alert("Please enter a number between " + min + " and " + max + ".");
		theNum.value = "";
		theNum.focus();
		return false;
	}
	if (decplaces == 0) {
		var fmtdnum = formatInteger(theNum,decplaces);
	} else {
		var fmtdnum = formatRealNum(theNum,decplaces);
	}
	if (addcommas) {
		fmtdnum = commaFmt(fmtdnum);
	}
	theNum.value = fmtdnum;
	return true
}

function validatePrice(theNum,min,max,addcommas) {
// VALIDATE & FORMAT USER INUPT
	var str = filterNum(theNum.value);
	if ((str == "") || (str == "null")) {
		theNum.value = "";
		return false;
	}
	var tmpFloat = parseFloat(filterNum(theNum.value));
	
	if (tmpFloat < min || tmpFloat > max) {
		alert("Please enter a number between " + min + " and " + max + ".");
		theNum.value = "";
		theNum.focus();
		return false;
	}
	if (str.indexOf(".") > -1) {
		decplaces = 2;
	} else {
		decplaces = 0;
	}
	
	if (decplaces == 0) {
		var fmtdnum = formatInteger(theNum,decplaces);
	} else {
		var fmtdnum = formatRealNum(theNum,decplaces);
	}
	if (addcommas) {
		fmtdnum = commaFmt(fmtdnum);
	}
	theNum.value = fmtdnum;
	return true
}

//JRP - Added Oct 24 2002
function validateSearchPrice(theNum,decplaces,min,max,addcommas,alterPrice) {
// VALIDATE & FORMAT USER INUPT
	var numStr = theNum.value;
        var str = filterNum(theNum.value);
	if ((str == "") || (str == "null")) {
		theNum.value = "";
		return false;
	}
        //alert(numStr.indexOf('.'));
        //alert(numStr.length-1);
        if (numStr.substr(numStr.length-1)== ".") {
           alterPrice = false;
        }
	var tmpFloat = parseFloat(filterNum(theNum.value));
	
	if (tmpFloat < min || tmpFloat > max) {
		alert("Please enter a number between " + min + " and " + max + ".");
		theNum.value = "";
		theNum.focus();
		return false;
	}
	if (alterPrice) {
		if (tmpFloat<10000) {
			theNum.value = tmpFloat*1000;;
		}
	}
	
	if (decplaces == 0) {
		var fmtdnum = formatInteger(theNum,decplaces);
	} else {
		var fmtdnum = formatRealNum(theNum,decplaces);
	}
	if (addcommas) {
		fmtdnum = commaFmt(fmtdnum);
	}
	theNum.value = fmtdnum;
	return true;
}


// SUBMIT VALIDATION

function replace_Char (unwantedChar,wantedChar,theStr) {
	while ((x=theStr.indexOf(unwantedChar)) != -1) {
		theStr = theStr.substring(0,x) + wantedChar 
			+ theStr.substring(x+unwantedChar.length,theStr.length);
	}	
	return theStr;
}

function parse_Wildcards (theStr,minWildcardPosition,noWarning) {
	theStr = scrub_String_Unwanted(theStr,"%_");
	if (minWildcardPosition == 0) {
		if (theStr.indexOf("*") != -1 || theStr.indexOf("?") != -1 ) {
			if (!noWarning)
				alert("Wildcards are not allowed in this field.");
			theStr = replace_Char("*","",theStr);
			theStr = replace_Char("?","",theStr);
		}
	} else {
		var tmpStr = theStr.substring(0,minWildcardPosition);
		if (tmpStr.indexOf("*") != -1 || tmpStr.indexOf("?") != -1 ) {
			if (!noWarning)
				alert("A wildcard can only be used after character " + minWildcardPosition 
					+ " in this field.");
			theStr = replace_Char("*","",theStr);
			theStr = replace_Char("?","",theStr);
		} else {
			var x = theStr.indexOf("*");
			if (x != -1) {
				tmpStr = theStr.substring(x+1,theStr.length);
				if (tmpStr.indexOf("*") != -1 ) {
					if (!noWarning)
						alert("Only one * wildcard is allowed in this field.");
					theStr = replace_Char("*","",theStr);
					theStr = replace_Char("?","",theStr);
				}
			}
		}
	}
	return theStr;
}


function scrub_String_Unwanted(theStr,charsUnwanted) {
	// eliminate all unwanted chars
	var result = "";
	var theChar = "";
	var ok = true;
	var i = 0;
	for(i=0;i<=theStr.length;i++) {
		theChar = theStr.charAt(i);
		if (theChar == '"') // really bad ones
			result += "`"
		else if (theChar == "'")
			result += "`"
//		else if (theChar == "`")
//			theChar = ""
		else if (charsUnwanted.indexOf(theChar) == -1)
 			result += theChar;
	}
	return result;
}


function scrub_Text (theStr,makeUpper,minWildcardPosition,allowQuotes) {
// strip spaces off ends of string
	theStr += "";
	if (theStr == "null" || theStr == "")
		return "";
	for(var i=0; i<theStr.length; i++) {
		if(theStr.charAt(0) != " ")
			break;
		theStr = theStr.substring(1,theStr.length);
	}
	for(i=theStr.length-1; i>=0; i--) {
		if(theStr.charAt(i) != " ")
			break;
		theStr = theStr.substring(0,i);
	}

	var perc = "";
	if (makeUpper) {
		theStr = theStr.toUpperCase();
		perc = "%_";
	}
	if (allowQuotes != 'true')
		theStr = scrub_String_Unwanted(theStr,perc);

//	if (allowQuotes == 'undefined' || allowQuotes != 'true')
//		theStr = scrub_String_Unwanted(theStr,"");
//
//	if (makeUpper)
//		theStr = theStr.toUpperCase();

	if (minWildcardPosition && minWildcardPosition > '')
		theStr = parse_Wildcards (theStr,minWildcardPosition);

	return theStr;
}

function str_Empty (theFormObj){
	if (theFormObj.value+"" == "null")
		return true;
	else if (theFormObj.value == "")
		return true;
	return false;
}

function popup_Empty(theMenuObj) {
	// if the object does not exist, then assume it is ok
	if (!theMenuObj) { return false; }

	var theSelection = theMenuObj.selectedIndex;
	if (theSelection == -1)
		return true;
	else if (theMenuObj.options[theSelection].value == '')
		return true;
	else
		return false;
}

function field_Empty (theFormObj){
	if (!theFormObj) {
		//alert("Please report this to systems support.\nUNKOWN FORM OBJECT"+theFormObj);
		//return false;
		return false;
	}
	//alert("field_Empty: " + theFormObj.name + " / " + theFormObj.type);
	var theType = theFormObj.type;
	if (theType == undefined) { return false; }
	if (theType.indexOf('select') != -1)
		return popup_Empty(theFormObj)
	else
		return str_Empty (theFormObj)
}



function list_Empty(theMenuObj) {
	var isEmpty = true;
	for(i=1;i<theMenuObj.length;i++) {
		if (theMenuObj.options[i].selected)
			isEmpty = false;
	}
	return isEmpty;
}

function dateOK(dayObj,monthObj,yearObj) {
	var dayEmpty = popup_Empty(dayObj);
	var monthEmpty = popup_Empty(monthObj);
	var yearEmpty = popup_Empty(yearObj);
	if (dayEmpty&&monthEmpty&&yearEmpty)
		return true;
	if (!dayEmpty&&!monthEmpty&&!yearEmpty)
		return true;
	return false;
}

function dateRange_OK(fromDayObj,fromMonthObj,fromYearObj,toDayObj,toMonthObj,toYearObj)
{
	var fromDay = fromDayObj.options[fromDayObj.selectedIndex].value ;
	var fromMonth =fromMonthObj.options[fromMonthObj.selectedIndex].value;
	var fromYear = fromYearObj.options[fromYearObj.selectedIndex].value;
	var toDay = toDayObj.options[toDayObj.selectedIndex].value;
	var toMonth = toMonthObj.options[toMonthObj.selectedIndex].value;
	var toYear = toYearObj.options[toYearObj.selectedIndex].value;
	if (toDay.length == 1)
		toDay = '0'+toDay;
	if (toMonth.length == 1)
		toMonth = '0'+toMonth;
	if (fromDay.length == 1)
		fromDay = '0'+fromDay;
	if (fromMonth.length == 1)
		fromMonth = '0'+fromMonth;
	var fromDate = fromYear+""+fromMonth+""+fromDay;
	var toDate = toYear+""+toMonth+""+toDay;
	if (parseInt(fromDate) > parseInt(toDate))
		return false;
	return true;
}

function numberRange_OK(fromNumObj,toNumObj)
{
	if (fromNumObj.value == "" || toNumObj.value == "")
		return true;
		
	var tmpFromFloat = parseFloat(filterNum(fromNumObj.value));
	var tmpToFloat = parseFloat(filterNum(toNumObj.value));
	if (tmpToFloat < tmpFromFloat) {
		alert(toNumObj.name+"  is greater than  "+toNumObj.name+"   Please re-enter");
		fromNumObj.value = "";
		toNumObj.value = "";
		fromNumObj.focus();
		return false;
	}
	return true;
}

function wildcard_Alert () {
	alert('Wildcard Search Enabled\n  "?" - Searches for any single character.\n'
		+ '  "*" - Searches for any characters of any length.');
}

function scrub_multi_value_field(fieldContents,minWildcardPosition) {
// Scrub fields that allow for multiple comma delimited values for queries
	var result = "";
	if (fieldContents == "" || fieldContents=='undefined')
		return "";
	if (minWildcardPosition == "" || minWildcardPosition=='undefined')
		minWildcardPosition = 0;

	fieldContents = scrub_Text (fieldContents,true);
	if (fieldContents.indexOf(",") == -1) {
			result = parse_Wildcards (fieldContents,minWildcardPosition);
	}
	else {
		var fieldContents_Array = fieldContents.split(",");
	
		for(var sc_x=0;sc_x < fieldContents_Array.length; sc_x++) {
	  		if (fieldContents_Array[sc_x] == "") 
	  			continue;
	  		if(fieldContents_Array[sc_x].charAt(0) == " ")
				fieldContents_Array[sc_x] = fieldContents_Array[sc_x].substring(1,fieldContents_Array[sc_x].length);
	  		if(fieldContents_Array[sc_x].charAt(fieldContents_Array[sc_x].length - 1) == " ")
				fieldContents_Array[sc_x] = fieldContents_Array[sc_x].substring(0,fieldContents_Array[sc_x].length - 1);
			result = result + parse_Wildcards (fieldContents_Array[sc_x],minWildcardPosition);
			result = result + ",";
		}
		// remove commas from the end of the string
		for(sc_i=result.length-1; sc_i>=0; sc_i--) {
			if(result.charAt(sc_i) != ",")
				break;
			result = result.substring(0,sc_i);
		}
	}
	return result;
}

// onChange='return scrub_select_mult(this, 5);' //
function scrub_select_mult(elem, maxn) { 
	var valid = true;
	var cnt = 0;
	for (var i=0; i<elem.options.length; i++) {
		if (valid) {
			if (elem.options[i].selected) { 
				cnt ++;
				if (cnt > maxn) { 
					valid = false;
					alert("You can select only " + maxn + " items in the list"); 
					elem.options[i].selected = false; 
				}
			}
		} else {
			elem.options[i].selected = false; 
		}
	}
	return valid; 
}

// CoptText function
// Takes in 2 form elements origin  - destination

function copyText(origElem, destElem) {
    if (destElem.value > '') {
       if (confirm("Data Exists in the field you are copying to.\n Do you wish to continue ?")) {
          destElem.value = origElem.value;
       } 
    } else {
         destElem.value = origElem.value;
    }
}
/* Function: check_CriteriaCount
 * Desc: To determine if sufficient fields have been selected to continue
 * Criteria:
 *        nMinimum: Minimum number of elements that must be selected
 *        sIgnore: Comma delimited list of fields to ignore - eg: "sortorder,sortname,"
 *        sAutoAccept: Comma delimited list of fields to autoaccept if they are filled in
 */
function check_CriteriaCount(nMinimum, sIgnore, sAutoAccept) {
	var form = document.forms[1];	
	
	// get the minimum number of fields that must be selected
	var nMin = Number(nMinimum);
	var nCriteriaCount = 0;

	for (var nCounter = 0; nCounter < form.elements.length; nCounter++) {
		// first check if we are to ignore this element
		if (sIgnore.indexOf(form.elements[nCounter].name + ",") > -1)
			continue;
		switch(form.elements[nCounter].type) {
			case "text":
				// check if the field was filled
				if (form.elements[nCounter].value != "") {
					// now check if we auto accept it
					if (sAutoAccept.indexOf(form.elements[nCounter].name + ",") > -1) {
						nCriteriaCount = nMinimum;
					} else {
						nCriteriaCount++;
					}
				}				
				break;
				
			case "select-one":
				// check if the field was filled
				if (form.elements[nCounter].selectedIndex != 0) {
					// now check if we auto accept it
					if (sAutoAccept.indexOf(form.elements[nCounter].name + ",") > -1) {
						nCriteriaCount = nMinimum;
					} else {
						nCriteriaCount++;
					}
				}				
				break;
				
			case "select-multiple":
				// check if the field was filled
				if (form.elements[nCounter].selectedIndex != -1 && form.elements[nCounter].selectedIndex != 0) {
					// now check if we auto accept it
					if (sAutoAccept.indexOf(form.elements[nCounter].name + ",") > -1) {
						nCriteriaCount = nMinimum;
					} else {
						nCriteriaCount++;
					}
				}				
				break;
			case "hidden":
				// we can ignore these
				break;
			default:
				// we can ignore any other types of tags
		}
		if (nCriteriaCount >= nMin) 
			break;
	}

	if (nCriteriaCount < nMin) {
		alert("You must select at least "+ nMin +" search criteria.");
			return false;
	}

	return true;
}


// Postal Code Check and Scrub space
function checkPostal(theObject,removeSpace) {
	var a = theObject.value;
	var b = "";
	var u = "";
	var numString="1234567890";
	var failed = false;
	if (a==' ') {
		return true;
	}

	a = scrub_Text(a,true);
	a = scrub_String_Unwanted(a," ");
	if (a.length < 1)
		return true;
		
	for(i=0;i<=5;i++) {
		var u = a.charAt(i);
		
		if (i==1||i==3||i==5) {
			if (!isNum(u)) 
				failed=true;
		} 
		else {
			if (isChar(u)) 
				u=u.toUpperCase();
			else 
				failed=true;
		}
		var b = b + u;
	}
	if (!removeSpace)
	  b = b.substring(0,3)+" "+b.substring(3,6);

	theObject.value = b;

	return !(failed);
}

function isNum(inString)  {
	if(inString.length!=1) 
		return false;
	var refString="1234567890";
	if (refString.indexOf(inString,0) == -1) 
		return false;
	return true;
}

function isChar(inString)  {
	if(inString.length!=1) 
		return false;
	var refString="abcdefghijklmnopqrstuvwxyzABCEDFGHIJKLMNOPQRSTUVWXYZ";
	if (refString.indexOf(inString,0) == -1) 
		return false;
	return true;
}

function IsValidTime(timeObj,allowMilitary,allowSeconds) {
// Checks if time is in HH:MM:SS AM/PM format.
// The seconds and AM/PM are optional.


var timeStr = timeObj.value;
var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
var matchArray = timeStr.match(timePat);

if (!allowMilitary || allowMilitary=='')
	allowMilitary = false;
	
if (!allowSeconds || allowSeconds=='')
	allowSeconds = false;

if (matchArray == null) {
alert("Time is not in a valid format.");
return false;
}
hour = matchArray[1];
minute = matchArray[2];
second = matchArray[4];
ampm = matchArray[6];

if (second=="") { second = null; }
if (ampm=="") { ampm = null }

if (allowMilitary) {
	if (hour < 0  || hour > 23) {
			alert("Hour must be between 1 and 12. (or 0 and 23 for military time)");	
		return false;
	} 
	if (hour <= 12 && ampm == null) {
		if (confirm("Please indicate which time format you are using.  OK = Standard Time, CANCEL = Military Time")) {
			alert("You must specify AM or PM.");
		return false;
   }
}

} else {
	if (hour < 1  || hour > 12) {
		alert("Hour must be between 1 and 12.");	
		return false;
	} 
	if (hour <= 12 && ampm == null) {
		alert("You must specify AM or PM.");
		return false;
   }

}

if  (hour > 12 && ampm != null) {
	alert("You can't specify AM or PM for military time.");
	return false;
}
if (minute<0 || minute > 59) {
	alert ("Minute must be between 0 and 59.");
	return false;
}
if (allowSeconds) {
	if (second != null && (second < 0 || second > 59)) {
		alert ("Second must be between 0 and 59.");
		return false;
	}
} else {
	if (second != null ) {
		alert ("Seconds are not needed , Please remove.");
		return false;
	}
	 
}
if (timeStr.indexOf(' PM') == -1 && timeStr.indexOf(' AM') == -1) {
	if (timeStr.indexOf('M') != -1)
		timeStr = timeStr.substr(0,(timeStr.indexOf('M')-1))+" "+timeStr.substr(timeStr.indexOf('M')-1);
}
		
if (hour.charAt(0) =='0')
	timeStr = timeStr.substr(1);
timeObj.value = timeStr	
return true;
}

// Functions used to validate and test the Vitual Tour URL A variable called testURL_Win must be declared on page
function testVtourURL() {
	var testURL_v = document.form1.txtURL.value;
	if (testURL_v==''||testURL_v=='http://' ) 
		alert("Fill in web site URL before testing .\n")
	else {
			testURL_Win = window.open('','Site','width=520,height=320');
			testURL_Win.location = testURL_v;
			testURL_Win.focus();
	}
}

function testIDXVtourURL() {
        var testURL_v = document.form1.idxURL.value;
        if (testURL_v==''||testURL_v=='http://' )
                alert("Fill in web site URL before testing .\n")
        else {
                        testURL_Win = window.open('','Site','width=520,height=320');
                        testURL_Win.location = testURL_v;
                        testURL_Win.focus();
        }
}

function checkVtourURL(vtourURL) {
	var testURL_v = vtourURL.value;
	if (testURL_v !='' &&  testURL_v.substr(0,7)!='http://' ) {
		alert("In order to function properly, the prefix of http:// must remain on the URL  .\n  ")
		vtourURL.value = 'http://'+testURL_v;
	}
}


function closeVtourWin() {
	if (testURL_Win && !testURL_Win.closed)
		testURL_Win.close();
}

function testSalesBroucherURL() {
    var testURL = document.form1.sales_broucher.value;
    if (testURL==''||testURL=='http://' )
        alert("Fill in sales brochure URL before testing .\n")
    else {
            testSBURL_Win = window.open('','Site','width=520,height=320');
            testSBURL_Win.location = testURL;
            testSBURL_Win.focus();
    }
}





function scrub_multi_numeric_field(fieldContents) {
// Scrub fields that allow for multiple comma delimited numeric values for queries 
	var result = "";
	if (fieldContents == "" || fieldContents=='undefined')
		return "";

	fieldContents = scrub_String (fieldContents,'0123456789,');
	if (fieldContents.indexOf(",") == -1) {
			result = fieldContents;
	}
	else {
		var fieldContents_Array = fieldContents.split(",");
	
		for(var sc_x=0;sc_x < fieldContents_Array.length; sc_x++) {
	  		if (fieldContents_Array[sc_x] == "") 
	  			continue;
	  		if(fieldContents_Array[sc_x].charAt(0) == " ")
				fieldContents_Array[sc_x] = fieldContents_Array[sc_x].substring(1,fieldContents_Array[sc_x].length);
	  		if(fieldContents_Array[sc_x].charAt(fieldContents_Array[sc_x].length - 1) == " ")
				fieldContents_Array[sc_x] = fieldContents_Array[sc_x].substring(0,fieldContents_Array[sc_x].length - 1);
			result = result + fieldContents_Array[sc_x];
			result = result + ",";
		}
		// remove commas from the end of the string
		for(sc_i=result.length-1; sc_i>=0; sc_i--) {
			if(result.charAt(sc_i) != ",")
				break;
			result = result.substring(0,sc_i);
		}
	}
	return result;
}

// SCRUB TEXT AREA 

function scrub_TextArea (objTextArea,makeUpper,nMaxLength) {
// strip spaces off ends of string
	var theStr = objTextArea.value+"";
	if (theStr == "null" || theStr == "")
		return "";
	for(var i=0; i<theStr.length; i++) {
		if(theStr.charAt(0) != " ")
			break;
		theStr = theStr.substring(1,theStr.length);
	}
	for(i=theStr.length-1; i>=0; i--) {
		if(theStr.charAt(i) != " ")
			break;
		theStr = theStr.substring(0,i);
	}

	if (makeUpper) {
		theStr = theStr.toUpperCase();
	}

	var	perc = "%_";
	theStr = scrub_String_Unwanted(theStr,perc);

	if (nMaxLength && nMaxLength > '') {
		if (theStr.length > nMaxLength) {
			alert("Maximun Length of "+nMaxLength+" exceeded. \nThe entry will be truncated ");
			theStr = theStr.substring(0,nMaxLength-1);
			objTextArea.value =  theStr;
			objTextArea.focus();
			return;
		}
		
	}
	objTextArea.value =  theStr;
	return;
}


// Check Status clear fields
// first run clears only 3 fields we cna increase this as needed

function  check_status_clear_fields(objStatus,objField1,objField2,objField3) {
	if(objStatus.options.selectedIndex==0) {
 		return;
 	} else {
	 	var sStatusText = objStatus.options[objStatus.options.selectedIndex].value;
	 	var sTriggerStatus = 'STACT|STATC|STCOS|STACL|STFOR';
	 	var nIndexStatus = sTriggerStatus.indexOf(sStatusText);
	 	if (nIndexStatus==-1) 
 			return;
 		else {
 			var theType = objField1.type;
			if (theType=='select-one')
				objField1.options.selectedIndex = 0;
			else
				objField1.value="";
			
 			theType = objField2.type;
			if (theType=='select-one')
				objField2.options.selectedIndex = 0;
			else
				objField2.value="";

 			theType = objField3.type;
			if (theType=='select-one')
				objField3.options.selectedIndex = 0;
			else
				objField3.value="";
			return;
 		}
 	}

}

//**********************************************************************
// Functions for populating the major area, district and sub district
// selection boxes.
//**********************************************************************

function bNewDistrictSelection() {
//	if (document.forms[1].name == 'frmEditProspect') {
//	    return false;
//	} else {
	    return true;
//	}
}

function bIsWindows() {
	var bResult = false;
// never return true, as the sub district windowie thing is not working correctly.  it does not reload on the back button the way it is supposed to.
//	if (navigator.appVersion.indexOf("Win")!=-1) { bResult = true; }
	return bResult;
}

function clearSelectCtrl_Other(ctrlList) {
	for (var i = 1; i <= ctrlList.length; i++) {
		ctrlList.options[i] = null; 
	}
	ctrlList.length=1;
}

function clearSelectCtrl_Windows(ctrlList) {
	var eachGroup = ctrlList.firstChild;
	while (eachGroup) {
		lastGroup = eachGroup;
		eachGroup = lastGroup.nextSibling;
		ctrlList.removeChild(lastGroup);
	}
	ctrlList.appendChild(document.createElement('option'));
}

function clearSelectCtrl(ctrlList) {
	if (bIsWindows()) {
		clearSelectCtrl_Windows(ctrlList);	
	} else {
		clearSelectCtrl_Other(ctrlList);
	}	
}

// Used for London to populate the districts and subdistrict selects
function oldfillMultiDistrictFromArray(selectCtrl,selectCtrl2, selectMajor_area) {
    var i;
    var j;;
    var k;
    var l;
    for (i = 1; i <= selectCtrl.length; i++) {
        selectCtrl.options[i] = null;
    }
    selectCtrl.length=1;
    for (i = 1; i <= selectCtrl2.length; i++) {
        selectCtrl2.options[i] = null;
    }
    selectCtrl2.length=1;
    j = 1;
    if (selectMajor_area != null) {
        // add new items
        for (i = 1; i < selectMajor_area.length; i++) {
            if (selectMajor_area.options[i].selected == true) {
                l=i;
                var itemArray = districts[i-1];
                for (k = 0; k < itemArray.length; k++) {
                    selectCtrl.options[j] = new Option(String(itemArray[k][0]), String(itemArray[k][1]), false, false);
//                  selectCtrl.options[j] = new Option(itemArray[k][0]);
//                  selectCtrl.options[j].value = itemArray[k][1];
                    j++;
                }
            }
    }
    if(j==2) {
        selectCtrl.selectedIndex = 1;
//      selectCtrl.options[1].selected = true;
        oldfillMultiSdistrictFromArray(selectCtrl2, selectCtrl,selectMajor_area);
    } else {
        // select first item (prompt) for sub list
        if (j>2) { selectCtrl.selectedIndex = 0;}
//      if (j>2) { selectCtrl.options[0].selected = true;}
        oldfillMultiSdistrictFromArray(selectCtrl2, selectCtrl,selectMajor_area);
    }
    if ( j< 10 ) {selectCtrl.size=j};
    if ( j>= 10) {selectCtrl.size=10};
   }
}

function oldfillMultiSdistrictFromArray(selectCtrl,selectDistrict,selectMajor_area) {
var i,k,l,m;

var district_code;
// empty existing items
for (i = 1; i <= selectCtrl.length; i ++) {
    selectCtrl.options[i] = null;
}
selectCtrl.length=1;
j=1;
if (selectDistrict != null) {
    // add new items
    for (i = 1; i < selectDistrict.length; i++) {
        if (selectDistrict.options[i].selected == true) {
            district_code=selectDistrict.options[i].value;
            for (k = 1; k < selectMajor_area.length; k++) {

                if (selectMajor_area.options[k].selected ==true) {

                    var itemArray = districts[k-1];

                    for (l = 0; l < itemArray.length; l++) {
                        //alert(district_code+ " = "+itemArray);
                        if (itemArray[l][1]==district_code) {
                            var subdistricts = itemArray[l];
                            //alert( subdistricts);
                            for (m = 2; m < subdistricts.length; m++) {
                                var dupFlag = false;
                                for (var n=0; n < selectCtrl.length;n++ ) {
                                    if (selectCtrl.options[n].value == subdistricts[m][1]) {
                                        dupFlag = true;
                                    }
                                }
                                if (!dupFlag) {
                                    selectCtrl.options[j] = new Option(String(subdistricts[m][0]), String(subdistricts[m][1]), false, false);
                                    //selectCtrl.options[j] = new Option(subdistricts[m][0]);
                                    //selectCtrl.options[j].value = subdistricts[m][0];
                                    j++;
                                }

                            }
                        }
                    }
                }
            }
        }
    }
    // select first item (prompt) for sub list
    if(j==2) { selectCtrl.selectedIndex = 1; }
    if (j>2) { selectCtrl.selectedIndex = 0; }
//  if (j>2) { selectCtrl.options[0].selected = true;}
    if ( j< 10 ) {selectCtrl.size=j} else {selectCtrl.size=10} ;

   }
}

// Used for London to populate the districts and subdistrict selects
function fillMultiDistrictFromArray(selectCtrl,selectCtrl2, selectMajor_area) {
	var i,j,k,l;
	var sOptionTextPrefix = "";

	if (!bNewDistrictSelection()) {
	    oldfillMultiDistrictFromArray(selectCtrl,selectCtrl2, selectMajor_area);
	} else { 
		clearSelectCtrl(selectCtrl);
		clearSelectCtrl(selectCtrl2);
	
		j = 1;
		if (selectMajor_area != null) {
			// add new items
			for (i = 1; i < selectMajor_area.length; i++) {
				if (selectMajor_area.options[i].selected == true) {
					l=i;
	
					if (bIsWindows()) {
						// add group item
						var OptionGroup = document.createElement("optgroup");
						OptionGroup.label = selectMajor_area.options[i].text;
						selectCtrl.appendChild(OptionGroup); 
						j++;
					} 	
					// add the list of items				
					var itemArray = districts[i-1];
					for (k = 0; k < itemArray.length; k++) {
						if (bIsWindows()) {
							var NewOption = document.createElement("option");
							NewOption.text = itemArray[k][0];
							NewOption.innerText = itemArray[k][0];
							NewOption.value = String(selectMajor_area.options[i].value) + '^' + String(itemArray[k][1]);
							selectCtrl.appendChild(NewOption); 
						} else {
							selectCtrl.options[j] = new Option(sOptionTextPrefix + String(itemArray[k][0]), String(selectMajor_area.options[i].value) + '^' + String(itemArray[k][1]), false, false);
						}
						j++;
					}
				}
			}
			if(j==2) { 
				selectCtrl.selectedIndex = 1; 
				fillMultiSdistrictFromArray(selectCtrl2, selectCtrl,selectMajor_area);
			} else {
				// select first item (prompt) for sub list
				if (j>2) { selectCtrl.selectedIndex = 0;}
				fillMultiSdistrictFromArray(selectCtrl2, selectCtrl,selectMajor_area);
			}
			if ( j< 10 ) {selectCtrl.size=j};
   			if ( j>= 10) {selectCtrl.size=10};	
		}
	} 	
}

function fillMultiSdistrictFromArray(selectCtrl,selectDistrict,selectMajor_area) {
	var i,k,l,m;
	var district_code;

    if (!bNewDistrictSelection()) {
	    oldfillMultiSdistrictFromArray(selectCtrl,selectDistrict,selectMajor_area);
	} else {
		clearSelectCtrl(selectCtrl);
	
		j=1;
		if (selectDistrict != null) {
			// add new items
			for (i = 1; i < selectDistrict.length; i++) {
				if (selectDistrict.options[i].selected == true) {
		  			district_code=selectDistrict.options[i].value;
					district_code = district_code.substring(district_code.lastIndexOf("^") + 1);
			  		for (k = 1; k < selectMajor_area.length; k++) {
			  			if (selectMajor_area.options[k].selected == true) {
		  					var itemArray = districts[k-1];
		  					for (l = 0; l < itemArray.length; l++) {
			  					if (itemArray[l][1]==district_code) {
			  						var subdistricts = itemArray[l];
									if (bIsWindows()) {
										// add group item
										var OptionGroup = document.createElement("optgroup");
										OptionGroup.label = selectDistrict.options[i].text;
										selectCtrl.appendChild(OptionGroup); 
										j++;
									} else {
										sOptionTextPrefix = String(selectDistrict.options[i].text);
										if (sOptionTextPrefix != "North" && sOptionTextPrefix != "South" && sOptionTextPrefix != "East") {
											sOptionTextPrefix = "";
										} else {
											sOptionTextPrefix += " - ";	
										}
									}	

									for (m = 2; m < subdistricts.length; m++) {
										if (subdistricts[m][0] != ' ' && subdistricts[m][1] != ' ') { 
										if (bIsWindows()) {
	  					                   	var NewOption = document.createElement("option");
	                					    NewOption.text = subdistricts[m][0];
					    	                NewOption.innerText = subdistricts[m][0];
	                					    NewOption.value = String(selectMajor_area.options[k].value) + '^' + String(district_code) + '^' + String(subdistricts[m][1]);
					            	        selectCtrl.appendChild(NewOption);
										} else {
											selectCtrl.options[j] = new Option(sOptionTextPrefix + String(subdistricts[m][0]), String(selectMajor_area.options[k].value) + '^' + String(district_code) + '^' + String(subdistricts[m][1]), false, false);
										}
										j++;
										}


									}
								}
							}
						}
					}
				}
			}
			// select first item (prompt) for sub list
			if(j==2) { selectCtrl.selectedIndex = 1; }
			if (j>2) { selectCtrl.selectedIndex = 0; }
			if ( j< 10 ) {selectCtrl.size=j} else {selectCtrl.size=10} ;
		}
	}
}


// data entry screen - popup fill three level areas - Standard code set

function fillDistrictFromArray(selectCtrl,selectCtrl2, itemArray) {
var i, j;
// empty existing items
//for (i = selectCtrl.options.length; i >= 0; i--) {
//	selectCtrl.options[i] = null; 
//}
//for (i = selectCtrl2.options.length; i >= 0; i--) {
//	selectCtrl2.options[i] = null; 
//}
clearSelectCtrl(selectCtrl);
clearSelectCtrl(selectCtrl2);

j = 1;
if (itemArray != null) {
	// add new items
	for (i = 0; i < itemArray.length; i++) {
		selectCtrl.options[j] = new Option(itemArray[i][0], itemArray[i][1], false, false);
//		if (itemArray[i][1] != null) {
//			selectCtrl.options[j].value = itemArray[i][1]; 
//		}
		j++;
	}
	if(j==2) { 
		selectCtrl.options[1].selected = true; 
		fillSdistrictFromArray(selectCtrl2, districts[document.form1.major_area.selectedIndex-1][selectCtrl.selectedIndex-1]);
	} else {
	// select first item (prompt) for sub list
	selectCtrl.options[0].selected = true;
	}
   }
}


function fillSdistrictFromArray(selectCtrl, itemArray, goodPrompt, badPrompt, defaultItem) {
var i, j;
// empty existing items
//for (i = selectCtrl.options.length; i >= 0; i--) {
//	selectCtrl.options[i] = null; 
//}
clearSelectCtrl(selectCtrl);
j = 1;
if (itemArray != null) {
	// add new items
	for (i = 2; i < itemArray.length; i++) {
		selectCtrl.options[j] = new Option(itemArray[i][0]);
		if (itemArray[i][1] != null) {
			selectCtrl.options[j].value = itemArray[i][1]; 
		}
		j++;
	}
	// select first item (prompt) for sub list
	selectCtrl.options[0].selected = true;
   }
}

// Password Validation

function bValidatePassword (sPassword) {
        var nMinLength = 6;
        var nMaxLength = 10;
        var sMyPassword = sPassword;

        if (sMyPassword.indexOf(" ") > 0) {
                alert("Passwords cannot contain spaces");
                return false;
        }

        if (sMyPassword.length < 6) {
                alert("Passwords must be between 6 and 10 characters long");
                return false;
        }

        return true;
}

// VALIDATE AGE
function validateAge(theAge,min,max,allowableText) {
		// allowable text of the form 'val1,val2,val3' for multiple strings

        // strip spaces off ends of string
        var theStr = theAge.value;
        theStr += "";
        if (theStr == "null" || theStr == "")
                return "";
        for(var i=0; i<theStr.length; i++) {
                if(theStr.charAt(0) != " ")
                        break;
                theStr = theStr.substring(1,theStr.length);
        }
        for(i=theStr.length-1; i>=0; i--) {
                if(theStr.charAt(i) != " ")
                        break;
                theStr = theStr.substring(0,i);
        }
		
		// Check to see if special allowable text string
		var sAllowed = "," + allowableText + ",";
        theStr = theStr.toUpperCase();

        if (sAllowed.indexOf("," + theStr+ ",") > -1) {
        	theAge.value = theStr;
           return true;
        }
        var tmpFloat = parseFloat(filterNum(theStr));

        if (tmpFloat < min || tmpFloat > max || isNaN(tmpFloat)) {
                alert("Please enter a number between " + min + " and " + max + " or "+ allowableText);
                theAge.value = "";
                theAge.focus();
                return false;
        }
        theAge.value = tmpFloat;
        return true;
}

//MULTI-FAMILY LISTING ENTRY AUTO CALCULATE TOTAL INCOME
function nAuto_calc_approx_total_income() {

  var sTotalRentInc = scrub_String(document.form1.totalrentinc.value,"0123456789",".");
  var sLaundryInc = scrub_String(document.form1.laundryinc.value,"0123456789",".");
  var sOtherInc = scrub_String(document.form1.otherinc.value,"0123456789",".");
  //document.form1.appxtotalinc.value = scrub_String(document.form1.appxtotalinc.value,"0123456789",".");
  var nTotalIncome = 0;

  nTotalIncome = Number(sTotalRentInc) + Number(sLaundryInc) + Number(sOtherInc);
  document.form1.appxtotalinc.value = format_Number(nTotalIncome,2,true);
}

//MULTI-FAMILY LISTING ENTRY AUTO CALCULATE TOTAL EXPENSES
function nAuto_calc_approx_total_exp() {

  var sInsuranceExp = scrub_String(document.form1.insurance.value,"0123456789",".");
  var sMtncExp = scrub_String(document.form1.repmtce.value,"0123456789",".");
  var sWaterSewerExp = scrub_String(document.form1.watersewer.value,"0123456789",".");
  var sSnowGarbageExp = scrub_String(document.form1.snowgarbage.value,"0123456789",".");
  var sHeatBillExp = scrub_String(document.form1.heatbill.value,"0123456789",".");
  var sHydroBillExp = scrub_String(document.form1.hydrobill.value,"0123456789",".");
  var sManageExp = scrub_String(document.form1.management.value,"0123456789",".");
  var sOtherCostsExp = scrub_String(document.form1.othercosts.value,"0123456789",".");
  var sTaxesExp = scrub_String(document.form1.taxescosts.value,"0123456789",".");
  //document.form1.appxtotalexp.value = scrub_String(document.form1.appxtotalexp.value,"0123456789",".");
  var nTotalExp = 0;

 nTotalExp =  Number(sInsuranceExp) + Number(sMtncExp) + Number(sWaterSewerExp) + Number(sSnowGarbageExp) + Number(sHeatBillExp) + Number(sHydroBillExp) + Number(sManageExp) + Number(sOtherCostsExp) + Number(sTaxesExp);
 document.form1.appxtotalexp.value = format_Number(nTotalExp,2,true);

}

//MULTI-FAMILY LISTING ENTRY AUTO CALCULATE TOTAL NET INCOME
function nAuto_calc_approx_net_total() {

  var sApproxTotalInc = scrub_String(document.form1.appxtotalinc.value,"0123456789",".");
  var sApproxTotalExp = scrub_String(document.form1.appxtotalexp.value,"0123456789",".");
  var nTotalIncome = 0;
 
  nTotalIncome = Number(sApproxTotalInc) - Number(sApproxTotalExp);
  document.form1.appxnetinc.value = format_Number(nTotalIncome,2,true);

}

//Auto populate frontage field from lotsize
function nAuto_populate_frontage() {
  var slotsize = document.form1.lotsize.value;
  var sfrontage = document.form1.frontage.value;
  var slotsize_substring = "";

  if ((sfrontage == "") || (sfrontage == "null")) {
    slotsize = slotsize.toUpperCase();
    if (slotsize.indexOf("X")!=-1) {
      slotsize_substring = slotsize.indexOf("X");
      slotsize_substring = slotsize.substring(0,slotsize_substring);
      slotsize = scrub_String(slotsize_substring,"0123456789",".");
      document.form1.frontage.value = slotsize;	
    }
  }
}

// limit an input field to a Max Length.  Alert user by default
function limitFieldLength(field, nMaxlimit, bAlertUser) {
	var sLineEnding = "\n";
	var nLineEndingCount = 0;
	
	if (field.value.indexOf(sLineEnding) != -1) {
		nLineEndingCount = nCountOccurrences(field.value, sLineEnding);
	}
	
	// line endings saving as 2 chars, therefore adjust max length accordingly
	var nTrueLimit = nMaxlimit - nLineEndingCount;
	
	if (bAlertUser == null || bAlertUser=='')
		bAlertUser = true;		
			
	// if too long...trim it!
	if (field.value.length > nTrueLimit) {
		if (bAlertUser)
			alert("The character limit of " + nMaxlimit + " for this field has been reached.");
		field.value = field.value.substring(0, nTrueLimit); 
	}

}

// Count the occurences of a substring
function nCountOccurrences(sValue, sSubstring) {
	var nPos = 0;
	var nCount = 0;
	while (sValue.indexOf(sSubstring, nPos) != -1) {
		nPos = sValue.indexOf(sSubstring, nPos) + 1;
		nCount += 1;
	}
	return nCount;
}

// link checkbox to a text field. 
//   - clicking checkbox will populate/unpopulate field with textString
//   - text entered in field may cause checkbox to check/uncheck
// Order of objects in paramter list determines flow  (object1 - master, object2 - slave)
// Sample usage edit_listing_neab.html, links taxes field and "unassessed" checkbox
function sync_checkbox_and_textfield(object1, object2, textString ) {
	if (object1.type == "checkbox" && object2.type == "text" ) {	
    // populate text field based on checkbox selection
		if (object1.checked) {
			object2.value = textString;
		} else if (object2.value == textString) {
			object2.value = "";
		}		
	} else if (object1.type == "text" && object2.type == "checkbox" ) {
		// set checkbox based on textField contents
		if (object1.value == textString) {
			object2.checked = true;
		} else {
			object2.checked = false;
		}
	} 
	// else, incorrect use
}

function autoCheckNew(ageFieldFrom) {
	if (document.getElementById('age_ne')) {
		if (ageFieldFrom.value=="0") {
			document.getElementById('age_ne').checked = true;
		}
	}
}