function Validator(frmname)
{
  this.formobj=document.forms[frmname];
	if(!this.formobj)
	{
	  alert("BUG: could not 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()
{
	for(var itr=0;itr < this.elements.length;itr++)
	{
		if(this.elements[itr].validationset &&
	   !this.elements[itr].validationset.validate())
		{
		  return false;
		}
	}
	if(this.addnlvalidation)
	{
	var hasParams=InStrRev(this.addnlvalidation, ")", 1, 0);
	if(hasParams > 0){
	
		 str =" var ret = "+this.addnlvalidation;
	}	
	else
	{
		 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;
	}//if
	var itemobj = this.formobj[itemname];
  if(!itemobj)
	{
	  alert("BUG: Couldnot get the input object named: "+itemname);
		return;
	}
	
	 if(itemobj.length && isNaN(itemobj.selectedIndex) )
    //for radio button; don't do for 'select' item
	{
		itemobj = itemobj[0];
	}	
	
	if(!itemobj.validationset)
	{
	  itemobj.validationset = new ValidationSet(itemobj);
	}
  itemobj.validationset.add(descriptor,errstr);
}
function ValidationDesc(inputitem,desc,error)
{
  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;
}
function validateEmailv2(email)
{
    if(email.length <= 0)
	{
	  return true;
	}
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null) 
      {
	    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
return false;

}

function validateEmailv3(email){
var re=/^[A-Za-z0-9_\-\?\!\$\%\&\'\*\=\|\~\{\}\+\#\^\/]+([.][A-Za-z0-9_\-\']+)*[@][A-Za-z0-9_\-]+([.][A-Za-z0-9_\-]+)+$/;
	if (re.test('test.user@bbc.co.uk')){
	 if (!re.test(email)){
	   return false;
	 }
	return true
	}
	return true
}

function V2validateData(strValidateStr,objValue,strError) 
{ 
    var epos = strValidateStr.search("="); 
    var  command  = ""; 
    var  cmdvalue = ""; 
    if(epos >= 0) 
    { 
     command  = strValidateStr.substring(0,epos); 
     cmdvalue = strValidateStr.substr(epos+1); 
    } 
    else 
    { 
     command = strValidateStr; 
    } 
    switch(command) 
    { 
        case "req": 
        case "required": 
         { 
           if(eval(objValue.value.length) == 0) 
           { 
              if(!strError || strError.length ==0) 
              { 
                strError = "Please ensure all fields marked with a * are filled in."; 
              }//if 
              alert(strError); 
              return false; 
           }//if 
           break;             
         }//case required 
        case "maxlength": 
        case "maxlen": 
          { 
             if(eval(objValue.value.length) >  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = "Your " + objValue.name + " can only be " + cmdvalue + " characters long."; 
               }//if 
               alert(strError);
               return false; 
             }//if 
             break; 
          }//case maxlen 
        case "minlength": 
        case "minlen": 
           { 
             if(eval(objValue.value.length) <  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = "Your " + objValue.name + " needs to be at least " + cmdvalue + " characters long."; 
               }//if               
               alert(strError);
               return false;                 
             }//if 
             break; 
            }//case minlen 
        case "alnum": 
        case "alphanumeric": 
           { 
              var charpos = objValue.value.search("[^A-Za-z0-9]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
               if(!strError || strError.length ==0) 
                { 
                  strError = "Please enter only letters and numbers for your " + objValue.name; 
                }//if 
                alert(strError);
                return false; 
              }//if 
              break; 
           }//case alphanumeric 
        case "num": 
        case "numeric": 
           { 
              var charpos = objValue.value.search("[^0-9]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = "Please enter only numbers for your " + objValue.name;
                }//if               
                alert(strError);
                return false; 
              }//if 
              break;               
           }//numeric 
        case "alphabetic": 
        case "alpha": 
           { 
              var charpos = objValue.value.search("[^A-Za-z]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                  if(!strError || strError.length ==0) 
                { 
                  strError = "Please enter only letters for your " + objValue.name;
                }//if                             
                alert(strError);
                return false; 
              }//if 
              break; 
           }//alpha 
		case "alnumhyphen":
			{
              var charpos = objValue.value.search("[^A-Za-z0-9\-_]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                  if(!strError || strError.length ==0) 
                { 
                  strError = "Only characters allowed are A-Z,a-z,0-9,- and _ for your " + objValue.name; 
                }//if                             
                alert(strError);
                return false; 
              }//if 			
			break;
			}
        case "email": 
          { 
               if(!validateEmailv3(objValue.value)) 
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = "Please enter a valid email address. Email addresses must have one @ sign and no spaces."; 
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
           break; 
          }//case email 
        case "lt": 
        case "lessthan": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert(objValue.name+": Should be a number "); 
              return false; 
            }//if 
            if(eval(objValue.value) >=  eval(cmdvalue)) 
            { 
              if(!strError || strError.length ==0) 
              { 
                strError = " Please enter a number less than "+ cmdvalue + " for your " + objValue.name; 
              }//if               
              alert(strError); 
              return false;                 
             }//if             
            break; 
         }//case lessthan 
        case "gt": 
        case "greaterthan": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert(objValue.name+": Should be a number "); 
              return false; 
            }//if 
             if(eval(objValue.value) <=  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = " Please enter a number more than "+ cmdvalue + " for your " + objValue.name; 
               }//if               
               alert(strError); 
               return false;                 
             }//if             
            break; 
         }//case greaterthan 
        case "regexp": 
         { 
		 	if(objValue.value.length > 0)
			{
	            if(!objValue.value.match(cmdvalue)) 
	            { 
	              if(!strError || strError.length ==0) 
	              { 
	                strError = objValue.name+": Invalid characters found "; 
	              }//if                                                               
	              alert(strError); 
	              return false;                   
	            }//if 
			}
           break; 
         }//case regexp 
        case "dontselect": 
         { 
            if(objValue.selectedIndex == null) 
            { 
              alert("BUG: don't select command for non-select Item"); 
              return false; 
            } 
            if(objValue.selectedIndex == eval(cmdvalue)) 
            { 
             if(!strError || strError.length ==0) 
              { 
              strError = "Please select an option from the " + objValue.name + " menu."; 
              }//if                                                               
              alert(strError); 
              return false;                                   
             } 
             break; 
         }//case dontselect 
		 
		 case "checkboxchecked":
		 {
		
			 if(!objValue.checked)
			  {
				  if(!strError || strError.length ==0) 
	              { 
	                strError =  "Please make sure you have selected your " + objValue.name; 
	              }
				  else if(strError == "parentalConsent")
				  {
				  	strError = "You will need to tick the box before you can send this form. Please ask your parent or guardian for permission.";
				  }   
	              alert(strError); 
	              return false;        
			  }
			  else
			  {
			    return true;
			  }//if 
		 	break;
		 }//case checkboxchecked
		 
		 case "match":
		 {
		 objCompare = objValue.form.elements[cmdvalue];
		 	 if(objValue.value!= objCompare.value)
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = "Please make sure your " + objValue.name + " and " + cmdvalue + " confirmation are the same."; 
               }//if               
               alert(strError); 
               return false;                 
             }//if 
			 break;            
		 }// match
		 
		 case "oneradio":
		 {
		 	
		 	ret = TestSelectOneRadio(objValue,strError);
			if(!ret == true) 
             { 
               return false;           
             }//if        
			  break;     
		 }// oneradio
		 
		  case "checkfiletype":
		 
		 {
		 
		 var FileLen = objValue.value.length
		 var FileExt = (objValue.value.substring((FileLen - 4),FileLen))
		 
		 var FileExts = cmdvalue;
			
		 var FileExts_array = FileExts.split(",");
		 var isOK = false;
			for (var loop=0; loop < FileExts_array.length; loop++)
			{
			   if(FileExts_array[loop]==FileExt){
			   		isOK=true;
			   }
			    
			}
		 	 if(isOK != true)
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = "Please make sure that the file you are sending is a " + cmdvalue; 
               }//if               
               alert(strError); 
               return false;                 
             }//if 
			 break;            
		 }
		 
		 case "isXID":
		 {
		 
			 if(!strError || strError.length ==0) 
               { 
                 strError = "Please enter a valid XID in the format [letter][number]."; 
               }//if               
		 
			var isNumeric=/^[0-9]/;
			var strElm, intElmLen
				strElm = objValue.value
				intElmLen = objValue.value.length
				strLetter = strElm.substring(0, 1)
	    	if (strElm == "" || strElm == null){
		  		alert(strError);
				return false;
				 
			}
	    	if (!isNumeric.test(strElm.substring(1, intElmLen))){
				 alert(strError); 
				return false;
				
			}
			if ((strLetter == 'g') || (strLetter == 'o') || (strLetter == 'i') ||  (strLetter == 'b') || (strLetter == 'r') || (strLetter == 'p') || (strLetter == 'y')){
			}
			else{
				 alert(strError);
				return false;
				
			}
			 break; 
		 }
    }//switch 
    return true; 
}

