<!--
/* 
 * Form Validator
 * 
 * Needs Prototype.js - http://prototypejs.org
 * 
 * Created By Vincent Limjap 
 * Last Edited 12/05/06
 * 
 * Instructions: The script tag to include this file must be located at the end of the HTML file. All element ID names must be unique.
 * 
 * Available validations:
 * 		validateEmail 
 * 		requiredField
 * 		requiredFieldName - Does not allow numbers in FirstName LastName fields 
 * 		validateNumeric
 * 		requiredAlphanumeric
 * 		validateUSPhone
 * 		requiredUSPhone
 * 		requiredEmail
 * 		confirmField
 * 		requiredCheckbox
 * 		validDate
 * 		validateUSZip 
 * 		requiredRadio
 * Ex.
 * input field: <input id="inputID" type="text" class="requiredEmail" /> <span id="inputID_err" class="formError"></span>
 * textarea field: <textarea id="textareaID" class="requiredField" /> </textarea> <span id="textareaID_err" class="formError"></span>
 * select field: <select id="selectID" class="requiredField" name="selectID">
 * 					<option value="1">1</option>
 * 				</select>
 * 				<span id="selectID_err" class="formError"></span>
 * radio fields: <input type="radio" name="requiredRadio" id="requiredRadio1" class="requiredRadio"></input>
 * 						<input type="radio" name="requiredRadio" id="requiredRadio1"></input>
 * 						<input type="radio" name="requiredRadio" id="requiredRadio1"></input>
 * age validation: <input type="input" class="verifyAge" id="ageMin_10" />
 */

//Initialize Script
var Prototype;
if(!Prototype) {
	alert('Prototype framework missing. - http://prototypejs.org');
	window.open('http://prototypejs.org','prototypewindow');
}


//	**** USER CONFIGURATION SETTINGS HERE *************************	
var alertBox=0; // set to 1 if you want a javascript alert to appear.
var eventListener=1 //set to 1 if you want the eventlistener to be initialized on upon loading. 
var errInputBGColor='#FFEDED'; // input field bgcolor for invalid fields.
// ****************************************************************


var	FormValidation = Class.create();

