var fV = {
	
  addEvent: function(elm, evType, fn, useCapture) {
    // cross-browser event handling for IE5+, NS6 and Mozilla 
    // By Scott Andrew
    if (elm.addEventListener) {
      elm.addEventListener(evType, fn, useCapture);
      return true;
    } else if (elm.attachEvent) { 
      var r = elm.attachEvent('on' + evType, fn);
      return r;
    } else {
      elm['on' + evType] = fn; 
    }	
  },

  init: function() {
    for (var i in validationSet) {
      if (document.getElementsByName(i)) {        
		
		var formField = document.getElementsByName(i)[0];		
		
		// initial state is "none" for error messages div
		if(formField) {
			
			if(formField.type != "radio" || formField.type != "checkbox"){
				fV.addEvent(formField, 'blur', fV.checkValid, false);
			}
			
			var errDisplay = document.getElementById('error_' + formField.name);		
			
			if(errDisplay && !failedE){
				errDisplay.style.display = "none";
			}			
			
		}else{
			return null;
		}
		
		if (!formField.form.validateSubmit) {
			  fV.addEvent(formField.form, 'submit', fV.checkValidSubmit, false);
			  formField.form.onsubmit = fV.checkSubmit; // Safari
			  formField.form.validateSubmit = true;
		}
		
      }
    }
	
  },
  
  getCurrentStyle: function(el, prop_css, prop_dom) {	  
	  // var x = document.getElementById(el);
	  var x = el;	  
	  if (x.style[prop_dom]) {
		var y = x.style[prop_dom];
	  }	  
	  // IE
	  if (x.currentStyle) {			
			var ar = prop_dom.match(/\w[^-]*/g);
			var s = ar[0];
			for(var i = 1; i < ar.length; ++i) {
				 s += ar[i].replace(/\w/, ar[i].charAt(0).toUpperCase());
			}			
			var y = x.currentStyle[s];
	  }	  
	   // mozilla
	   if (document.defaultView) {
			var y = document.defaultView.getComputedStyle(x,"").getPropertyValue(prop_css);
	   }		
	return y;
	
  },

  hasClass: function(e,cls) {
	return e.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
  },

  addClass: function(e,cls) {
		if (!this.hasClass(e,cls)) e.className += " "+cls;
	},
	
  removeClass: function(e,cls) {
		if (fV.hasClass(e,cls)) {
			var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
			e.className = e.className.replace(reg,' ');
		}
  },	

  checkValidSubmit: function(e) {
    
	var submitbutton = document.getElementById('Submit');
	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] && frm.elements[i].type != "hidden") {		
		
		var failedE = fV.handleValidity(frm.elements[i]);		
		var errDisplay = document.getElementById('error_' + frm.elements[i].name);
		
		// if previous element has same name, ignore the error
		if(frm.elements[i].name == frm.elements[i+1].name) {
			//alert(frm.elements[i].name + " != " + frm.elements[i-1].name + " OK!");
			failedE = false;
		}
		
		//var errFlag = document.getElementById('flag_' + frm.elements[i].name);
		
		if (failedE && errDisplay) {
          errDisplay.innerHTML = validationSet[failedE.name]['error'];
		  // show the error
		  errDisplay.style.display = "block";
	  	  if(frm.elements[i].type != "radio" || frm.elements[i].type != "checkbox"){
		  	fV.addClass(frm.elements[i],"errorfield");
		  }
        }
        if (!failedE && errDisplay) {
          errDisplay.innerHTML = '';
		  errDisplay.style.display = "none";
		}

        if (failedE) {
          var labels = document.getElementsByTagName('label');
          errText[errText.length] = validationSet[failedE.name]['error'];
          for (var j = 0; j < labels.length; j++) {
            
			thefieldid = failedE.id;
			
			// if radio or check, get name, not ID
			if(failedE.type == "radio" || failedE.type == "checkbox"){
				thefieldid = failedE.name;
			}
			
			if (labels[j].htmlFor == thefieldid) {
              errText[errText.length - 1] += ' (field \'' + labels[j].firstChild.nodeValue + '\')';
            }
			
          }
        }
      }  /* end 'if' */
    } /* end 'for' */

    if (errText.length > 0) {
      
      var t_errorIntro = "Please fix the following errors and resubmit:";
      var t_tryAgain = "Try again";
      var t_sending = "Sending";
      
	  alert(t_errorIntro + '\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;
      }	  
	  
	  submitbutton.value = t_tryAgain;
	  
	  
    } else {
      frm.submitAllowed = true;
	  
	  submitbutton.value = t_sending;
	  
    }
	
  },

  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);	
	
	//target.style.borderColor = "#888";
	fV.removeClass(target,"errorfield");
	
	if (failedE && errDisplay) {
      
	  errDisplay.innerHTML = validationSet[failedE.name]['error'];      
	  
	  errDisplay.style.display = "block";
	  //target.style.borderColor = "red";
	  fV.addClass(target,"errorfield");
	  
	  //failedE.focus();
    }
	
    if (failedE && !errDisplay) {
      alert(validationSet[failedE.name]['error']);
    }
	
    if (!failedE && errDisplay) {
      errDisplay.innerHTML = '';
	  errDisplay.style.display = "none";	  
	}
	
  },
  
  getSelectedCheckboxValue: function(buttonGroup) {
	   // return an array of values selected in the check box group. if no boxes
	   // were checked, returned array will be empty (length will be zero)
	   var retArr = new Array(); // set up empty array for the return values
	   var selectedItems = fV.getSelectedCheckbox(buttonGroup);
	   if (selectedItems.length != 0) { // if there was something selected
		  retArr.length = selectedItems.length;
		  for (var i=0; i<selectedItems.length; i++) {
			 if (buttonGroup[selectedItems[i]]) { // Make sure it's an array
				retArr[i] = buttonGroup[selectedItems[i]].value;
			 } else { // It's not an array (there's just one check box and it's selected)
				retArr[i] = buttonGroup.value;// return that value
			 }
		  }
	   }
	   return retArr;
  },
  
  getSelectedRadio: function(buttonGroup) {
	   // returns the array number of the selected radio button or -1 if no button is selected
	   if (buttonGroup[0]) { // if the button group is an array (one button is not an array)
		  for (var i=0; i<buttonGroup.length; i++) {
			 if (buttonGroup[i].checked) {
				return i
			 }
		  }
	   } else {
		  if (buttonGroup.checked) { return 0; } // if the one button is checked, return zero
	   }
	   // if we get to this point, no radio button is selected
	   return -1;
	},
  
  getSelectedRadioValue: function(buttonGroup) {
	   // returns the value of the selected radio button or "" if no button is selected
	   var i = fV.getSelectedRadio(buttonGroup);
	   if (i == -1) {
		  return "";
	   } else {
		  if (buttonGroup[i]) { // Make sure the button group is an array (not just one button)
			 return buttonGroup[i].value;
		  } else { // The button group is just the one button, and it is checked
			 return buttonGroup.value;
		  }
	   }
  },
  
  getSelectedCheckbox: function(buttonGroup) {
	   // Go through all the check boxes. return an array of all the ones
	   // that are selected (their position numbers). if no boxes were checked,
	   // returned array will be empty (length will be zero)
	   var retArr = new Array();
	   var lastElement = 0;
	   if (buttonGroup[0]) { // if the button group is an array (one check box is not an array)
		  for (var i=0; i<buttonGroup.length; i++) {
			 if (buttonGroup[i].checked) {
				retArr.length = lastElement;
				retArr[lastElement] = i;
				lastElement++;
			 }
		  }
	   } else { // There is only one check box (it's not an array)
		  if (buttonGroup.checked) { // if the one check box is checked
			 retArr.length = lastElement;
			 retArr[lastElement] = 0; // return zero as the only array value
		  }
	   }
	   return retArr;
  },

  
  handleValidity: function(field) {
	  
	var thevalue = field.value;
	
	if(field.type == "checkbox") {	
		
		var checkBoxArr = fV.getSelectedCheckbox(document.getElementsByName(field.name));		
		
		if (checkBoxArr.length == 0) { 
			return field;
		}
		
	}
	
	if(field.type == "radio") {		
		
		var checkBoxArr = fV.getSelectedRadio(document.getElementsByName(field.name));		
		if (checkBoxArr < 0) { 			
			return field;
		}
		
	}
	
	// check if the field is required
	if (!thevalue && !document.getElementById('flag_' + field.name)) {
      return null;
    }	
	
	var re = validationSet[field.name]['regexp'];
	
	if (!thevalue.match(re)) {
	  return field;
	} else {
	  return null;
	}
	
  }
  
}

fV.addEvent(window, 'load', fV.init, false);
