/*-----------------------------------------------------------------------------------------------*/

Event.observe(window, 'load', initializeForms, false);

var webForm = Class.create();

webForm.prototype = {

	initialize: function(formId) {
		// Get local references to our form element, required fields and submit button
		this.formElement = $(formId);
		this.requiredLabel = this.formElement.getElementsBySelector('p[id="requiredLabel"]')[0];
		this.requiredFields = this.formElement.getElementsBySelector(".req");
		this.formInputs = this.formElement.getElements();
		this.submitButton = this.formElement.getElementsBySelector(".stdSubmit")[0];
		this.errorMsg = new Array();
		this.introContainer = $$('div[class="formIntro"]')[0];
		
		// Make sure we have an error container
		if (this.formElement.getElementsBySelector('div[class="errorContainer"]')[0]){
			this.errorContainer = this.formElement.getElementsBySelector('div[class="errorContainer"]')[0];
		}else{
			var errorDiv = "<div class='errorContainer' style='display:none;'></div>";
			if ( this.requiredLabel )
				 // insert element after this.requiredLabel
				new Insertion.After(this.requiredLabel, errorDiv);
			else
			  // insert element at top of this.formElement
				new Insertion.Top(this.formElement, errorDiv);
			this.errorContainer = this.formElement.getElementsBySelector('div[class="errorContainer"]')[0];
				  
		}
		
		// Observer our submit button's click event and the form's keypress (enter) event
		if(this.submitButton){
			Event.observe(this.submitButton, 'click', this.submitForm.bindAsEventListener(this), false);
			this.submitButton.onclick = function(){return false;};
		}
		//Event.observe(this.formElement, 'keypress', this.observeKeypress.bindAsEventListener(this), false);
	},
	
	
	
	appendUserAgent: function(){
	  	//Append userAgent data
		if(document.getElementById('userAgent') && document.getElementById('userAgent').value == "getUserAgent"){
		//Set userAgent
		var nAgt = navigator.userAgent;
		//Check the append field is ! empty
			if(document.getElementById('memberRequestSlot').value != "" ){
			//Append userAgent info
			var appendAgt = document.getElementById('memberRequestSlot').value+'\n\nBrowser Info:\n'+nAgt;
			document.getElementById('memberRequest').value = appendAgt;
			}//end !empty
		}//end userAgent 
	},//end function
		

  submitForm: function() {
	  
		this.appendUserAgent();
	  
	  	if ( this.validate() ) this.formElement.submit();
	},

	// Run client-side validation
	validate: function(){
		// Make sure we're starting w/ fresh error state
		this.clearErrors();
		
		// Make sure that all required fields have been completed
		if( !this.validateRequired() ) {
			return false;
		}else{
			this.validateContents(); 
		
			if ( this.errorMsg.length > 0 ){
				this.errorMsg = this.errorMsg.uniq();
				var errorHtml = "";
				this.introContainer.hide();
				for (var i=0; i<this.errorMsg.length; i++){
					errorHtml += ("<li>" + this.errorMsg[i] + "</li>");
				}
				new Insertion.Bottom( this.errorContainer, "Please correct the following errors:<ul>" + errorHtml + "</ul>" );
				this.errorContainer.show();
				return false;
			}else{
				return true;
			}
		}
	},

	validateRequired: function(){
		var missingRequired = false;
    if( this.requiredFields && (this.requiredFields.size() > 0) ){
			for( var i=0; i<this.requiredFields.length; i++ ){
				var fieldLabel = this.getFieldLabel(this.requiredFields[i].id);
				if( $F(this.requiredFields[i]) == "" ){
					if ( fieldLabel ){
						if(fieldLabel[0])
							fieldLabel[0].addClassName('error');
					}
					missingRequired = true;
				}
			}
		}
		if ( missingRequired )  {
			if(this.requiredLabel) {
				this.requiredLabel.addClassName('errors');
				this.requiredLabel.removeClassName('requiredLabel');
			}
			else
				missingRequired = false;
		}
		return (missingRequired ? false : true);
	},
	
	validateContents: function(){
		var contentsValid = true;
		
    if( this.formInputs && (this.formInputs.size() > 0) ){
			for( var i=0; i<this.formInputs.length; i++ ){
				if ( this.formInputs[i].type != "hidden" ){
					var fieldLabel = this.getFieldLabel(this.formInputs[i].id);
					if( !this.checkContent(this.formInputs[i]) ){
						if ( fieldLabel ) fieldLabel[0].addClassName('error');
						contentsValid = false;
					}
				}
			}
		}
		return contentsValid;
	},
	
	checkContent: function(formInput){
		switch(formInput.id){
			case "fname":
			case "lname":
				var r_name = /^[a-z \- ]*$/i;
				if(!r_name.test($F(formInput))){ 
					this.addErrorMsg("Names should contain only letters.");
					return false; 
				}
				break;
				
			case "email":
				var msg = "";
				var r_start    = /^[a-z0-9]/i;
				var r_email    = /^[a-z0-9]+[-a-z0-9._'+]*@[-a-z0-9_']+(\.[-a-z0-9_']{1,})*\.[a-z0-9]{2,}/i;
				var r_end      = /[a-z0-9]$/i;
				if (!r_start.test($F(formInput))) {
					msg = "Email address must begin with a letter or number"; 
				} else if ($F(formInput).indexOf('@', 1) == -1) {
					msg = "Email address must contain an \'@\' character"; 
				} else if ($F(formInput).indexOf('.', $F(formInput).indexOf('@', 0)) == -1) {
					msg = "Email address must contain a \'.\' character after the \'@\'"; 
				} else if ($F(formInput).length  - $F(formInput).indexOf('.', 0)  < 3 ) {
					msg = "Email address must have at least two characters after the  \'.\' character"; 
				} else if (!r_end.test($F(formInput))) { 
					msg = "Email address cannot end with a \" " +$F(formInput).charAt($F(formInput).length - 1 )+ " \""; 
				} else if (!r_email.test($F(formInput))){
					msg = "Please use a valid email address";
				}
				if(msg){
					this.addErrorMsg(msg);
					return false;
				}
				break;

			case "password1":
				var msg = "";
				var r_password = /^.{6,30}$/i;
				if (!r_password.test($F(formInput))) {
					msg='Password must be at least 6 characters';
				} else if ($F(formInput).toLowerCase() == 'password' || $F(formInput) == '123456'){
					msg = 'You have entered an invalid password.'
				}
				if(msg){
					this.addErrorMsg(msg);
					return false;
				}
			
			case "password2":
				if($F(formInput) != $F('password1')){
					this.addErrorMsg("Passwords do not match");
					return false;
				}
				break;
				
			case "zip":
				if($F(formInput).length < 5 ){
					this.addErrorMsg("Zip code must be at least 5 characters");
					return false;
				}
				break;
			case "birthDateMonth":
				// Get our values and cast as integers
				var month = parseInt($F('birthDateMonth'), 10);
				var date = parseInt($F('birthDateDay'), 10);
				var year = parseInt($F('birthDateYear'), 10);
				
				// Convert our month to zero-based index for javascript 
				// b/c EMP expects vals 1-12 from the reg form and js works w/ 0-11
				month = (month - 1);
				
				// Make sure we have some values
				if( isNaN(month) || isNaN(date) || isNaN(year) ){
					this.addErrorMsg("Please enter your full date of birth.");
					return false;
				}
				
				// Now see if we have a valid date
				if(!IsValidDate(month,date,year,false) ){
					this.addErrorMsg("Please enter a valid date.");
					return false;
				}
				
				// See if the user is eighteen years old or not
				if( GetAge(month, date, year) < 18 ) {
					this.addErrorMsg("We're sorry.  You are not eligible to sign up for MyPoints.")
					return false;
				}
				break;
			case "vuser":
			  if($F('vuserName')){
					// See if we have any custom validation for the current vuser attribute
					switch($F('vuserName')){  //vuserName.value should contain the attribute's name (not display name)
						case "HHonors":
							// we need to do some math here so make sure we have an integer (see spec for more details on formula)
							var intInput = parseInt($F(formInput),10);
							// split the number into the first 8 bytes (digits) and the last byte
							var intBase = Math.floor(intInput/10);
							var intCheck = ((intBase - (Math.floor((intBase / 9)) * 9)) + 1);
							if(intCheck != (intInput % 10)){
								this.addErrorMsg("The HHonors account number you entered is invalid. Please check it and try again.")
								return false;
							}
							break;
						case "MileagePlus":
							// we need to do some math here so make sure we have an integer (see spec for more details on formula)
							var intInput = parseInt($F(formInput),10);
							// split the number into the first 10 digits and the last check digit
							var intBase = Math.floor(intInput/10);
							var intCheck = 0;
							for (var i=0; i<10; i++){
								var intFactor = (i % 6) + 2;
								intCheck += ((intBase % 10) * intFactor);
								intBase = Math.floor(intBase/10);
							}
							
							intCheck = intCheck % 11;
							intCheck = ((intCheck == 0) || (intCheck == 1) ? 0 : (11 - intCheck));
					
							if(intCheck != (intInput % 10)){
								this.addErrorMsg("The MileagePlus account number you entered is invalid.\nPlease check it and try again.");
								return false;
							}
							break;
						default:
							break;
					}
				}
			
			  break;
		}
		return true;
	},

	addErrorMsg: function(strError){
		if(strError) this.errorMsg[this.errorMsg.length] = strError;
	},

  clearErrors: function(){
		this.errorMsg = new Array();
		
		// Reset Error Labels
		var errorLabels = this.formElement.getElementsBySelector('label[class="error"]');
		for (var i=0; i<errorLabels.length; i++){
		  errorLabels[i].removeClassName('error');
		}
		
		if(this.requiredLabel){
			this.requiredLabel.addClassName('requiredLabel');
			this.requiredLabel.removeClassName('errors');
		}
		
		// Reset Error Container
		this.errorContainer.hide();
		this.errorContainer.innerHTML = "";
		
	},

	getFieldLabel: function(id){
		var labelElement = this.formElement.getElementsBySelector('label[for="'+id+'"]');
		return labelElement;
	},
	
	observeKeypress: function(e){
    var key = (e.which ? e.which : e.keyCode);
		
		if(key){
			switch(key){
				case Event.KEY_RETURN:
				 this.validate();
				 Event.stop(e);
				 break;
			}
		}
		
	}

}

/*-----------------------------------------------------------------------------------------------*/


function initializeForms(){
	forms = $$('form.stdForm');
	for(i = 0; i < forms.length; i++) {
		valid = new webForm(forms[i].id);
	}
}

