/*
*  The Validator
*   The class that handles all validation related issues
*    
*   pass the name of the form while constructing.
*   methods:
*    addValidation(input_item_name,validation_descriptor,error_string)
*       call this method for each input item. Single input item can have 
*       many validations
*      
*    setAddnlValidationFunction(function_name)
*             call this function to set a custom validat function, which will
*						 be called after other validations are over.
*			       The function should return 'true' or 'false' 
*/
var theForm;

function Validator(frmname)
  {
  this.formobj=document.forms[frmname];
  if(!this.formobj)
    {
    alert("BUG: couldnot get Form object "+frmname);
    return;
    }
  if(this.formobj.onsubmit)
    {
    this.formobj.old_onsubmit = this.formobj.onsubmit;
    this.formobj.onsubmit=null;
    }
  else
    {
    this.formobj.old_onsubmit = null;
    }
  this.formobj.onsubmit=form_submit_handler;
  this.addValidation = add_validation;
  this.setAddnlValidationFunction=set_addnl_vfunction;
  this.clearAllValidations = clear_all_validations;
  }

  
function set_addnl_vfunction(functionname)
  {
  this.formobj.addnlvalidation = functionname;
  }

  
function clear_all_validations()
  {
  for(var itr=0;itr < this.formobj.elements.length;itr++)
    {
    this.formobj.elements[itr].validationset = null;
    }
  }


function form_submit_handler()
  {
  theForm = this;
  for(var itr=0;itr < this.elements.length;itr++)
    {
    if(this.elements[itr].validationset &&
    !this.elements[itr].validationset.validate())
      {
      return false;
      }
    }
  if(this.addnlvalidation)
    {
    str =" var ret = "+this.addnlvalidation+"()";
    eval(str);
    if(!ret) return ret;
    }
  return true;
  }

function add_validation(itemname,descriptor,errstr)
  {
  if(!this.formobj)
    {
    alert("BUG: the form object is not set properly");
    return;
    }
  var itemobj = this.formobj[itemname];
  if(!itemobj)
    {
    //GZW took this line out:   alert("BUG: Could not get the input object named: "+itemname);
    return;
    }
  
  //GZW: This changes the itemobj to the first radio in a radio group
  if (descriptor == "radioreq")
    {
    if(itemobj.length)
      {
      itemobj = itemobj[0];
      }
    }

  
  if(!itemobj.validationset)
    {
    itemobj.validationset = new ValidationSet(itemobj);
    }
  itemobj.validationset.add(descriptor,errstr);
  }
  
  
function ValidationDesc(inputitem,desc,error)
  {
  //alert("Adding validation to:"+inputitem.name)
  this.desc=desc;
  this.error=error;
  this.itemobj = inputitem;
  this.validate=vdesc_validate;
  }
  
  
function vdesc_validate()
  {
  if(!V2validateData(this.desc,this.itemobj,this.error))
    {
    this.itemobj.focus();
    return false;
    }
  return true;
  }


function ValidationSet(inputitem)
  {
  this.vSet=new Array();
  this.add= add_validationdesc;
  this.validate= vset_validate;
  this.itemobj = inputitem;
  }
  
  
function add_validationdesc(desc,error)
  {
  this.vSet[this.vSet.length]= 
  new ValidationDesc(this.itemobj,desc,error);
  }


function vset_validate()
  {
  for(var itr=0;itr<this.vSet.length;itr++)
    {
    if(!this.vSet[itr].validate())
      {
      return false;
      }
    }
  return true;
  }

//---------------------------------EMail Check ------------------------------------ 

/*  checks the validity of an email address entered 
*   returns true or false 
*   
*/ 

function ValidEmail(val,str)
  {
  var strInput = new String(val.value);
  if (isWhitespace(strInput) || strInput.indexOf ('@', 0) == -1) 
    {
    return false;
    } 
  else
    {
    return true;
    }
  }

function validateEmailv2(email)
  {
  if (email.indexOf ('@', 0) == -1) 
    {
    return false;
    } 
  else
    {
    if (email.indexOf ('.', 0) == -1)
      {
      
      }
    else
      {
      return true;
      }
    }
  }
  
  
