var validationSet = {
  // set of form fields to be validated
  'email': {
  	'regexp': /required/,
    'regexppresent': /^.+?@.+?\..+$/,
    'error': '* Please enter a valid e-mail address. (i.e. user@somewebsite.com)'
  },
  'name': {
    'regexp': /required/,
    'error': '* Please enter your name.'
  },
  'message': {
    'regexp': /required/,
    'error': '* Please enter a message.'
  }
}


var fV = {
  init: function() {
    // add eventListeners
    for (var i in validationSet) {
      if (document.getElementsByName(i)) {
	    var formField = document.getElementsByName(i)[0];
        if (!formField) return;
 		
        if (!formField.form.validateSubmit) {
          Event.observe(formField.form, 'submit', fV.checkValidSubmit, false);
          formField.form.onsubmit = fV.checkSubmit; // Safari
          formField.form.validateSubmit = true;
        }
      }
    }
  },

  checkValidSubmit: function(e) {
    var frm = window.event ? window.event.srcElement : e ? e.target : null;
    if (!frm) return;
    var errText = [];
    
    for (var i = 0; i < frm.elements.length; i++) {
      if (frm.elements[i].name && validationSet[frm.elements[i].name]) {

        var failedE = fV.handleValidity(frm.elements[i]);

        var errDisplay = document.getElementById('error_' + frm.elements[i].name);
        if (failedE && errDisplay) {
            errDisplay.innerHTML = 
              validationSet[failedE.name]['error'];
        }

        if (failedE) {
          var labels = document.getElementsByTagName('label');
          errText[errText.length] = validationSet[failedE.name]['error'];
          for (var j = 0; j < labels.length; j++) {
            if (labels[j].htmlFor == failedE.id) {
              errText[errText.length - 1];
            }
          }
        }
      }  /* end 'if' */
    } /* end 'for' */

    if (errText.length > 0) {
      alert('Looks like some fields weren\'t filled in...\n\n' +
          errText.join('\n'));
      frm.submitAllowed = false;
      if (e && e.stopPropagation && e.preventDefault) {
        e.stopPropagation();
        e.preventDefault();
      }
      if (window.event) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
        return false;
      }
    } else {
      frm.submitAllowed = true;
    }
  },
  checkSubmit: function() {
    return this.submitAllowed;
  },
  
  checkValid: function(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;

    var failedE = fV.handleValidity(target);
    var errDisplay = document.getElementById('error_' + target.name);
	
    if (failedE && errDisplay) {
      alert(validationSet[failedE.name]['error']);
    }
  },

  handleValidity: function(field) {
    var re = validationSet[field.name]['regexp'];
	var represent = validationSet[field.name]['regexppresent'];
	
	if (represent) {
	  if (field.value == "") {
	    return field;
	  } else {
	    re = represent;
	  }
	}
	
    if (re == "/required/" && field.value == "") {
      return field;
    }
    if (!field.value) {
      return null;
    }
    if (!field.value.match(re) && re != "/required/") {
      return field;
    } else {
      return null;
    }
  }
}

Event.observe(window, 'load', fV.init, false);
