function validateZip(){
	var provinces = " AB,BC,MB,NB,NF,NT,NS,NT,ON,PE,QC,SK,YT"
	if(this.state != null && this.registerState == null){
		registerEvent(getElement(this.state), "onChange", "if(getElement('" + this.name + "').get() > '') validateByName('" + this.name + "')");
		this.registerState = true;
	}
	if(this.state != null && provinces.indexOf(getElement(this.state).get().toUpperCase()) > 0){
		var cleanStr = extract(this.get().toUpperCase(), NUMERIC + UPPERALPHA), i;
		if(cleanStr.length > 3)
			this.set(cleanStr.substring(0, 3) + " " + cleanStr.substring(3));
		else
			this.set(cleanStr);

		if(cleanStr.length != 6) { this.message = "Canadian postal codes are 6 characters long"; return false; }
		this.message = "Canadian postal codes are in the format Letter/Number/Letter (space) Number/Letter/Number.";
		for(i = 0; i < 6; i++)
			if(i % 2 == 0){
				if(UPPERALPHA.indexOf(cleanStr.charAt(i)) == -1) return false;
			}else{
				if(NUMERIC.indexOf(cleanStr.charAt(i)) == -1) return false;
			}
		var notInFirst = "WZ", notInPostalCode = "DFIOQU";
		if(notInFirst.indexOf(cleanStr.charAt(0)) != -1) { this.message = "Canadian postal codes may not begin with W or Z."; return false; }
		for(var i = 0; i < 6; i += 2)
			if(notInPostalCode.indexOf(cleanStr.charAt(i)) != -1) { this.message = "Canadian postal codes may not contain D, F, I, O, Q or U."; return false; }
		
		this.message = "";
		return true;
	}

	var cleanStr = extract(this.get(), NUMERIC);
	this.set((cleanStr.length <= 5) ? cleanStr : cleanStr.substring(0, 5) + '-' + cleanStr.substring(5));
	if(cleanStr.length == 5 || cleanStr.length == 9)
		return true;
	this.message = "Zip codes must be exactly 5 or 9 digits long.";
	return false;
}

function validate16Digit(){
	this.set(extract(this.get(), NUMERIC + "-"));
	if(extract(this.get(), NUMERIC).length == 16) return true;
	this.message = "16-digit MemberBenefit ID's must include exactly 16 digits.";
	return false;
}
function validatePhone(){
	var cleanStr = cleanPhone(this.get());
	this.set((cleanStr.length > 3) ? formatPhone(cleanStr) + cleanStr.substring(10) : cleanStr);
	if(cleanStr.length >= 6 && badAreaAndPrefix(cleanStr)){ this.message = "Area codes and prefixes cannot begin with 0 or 1"; return false; }
	if(cleanStr.length == 10) return true;
	this.message = "Phone numbers must contain exactly 10 digits (including area code).";
	return false;	
}
function validateBusinessPhone(){
	var cleanStr = cleanPhone(this.get());
	this.message = ""
	if(cleanStr.length >= 6 && badAreaAndPrefix(cleanStr)) this.message = "Area codes and prefixes cannot begin with 0 or 1";
	if(cleanStr.length < 10) this.message = "Phone numbers must contain at least 10 digits (including area code).";
	if(cleanStr.length <= 3)
		this.set(cleanStr);
	else if(cleanStr.length <= 10)
		this.set(formatPhone(cleanStr));
	else
		this.set(formatPhone(cleanStr) + 'x' + cleanStr.substring(10));
	return (this.message == "")
}
function cleanPhone(strPhone){
	var cleanStr = extract(strPhone, NUMERIC);
	if(cleanStr.charAt(0) == '1' && cleanStr.length > 10) cleanStr = cleanStr.substring(1, cleanStr.length);
	return cleanStr;
}
function badAreaAndPrefix(cleanStr){
	return cleanStr.charAt(0) == '0' || cleanStr.charAt(0) == '1' || cleanStr.charAt(3) == '0' || cleanStr.charAt(3) == '1';
}
function formatPhone(strPhone){
	return '(' + strPhone.substring(0, 3) + ')' + strPhone.substring(3, 6) + '-' + strPhone.substring(6, 10);
}
function validateMeasurement(){
	var val = extract(this.get().toLowerCase(), NUMERIC + "i\"f'");
	if(val == "") { this.set(""); this.message = "This is a required field"; return false; }
	val += "i\"f'";
	var ft_1 = val.indexOf("'"), ft_2 = val.indexOf("f");
	var in_1 = val.indexOf('"'), in_2 = val.indexOf("i");
	var ftEnd = (ft_1 < ft_2) ? ft_1 : ft_2;
	var inEnd = (in_1 < in_2) ? in_1 : in_2;
	var ftStart = (ftEnd < inEnd) ? 0 : inEnd;
	var inStart = (ftEnd < inEnd) ? ftEnd : 0;
	var ftMeasure = parseInt("0" + extract(val.substring(ftStart, ftEnd), NUMERIC), 10);
	var inMeasure = parseInt("0" + extract(val.substring(inStart, inEnd), NUMERIC), 10);
	var inches = ftMeasure * 12 + inMeasure;
	ftMeasure = parseInt(inches / 12);
	inMeasure = inches % 12;
	this.set(ftMeasure + "'" + inMeasure + '"');
	if(this.maximum != null && inches > this.maximum) { this.message = "Measurement is too large."; return false; }
	if(this.minimum != null && inches < this.minimum) { this.message = "Measurement is too small."; return false; }
	return true;
}