function GetRef(id) {
	return (document.all) ? document.all[id] : (document.getElementById) ? document.getElementById(id) : null;
}

function ShowHide(id, show) {
	//alert("ShowHide: "+ id);
	var e = GetRef(id);
	if (e == null) return;
	var display = (show) ? "block" : "none";
	//alert("ShowHide: "+ id +" ~ "+ display);
	e.style.display = display;
}

function ShowHideWithStyle(id, show, style) {
	var e = GetRef(id);
	if (e == null) return;
	var display = (show) ? style : "none";
	e.style.display = display;
}

function ImageRollover(id) {
	var i = GetRef(id);
	if (i == null) return;
	var src = i.src;
	if (src == null || src == "") return;
	if (src.indexOf("_off.") > -1) {
		i.src = src.replace("_off.", "_on.");
	} else {
		i.src = src.replace("_on.", "_off.");
	}
}

function findPos(obj) {
	var curleft = curtop = 0;
	var oReturn = new Object();
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	
	oReturn.top = curtop;
	oReturn.left = curleft;
	
	return oReturn;
}

/******
	nav flyouts
 ******/
var flyoutTimer = null;
var flyoutDelay = 40; // ms
var xOffset = 180;
var yOffset = 0;
var currentFlyout = "";
var FlyOutTimerObj = new Array();

function ShowFlyout(flyout, anchor) {
	var f = GetRef(flyout);
	if (f == null) return;
	//alert("flyout found: "+ flyout);
	
	var a = GetRef(anchor);
	if (a == null) return;
	//alert("anchor found: "+ anchor);
	
	/*
	ShowHide(currentFlyout, false);
	clearTimeout(flyoutTimer);
	*/
	
	SustainFlyout(flyout);
	
	var p = findPos(a);
	if (p == null) return;
	//alert("position retrieved: "+ p.top +", "+ p.left);
	
	var x = p.left + xOffset;
	var y = p.top + yOffset;
	//alert("position offset: "+ x +", "+ y);
	
	f.style.left = x +"px";
	f.style.top = y +"px";
	
	ShowHide(flyout, true);
	//currentFlyout = flyout;
}

function HideFlyout(flyout) {
	//clearTimeout(flyoutTimer);
	//flyoutTimer = setTimeout("ShowHide('"+ flyout +"', false);", flyoutDelay);
	FlyOutTimerObj[flyout] = window.setTimeout("HideMenu('"+ flyout +"')", flyoutDelay);
}

function SustainFlyout(flyout){
	clearTimeout(FlyOutTimerObj[flyout]);
	FlyOutTimerObj[flyout] = null;
}

function HideMenu(flyout){
	ShowHide(flyout, false);
}

function NavImageRollover(flyout, img, flag) {
	ImageRollover(img);
	if (flag) {
		SustainFlyout(flyout);
	} else {
		HideFlyout(flyout);
	}
}

/******
	contest subnav flyouts
 ******/
function ShowContestFlyout(flyout, anchor, xOffset, yOffset) {
	var flyout = "contestSubnav";
	var anchor = "headerShot";
	
	var f = GetRef(flyout);
	if (f == null) return;
	//alert("flyout found: "+ flyout);
	
	var a = GetRef(anchor);
	if (a == null) return;
	//alert("anchor found: "+ anchor);
	
	var p = findPos(a);
	if (p == null) return;
	//alert("position retrieved: "+ p.top +", "+ p.left);
	
	var x = p.left + 429;
	var y = p.top + 251;
	//alert("position offset: "+ x +", "+ y);
	
	f.style.left = x +"px";
	f.style.top = y +"px";
	
	//ShowHide(flyout, true);
}
window.onresize = ShowContestFlyout;

var barcodeStatus = false;
function ToggleBarCode(show) {
	/*
	barcodeStatus = !barcodeStatus;
	ShowHide('barcodeOverlay', barcodeStatus);
	*/
	ShowHide('barcodeOverlay', show);
}
/******
	Recipe Nutritional label flyouts
 ******/
//window.onresize = PositionNutritionLabel;

var nutritionalLabelState = false; // false is off, true is on
var nutritionalTimeout;

function ToggleNutritionalLabel() {
	nutritionalLabelState = !nutritionalLabelState;
	ToggleNutritionalInfoButton();
	ShowHide("flyout", nutritionalLabelState);
}

