var fV = {
  init: function() {
	var j = 0;	  
    for (var i in validationSet) {
      if (document.getElementsByName(i)) {
        var formField = document.getElementsByName(i)[0];
		if (typeof formField != 'undefined') {
		  /* if the form has an id already use it otherwise give it one */
		  formField.form.id = (formField.form.id == null || formField.form.id == '') ? 'val_form_' + j++ : formField.form.id;			
		  /* bind a span to each form field */
		  var errorSpan = document.createElement('span');
		  errorSpan.className = 'errormessage';
		  /* give it the id of 'error_' + the current field's name */
		  errorSpan.id = 'error_' + formField.name;
		  formField.parentNode.appendChild(errorSpan);
		  /* append the error span to the field's parent add add the blur handler */
          addEvent(formField, 'blur', fV.checkValid, false);
		
          if (!formField.form.validateSubmit) {
            addEvent(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 = [];
	var fieldErr = [];
	
    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 && errDisplay) {
		  errDisplay.innerHTML = '';
		}

        if (failedE) {
          var labels = document.getElementsByTagName('label');
          errText[errText.length] = validationSet[failedE.name]['error'];
		  fieldErr[fieldErr.length] = validationSet[failedE.name];
          for (var j = 0; j < labels.length; j++) {
            if (labels[j].htmlFor == failedE.id) {
              errText[errText.length - 1] +=
                  ' - ' + labels[j].firstChild.nodeValue.replace(/[:;-]/, '');
			  fieldErr[fieldErr.length - 1] = frm.elements[i].name;
            }
          }
        }
      }  /* end 'if' */
    } /* end 'for' */

    if (errText.length > 0) {
	  /* get the current form's id + vm (validation message) */
	  if (document.getElementById('vm' + frm.id)) {
		 frm.removeChild(document.getElementById('vm' + frm.id)); 
	  }
	  var fixMsg = 'The following fields contain errors or are '+
	  			   'incomplete please fix these and resubmit:';
	  var wrap = document.createElement('div');
	  var ul = document.createElement('ul');
	  var span = document.createElement('span');
	  /* set up the full message to display */
  	  wrap.id = 'vm' + frm.id;
	  wrap.className = 'validationmessage';
	  wrap.style.display = 'block';
	  wrap.appendChild(span);
	  wrap.appendChild(ul);
	  frm.insertBefore(wrap,frm.firstChild);
	  span.appendChild(document.createTextNode(fixMsg));
	  /* add each bullet */
	  for (var i=0; i<errText.length; i++) {
		var li = document.createElement('li');
		li.appendChild(document.createTextNode(errText[i].split('-')[1]));
		ul.appendChild(li);
	  }
	  /* add focus to the first error field and cancle form submission */
	  frm.elements[fieldErr[0]].focus();
      frm.submitAllowed = false;
	  /* prevent default actions */
      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() {
    if (this.attachEvent) {return true;}
    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) {
      errDisplay.innerHTML = validationSet[failedE.name]['error'];
    }
    if (failedE && !errDisplay) {
      alert(validationSet[failedE.name]['error']);
    }
    if (!failedE && errDisplay) {
      errDisplay.innerHTML = '';
    }
  },

  handleValidity: function(field) {
	var errorClass = field.className.replace(/\b ?textfield\b/, 'fielderror');
	var normalClass = field.className.replace(/\b ?fielderror\b/, 'textfield');
	switch (field.type) {
		case 'select-one':
			if (validationSet[field.name]['required'] != null && 
				validationSet[field.name]['required'] == false && field.value == '') {
			  field.className = normalClass;
			  return null;
			} else if (field.selectedIndex == -1 || field.options[field.selectedIndex].value == ''){
				field.className = errorClass;
				return field;
			} else {
			    field.className = normalClass;
			    return null;
			}
		case 'select-multiple':
			if (field.selectedIndex == -1){
				field.className = errorClass;
				return field;
			} else {
			    field.className = normalClass;
				return null;
			}			
		case 'text':
		case 'textarea':
		case 'password':
		case 'file':
			if (validationSet[field.name]['required'] != null && 
				validationSet[field.name]['required'] == false && field.value == '') {
			  field.className = normalClass;
			  return null;
			} else if (!field.value.match(validationSet[field.name]['regexp'])) {
			  field.className = errorClass;
			  return field;
			} else {
			  field.className = normalClass;
			  return null;
			}
		case 'radio':
		case 'checkbox':
			var blnchecked = false;
			if (field.type == 'radio') {
				for (var j = 0; j < field.form.elements[field.name].length; j++) {
					if (field.form.elements[field.name][j].checked) {
						blnchecked = true;
					}
				}
			} else if (field.type == 'checkbox') {
				if (field.checked) {
					blnchecked = true;	
				}
			}
			if (!blnchecked){
				return field;
			} else {
			  	return null;
			}
		default:
			return null;
	}
  }
}

addLoadListener(fV.init);
