Event.observe(window, 'load', chForms, false);

function chForms () {
	var chForms = document.forms;
	
	// For each form in the page
	for (var i = 0; i < chForms.length; i++) {		
		chFields = Form.getElements(chForms[i]);
		
		// get each submit button
		for (var j = 0; j < chFields.length; j++) {
      if ((chFields[j].tagName == "INPUT") && (chFields[j].getAttribute("type") == "submit")) {
				Event.observe(chFields[j], 'click', clickSubmit, false);
				chFields[j].onclick = function() {
           return false;
        }
			}
		}
	}
	
	
	function clickSubmit(e) {
    var parent = (document.all) ? Event.element(e).parentNode : this.parentNode;
		var formErrors = 0;
		var formFocus;
		var formFocusFlag = 0;
		
		while (parent != document.body) {
		  if (parent.tagName == "FORM") {
		      var parentForm = parent;
			     break;
		  }
		  parent = parent.parentNode;			
		}
		
		// If the parent form was found
		if (parentForm) {
			// For each of the forms fields
			fields = Form.getElements(parentForm);
			
			for (var i = 0; i < fields.length; i++) {
				// Remove field errors
				removeFieldError(fields[i], parentForm);
				
/*
        if(!isAllowedChar(fields[i].value)){
          addFieldError(fields[i], parentForm, "Only Alpha-Numeric and a few sepcial caharcters are allowed - Please check this input:");
          formErrors += 1;
        }
*/        
				// Validate required form fields
				formErrors += validateReq(fields[i], parentForm);
				
        // validate required check boxes
        formErrors += validateCheckRequired(fields[i], parentForm)
        
				// Validate fields with max characters
				formErrors += validateMaxChars(fields[i], parentForm);

				// Validate required form fields
				formErrors += validateEmail(fields[i], parentForm);

								
				if (formErrors > 0) {
					if (formFocusFlag == 0) {
						formFocus = fields[i];
						formFocusFlag = 1;
					}	
				}								
			}

		// find the two password fields, if there, then validate
			var pwField1, pwField2;
			for (var i = 0; i < fields.length; i++) {
				if(fields[i].getAttribute("fPassword") == "true"){
					pwField1 = fields[i];
				}else if(fields[i].getAttribute("fConfirmPw") == "true"){
					pwField2 = fields[i];					
				}
			}
			if(pwField1 != null){
				if(pwField2 == null){
					//run validation anyway, but just on the one field
					formErrors += validatePasswords(pwField1, pwField1, parentForm);
				}else{
					// Validate for both
					formErrors += validatePasswords(pwField1, pwField2, parentForm);
				}
			}					
			
		// find and 'one of these' fields, if there, then validate
			var oneOfThese = new Array();
			for (var i = 0; i < fields.length; i++) {
				if(fields[i].getAttribute("fOneOfThese") == "true"){
					oneOfThese.push(fields[i]);
				}
			}
			if(oneOfThese.length > 0){
				formErrors += validateOneOfThese(oneOfThese, parentForm);
			}					

      // find any expiry dates...
      var mField, yField;
      for (var i = 0; i < fields.length; i++) {
        if(fields[i].getAttribute("fExpiryM") == "true"){
          mField = fields[i];
        }
        if(fields[i].getAttribute("fExpiryY") == "true"){
          yField = fields[i];
        }        
      }
      if(mField && yField){
        formErrors += validateExpiry(mField, yField, parentForm);
      }         

			
			// --------------------------
			if (formErrors > 0) {
				if (formFocusFlag == 0) {
					formFocus = fields[i];
					formFocusFlag = 1;
				}	
			}								

			
			if (formErrors > 0) {			
				alert("Please fill in the highlighted fields.");
				formFocus.focus()
			} else {
				parentForm.submit();
			}
		}		
	}
		
	// ************************************************************************************************************************
	
	function validateReq(field, form) {	
		if ((field.getAttribute("fReq") == "true") && (field.value == "")) {
			addFieldError(field, form, "");
			return 1;
		} else {
			return 0;
		}
	}
	
  function validateCheckRequired(field, form){
  if ((field.getAttribute("fCheckRequired") == "true") && (field.checked == false)) {
      addFieldError(field, form, "You must check this box to confirm.");
      return 1;
    } else {
      return 0;
    }
  }
  
	function validateMaxChars(field, form) {	
		if ((field.getAttribute("fMaxChars") != null) && (field.value.length > field.getAttribute("fMaxChars"))) {
			addFieldError(field, form, " This field has an upper limit of " + field.getAttribute("fMaxChars") + " characters.");
			return 1;
		} else {
			return 0;			
		}
	}

 
 	function validateEmail(field,form){
		if(field.getAttribute("fEmail") == "true"){
 			var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			if (filter.test(field.value)){
				return 0;
			}else{
				addFieldError(field, form, " - Please enter a valid email address.");
				return 1;
			}
		}else{
			// not an email field
			return 0;
		}
 	}

	function validatePasswords(field1, field2, form) {	
		if ((field1.value == "") || (field2.value == "")){
			addFieldError(field1, form, " - The passwords cannot be blank.");
			addFieldError(field2, form, "");
			return 1;			
		}else if(field1.value != field2.value){
			addFieldError(field1, form, " - The passwords entered don't match.");
			addFieldError(field2, form, "");
			return 1;
		}else if(!isAlphaNumeric(field1.value)){
			//check for special chars, min length, etc...
			addFieldError(field1, form, " - Passwords can only contain letters & numbers.");
			return 1;			
		} else {
			return 0;			
		}
	}

  function validateExpiry(monthField, yearField, form) {  
    if ((monthField.value == "") || (yearField.value == "")){
      addFieldError(monthField, form, " - Please Select an Expiry Date.");
      addFieldError(yearField, form, "");
      return 1;     
    }else{
      var thisMonth = new Date().getMonth()+1;
      var thisYear = new Date().getYear();

     if((yearField.value < thisYear) || ((yearField.value == thisYear) && (monthField.value < thisMonth))){
        addFieldError(monthField, form, " - Please select an expiry date in the future.");
        addFieldError(yearField, form, "");
        return 1;
      } else {
        return 0;     
      }
    }
  }



	function validateOneOfThese(oneOfThese, form){
		var myCat = "";
		for(i=0; i<oneOfThese.length; i++){
			myCat += oneOfThese[i].value;
		}
		if(myCat.length > 0){
			// then one of those fields a string longer than 0, so it's ok
			return 0;
		}else{
			for(i=0; i<oneOfThese.length; i++){
				addFieldError(oneOfThese[i], form, " - You must fill in at least one of these fields.");
			}
			return 1;
		}
	}
  
  
  
  function isAllowedChar(thestring){
    var allowedChars = " 0123456789abcdefghijklmnopqrstuvwxyzáéíóú.,-_ '@%&:/?#=+ ";
    var isok = true;
    for(i=0;i<thestring.length;i++){
      if(allowedChars.indexOf(thestring.charAt(i)) < 0){
        isok = false;       
      }
    }
    return isok;
  }


	function isAlphaNumeric(thestring){
		var allowedChars = "__ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789";
		var isok = true;
		for(i=0;i<thestring.length;i++){
			if(allowedChars.indexOf(thestring.charAt(i)) < 0){
				isok = false;				
			}
		}
		return isok;
	}
	
	// ************************************************************************************************************************
	
	function addFieldError(field, form, message) {		
		var assocLabel;				
		if (assocLabel = returnAssociatedLabel(field, form)) {
      Element.addClassName(assocLabel, "js-fError");
			assocLabel.appendChild(createLabelError(message));
		}

		Element.addClassName(field, "js-fError");
	}
	
	function removeFieldError(field, form, message) {
		Element.removeClassName(field, "js-fError");	
		
		if (returnAssociatedLabel(field, form)) {
			var label = returnAssociatedLabel(field, form);	
		      Element.removeClassName(label, "js-fError");
			for (i = 0; i < label.childNodes.length; i++) {
				if ((label.childNodes[i].tagName == "SPAN") && (Element.hasClassName(label.childNodes[i], "js-fError"))) {
					label.childNodes[i].parentNode.removeChild(label.childNodes[i]);
				}
			}
		}	
	}
	
	// ************************************************************************************************************************
	
	function returnAssociatedLabel(field, form) {		
		var labels = form.getElementsByTagName("LABEL");
		
		for (var i = 0; i < labels.length; i++) {
			if (labels[i].getAttribute("for") == field.getAttribute("id")) {
				return labels[i];
			}
		}		
		return false;
	}
	
	function createLabelError(message) {
		var error = document.createElement("SPAN");
		
		error.className = "js-fError";		
		error.appendChild(document.createTextNode(message));
		
		return error;
	}
	
	// ************************************************************************************************************************
}