function ToggleNutritionalInfoButton() {
	var imgState = (nutritionalLabelState) ? "on" : "off";
	var i = GetRef("nutritionalButton");
	if (i == null) return; 
	i.src = i.src.replace(/(nutritionflyout_button_)off|on(.gif)/i, "$1"+ imgState +"$2");  
}

function ShowNutritionalLabel() {
	clearTimeout(nutritionalTimeout);
	nutritionalLabelState = true;
	ShowHide("flyout", true);
}

function HideNutritionalLabel() {
	nutritionalTimeout = setTimeout("nutritionalLabelState = false;ShowHide('flyout', false);ToggleNutritionalInfoButton()", 500);
}

function PositionNutritionLabel() {
	var ref = GetRef("recipeTitleImage");
	if (ref == null) return;
	
	var target = GetRef("nutritionalFlyout");
	if (target == null) return;
	
	var refPos = findPos(ref);
	var xNew = refPos.left + 427;
	
	target.style.left = xNew +"px";
}

/******
	Form Submits
 ******/
function SubmitForm(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	f.submit(); 
}

function SubmitLogin(frm, alt) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateLogin(f, alt)) f.submit(); 
}

function SubmitForgotPassword(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateForgotPassword(f)) f.submit(); 
}

function SubmitResetPassword(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateResetPassword(f)) f.submit(); 
}

function SubmitContact() {
	var f = GetRef("frmContactUs");
	if (f == null) return;
	if (ValidateContact(f)) f.submit();
}

function SubmitSignUp(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateSignUp(f)){
/*		if(f.txtDobMonth.value.length <2)f.txtDobMonth.value = "0"+f.txtDobMonth.value;
		if(f.txtDobDay.value.length <2)f.txtDobDay.value = "0"+f.txtDobDay.value
*/
		f.submit();
	}
}

function SubmitProfile(frm, todo) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateProfile(f, todo)){
		f.submit();
	}
}

function SubmitSpin(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateSpin(f)) f.submit();
}

function SubmitEnewsletter(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateEnewsletter(f)){
		//if(f.txtDobMonth.value.length <2)f.txtDobMonth.value = "0"+f.txtDobMonth.value;
		//if(f.txtDobDay.value.length <2)f.txtDobDay.value = "0"+f.txtDobDay.value
		f.submit();
	}
}

function SubmitSAF(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateSAF(f)) {
		//f.recipeTitle.value = escape(f.recipeTitle.value);
		//f.recipeTitle.value = replaceChars(f.recipeTitle.value);
		//f.txtSenderName.value = escape(f.txtSenderName.value);
		//f.txtMessage.value = escape(f.txtMessage.value);
		f.submit();
	}
}

function SubmitContest(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateContest(f)) f.submit();
}

function SubmitContestAdminGetMemberInfo(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateContestAdminGetMemberInfo(f)) f.submit();
}

function SubmitRegistrationChoice(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateRegistrationChoice(f)) {
		f.rdoRegistrationChoice[0].value += "&rules="+ rulesAccepted;
		f.rdoRegistrationChoice[1].value += "&rules="+ rulesAccepted;
		f.submit();
		
	}
		
}

function replaceChars(str) {
	var strReturn = str;
	//strReturn = strReturn.replace("&oelig;", "�");
	//strReturn = strReturn.replace("&", "%26");
	//strReturn = strReturn.replace(";", "%3B");
	//strReturn = strReturn.replace("�", "%26oelig%3B");
	if (strReturn.indexOf("&#339;") > -1) { alert("found decimal notation"); }
	else if (strReturn.indexOf("&oelig;") > -1) { alert("found web notation"); }
	else if (strReturn.indexOf("�") > -1) { alert("found actual char"); }
	else { alert("not found : "+ str); }
	return strReturn;
}

