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()
{
	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;
   }//if

   var itemobj = this.formobj[itemname];
   if(!itemobj)
   {
      alert("BUG: Couldnot get the input object named: "+itemname);
      return;
   }
   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 == "") {
      return true;
   }
   // a very simple email validation checking.
   // you can add more complex email checking if it helps
   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 validateDate(datefield) {
   //var strDatestyle = "US"; //United States date style
   var strDatestyle = "EU";  //European date style
   var strDate;
   var strDateArray;
   var strDay;
   var strMonth;
   var strYear;
   var intday;
   var intMonth;
   var intYear;
   var booFound = false;
   var strSeparatorArray = new Array("-"," ","/",".");
   var intElementNr;
   var err = 0;
   var strMonthArray = new Array(12);
   strMonthArray[0] = "Jan";
   strMonthArray[1] = "Feb";
   strMonthArray[2] = "Mar";
   strMonthArray[3] = "Apr";
   strMonthArray[4] = "May";
   strMonthArray[5] = "Jun";
   strMonthArray[6] = "Jul";
   strMonthArray[7] = "Aug";
   strMonthArray[8] = "Sep";
   strMonthArray[9] = "Oct";
   strMonthArray[10] = "Nov";
   strMonthArray[11] = "Dec";
   strDate = datefield.value;

   if (strDate.length < 1) {
      return true;
   }

   for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
      if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
         strDateArray = strDate.split(strSeparatorArray[intElementNr]);
         if (strDateArray.length != 3) {
            err = 1;
            return false;
         }
         else {
            strDay = strDateArray[0];
            strMonth = strDateArray[1];
            strYear = strDateArray[2];
         }
         booFound = true;
      }
   }

   if (booFound == false) {
      if (strDate.length>5) {
         strDay = strDate.substr(0, 2);
         strMonth = strDate.substr(2, 2);
         strYear = strDate.substr(4);
      }
      else
      {
         return false;
      }
   }

   if (strYear.length == 2) {
      strYear = '20' + strYear;
   }

   // US style
   if (strDatestyle == "US") {
      strTemp = strDay;
      strDay = strMonth;
      strMonth = strTemp;
   }

   intday = parseInt(strDay, 10);
   if (isNaN(intday)) {
      err = 2;
      return false;
   }

   intMonth = parseInt(strMonth, 10);
   if (isNaN(intMonth)) {
      for (i = 0;i<12;i++) {
         if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
            intMonth = i+1;
            strMonth = strMonthArray[i];
            i = 12;
         }
      }

      if (isNaN(intMonth)) {
         err = 3;
         return false;
      }
   }

   intYear = parseInt(strYear, 10);
   if (isNaN(intYear)) {
      err = 4;
      return false;
   }

   if (intMonth>12 || intMonth<1) {
      err = 5;
      return false;
   }

   if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
      err = 6;
      return false;
   }

   if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
      err = 7;
      return false;
   }

   if (intMonth == 2) {
      if (intday < 1) {
         err = 8;
         return false;
      }

      if (LeapYear(intYear) == true) {
         if (intday > 29) {
            err = 9;
            return false;
         }
      }
      else {
         if (intday > 28) {
            err = 10;
            return false;
         }
      }
   }
   return true;
}

function LeapYear(intYear) {
   if (intYear % 100 == 0) {
      if (intYear % 400 == 0) { return true; }
   }
   else {
      if ((intYear % 4) == 0) { return true; }
   }
   return false;
}

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 = objValue.name + " : Required Field";
            }//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 = objValue.name + " : "+cmdvalue+" characters maximum ";
            }//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 = objValue.name + " : " + cmdvalue + " characters minimum  ";
            }//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 = objValue.name+": Only alpha-numeric characters allowed ";
            }//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 = objValue.name+": Only digits allowed ";
            }//if
            alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
            return false;
         }//if
         break;
      }//numeric

      case "numhyphen":
      {
         var charpos = objValue.value.search("[^0-9\-]");
         if(objValue.value.length > 0 &&  charpos >= 0)
         {
            if(!strError || strError.length ==0)
            {
               strError = objValue.name+": characters allowed are 0-9 and -";
            }//if
            alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
            return false;
         }//if
         break;
      }

      case "numslash":
      {
         var charpos = objValue.value.search("[^0-9\/]");
         if(objValue.value.length > 0 &&  charpos >= 0)
         {
            if(!strError || strError.length ==0)
            {
               strError = objValue.name+": characters allowed are 0-9 and /";
            }//if
            alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
            return false;
         }//if
         break;
      }

      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 = objValue.name+": Only alphabetic characters allowed ";
            }//if
            alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
            return false;
         }//if
         break;
      }//alpha

      case "alphahyphenspace":
      {
         var charpos = objValue.value.search("[^A-Za-z\- ]");
         if(objValue.value.length > 0 &&  charpos >= 0)
         {
            if(!strError || strError.length ==0)
            {
               strError = objValue.name+": characters allowed are A-Z,a-z,- and space";
            }//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 = objValue.name+": characters allowed are A-Z,a-z,0-9,- and _";
            }//if
            alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
            return false;
         }//if
         break;
      }

      case "email":
      {
         if(!validateEmailv2(objValue.value))
         {
            if(!strError || strError.length ==0)
            {
               strError = objValue.name+": Please enter a valid email address ";
            }//if
            alert(strError);
            return false;
         }//if
         break;
      }//case email

      case "datefield":
      {
         if(!validateDate(objValue))
         {
            if(!strError || strError.length ==0)
            {
               strError = objValue.name+": Please enter a valid date ";
            }//if
            alert(strError);
            return false;
         }//if
         break;
      }//case datefield

      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 = objValue.name + " : value should be less than "+ cmdvalue;
            }//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 = objValue.name + " : value should be greater than "+ cmdvalue;
            }//if
            alert(strError);
            return false;
         }//if
         break;
      }//case greaterthan

      case "regexp":
      {
         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: 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 ";
            }//if
            alert(strError);
            return false;
         }
         break;
      }//case dontselect
   }//switch
   return true;
}