FormValidation.prototype = {
	initialize:function() {
		this.alertBox=alertBox;
		this.docForm=document.getElementsByTagName('form');
		if (eventListener==1) {
			for (x=0;x<this.docForm.length;x++) {
				this.docForm[x].onsubmit = this.validateForm.bindAsEventListener(this.docForm[x],this.docForm[x].id);
				
			}
		}
	},
	
	trimAll:function(strValue) {
		var objRegExp = /^(\s*)$/;
		//check for all spaces
		if(objRegExp.test(strValue)) {
			strValue = strValue.replace(objRegExp, '');
			if(strValue.length == 0) return strValue;
		}
		//check for leading & trailing spaces
		objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
		if(objRegExp.test(strValue)) {
			//remove leading and trailing whitespace characters
			strValue = strValue.replace(objRegExp, '$2');
		}
		return strValue;		
	},
	
	clearFormErr:function(formEl) {
		formErr=$(formEl).getElementsByTagName('span');
		for (y=0; y<formErr.length; y++) {
			errorItems=formErr.item(y);
			errorAttr=errorItems.className;
			if (errorAttr=='formError' || errorAttr=='formErr') {
				try {
					$(errorItems.id).innerHTML='';
				} catch(err) {};	
			}
		}		
	},	
	
	displayError:function(el, errMsg) {
		$(el.id+'_err').innerHTML = errMsg;
	},
	
	verifyDate:function(strValue) {
		var ValidDatefilter = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
		
		if(!ValidDatefilter.test(strValue))
			return false; //doesn't match pattern, bad date
		else {
			var strSeparator = strValue.substring(2,3); //find date separator
			var arrayDate = strValue.split(strSeparator); //split date into month, day, year
			//create a lookup for months not equal to Feb.
		    var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
		                        '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
		    var intDay = parseInt(arrayDate[1],10); 
		
		    //check if month value and day value agree
		    if(arrayLookup[arrayDate[0]] != null) {
		      if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
		        return true; //found in lookup table, good date
		    }
		    
		    //check for February (bugfix 20050322)
		    //bugfix  for parseInt kevin
		    //bugfix  biss year  O.Jp Voutat
		    var intMonth = parseInt(arrayDate[0],10);
		    if (intMonth == 2) { 
		       var intYear = parseInt(arrayDate[2]);
		       if (intDay > 0 && intDay < 29) {
		           return true;
		       }
		       else if (intDay == 29) {
		         if ((intYear % 4 == 0) && (intYear % 100 != 0) || 
		             (intYear % 400 == 0)) {
		              // year div by 4 and ((not div by 100) or div by 400) ->ok
		             return true;
		         }   
		       }
		    }
		  }  
		  return false; //any other values, bad date										
	},
	
	goValidate:function(formEl) {
		if(formEl) {
			var fieldItemsAry = new Array;
	
			var Emailfilter  = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
			var Phonefilter1 = /(\(?\d{3}\)?)?(\-| )?\d{3}(\-| )?\d{4}/; //(123)456-7890;
			var Phonefilter2 =  /[0-9]{3}-[0-9]{3}-[0-9]{4}/; //123-456-7890
			var Numericfilter = /(^-?\d\d*$)/;
			var Alphanumericfilter = /^[a-zA-Z0-9\.\s]+$/;
			var ValidUSZip = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
	
			var fieldAry = new Array('input', 'select', 'textarea');
						
			this.clearFormErr(formEl);
			mForm=$(formEl);
			for(x=0; x<fieldAry.length; x++) {
				fieldRows=mForm.getElementsByTagName(fieldAry[x]);
				
				for (y=0; y<fieldRows.length; y++) {
					fieldItem=fieldRows.item(y);
					fieldAttr=fieldItem.className;
					fieldItem.style.backgroundColor='';
					if (fieldAttr) {
						switch(fieldAttr) {
							case "validateEmail":
								if (fieldItem.value) {
									if(!Emailfilter.test(fieldItem.value)) {
										try {
											errMsg='*Invalid email address.';
											this.displayError(fieldItem,errMsg);
										} catch(err) {};
										if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);	
									}
								}
							break;
							case "requiredField":
								if (!fieldItem.value.replace(/^\s+/g, '').replace(/\s+$/g, '')) {
									try {
										errMsg='*Required field.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							/*Added Case to test for digits in name*/
							case "requiredFieldName":
								if (!fieldItem.value.replace(/^\s+/g, '').replace(/\s+$/g, '')) {
									try {
										errMsg='*Required field.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							else if (fieldItem.value.replace(/[^0-9.,]/g, '').replace(/[^0-9.,]/g, '')) {
									try {
										errMsg='*Required field.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							case "validateNumeric":
								if (fieldItem.value) {
									if(!Numericfilter.test(fieldItem.value)) {
										try {
											errMsg='*Numeric data required.';
											this.displayError(fieldItem,errMsg);
										} catch(err) {};
										if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
									}
								}
							break; 
							case "requiredAlphanumeric":
								if(!Alphanumericfilter.test(this.trimAll(fieldItem.value))) {
									try {
										errMsg='*Invalid characters.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break; 
							case "validateUSPhone":
								if (fieldItem.value) {
									if(!Phonefilter1.test(fieldItem.value) || !Phonefilter2.test(fieldItem.value)) {
										try {
											errMsg='*Invalid phone number.';
											this.displayError(fieldItem,errMsg);
										} catch(err) {};
										if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);								
									} 
								}
							break;
							case "requiredUSPhone":
								if(!Phonefilter1.test(fieldItem.value) || !Phonefilter2.test(fieldItem.value)) {
									try {
										errMsg='*Invalid phone number.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);								
								} 
							break;
							case "validateUSZip":
								if (fieldItem.value) {
									if(!ValidUSZip.test(fieldItem.value)) {
										try {
											errMsg='*Invalid zip code.';
											this.displayError(fieldItem,errMsg);
										} catch(err) {};
										if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);	
									}
								}
							break;
							case "requiredUSZip":							
								if(!ValidUSZip.test(fieldItem.value)||(fieldItem.value.length==0)) {
									try {
										errMsg='*Invalid zip code.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);	
								}
							break;
							case "requiredEmail":
								if (!Emailfilter.test(fieldItem.value)) {
									try {
										errMsg='*Invalid email address.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							case "confirmField": //Matching email must be the PREVIOUS input element.
								fieldCount = 2; //Value is 2 for ATG
								if (!this.trimAll(fieldRows.item(y).value) || fieldRows.item(y).value!=fieldRows.item(y-fieldCount).value) {
									try {
										errMsg='*Mismatched field.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							case "requiredCheckbox":
								if (!fieldItem.checked) {
									try {
										errMsg='*Required checkbox.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};								
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
													
							case "requiredRadio":
							radioCheck=0;
								for(x=0;x<eval('$(formEl).'+fieldItem.name+'.length');x++) {
									if (eval('document.forms[\''+formEl+'\'].'+fieldItem.name+'[x].checked')) {
										radioCheck=1;
									}
								}
								if(radioCheck==0) {
									try {
										errMsg='*Required field.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
				
							case "validDate":
								if (!this.verifyDate(fieldItem.value)) {
									try {
										errMsg='*Invalid date.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							
							case "verifyAge":
								var cookieExp = 30;
								if (fieldItem.value.length==1) fieldItem.value = '0'+fieldItem.value
								var strSeparator = fieldItem.value.substring(2,3); //find date separator
								var arrayDate = fieldItem.value.split(strSeparator); //split date into month, day, year
								minAge=fieldItem.id.substr(fieldItem.id.indexOf('_')+1,2);
								var now = new Date();
								var then = new Date((now.getFullYear() - minAge),now.getMonth(),now.getDate());
								var bd = new Date(arrayDate[2],(Number(arrayDate[0]) - 1),arrayDate[1]);
								
								//used so that redirecting doesn't occur
								var redirectExceptionsAry = new Array('mycovergirl/myshoppinglist');
								
								//exclude people from maine
								var maineExcludeAry = new Array('antm/cycle13','persona');
								
								var redirectException = false;
								
								var currentUrl = window.location.pathname;
								
								for(a=0; a<redirectExceptionsAry.length; a++) {
									if(currentUrl.indexOf(redirectExceptionsAry[a]) != -1) {
										redirectException = true;
									}
								}
								
								var ageReqNotMetRedirectPage = "/global/error-age.jsp";
								
								if(currentUrl.indexOf('antm/cycle13') != -1) {
									ageReqNotMetRedirectPage = '/antm/cycle13/sweeps-age-requirements-not-met.jsp';
								}else if(currentUrl.indexOf('persona') != -1) {
									ageReqNotMetRedirectPage = '/persona/sorry.jsp';
								}else if(currentUrl.indexOf('conversion') != -1) {
									ageReqNotMetRedirectPage = '/stand-up-for-beauty/compare-makeup/error-age.jsp';
								}
								
								var ageReqNotMetMessage = "We're sorry but we can't accept your messages or personal information because you do not meet our eligibility requirements. But that doesn't mean you can't explore the rest of our site and learn more about us! <a href='/'>Click here to return to the homepage</a>.";
								
								var pass18Maine = true;
								
								var pass13 = true;
								
								var passMaine = true;
								
								//check age requirements
								if(readCookie("ageReqNotMet")) {
									pass13 = false;
								}else if(readCookie("excludeMaine")) {
									for(b=0; b<maineExcludeAry.length; b++) {
										if(currentUrl.indexOf(maineExcludeAry[b]) != -1) {
											passMaine = false;
										}
									}	
								}else{
									//check 18 and Maine
									if($('state') && ($('state').value == 'ME')) {
										for(b=0; b<maineExcludeAry.length; b++) {
											if(currentUrl.indexOf(maineExcludeAry[b]) != -1) {
												passMaine = false;
											}
										}
										if(passMaine) {
											if(readCookie("ageReqNotMet18Maine")) {
												pass18Maine = false;
											}else{
												var minAgeMaine = 18;
												then = new Date((now.getFullYear() - minAgeMaine),now.getMonth(),now.getDate());
												if(bd>then) {
													pass18Maine = false;
												}
											}
										}
									}else{
										//check 13
										then = new Date((now.getFullYear() - minAge),now.getMonth(),now.getDate());
										if(bd>then) {
											pass13 = false;
										}
									}
								}
								
								//handle fail age requirements
								if(!pass18Maine || !pass13 || !passMaine) {
									if(!passMaine) {
										if(!readCookie("excludeMaine")) {
											createCookie("excludeMaine",true,cookieExp);
										}
									}else if(!pass18Maine) {
										if(!readCookie("ageReqNotMet18Maine")) {
											createCookie("ageReqNotMet18Maine",true,cookieExp);
										}
									}else if(!pass13) {
										if(!readCookie("ageReqNotMet")) {
											createCookie("ageReqNotMet",true,cookieExp);
										}
									}
									if(!redirectException) {
										document.location = ageReqNotMetRedirectPage;
										return false;
									}else{
										if($('sendToMobileForm')) {
											$('sendToMobileForm').style.display = 'none';
										}
									}
									errMsg=ageReqNotMetMessage;
									this.displayError(fieldItem,errMsg);
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
						}
					}
				}
			}
						
			if (fieldItemsAry.length>0) {
				if(this.alertBox==1) alert('Please make sure all fields are valid.');
				for (x=0; x<fieldItemsAry.length; x++) {
					$(fieldItemsAry[x]).style.backgroundColor=errInputBGColor;
				}
				try {
				$(fieldItemsAry[0]).focus();
				} catch(err) {}
				return false;
			}
			
			if($('mobileNumber') && $('mobileCarrier') && $('mobileOptin')) {
				var mobileError;
				if($('mobileOptin').checked) {
					if($('mobileNumber').value.length == 0 || (!Phonefilter1.test($('mobileNumber').value) || !Phonefilter2.test($('mobileNumber').value))) {
						errMsg='*Invalid mobile number.';
						this.displayError($('mobileNumber'),errMsg);
						for(i=1; i<4; i++) {
							if($('phone' + i)) {
								$('phone' + i).style.backgroundColor=errInputBGColor;
							}
						}
						if ($('mobileNumber')) fieldItemsAry.push('mobileNumber');
						mobileError = true;
					}
					if($('mobileCarrier').value.length == 0) {
						errMsg='*Invalid mobile carrier.';
						this.displayError($('mobileCarrier'),errMsg);
						$('mobileCarrier').style.backgroundColor=errInputBGColor;
						if ($('mobileCarrier')) fieldItemsAry.push('mobileCarrier');
						mobileError = true;
					}
				}else{
					if($('mobileNumber').value.length > 0) {
						errMsg='*Please accept the terms and conditions.';
						this.displayError($('mobileOptin'),errMsg);
						if ($('mobileOptin')) fieldItemsAry.push('mobileOptin');
						mobileError = true;
					}
				}
				if(mobileError == true) {
					return false;
				}
			}
			
			if($('entryMobileNumber') && $('entryMobileCarrier') && $('entryMobileOptin')) {
				var mobileError;
				if($('entryMobileOptin').checked) {
					if($('entryMobileNumber').value.length == 0 || (!Phonefilter1.test($('entryMobileNumber').value) || !Phonefilter2.test($('entryMobileNumber').value))) {
						errMsg='*Invalid mobile number.';
						this.displayError($('entryMobileNumber'),errMsg);
						for(i=1; i<4; i++) {
							if($('phone' + i)) {
								$('phone' + i).style.backgroundColor=errInputBGColor;
							}
						}
						if ($('entryMobileNumber')) fieldItemsAry.push('entryMobileNumber');
						mobileError = true;
					}
					if($('entryMobileCarrier').value.length == 0) {
						errMsg='*Invalid mobile carrier.';
						this.displayError($('entryMobileCarrier'),errMsg);
						$('entryMobileCarrier').style.backgroundColor=errInputBGColor;
						if ($('entryMobileCarrier')) fieldItemsAry.push('entryMobileCarrier');
						mobileError = true;
					}
				}else{
					if($('entryMobileNumber').value.length > 0) {
						errMsg='*Please accept the terms and conditions.';
						this.displayError($('entryMobileOptin'),errMsg);
						if ($('entryMobileOptin')) fieldItemsAry.push('entryMobileOptin');
						mobileError = true;
					}
				}
				if(mobileError == true) {
					return false;
				}
			}
			
			
		}
		return true;		
	},
	
	validateForm: function(formEvt,formID) {
		return FormValidation.goValidate(formID);
	}
} 
var FormValidation = new FormValidation();
-->