/******
	Form Validation
 ******/
 /*** 12 digit version ***/
 /*
var arrUpc = new Array();
arrUpc[0] = "058744152264"; // Soya Reg 250 mL
arrUpc[1] = "058744152271"; // Soya Reg 450 mL (12 ct)
arrUpc[2] = "058744152271"; // Soya Reg 450 mL (18 ct)
arrUpc[3] = "058744152318"; // Soya Light 450 mL (12 ct)
arrUpc[4] = "058744152318"; // Soya Light 450 mL (18 ct)
arrUpc[5] = "058744151076"; // Cooking Sauce Honey Garlic 341 mL
arrUpc[6] = "058744151113"; // Cooking Sauce String 341 mL
arrUpc[7] = "058744151151"; // Cooking Sauce Medium 341 mL
arrUpc[8] = "058744151199"; // Cooking Sauce Mild 341 mL
arrUpc[9] = "087444151236"; // Cooking Sauce S&S 341 mL
arrUpc[10] = "058744151250"; // Cooking Sauce Teriyaki 341 mL
arrUpc[11] = "058744151311"; // Cooking Sauce Pineapple 341 mL
arrUpc[12] = "058744152035"; // Dipping Sauce S&S 227 mL
arrUpc[13] = "058744152059"; // Dipping Sauce S&S 455 mL
arrUpc[14] = "058744152110"; // Dipping Sauce Plum 227 mL (12 ct)
arrUpc[15] = "058744152110"; // Dipping Sauce Plum 227 (18 ct)
arrUpc[16] = "058744152134"; // Dipping Sauce Plum 455 mL
arrUpc[17] = "058744152158"; // Dipping Sauce Cherry 227 mL
arrUpc[18] = "058744152172"; // Dipping Sauce Cherry 455 mL
arrUpc[19] = "058744152356"; // Dipping Sauce Plum 750 mL (squeezable)
arrUpc[20] = "058744152394"; // Dipping Sauce Thai 455 mL
arrUpc[21] = "058744153445"; // Stir-fry Sauce S&S 355 mL
arrUpc[22] = "058744153469"; // Stir-fry Sauce Teriyaki 355 mL
arrUpc[23] = "058744153483"; // Stir-fry Sauce Szechwan 355 mL
arrUpc[24] = "058744153506"; // Stir-fry Sauce Orange Ginger 355 mL
arrUpc[25] = "058744153513"; // Stir-fry Sauce Asian 5 Spice 355 mL
arrUpc[26] = "058744159751"; // Specialty Chinese Fondue Mix
arrUpc[27] = "058744631004"; // Specialty Bean Sprouts
arrUpc[28] = "058744151007"; // Specialty Fortune Cookies
*/

/*** 10 digit version ***/
var arrUpc = new Array();
arrUpc[0] = "5874415226"; // Soya Reg 250 mL
arrUpc[1] = "5874415227"; // Soya Reg 450 mL (12 ct)
arrUpc[2] = "5874415227"; // Soya Reg 450 mL (18 ct)
arrUpc[3] = "5874415231"; // Soya Light 450 mL (12 ct)
arrUpc[4] = "5874415231"; // Soya Light 450 mL (18 ct)
arrUpc[5] = "5874415107"; // Cooking Sauce Honey Garlic 341 mL
arrUpc[6] = "5874415111"; // Cooking Sauce String 341 mL
arrUpc[7] = "5874415115"; // Cooking Sauce Medium 341 mL
arrUpc[8] = "5874415119"; // Cooking Sauce Mild 341 mL
arrUpc[9] = "8744415123"; // Cooking Sauce S&S 341 mL
arrUpc[10] = "5874415125"; // Cooking Sauce Teriyaki 341 mL
arrUpc[11] = "5874415131"; // Cooking Sauce Pineapple 341 mL
arrUpc[12] = "5874415203"; // Dipping Sauce S&S 227 mL
arrUpc[13] = "5874415205"; // Dipping Sauce S&S 455 mL
arrUpc[14] = "5874415211"; // Dipping Sauce Plum 227 mL (12 ct)
arrUpc[15] = "5874415211"; // Dipping Sauce Plum 227 (18 ct)
arrUpc[16] = "5874415213"; // Dipping Sauce Plum 455 mL
arrUpc[17] = "5874415215"; // Dipping Sauce Cherry 227 mL
arrUpc[18] = "5874415217"; // Dipping Sauce Cherry 455 mL
arrUpc[19] = "5874415235"; // Dipping Sauce Plum 750 mL (squeezable)
arrUpc[20] = "5874415239"; // Dipping Sauce Thai 455 mL
arrUpc[21] = "5874415344"; // Stir-fry Sauce S&S 355 mL
arrUpc[22] = "5874415346"; // Stir-fry Sauce Teriyaki 355 mL
arrUpc[23] = "5874415348"; // Stir-fry Sauce Szechwan 355 mL
arrUpc[24] = "5874415350"; // Stir-fry Sauce Orange Ginger 355 mL
arrUpc[25] = "5874415351"; // Stir-fry Sauce Asian 5 Spice 355 mL
arrUpc[26] = "5874415975"; // Specialty Chinese Fondue Mix
arrUpc[27] = "5874463100"; // Specialty Bean Sprouts
arrUpc[28] = "5874415100"; // Specialty Fortune Cookies


