/*
---------------------------------------------------------------------------

JavaScript Form Validator.
Edited by Dan Evans, 07/01/2005

INSTRUCTIONS:

Include this file in any page that requires client-side form validation.

Immediately below </form> tag add in your validation requests:

	//create a new validation object and pass the form name
		var frmvalidator  = new Validator("formName");
		e.g.
		var frmvalidator  = new Validator("frm1");
	
	//apply validations in required order. Form field name, validation to apply, 
	//optional pop-up alert if validation fails
		frmvalidator.addValidation("formFieldName","validationToApply","Message Alert to user on validation fail [optional]");
		e.g.
		frmvalidator.addValidation("age","req","Please enter your age");
		
	Available validations:
	
	"required", "req"  The field should not be empty  
maxlen=???
maxlength=???  checks the length entered data to the maximum. For example, if the maximum size permitted is 25, give the validation descriptor as "maxlen=25"  
minlen=???
minlength=???  checks the length of the entered string to the required minimum. example "minlen=5"  
alphanumeric /
alnum  Check the data if it contains any other characters other than alphabetic or numeric characters  
num 
numeric  Check numeric data  
alpha 
alphabetic  Check alphabetic data. 
alnumhyphen: Check alphanumeric and _ and - 
email  The field is an email field and verify the validity of the data.  
lt=???
lessthan=???  Verify the data to be less than the value passed. Valid only for numeric fields. 
example: if the value should be less than 1000 give validation description as "lt=1000"  
gt=???
greaterthan=???  Verify the data to be greater than the value passed. Valid only for numeric fields. 
example: if the value should be greater than 10 give validation description as "gt=10"  
regexp=???  Check with a regular expression the value should match the regular expression.
example: "regexp=^[A-Za-z]{1,20}$" allow up to 20 alphabetic characters.  
dontselect=??  This validation descriptor is valid only for select input items (lists) Normally, the select list boxes will have one item saying 'Select One' or some thing like that. The user should select an option other than this option. If the index of this option is 0, the validation description should be "dontselect=0"  
checkboxchecked: checks to see if a particular checkbox has been selected (used for parental consent checking)
	e.g. frmvalidator.addValidation("parentAsked","checkboxchecked","Make sure you have asked a parent or guardian for permission and checked the box.");
match: Checks to see if two fields (ex. Password fields) are identical
	e.g. frmvalidator.addValidation("password","match=password2","Please make sure your passwords match"); 
oneradio: Checks to see if at least one radio of a given group name has been selected
	e.g. frmvalidator.addValidation("rd1","oneradio","Please check a radio button.");

checkfiletype: Checks whether the file extension of a file is allowed. eg. checkfiletype=.jpg checks the file being uploaded is a jpg
	
Other validations:

Display an alert advising user that the email will be sent over a secure connection. Note
, this does not require any parameters.

frmvalidator.setAddnlValidationFunction("formIsSecure");

To add in custom validators you have two options. Firstly if the validator is specific
to your site and unlikely to be used elsewhere then simply write your validation function as 
normal in your page code making sure it returns true or false as required.
Then it can be called in the same way as the example above:

frmvalidator.setAddnlValidationFunction("myCustomValidator");

Alternatively, add in a custom validator to this script in the area delimited by
//BEGIN CUSTOM VALIDATOR and //END CUSTOM VALIDATOR


  -------------------------------------------------------------------------
	                    JavaScript Form Validator 
                                Version 2.0.2
	Copyright 2003 JavaScript-coder.com. All rights reserved.
	You use this script in your Web pages, provided these opening credit
    lines are kept intact.
	The Form validation script is distributed free from JavaScript-Coder.com

	You may please add a link to JavaScript-Coder.com, 
	making it easy for others to find this script.
	Checkout the Give a link and Get a link page:
	http://www.javascript-coder.com/links/how-to-link.php

    You may not reprint or redistribute this code without permission from 
    JavaScript-Coder.com.
	
	JavaScript Coder
	It precisely codes what you imagine!
	Grab your copy here:
		http://www.javascript-coder.com/
    -------------------------------------------------------------------------  
*/
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;
	}
	
	if (document.getElementById("submit")) {
		var subButton = document.getElementById("submit");
		var parentForm = subButton.parentNode.getAttribute('id');
		var submitted = 0;
		if (!submitted) {
			subButton.disabled=true;
			submitted = 1;
		} else {
			alert("Form already submitted. Please wait while your files are uploaded.");
		}
	}
	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)
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
    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; 
    } 
	
	//alert(command);
	//alert(cmdvalue);
	
    switch(command) 
    { 
        case "req": 
        case "required": 
         { 
           if(eval(objValue.value.length) == 0) 
           { 
              if(!strError || strError.length ==0) 
              { 
                strError = "Please enter your " + objValue.name + "."; 
              }//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);// + "\n[Current length = " + objValue.value.length + " ]"); 
               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); // + "\n[Current length = " + objValue.value.length + " ]"); 
               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); // + "\n [Error character position " + eval(charpos+1)+"]"); 
                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); // + "\n [Error character position " + eval(charpos+1)+"]"); 
                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); // + "\n [Error character position " + eval(charpos+1)+"]"); 
                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); // + "\n [Error character position " + eval(charpos+1)+"]"); 
                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];
		 //alert(objCompare.value);
		 //alert(objValue.value);
		 	 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;
			   }
			    
			}
		 
		 //alert(isOK);
		 	 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; 
		 }
		 
		 //BEGIN CUSTOM VALIDATOR 
		 
		 //case "mynewvalidatorname":
		 //{
		 
		 //}
		 //END CUSTOM VALIDATOR
		 
    }//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;
  }
}
function DoCustomValidation()
{
  var frm = document.forms["registration-form"];
  if(frm.password.value != frm.passwordConf.value)
  {
    alert('The Password and verified password don not match!');
    return false;
  }
  else
  {
    return true;
  }
}