/* function to check the Human question has been answered correctly
*/

function validateQuestion(strQuestion)
  {
  if (strQuestion != "a" && strQuestion !="A") 
    {
    return false;
    } 
  
    else
      {
      return true;
      }
 } 
  



/* function V2validateData 
*  Checks each field in a form 

*/ 
function V2validateData(strValidateStr,objValue,strError) 
  { 
  //var epos = strValidateStr.search("="); 
  var epos = strValidateStr.indexOf("=");   
  var  command  = ""; 
  var  cmdvalue = ""; 
  if(epos >= 0) 
    {
    command  = strValidateStr.substring(0,epos);
 
    //Setting cmdvalue to 0 because of NN3 clients not using substr
    
    //strVariable.substring(start, end)
    //stringvar.substr(start [, length ]) 
    
    //cmdvalue = strValidateStr.substr(epos+1); 
    //cmdvalue = 0; 
    cmdvalue = strValidateStr.substring(epos+1, strValidateStr.length)
    
    } 
  else 
    { 
    command = strValidateStr; 
    } 
  
  //alert("Checking:"+objValue.name+" for:"+command)
  
    
  //switch(command)     //****************************
  //  { 
    //case "req": 
    //case "required": 
    if ((command == "req") || (command == "required"))
      { 
      if(eval(objValue.value.length) == 0) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name + " : Required Field"; 
          }
        alert(strError); 
        return false; 
        }  
      }

    //case "maxlength": 
    //case "maxlen": 
    else if ((command == "maxlength") || (command == "maxlen"))
      { 
      if(eval(objValue.value.length) > eval(cmdvalue)) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name + " : "+cmdvalue+" characters maximum "; 
          }
        alert(strError + "\n[Current length = " + objValue.value.length + " ]"); 
        return false; 
        }
      }
      
    //case "minlength": 
    //case "minlen": 
    else if ((command == "minlength") || (command == "minlen"))
      { 
      if(eval(objValue.value.length) <  eval(cmdvalue)) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name + " : " + cmdvalue + " characters minimum  "; 
          }               
        alert(strError + "\n[Current length = " + objValue.value.length + " ]"); 
        return false;                 
        }
      }

    //case "alnum": 
    //case "alphanumeric": 
    else if ((command == "alnum") || (command == "alphanumeric"))
      { 
      var charpos = objValue.value.search("[^A-Za-z0-9]"); 
      if(objValue.value.length > 0 &&  charpos >= 0) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name+": Only alpha-numeric characters allowed "; 
          }
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
        return false; 
        }
      }
      
    //case "num": 
    //case "numeric":
    else if ((command == "num") || (command == "numeric")) 
      { 
      var charpos = objValue.value.search("[^0-9]"); 
      if(objValue.value.length > 0 &&  charpos >= 0) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name+": Only digits allowed "; 
          }             
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
        return false; 
        }
      }
      
    //case "alphabetic": 
    //case "alpha": 
    else if ((command == "alphabetic") || (command == "alpha"))
      { 
      var charpos = objValue.value.search("[^A-Za-z]"); 
      if(objValue.value.length > 0 &&  charpos >= 0) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name+": Only alphabetic characters allowed "; 
          }                            
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
        return false; 
        }
      }
      
    //case "alnumhyphen":
    else if (command == "alnumhyphen")
      {
      var charpos = objValue.value.search("[^A-Za-z0-9\-_]"); 
      if(objValue.value.length > 0 &&  charpos >= 0) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name+": characters allowed are A-Z,a-z,0-9,- and _"; 
          }                            
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
        return false; 
        }			
      }
      
    //case "email": 
    else if (command == "email")
      { 
      if(!validateEmailv2(objValue.value)) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name+": Enter a valid Email address "; 
          }                                              
        alert(strError); 
        return false; 
        }
      } 
      
   //case "strQuestion": 
    else if (command == "strQuestion")
      { 
      if(!validateQuestion(objValue.value)) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name+": Please answer the alphabet question "; 
          }                                              
        alert(strError); 
        return false; 
        }
      } 
      
      
      

    //case "lt": 
    //case "lessthan": 
    else if ((command == "lt") || (command == "lessthan"))
      { 
      if(isNaN(objValue.value)) 
        { 
        alert(objValue.name+": Should be a number "); 
        return false; 
        }
      if(eval(objValue.value) >=  eval(cmdvalue)) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name + " : value should be less than "+ cmdvalue; 
          }             
        alert(strError); 
        return false;                 
        }            
      } 

    //case "gt": 
    //case "greaterthan": 
    else if ((command == "gt") || (command == "greaterthan"))
      { 
      if(isNaN(objValue.value)) 
        { 
        alert(objValue.name+": Should be a number "); 
        return false; 
        }
      if(eval(objValue.value) <=  eval(cmdvalue)) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name + " : value should be greater than "+ cmdvalue; 
          }              
        alert(strError); 
        return false;                 
        }            
      }

    //case "regexp": 
    else if (command == "regexp")
      { 
      if(!objValue.value.match(cmdvalue)) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name+": Invalid characters found "; 
          }                                                             
        alert(strError); 
        return false;                   
        }
      }

    //case "dontselect": 
    else if (command == "dontselect")
      { 
      if(objValue.selectedIndex == null) 
        { 
        alert("BUG: dontselect command for non-select Item"); 
        return false; 
        } 
      if(objValue.selectedIndex == eval(cmdvalue)) 
        { 
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name+": Please Select one option "; 
          }                                                              
        alert(strError); 
        return false;                                   
        } 
      }

         
    // Added by GZW to deal with multiple radios buttons
    //case "radioreq": 
    else if (command == "radioreq")
      { 
      var radio_choice = false;
      var radiogroup = theForm.elements[objValue.name]

      for (radio_counter = 0; radio_counter < radiogroup.length; radio_counter++)
        {
        if (radiogroup[radio_counter].checked)
          {
          radio_choice = true;
          }
        }

      if (!radio_choice)
        {
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name + " : Required Field"; 
          } 
        alert(strError); 
        return false; 
        }
      }
    
    
    // Added by GZW to deal with SINGLE required radios buttons
    //case "radioreqsingle": 
    else if (command == "radioreqsingle")
      { 

      if (!objValue.checked)
        {
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name + " : Required Field"; 
          } 
        alert(strError); 
        return false; 
        }

      }  
      
      
      
    // Added by GZW to deal with checkboxes
    if (command == "checkreq")
      { 
      if (!objValue.checked)
        {
        if(!strError || strError.length ==0) 
          { 
          strError = objValue.name + " : Required Field"; 
          } 
        alert(strError); 
        return false; 
        } 
      }       

      return true; 

  }  
  
   //Really ugly function added to ensure the unsubscribe form checked both that a
   //checkbox has been ticked and also that the form fields have been filled in
   //Needs a re-write 
   //Added by dkbs
   
  function checkCheckBoxes() {
  	if(document.theform.fullname.value== ""){
  	alert('Please enter your full name');
  	return false;
  	}
  	
  	
  	if((document.theform.strQuestion.value!= "A" || document.theform.strQuestion.value!="a" )){
	alert('Please answer the question regarding the alphabet');
	return false;
	}

  	
	//else if(document.theform.companyname.value== ""){
  	//alert('Please enter your company name');
//  	return false;
  //	}
  	
  	else if(document.theform.contactphone.value== ""){
  	alert('Please enter your telephone number');
  	return false;
  	}
  	
  	else if(document.theform.contactemail.value== ""){
  	alert('Please enter your email address');
  	return false;
  	}

  	else if(document.theform.contactemail.value.indexOf ('@', 0) == -1){
  	alert('Please enter a valid email address');
  	return false;
  	}	
	else  	
  
	if (document.theform.Please_dont_send_publications.checked == false &&
	    document.theform.Please_dont_send_invitations.checked == false &&
	     document.theform.Please_dont_send_anything.checked == false &&
	    document.theform.Please_dont_send_alumni_information.checked == false)
		{
		alert ('Please tick at least one checkbox');
		return false;
		}
	else
		{

		document.theform.submit();
		}
	}