function validateRegistration(){
	document.forms[0].submit();	
}


function validateRecipe(){
	document.forms[0].submit();	
}

function validateTestimonial(){
	document.forms[0].submit();	
}

function validateENews(){
	document.forms[0].submit();	
}

function showDeclarationError(){
	ShowHide("errSpinDeclare", true);
}

function ValidateLogin(f, alt) {
	if (f == null) return false;	
	var valid = true;
	
	var divEmail = (alt) ? "errAltEmail" : "errEmail";
	var divPassword = (alt) ? "errAltPassword" : "errPassword";
	
	ShowHide(divEmail, false);
	ShowHide(divPassword, false);

	if (!IsValidEmail(f.email.value)) {
		ShowHide(divEmail, true);
		valid = false;
	} 

	if (!IsValidPassword(f.password.value)) {
		ShowHide(divPassword, true);
		valid = false;
	}	
	return valid;
}

function ValidateForgotPassword(f) {

	if (f == null) return false;	
	var valid = true;
	
	ShowHide("errEmail", false);
	if (!IsValidEmail(f.email.value)) {
		ShowHide("errEmail", true);
		valid = false;
	} 
	return valid;
}

function ValidateResetPassword(f) {

	if (f == null) return false;	
	var valid = true;
	
	ShowHide("errPassword", false);
	if (!IsValidPassword(f.password.value) || !IsValidPassword(f.confirmPassword.value) || (f.password.value != f.confirmPassword.value)) {
		ShowHide("errPassword", true);
		valid = false;
	} 
	return valid;
}

function ValidateContact(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errEmail", false);
	ShowHide("errName", false);
	ShowHide("errAddress", false);
	ShowHide("errCity", false);
	ShowHide("errProvince", false);
	ShowHide("errPostalCode", false);
	ShowHide("errPhone", false);
	ShowHide("errProduct", false);
	ShowHide("errProductBarCode", false);
	ShowHide("errProductionCode", false);
	ShowHide("errComments", false);

	if (!IsValidEmail(f.txtEmail.value)) {
		ShowHide("errEmail", true);
		valid = false;
	} else if (f.txtEmail.value.trim() != f.txtEmailConfirm.value.trim()) {
		ShowHide("errEmail", true);
		valid = false;
	}
	
	if (!IsValidString(f.txtFirstName.value) || !IsValidString(f.txtLastName.value)) {
		ShowHide("errName", true);
		valid = false;
	}
	
	if (!IsValidString(f.txtAddress1.value)) {
		ShowHide("errAddress", true);
		valid = false;
	}
	
	if (!IsValidString(f.txtCity.value)) {
		ShowHide("errCity", true);
		valid = false;
	}
	
	if (!IsValidSelect(f.selProvince)) {
		ShowHide("errProvince", true);
		valid = false;
	}
	
	var pcode = f.txtPcodePrefix.value + f.txtPcodeSuffix.value;
	if (!IsValidPostalCode(pcode)) {
		ShowHide("errPostalCode", true);
		valid = false;
	}
	
	var phone = f.txtPhoneArea.value + f.txtPhonePrefix.value + f.txtPhoneSuffix.value;
	if (!IsValidPhoneNumber(phone)) {
		ShowHide("errPhone", true);
		valid = false;
	}
	
	if (!IsValidSelect(f.selProduct)) {
		//ShowHide("errProduct", true);
		//valid = false;
	}
	
	if (!IsValidString(f.txtBarCode.value)) {
		//ShowHide("errProductBarCode", true);
		//valid = false;
	}
	
	if (!IsValidString(f.txtProductionCode.value)) {
		//ShowHide("errProductionCode", true);
		//valid = false;
	}
	
	if (!IsValidTextArea(f.taComments)) {
		ShowHide("errComments", true);
		valid = false;
	}	
	
	return valid;
}