function formIsSecure(){
	alert("The information you are sending us is safe.  You will immediately see a thank you page which is not secure.    You may see other messages about the connection, but your message is being sent safely, so if you see these messages, click 'Yes' to continue.");
	return true;

}


function TestSelectOneRadio(objValue,strError)
{
	var objradio = objValue.form.elements[objValue.name];
	var one_selected=false;
	for(var r=0;r < objradio.length;r++)
	{
	  if(objradio[r].checked == "1")
	  {
	  	one_selected=true;
		break;
	  }
	}
	if(false == one_selected)
	{
      if(!strError || strError.length ==0) 
       {
	    strError = "Please select one option from " + objValue.name;
	   }	
	  alert(strError);
	}
return one_selected;
}

function InStrRev(StringCheck, StringMatch, Start, Compare) {
  if (Start == 0 || Start < -1) {
    alert("Invalid Start argument\n\nInStrRev function");
	return "";
  }
  if (StringMatch.length == 0) return Start;
  if (Compare == 1) {
    StringCheck = LCase(StringCheck); StringMatch = LCase(StringMatch);
  }
  if (Start > 1) {
    return Left(StringCheck, Start).lastIndexOf(StringMatch) + 1;
    } else {
    return StringCheck.lastIndexOf(StringMatch) + 1;
  }
}

