	
	function isNumber(number) {

		// strip commas
		number = number.replace(/,/g,'');
	
	    // check for valid number
		if ( isNaN(number) ) 
			return false;
						
	    //integer check - trap decimal
		if (number.indexOf(".") > -1)
	    	return false;
	    	
		return true;
	}
	

	function checkNumberConstraints (value, min, max) {
	
		number = new Number (value);
	
		if (number < min || number > max)
			return false;

		return true;
	}
	
	
	function isFloat(number) { 

		// strip commas
		number = number.replace(/,/g,'');
	
	    //check for valid number
		if ( isNaN(number) ) 
			return false;
	
		return true;
	}
	
	
	function isLetter(c) {
	    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
	}
	
	function isDigit (c)
	{   
	    return ((c >= '0') && (c <= '9'));
	}
	
	function isLetterOrDigit(c)
	{
	    return (isLetter(c) || isDigit(c));
	}
	
	
	function validateDate (date) {

		// for now we only support mm/dd/yyyy
		// first try splitting by '/' and see if days and months are in order
		var		dateArray = date.split ("/");
		if (dateArray.length != 3) {	// try '-'
			dateArray = date.split ("-");					
			if (dateArray.length != 3)
				return "";
		}

		if (parseInt(dateArray[0], 10) <= 0 || parseInt(dateArray[0], 10) > 12)
			return "";
		if (parseInt(dateArray[1], 10)<= 0 | parseInt(dateArray[1], 10) > 31)	// this is iffy due and dependent on the month, but we're looking for obvious problems here
			return "";
		if (parseInt(dateArray[2], 10) <= 0 || (parseInt(dateArray[2], 10) >= 100 && parseInt(dateArray[2], 10) < 1600) || (parseInt(dateArray[2], 10) > 2100))	// we'll go back as far as 1600
			return "";

		var		year = dateArray[2];
			
		// fix up year - could come in with 2 digits
		if (parseInt(dateArray[2], 10) < 100) {
			if (parseInt(dateArray[2], 10) >= 40)
				year = parseInt(dateArray[2], 10) + 1900;
			else
				year = parseInt(dateArray[2], 10) + 2000;
		}
	
		return dateArray[0] + "/" + dateArray[1] + "/" + year;
	}
	

	function addDateSlashes(dateInput, evt) {
		
		var		cur_val = document.getElementById (dateInput.id).value;
		
		if (cur_val.indexOf("/") == -1 || (cur_val.indexOf("/") == 2 && (cur_val.lastIndexOf("/") == 2 || cur_val.lastIndexOf("/") == 5)))
			matchPattern (dateInput.id, "##/##/####", false);

		return true;
		
/*		var key = getkey(evt);
		if (key != 8 && key != 37 && key != 39 && key != 46 && key != 13) {
			var date = dateInput.value;
			if(date != null) {
				if(date.length == 2 || date.length == 5) {
					date += "/";
				}
				else if(date.length == 3 && date.substring(3,4) != "/") {
					date = date.substring(0,2) + "/" + date.substring(2);
				}
				else if(date.length == 6 && date.substring(6,7) != "/") {
					date = date.substring(0,5) + "/" + date.substring(5);
				}
			}
			dateInput.value = date;
		}*/
	}
	
	function validateExpirationDate (date) {

		// for now we only support mm/yyyy

		// first try splitting by '/' and see if days and months are in order
		var		dateArray = date.split ("/");
		if (dateArray.length != 2) {	// try '-'
			dateArray = date.split ("-");					
			if (dateArray.length != 2)
				return "";
		}

		if (parseInt(dateArray[0], 10) <= 0 || parseInt(dateArray[0], 10) > 12)
			return "";
		if (parseInt(dateArray[1], 10) <= 0 || (parseInt(dateArray[1], 10) >= 100 && parseInt(dateArray[1], 10) < 2006) || (parseInt(dateArray[1], 10) > 9999))
			return "";

		var		year = dateArray[1];
			
		// fix up year - could come in with 2 digits
		if (parseInt(dateArray[1], 10) < 100) {
			year = parseInt(dateArray[1], 10) + 2000;
		}
	
		return dateArray[0] + "/" + year;
	}
	
	
	function validateMoney (money) {
	
		// strip out all ,'s and $'s - we don't want them
		money = money.replace (/,/g,'');	
		money = money.replace (/\$/g,'');	

		// verify that we are a real number
		if (isNaN (parseInt (money)) && isNaN (parseFloat (money)))
			return "";

		// strip leading zeros
		while (money.substr (0,1) == '0')
			money = money.substring (1, money.length);

		// due to possible round off problems with large numbers, attach "cents" via string
		var		index = money.indexOf (".");
		if (index == -1)
			money = money + ".00";
		else {
			if (index + 3 > money.length) {	// zero pad
				for (var i = money.length; i < index + 3; i++)
					money += "0";
			}
			else // chop
				money = money.substring (0, index + 3);
		}
		
		// parse and put in , in appropriate places
		index = money.indexOf (".");
		var		cents = money.substring (index + 1, money.length);
		var		dollars = money.substring (0, index);
		var		full = parseInt(dollars.length / 3);
		var		parts = dollars.length % 3;
		var		fnl = "$" + dollars.substr (0, parts);
		
		for (var i = 0; i < full; i++) {
			var		part = dollars.substr (parts + (i * 3), 3);
			
			if (i != 0 || parts != 0)
				fnl += ",";
			fnl += part;
		}
		
		fnl += "." + cents;

		return (fnl);
	}
	
	
	function getMoneyAmt (money) {
	
		// strip out all ,'s and $'s - we don't want them
		money = money.replace (/,/g,'');	
		money = money.replace (/\$/g,'');	

		// verify that we are a real number
		if (isNaN (parseInt (money)) && isNaN (parseFloat (money)))
			return "";
			
		return parseFloat (money);
	}

	function isValidZip (zip) {
	
		// can only contain numbers and '-' character
		
		var			c;
		
		for (var i = 0; i < zip.length; i++) {
			c = zip.charAt (i);
			
			if (c != '-' && ! isDigit (c))
				return false;
		}
		
		// next make sure valid format #####-####
		if (zip.indexOf ('-') == -1) {	// make sure only 5 or 9 characters
		
			if (zip.length != 5 && zip.length != 9)
				return false;
		}
		else {	// split at '-' char, better be 5 and 4
			var		main = zip.substring (0, zip.indexOf ('-'));
			var		end = zip.substring (zip.indexOf ('-') + 1, zip.length);

			if (main.length != 5 || end.length != 4)
				return false;
		}
		
		return true;
	}	
	
	
	function escapeSingleQuote(text) {
			
			var newText;	
			newText = text.replace(/'/g,"\\'");				
			return newText;
		
	}
	
	
	function validateZipInput (evt) {

		var validChars = "-0123456789";
		
		return validateKeyInput (evt, validChars);
	}


	function validateMoneyInput (evt) {

		var validChars = "$.0123456789,";
		
		return validateKeyInput (evt, validChars);
	}


	function validateNumberInput (evt) {

		var validChars = "-0123456789,";
		
		return validateKeyInput (evt, validChars);
	}

	function validateYearInput (evt) {

		var validChars = "0123456789";
		
		return validateKeyInput (evt, validChars);
	}


	function validateKeyInput (evt, validChars) {

		var key, keychar;

		key = getkey(evt);
		if (key == null) 
			return true;

		// get character
		keychar = String.fromCharCode(key);

		// check goodkeys
		if (validChars.indexOf(keychar) != -1)
			return true;

		// control keys
		if ( key==null || key==0 || key==8 || key==9 || key==13 || key==27 )
		   return true;

		// else return false
		return false;
	}
	

	function getkey(evt) {

		if (window.event)
	   		return window.event.keyCode;
		else if (evt)
	   		return evt.which;
		else
	   		return null;
	}
	
	function validatePageList (pages, min, max) {
	
		var		pagelist = pages.split(",");
		
		for (var i = 0; i < pagelist.length; i++) {
			var		page = pagelist[i];
			
			if (! isNumber (page) || ! checkNumberConstraints (page, min, max))
				return false;
		}

		return true;	
	}
	
	function validateInput (inputstr, invalid_chars) {
	
		for (var i = 0; i < invalid_chars.length; i++) {
			var		chr = invalid_chars.substring(i, i+1);

			if (inputstr.indexOf (chr) != -1)
				return false;
		}
	
		return true;
	}
	
	function validateParcel (ctrlid, pat, multi) {

		matchPattern (ctrlid, pat, multi);
	}
	
	function matchPattern (ctrlid, pat, multi) {
	
		var		cur_val = document.getElementById (ctrlid).value;
		
		var		parcels;
		if (multi) {
			parcels = cur_val.split(",");
			
			if (parcels.length > 1)
				cur_val = parcels[parcels.length - 1];
		}
		
		// remove old style
		cur_val = cur_val.replace (/-/g, "");
		cur_val = cur_val.replace (/\//g, "");
				
		// apply new pattern
		//document.getElementById (ctrlid).value = cur_val;

		var		num_ct = 0;
		var		final_val = "";
		for (var i = 0; i < pat.length; i++) {
			var		chr = pat.substring(i, i+1);
			
			if (chr == '#') {
				if (cur_val.length > num_ct)
					final_val += cur_val.substring(num_ct, num_ct + 1);
				else
					break;
				
				num_ct++;
			}
			else {
				if (cur_val.length > num_ct)
					final_val += chr;
				else
					break;
			}
		}
		
		if (multi && parcels.length > 1) {
			var		p = "";
			for (var j = 0; j < parcels.length - 1; j++)
				p += parcels[j] + ",";
				
			final_val = p + final_val;
		}
			
		document.getElementById (ctrlid).value = final_val;		
	}