/* S.Redhead Nov 2008 */
/* Indra Sathish May 2009 - Updated for Radio/Checkbox group */

function validateForm(el) {

  if (!el) return true;
    //alert("Validating form "+el.name+"\nSubmit button = "+el.submitButton.name);

  // remove old validation errors from previous failed submission
  try
  {
       oldValidationMsgEls = getElementsByClassName('validation-message');
       for (x in oldValidationMsgEls) {
           oldValidationMsgEls[x].parentNode.parentNode.className = '';
           oldValidationMsgEls[x].parentNode.removeChild(oldValidationMsgEls[x]);
      }
  }
  catch(err) 
  {alert(err.description);}

  // run validators
  var passed = true;

  for (x in el.validators) {
    var thisPassed = el.validators[x].execute(el.submitButton.name);
    passed = passed && thisPassed; 
  }
  return passed;  

}

function Validator(elementid, trigger, type, message, param1, param2) {

  this.elementid=elementid;
  this.trigger=trigger; // if empty string, always trigger
  this.type=type;
  this.failureMessage=message;
  this.param1=param1;
  this.param2=param2;
  this.objtype= message; // this could be object type 'group'
}

Validator.prototype.execute = function(submitName) {
  var triggers = this.trigger.split(' ');

  var result = true;

  for(x in triggers) {

    if (triggers[x] == submitName || triggers[x]=='') {
/*
	     alert('Executing validator for ' +
            this.elementid + 
            '\nType='   + this.type + 
            '\nparam1=' + this.param1 + 
            '\nparam2=' + this.param2);
*/	
      if (!document.getElementById) return true; // rely on server
      var testVal;
      if (this.objtype == 'group')
      {
          var fieldE1 = document.getElementsByName(this.elementid);
          if(!fieldE1) return true;
          //alert('yes group validation');
          for(var i=0;i<fieldE1.length;i++)
          {
              if(fieldE1[i].checked) testVal = fieldE1[i].value;
          }
      }
      else
      {
         var fieldEl = document.getElementById(this.elementid);

         if (!fieldEl) return true; // rely on server
         var testVal = fieldEl.value;
      }
      var failureMessage = this.failureMessage;

      switch(this.type) {
      case 'length': 
	  // param1: minimum length
	  // param2: maximum length
	  if (testVal.length != 0 && testVal != undefined) { 
	      if (this.param1IsSet()) {
		  result = result && (testVal.length >= this.param1);
	      }
	      if (this.param2IsSet()) {
		  result = result && (testVal.length <= this.param2);
	      }
	  }
	  break;

      case 'required': 
	  result = (testVal!=undefined && testVal.length!=0); 
	  failureMessage = 'This field is required';
	  break;

      case 'regex': 
	  // param1: regular expression to match (required)
	  // param2: modifiers (optional)

	  if (testVal.length != 0 && testVal != undefined) { 
	      if (this.param2IsSet()) {
		  testRegExp = new RegExp(this.param1, this.param2);
	      } else {
		  testRegExp = new RegExp(this.param1);
	      }
	      result = testRegExp.test(testVal); 
	  }
	  break;
      }

      if (!result) {
  	  // add failure messages in context
	  var errorNode = document.createElement('div');
	  errorNode.className = 'validation-message';
	  errorNode.appendChild(document.createTextNode(failureMessage));
           if (this.objtype == 'group')
	  {
		//alert('fails here-'+fieldE1[0].id);
		var obj1 = fieldE1[0];
		obj1.parentNode.parentNode.appendChild(errorNode);
		obj1.parentNode.parentNode.className = 'validation-error';
	  }
	  else
	  {
	         fieldEl.parentNode.appendChild(errorNode);
 	         fieldEl.parentNode.parentNode.className = 'validation-error'; // <tr> element
	  }

	  // create message near submit button
	  if (!document.getElementById(submitName+':error-prompt')) {
	      var submitEl = document.getElementById(submitName);
	      var errorPromptNode = document.createElement('div');
	      errorPromptNode.setAttribute('id', submitName+':error-prompt');
	      errorPromptNode.className = 'validation-message';
	      errorPromptNode.appendChild(document.createTextNode('There were errors processing your submission. Please check the highlighted fields.'));
	      submitEl.parentNode.appendChild(errorPromptNode);
	  }	  
      }
    }
  }
  return result;
}

Validator.prototype.param1IsSet = function() {
    return (this.param1 != undefined && this.param1 != '');
}
Validator.prototype.param2IsSet = function() {
    return (this.param2 != undefined && this.param2 != '');
}


