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);
	}
}


/******
	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 SubmitRegistrationChoice(frm) {
	var f = GetRef(frm);
	if (f == null) return;
	if (ValidateRegistrationChoice(f)) 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
 ******/
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;
		}
	}
*/
	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;
		}
	}
	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("statusOfPlaying", false);
	
	if (!IsValidRadio(f.rdoPrivacy)) {
		ShowHide("errPrivacy", true);
		valid = false;
	} else {
		if (f.rdoPrivacy[1].checked) {
			ShowHide("errPrivacy", true);
			valid = false;
		}
	}
	if (!IsValidPin(f.txtUpc.value.trim())) {
		ShowHide("errInvalidUpc", true);
		valid = false;
	} 
			
	if (!IsValidSelect(f.selProduct, false)) {
		ShowHide("errInvalidProduct", true);
		valid = false;
	}

/*	
	if (!IsValidString(f.txtSkillTest.value)) {
		ShowHide("errSkillTest", true);
		valid = false;
	} else if (f.txtSkillTest.value != 195) {
		ShowHide("errSkillTest", true);
		valid = false;
	}
*/	
	return valid;
}

function ValidateRegistrationChoice(f) {
	if (f == null) return false;
	
	var valid = true;
	
	ShowHide("errRegistrationChoice", false);
	
	if (!IsValidRadio(f.rdoRegistrationChoice)) {
		ShowHide("errRegistrationChoice", 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=/^[0-9]{3}-[0-9]{3}-[0-9]{3}$/
	//alert("Pin# 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;
}