function validateRadio(radiobutton) {
   myOption = -1;
   for (i=radiobutton.length-1; i > -1; i--) {
      if (radiobutton[i].checked) {
         myOption = i;
      }
   }
   if (myOption == -1) {
      return false;
   }
   return true;
}

function DoCustomValidation() {
   var frm = document.forms["FormMain"];

   if (frm.Nationality[frm.Nationality.selectedIndex].value == "Singaporean" || frm.Nationality[frm.Nationality.selectedIndex].value == "Singapore" || frm.SPR.checked == true) {
      if(frm.NRIC.value == "") {
         alert("Please enter your NRIC number");
         return false;
      }
   }
   else {
      if(frm.Passport.value == "") {
         alert("Please enter your passport number");
         return false;
      }
   }

   if (frm.EnrolmentYear.value.length > 0 && frm.EnrolmentYear.value.length != 4) {
      alert("Please enter your enrolment year in yyyy format");
      return false;
   }

   if (frm.ContactMobile.value == "" && frm.ContactHome.value == "" && frm.ContactOffice.value == "") {
      alert("Please provide at least one contact number");
      return false;
   }

   return true;
}

function CheckContactNumbers() {

   var frm = document.forms["FormMain"];

   if (frm.ContactMobile.value == "" && frm.ContactHome.value == "" && frm.ContactOffice.value == "") {
      alert("Please provide at least one contact number");
      return false;
   }

   return true;
}


function DoLaunchValidation() {
   var frm = document.forms["FormMain"];

   if (frm.SignUpSMUAALaunch.checked == false && frm.SignUpCityCampusTour.checked == false) {
         alert("Please select at least one item to register");
         return false;
      }

   return true;
}


function DoPaymentValidation() {
   var frm = document.forms["FormMain"];

   if(DoCustomValidation() == false)
   {
      return false;
   }

   if (validateRadio(frm.Membership) == false) {
      alert("Please select a membership type");
      return false;
   }

   if (validateRadio(frm.PaymentMode) == false) {
      alert("Please select a payment mode");
      return false;
   }

   if (frm.PaymentMode[1].checked == true) {
      if (frm.CardName.value == "") {
         alert("Please enter your credit card name");
         return false;
      }
      if (frm.CardNo.value == "") {
         alert("Please enter your credit card number");
         return false;
      }
      if (frm.CardExpiryDate.value == "") {
         alert("Please enter your credit card expiry date");
         return false;
      }
   }
   else {
      frm.CardName.value = "";
      frm.CardNo.value = "";
      frm.CardExpiryDate.value = "";
   }

   if (frm.Contribution.checked == true) {
      if (validateRadio(frm.ContributionType) == false) {
         alert("Please select a donation option");
         return false;
      }
      else {
         if (frm.ContributionType[0].checked == true) {
            if (frm.ContributionAmountNonGIRO.value == "") {
               alert("Please enter the amount you want to contribute");
               return false;
            }

            if (validateRadio(frm.ContributionMode) == false) {
               alert("Please select a payment mode for your contribution");
               return false;
            }

            if (frm.ContributionMode[1].checked == true) {
               if (frm.ContributionCardName.value == "") {
                  alert("Please enter your credit card name");
                  return false;
               }
               if (frm.ContributionCardNo.value == "") {
                  alert("Please enter your credit card number");
                  return false;
               }
               if (frm.ContributionCardExpiryDate.value == "") {
                  alert("Please enter your credit card expiry date");
                  return false;
               }
            }
            else {
               frm.ContributionCardName.value = "";
               frm.ContributionCardNo.value = "";
               frm.ContributionCardExpiryDate.value = "";
            }
         }
         else {
            if (frm.ContributionAmountGIRO.value == "") {
               alert("Please enter the amount you want to contribute");
               return false;
            }
            if (frm.ContributionFrequency.selectedIndex == 0) {
               alert("Please select a contribution frequency");
               return false;
            }
         }

         if (frm.Anonymous.checked == false)
         {
            if (frm.HonourRollName.value == "")
            {
               alert("Please enter the name to list on Honour Roll");
               return false;
            }
         }
      }
   }

   if (frm.Declaration.checked == false) {
      alert("Please declare that the particulars in your application are correct");
      return false;
   }

   return true;
}


function HelpdeskCommentValidation() {
   var frm = document.forms["FormMain"];

   if (frm.HelpdeskComment.value.length > 4000) {
      alert("The helpdesk comment is too long");
      return false;
   }

   return true;
}