function ValidateSignUp(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errEmail", false);
	ShowHide("errPassword", false);
	ShowHide("errName", false);
	ShowHide("errAddress", false);
	ShowHide("errCity", false);
	ShowHide("errProvince", false);
	ShowHide("errPostalCode", false);
	ShowHide("errCountry", false);
	ShowHide("errPhone", false);
	ShowHide("errGender", false);
	ShowHide("errDob", false);
		
	if (!IsValidEmail(f.txtEmail.value)) {
		ShowHide("errEmail", true);
		valid = false;
	} 

	if (!IsValidPassword(f.txtPassword.value)) {
		ShowHide("errPassword", true);
		valid = false;
	} 

	if (!IsValidString(f.txtFirstName.value) || !IsValidString(f.txtLastName.value)) {
		ShowHide("errName", true);
		valid = false;
	}
	
	if (!IsValidString(f.txtAddress1.value)) {
		ShowHide("errAddress", true);
		valid = false;
	}
	
	if (!IsValidString(f.txtCity.value)) {
		ShowHide("errCity", true);
		valid = false;
	}
	
	if (!IsValidSelect(f.selProvince)) {
		ShowHide("errProvince", true);
		valid = false;
	}
	
	/*
	var country = f.country.options[f.country.selectedIndex].value;
	if (
		(country == "CA" && !IsValidPostalCode(f.txtPostalCode.value)) ||
		(country == "US" && !IsValidZipCode(f.txtPostalCode.value))) 
	{
	*/
	if (!IsValidPostalCode(f.txtPostalCode.value)) {
		ShowHide("errPostalCode", true);
		valid = false;
	}
	
	/*
	if (!IsValidCountry(f.txtCountry.value)) {
		ShowHide("errCountry", true);
		valid = false;
	}
	*/
	
	var phone = f.txtPhoneArea.value + f.txtPhonePrefix.value + f.txtPhoneSuffix.value;
	if (!IsValidPhoneNumber(phone)) {
		ShowHide("errPhone", true);
		valid = false;
	}
	
	if (!IsValidRadio(f.rdoGender)) {
		ShowHide("errGender", true);
		valid = false;
	}
/*	
	var dob = f.txtDobMonth.value +"-"+ f.txtDobDay.value +"-"+ f.txtDobYear.value;
	if (!IsValidDate(dob)) {
		ShowHide("errDob", true);
		valid = false;
	} else {
		var today = new Date();
		var dtDob = new Date(f.txtDobYear.value, f.txtDobMonth.value - 1, f.txtDobDay.value);
		if (!IsValidAge(today, dtDob, 18)) {
			ShowHide("errDob", true);
			valid = false;
		}
	}
*/

	if (!IsValidSelect(f.txtAge)) {
		ShowHide("errDob", true);
		valid = false;
	}
	return valid;
}


function ValidateProfile(f, todo) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errPassword", false);

	ShowHide("errEmail", false);
	ShowHide("errName", false);
	ShowHide("errAddress", false);
	ShowHide("errCity", false);
	ShowHide("errProvince", false);
	ShowHide("errPostalCode", false);
	ShowHide("errCountry", false);

	if(todo=="password") {

		if (!IsValidPassword(f.password.value) || !IsValidPassword(f.newPassword.value) || !IsValidPassword(f.confirmPassword.value)) {
			ShowHide("errPassword", true);
			valid = false;
		} 
		else {
			if (f.newPassword.value != f.confirmPassword.value) {
				ShowHide("errPassword", true);
				valid = false;
			}
		}
	}	
		
	if (!IsValidEmail(f.email.value)) {
		ShowHide("errEmail", true);
		valid = false;
	} 

	if (!IsValidString(f.firstname.value) || !IsValidString(f.lastname.value)) {
		ShowHide("errName", true);
		valid = false;
	}
	
	if (!IsValidString(f.address1.value)) {
		ShowHide("errAddress", true);
		valid = false;
	}
	
	if (!IsValidString(f.city.value)) {
		ShowHide("errCity", true);
		valid = false;
	}
	
	/*
	var country = f.country.options[f.country.selectedIndex].value;
	if (
		(country == "CA" && !IsValidPostalCode(f.postalcode.value)) ||
		(country == "US" && !IsValidZipCode(f.postalcode.value))) 
	{
	*/
	if (!IsValidPostalCode(f.postalcode.value)) {
	
		ShowHide("errPostalCode", true);
		valid = false;
	} 
	
	if (!IsValidSelect(f.province,1)) {
		ShowHide("errProvince", true);
		valid = false;
	}
	
	if (!IsValidSelect(f.country,1)) {
		ShowHide("errCountry", true);
		valid = false;
	}
	
