// form.js
// This file has all the functions needed to validate form input.
// When included and properly formatted pages exist all you have to have is OnSubmit="return ValidateForm(this);"
// There are additional functions based on text input, but that's just hunky dory

var AtLeastOne = 0; // You may only have ONE of these types per form

function PhoneNumberInput(SelObj)
{
   EText = new String();
   FText = new String();

   for (var i = 0; i < SelObj.value.length; i++)
      if (SelObj.value.charAt(i) >= '0' && SelObj.value.charAt(i) <= '9') EText += SelObj.value.charAt(i);

   for (var i = 0; i < EText.length; i++) {
      if (EText.length > 7) {
         if (i == 3) FText += "-";
         if (i == 6) FText += "-";
      }

      FText += EText.charAt(i);
   }

   SelObj.value = FText;

   return true;
}

function NumberInput(SelObj)
{
   EText = new String();
   FText = new String();

   for (var i = 0; i < SelObj.value.length; i++)
      if (SelObj.value.charAt(i) >= '0' && SelObj.value.charAt(i) <= '9') EText += SelObj.value.charAt(i);

   for (var i = 0; i < EText.length; i++) {
      FText += EText.charAt(i);
   }

   SelObj.value = FText;

   return true;
}

function AtLeastOneCheck(SelObj)
{
   if (SelObj.checked) AtLeastOne++;
   else AtLeastOne--;

   if (AtLeastOne < 0) AtLeastOne = 0;
}

function GetFormObject(Name)
{
   var i, j;

/*   for (i = 0; i < document.forms.length; i++) {
      if (eval("document.forms[" + i + "]." + Name)) {
         return eval("document.forms[" + i + "]." + Name);
      }
   } */

   // Slow method needs to be used because of dynamic form lengths
   for (i = 0; i < document.forms.length; i++) {
      for (j = 0; j < document.forms[i].elements.length; j++) {
         if (document.forms[i].elements[j].name == Name) {
            return document.forms[i].elements[j];
         }
      }
   }

   return false;
}

function IsEmailAddr(EmailAddress)
{
   if (EmailAddress.length > 3)
   {
      var TheStr = new String(EmailAddress);
      var Index = TheStr.indexOf("@");

      if (Index > 0)
      {
         var PIndex = TheStr.indexOf(".", Index);

         if ((PIndex > Index + 1) && (TheStr.length > PIndex + 1))
            return true;
      }
   }

   return "The entered email address \"" + EmailAddress + "\" is not a valid email address";
}

function IsEmail(Name, Value)
{
   var ValidEmail = "example@example.com";
   var EmailReg = new RegExp(/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/i);
   var Email = new String(Value);

   if (!EmailReg.exec(ValidEmail)) {
      return IsEmailAddr(Email);
   }

   var Resp = EmailReg.exec(Email);

   if (Resp)
      return true;
   else
      return "The entered email address \"" + Email + "\" is not a valid email address";
}

function IsPhoneNumber(Name, Value)
{
   EText = new String();
   FText = new String();

   var SelObj = GetFormObject(Name);

   for (var i = 0; i < SelObj.value.length; i++)
      if (SelObj.value.charAt(i) >= '0' && SelObj.value.charAt(i) <= '9') EText += SelObj.value.charAt(i);

   for (var i = 0; i < EText.length; i++) {
      if (EText.length > 6) {
         if (i == 3) FText += "-";
         if (i == 6) FText += "-";
      }
      else if (EText.length > 2) {
         if (i == 3) FText += "-";
      }

      FText += EText.charAt(i);
   }

   SelObj.value = FText;

   return true;
}

function IsInputPhoneNumber(Name, Value)
{
   var EText;
   var FText  = new String();
   var SName  = new String(Name);
   var Append = new String();

   var ValidNumber = "1234678900@example.com";

   var NReg = new RegExp(/([a-zA-Z]*)(\[[0-9]*\])/);

   var PArray = NReg.exec(Name);

   if (PArray) {
      SName = PArray[1];
      Append = PArray[2];
   }

   var PProvider  = GetFormObject(SName + "Provider" + Append);
   var PNumberIn  = GetFormObject(SName + "Input" + Append);
   var PNumber    = GetFormObject(SName + Append);

   if (!PProvider || !PNumberIn || !PNumber)
      return true;

   if ((PProvider.selectedIndex == 0) && (PNumberIn.value.length == 0))
      return true;

   if ((PProvider.selectedIndex == 0) && (PNumberIn.value.length != 0))
      return "You must select a provider before continuing.";

   if ((PProvider.selectedIndex != 0) && (PNumberIn.value.length == 0))
      return "You have selected a provider but you have not entered a phone number that belongs to the provider, please enter your phone number to continue.";

   EText = new String(PNumberIn.value);

   for (var i = 0; i < EText.length; i++)
      if (EText.charAt(i) >= '0' && EText.charAt(i) <= '9') FText += EText.charAt(i);

   var Option = PProvider[PProvider.selectedIndex];

   Reg = new RegExp(eval("/([0-9]{10})@example\.com/"));

   if (!Reg.exec(ValidNumber)) {
      if (FText.length == 7 || FText.length == 10)
         return true;
      else
         return "The number \"" + FText + "@" + Option.title + "\" does not match the provider's requirements for text-messaging.";
   }

   Reg = new RegExp(eval("/" + Option.id + "/"));

   var FoundArray = Reg.exec(FText + "@" + Option.title);

   if (FoundArray) {
      PNumber.value = FoundArray[1];

      return true;
   }
   else {
      PNumber.value = "";

      return "The number \"" + FText + "@" + Option.title + "\" does not match the provider's requirements for text-messaging.";
   }
}