/*	
	var phone = f.txtPhoneArea.value + f.txtPhonePrefix.value + f.txtPhoneSuffix.value;
	if (!IsValidPhoneNumber(phone)) {
		ShowHide("errPhone", true);
		valid = false;
	}
	
	var dob = f.txtDobMonth.value +"-"+ f.txtDobDay.value +"-"+ f.txtDobYear.value;
	if (!IsValidDate(dob)) {
		ShowHide("errDob", true);
		valid = false;
	} else {
		var today = new Date();
		var dtDob = new Date(f.txtDobYear.value, f.txtDobMonth.value - 1, f.txtDobDay.value);
		if (!IsValidAge(today, dtDob, 18)) {
			ShowHide("errDob", true);
			valid = false;
		}
	}

	if (!IsValidRadio(f.rdoGender)) {
		ShowHide("errGender", true);
		valid = false;
	}
*/
	
	return valid;
}

function ValidateSpin(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errSpin", false);
	
	if (!IsValidTextArea(f.taSpin)) {
		ShowHide("errSpin", true);
		valid = false;
	}	
	
	return valid;
}

function ValidateEnewsletter(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errEmail", false);
	ShowHide("errName", false);
	ShowHide("errCity", false);
	ShowHide("errProvince", false);
	ShowHide("errCountry", false);
	ShowHide("errDob", false);	
	ShowHide("errOptIn", false);
	
	if (!IsValidEmail(f.txtEmail.value)) {
		ShowHide("errEmail", true);
		valid = false;
	}
	
	if (!IsValidString(f.txtFirstName.value) || !IsValidString(f.txtLastName.value)) {
		ShowHide("errName", true);
		valid = false;
	}
	
	if (!IsValidString(f.txtCity.value)) {
		ShowHide("errCity", true);
		valid = false;
	}
	
	if (!IsValidSelect(f.selProvince)) {
		ShowHide("errProvince", true);
		valid = false;
	}
	
	/*
	if (!IsValidSelect(f.txtCountry)) {
		ShowHide("errCountry", true);
		valid = false;
	}
	*/
	
	/*	
	var dob = f.txtDobMonth.value +"-"+ f.txtDobDay.value +"-"+ f.txtDobYear.value;
	if (!IsValidDate(dob)) {
		ShowHide("errDob", true);
		valid = false;
	} else {
		var today = new Date();
		var dtDob = new Date(f.txtDobYear.value, f.txtDobMonth.value - 1, f.txtDobDay.value);
		if (!IsValidAge(today, dtDob, 18)) {
			ShowHide("errDob", true);
			valid = false;
		}
	}
	*/
	
	if (!IsValidSelect(f.txtAge)) {
		ShowHide("errDob", true);
		valid = false;
	}
	
	var vhOptIn = f.chkVhOptIn[0].checked;
	var conagraOptIn = f.chkConagraOptIn[0].checked;
	if (!(vhOptIn || conagraOptIn)) {
		ShowHide("errOptIn", true);
		valid = false;
	}
	
	return valid;
}

function ValidateSAF(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errGeneric", false);
	
	if (
		!IsValidEmail(f.txtRecipientEmail.value) ||
		!IsValidEmail(f.txtSenderEmail.value) ||
		!IsValidString(f.txtSenderName.value) ) 
	{
		ShowHide("errGeneric", true);
		valid = false;
	}
	
	return valid;
}

function ValidateContest(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errPrivacy", false);
	ShowHide("errNotEligible", false);
	ShowHide("errSkillTest", false);
	ShowHide("errInvalidUpc", false);
	ShowHide("errInvalidProduct", false);
	ShowHide("errSkillTest", false);
	ShowHide("errUpcNotPIN", false);
	
	if (!(f.rdoPrivacy == null || typeof(f.rdoPrivacy) == "undefined")) {
		if (!f.rdoPrivacy.checked) {
			ShowHide("errRulesChoice", true);
			valid = false;
		}
	}
	
	var pin = f.txtUpcPart1.value.trim() + f.txtUpcPart2.value.trim() + f.txtUpcPart3.value.trim();
	var pattern = /^\d{9}$/;
	var re = new RegExp(pattern);
	if (re.test(pin)) 
	{
		// this is a upc, not a pin
		ShowHide("errUpcNotPIN", true);
		valid = false;
	
	} 
	else if (!IsValidPin(pin)) 
	{
		// not a upc, check if it's a valid pin
		ShowHide("errInvalidUpc", true);
		valid = false;
	} 
			
	if (!IsValidSelect(f.selProduct, false)) {
		ShowHide("errInvalidProduct", true);
		valid = false;
	}
	return valid;
}

function ValidateContestAdminGetMemberInfo(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errMemberId", false);
	ShowHide("errPinNumber", false);
	
	if (!IsValidString(f.txtMemberId.value.trim())) { 
		ShowHide("errMemberId", true);
		valid = false;
	} 
	if (!IsValidPin(f.txtPinNumber.value.trim())) {
		ShowHide("errPinNumber", true);
		valid = false;
	} 
	return valid;
}

function ValidateRegistrationChoice(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errRegistrationChoice", false);
	ShowHide("errRulesRead", false);
	
	if (!IsValidRadio(f.rdoRegistrationChoice)) {
		ShowHide("errRegistrationChoice", true);
		valid = false;
	}
	
	if (rulesAccepted != 1) {
		ShowHide("errRulesRead", true);
		valid = false;
	}
	
	return valid;
}



/******
	Validation helper functions
 ******/
function IsValidRadio(r) {
	if (r == null) return false;
	
	for (var i=0; i<r.length; i++) {
		if (r[i].checked) return true;
	}
	
	return false;
}

function IsValidCheckbox(c) {
	if (c == null) return false;
	if (c.form[c.id][0] == undefined) {
		return c.checked;
	} else {
		return IsValidRadio(c);
	}
	
}

function IsValidSelect(s, firstVal) {
	if (s == null) return false;
	
	var valid = false;
	var firstValidIndex = (firstVal) ? 0 : 1;
	
	if (s.selectedIndex >= firstValidIndex) {
		if (IsValidString(s.options[s.selectedIndex].value)) {
			valid = true;
		} 
	}
	
	return valid; 
}

function IsValidTextArea(t) {
	if (t == null) return false;
	return IsValidStringMultiLine(t.value);
}

function IsValidEmail(e) {
	var sPattern = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;
	//var sPattern = /\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i;
	return IsValid(sPattern, e);
}

function IsValidPassword(s) { /*** same as IsValidString ***/
	//var sPattern = /^.+?$/i;
	var sPattern = /^[^\s|]{6,15}$/i;
	return IsValid(sPattern, s);
}

function IsValidPostalCode(p) {
	var sPattern = /^[a-ceghj-npr-tvxy]\d[a-z](\s)?\d[a-z]\d$/i;
	return IsValid(sPattern, p);
}

function IsValidZipCode(z) {
	var sPattern = /^\d{5}$/i;
	return IsValid(sPattern, z);
}

function IsValidPhoneNumber(p) {
	var sPattern = /^\d{10}$/;
	return IsValid(sPattern, p);
}

function IsValidCountry(p) {
	var sPattern = /^CA$/;
	return IsValid(sPattern, p);
}

function IsValidString(s) {
	var sPattern = /^.+?$/i;
	return IsValid(sPattern, s);
}

function IsValidStringMultiLine(s) {
	var sTmp = s.trim();
	var sPattern = /^[\S]+?[\s\S]*?$/i;
	return IsValid(sPattern, sTmp);
}

function IsValidDate(d) {
	/* date format must be  mm[/-.]dd[/-.]yyyy  -- separators are not optional */
	//var sPattern = /^(19|20)\d\d([- \/.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/;
	var sPattern = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
	return IsValid(sPattern, d);
}

function IsValidAge(currentDate, birthDate, requiredAge) {
	var diff = Math.ceil(currentDate.getTime() - birthDate.getTime());
	var one_day = 1000*60*60*24;
	var one_year = one_day * 365;
	var diffYears = diff / one_year;
	if (diffYears < requiredAge) return false;
	return true;
}

function IsValidPin(p) {
	//var sPattern=/^[A-Za-z0-9]{3}-?[A-Za-z0-9]{3}-?[A-Za-z0-9]{3}$/;
	var sPattern = /^[A-Za-z0-9]{9}$/;	
	//alert("Pin#[" + p + "]is valid? " + IsValid(sPattern, p));
	return IsValid(sPattern, p);
}

function IsValid(sPattern, sTest) {
	var re = new RegExp(sPattern);
	return re.test(sTest);
}

/******
	Helper utility functions
 ******/
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

Array.prototype.exists = function (x) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == x) return true;
    }
    return false;
}