function IsSelected(Name, Value)
{
   var SelObj = GetFormObject(Name);

   if (SelObj.selectIndex > 0)
      return true;
   else
      return "The default selection is not a proper selection, please select another option from the drop down box.";
}

function IsChecked(Name, Value)
{
   var SelObj = GetFormObject(Name);

   if (SelObj.checked)
      return true;
   else
      return "This box must be checked to continue.";
}

function IsArrayChecked(Name, Value)
{
   var SName  = new String(Name);

   var NReg = new RegExp(/([a-zA-Z].*)(\[([0-9].*|)\])/);
   var PArray = NReg.exec(Name);

   if (PArray)
      SName = PArray[1];
   else
      return true;

   var NReg = new RegExp(eval("/" + SName + ".*/"));

   for (i = 0; i < document.forms.length; i++) {
      for (j = 0; j < document.forms[i].elements.length; j++) {
         if (NReg.exec(document.forms[i].elements[j].name)) {
            if (document.forms[i].elements[j].checked)
               return true;
         }
      }
   }

   return "You must select at least one of the listed " + SName + ".";
}

function IsMatch(Name, Value)
{
   var Item    = GetFormObject(Name.substr(0, Name.length - 3));
   var ItemVer = GetFormObject(Name);

   if (!Item || !ItemVer) return "Cannot verify input on \"" + Name.substr(0, Name.length - 3) + "\" fields.";

   if (Item.value == ItemVer.value)
      return true;
   else
      return Name.substr(0, Name.length - 3) + " fields do not match.";
}

function IsURI(Name, Value)
{
   var UReg = new RegExp(/(http:\/\/|).*\..*\..*(\/|)/);

   if (UReg.exec(Value))
      return true;
   else
      return "The entered URI \"" + Value + "\" is not a valid URI.";
}

function IsNumber(Name, Value)
{
   var Check = new String(Value);

   // Loop through looking for anything that isn't a number
   for (var i = 0; i < Check.length; i++) // Return false if we find something that isn't a number
      if (Check.charAt(i) < '0' && Check.charAt(i) > '9') return "\"" + Value + "\" is not a number.";

   // Otherwise return true (Including zero length)
   return true;
}

function IsPassword(Name, Value)
{
   var Check = new String(Value);

   if (Check.length > 3)
      return true;
   else
      return "Password must be at least 4 characters in length.";
}

function IsEmpty(Name, Value)
{
   var Check = new String(Value);

   return (Check.length == 0);
}

function IsNotEmpty(Name, Value)
{
   return !IsEmpty(Value);
}

function IsAtLeastOne(Name, Value)
{
   var SelObj = GetFormObject(Name);

   if (SelObj.checked) AtLeastOne++;

   return true;
}

function ParseLabel(Label, Name, Value)
{
   Func = new String();

   var i;
   var Done;

   Done = false;

   if (!Label) return "";

   Func = "(";

   for (i = 0; i < Label.length; i++) {
      if ((Label.charAt(i) == '|') || (Label.charAt(i) == '&'))
         Func += "(\"" + Name + "\", \"" + Value + "\") " + Label.charAt(i) + Label.charAt(i) + " ";
      else
         Func += Label.charAt(i);
   }

   Func += "(\"" + Name + "\", \"" + Value + "\")";

   Func += ")";

   return Func;
}

function ValidateForm(Form, SuccessString, FailureString)
{
   if (Form.Bypass.value == "true")
      return true;

   if (Form.AddCounties) {
      alert("You must finish adding new counties before you can complete your signup.");

      return false;
   }

   var Elements = Form.elements;
   var i;

   for (i = 0; i < Elements.length; i++) {
      var Element = Elements[i];

      if (Element.id.length)
         Result = eval(ParseLabel(Element.id, Element.name, Element.value));
      else
         continue;

      if (Result == true) continue;
      else {
         alert(Result);

         if (Element.type == "hidden")
            Elements[i - 1].focus();
         else
            Element.focus();

         return false;
      }
   }

   if (NeedAtLeastOne && (AtLeastOne < 1)) {
      alert("This page requires that you agree to at least one of our sending methods.");
   }

   if (SuccessString != null)
      alert(SuccessString);

   return true;
}
