﻿//  Revision  Reason
//  ========  ======
//  02/02/10  Added Fieldtype password to Value
//  03/17/10  No focus on hidden fields
var CV = false; // Cancel Validation
var CheckLength = false;
function ServerAlert(msg, id)
{ if (id != "")
  { var Field = document.getElementById(id);
    if (Field != null)
    { FocusOn(Field);
    };
  };
  if (msg != "")
  { alert(msg);
  };
};
function AddLoadEvent(func)
{ var oldonload = window.onload;
  if (typeof window.onload != 'function')
  { window.onload = func;
  }
  else
  { window.onload =
    function()
    { if (oldonload)
      { oldonload();
      };
      func();
    };
  };
};
function Value(field)
{ if (field.type == "text" || field.type == "textarea" || field.type == "hidden" || field.type == "password")
  { return field.value;
  };
  if (field.type == "checkbox")
  { if (field.checked)
    { return field.value;
    }
    else
    { return ""
    };
  };
  if (field.type == "radio" || field.type == undefined)
  { var i;
    for (i = 0; i < field.length; i++)
    { if (field[i].checked)
      { return field[i].value;
      };
    };
    return "";
  };
  if (field.type.substring(0,7) == "select-")
  { var v = "";
    var s = "";
    var i;
    for (i = 0; i < field.options.length; i++)
    { if (field.options[i].selected)
      { v += s + field.options[i].value;
        s = ",";
      };
    };
    return v;
  };
  alert("Field type '" + field.type + "' not supported");
  return null;
};  

function QueryValue(Field)
{ var q = location.search;
  var s = q.indexOf(Field + "=");
  if (s >= 0)
  { s += Field.length + 1;
    var e = q.indexOf("&", s);
    if (e < 0)
    { e = q.length;
    };
    return unescape(q.substring(s, e));
  };
  return "";
};

function FocusOn(field)
{ if (field.type == null)
  { if (field[0].type == "radio")
    { field[0].focus();
    };
  }
  else
  { if (field.type == "radio")
    { field[0].focus();
    }
    else
    { if (field.type != "hidden")
      { field.focus();
      };
    };
  };
  if (field.type == "text" || field.type == "textarea")
  { field.select();
  }
};

function Invalid(field, message)
{ FocusOn(field);
  alert (eval("Validations." + field.name + ".title") + message);
};
function vRequired(field)
{ if (Value(field) == "")
  { Invalid (field, " required");
    return false;
  };
  return true;
};

function isInteger(Value)
{ var i;
  for (i = 0; i < Value.length; i++)
  { if (Value.charAt(i) < '0' || Value.charAt(i) > '9')
    { return false;
    };
  };
  return true;
};

function ValuePattern(Value, Pattern)
{ var i;
  var v = 0;
  for (i = 0; i < Pattern.length; i++)
  { if (Pattern.charAt(i) == '0')
    { if (Value.charAt(v) >= '0' && Value.charAt(v) <= '9')
      { v += 1;
      };
    }
    else if (Pattern.charAt(i) == 'A')
    { if (Value.charAt(v) >= 'A' && Value.charAt(v) <= 'Z')
      { v += 1;
      };
    }
    else
    { if (v >= Value.length)
      { return false;
      };
      if (Pattern.charAt(i) == '9')
      { if (Value.charAt(v) < '0' || Value.charAt(v) > '9')
        { return false;
        };
        v += 1;
      }
      else if (Pattern.charAt(i) == 'Z')
      { if (Value.charAt(v) < 'A' || Value.charAt(v) > 'Z')
        { return false;
        };
        v += 1;
      }
      else
      { if (Value.charAt(v) != Pattern.charAt(i))
        { return false;
        };
        v += 1;
      };
    };
  };
  if (v != Value.length)
  { return false;
  };
  return true;
};

function vInteger(field)
{ if (Value(field) == "")
  { return true;
  };
  if (!isInteger(Value(field)))
  { Invalid (field, " must be an integer number");
    return false;
  };
  return true;
};

function vDate(field)
{ var strdate = field.value;
  if (strdate == "")
  { return true;
  };
  if (!ValuePattern(strdate, "99/99/9999"))
  { Invalid(field, ": Use format MM/DD/YYYY");
    return false;
  };
  if (strdate.substring(0, 1) == "0")
  { var month = parseInt(strdate.substring(1, 2));
  }
  else
  { var month = parseInt(strdate.substring(0, 2));
  };
  if (strdate.substring(3, 4) == "0")
  { var day = parseInt(strdate.substring(4, 5));
  }
  else
  { var day = parseInt(strdate.substring(3, 5))
  };
  var year = parseInt(strdate.substring(6, strdate.length));
  if (month < 1 || month > 12)
  { Invalid(field, " must be a valid date");
    return false;
  };
  var leap = (Math.floor((400 - (year % 400)) / 400) +
              Math.floor((100 - (year % 100)) / 100) +
              Math.floor((  4 - (year %   4)) /   4)
             ) % 2;
  var days = 31 - ((((month - 1) % 7) % 2) +
                   (Math.floor(((13 - month) % 12 + 1) / 12) * (2 - leap))
                  );

  if (day < 1 || day > days)
  { Invalid(field, " must be a valid date");
    return false;
  };
  return true;
};

function vZipCode(field)
{ var val = Value(field)
  if (val == "")
  { return true;
  };
  if (!ValuePattern(val, "99999") && !ValuePattern(val, "99999-9999") && !ValuePattern(val, "A9A 9A9"))
  { Invalid(field, ": Use format '12345', '12345-1234' or 'A1B 2C3'");
    return false;
  };
  return true;
};

function vPhone(field)
{ var val = Value(field)
  if (val == "")
  { return true;
  };
  if (!ValuePattern(val, "999-999-9999") && !ValuePattern(val, "999-999-9999#9000"))
  { Invalid(field, ": Use format 123-123-1234 or 123-123-1234#1234");
    return false;
  };
  return true;
};

function vEMail(field)
{ var val = Value(field)
  if (val == "")
  { return true;
  };
  var at = val.lastIndexOf("@");
  var dot = val.lastIndexOf(".");
  if (at < 0 || dot < 0 || dot < at)
  { Invalid (field, " must be a valid E-mail address.");
    return false;
  };
  return true;
};

function vFloat(field)
{ if (Value(field) == "")
  { return true;
  };
  if (isNaN(Value(field)))
  { Invalid (field, " must be a floating point number");
    return false;
  };
  return true;
};

function vCCNumber(field)
{ var val = Value(field)
  if (val == "")
  { return true;
  };
  if (ValuePattern(val, "**** **** **** 9999"))
  { return true;
  };
  if (!ValuePattern(val, "9999 9999 9999 9999"))
  { Invalid(field, ": Use format 1234 1234 1234 1234");
    return false;
  };
  var i;
  var factor = 0;
  var num;
  var sum = 0;
  for (i = val.length - 1; i >= 0; i--)
  { if (val.substring(i, i + 1) != " ")
    { factor += 1;
      num = parseInt(val.substring(i, i + 1)) * factor;
      sum += Math.floor(num / 10) + (num % 10);
      factor = factor % 2;
    };
  };
  if (sum % 10 != 0)
  { Invalid(field, ": Invalid number");
    return false;
  };
  return true;
};

function vCCExp(field)
{ var val = Value(field)
  if (val == "")
  { return true;
  };
  if (!ValuePattern(val, "99/99"))
  { Invalid(field, ": Use format MM/YY");
    return false;
  };
  var curdate = new Date();
  var curmonth = curdate.getMonth() + 1;
  var curyear = curdate.getYear() - 2000;
  var strmonth = val.substring(0, 2);
  if (strmonth.substring(0, 1) == "0")
  { var ccmonth = parseInt(strmonth.substring(1, 2));
  }
  else
  { var ccmonth = parseInt(strmonth);
  };
  var stryear = val.substring(3, 5);
  if (stryear.substring(0, 1) == "0")
  { var ccyear = parseInt(stryear.substring(1, 2));
  }
  else
  { var ccyear = parseInt(stryear);
  };
  if (ccmonth < 1 || ccmonth > 12)
  { Invalid(field, ": Invalid month");
    return false;
  };
  if ((ccyear * 12) + ccmonth - 1 < (curyear * 12) + curmonth - 1)
  { Invalid(field, ": Date is in the past");
    return false;
  };
  return true;
};

function vMultiple(field)
{ CheckLength = true;
  return true;
};

function vMin(field, min)
{ if (Value(field) == "" || min == "")
  { return true;
  };
  if (min.indexOf("/") < 0)
  { var minimum = new Number(eval(min));
    var val = new Number(eval(Value(field)));
    if (val < minimum)
    { Invalid (field, " minimum value = " + min);
      return false;
    };
  }
  else
  { var Val = Value(field);
    var NumVal = (new Number(eval(Val.substring(Val.lastIndexOf("/") + 1, Val.length))) * 10000) +
	             (new Number(eval(Val.substring(0, Val.indexOf("/")))) * 100) +
	              new Number(eval(Val.substring(Val.indexOf("/") + 1, Val.lastIndexOf("/"))));
    
    var NumMin = (new Number(eval(min.substring(min.lastIndexOf("/") + 1, min.length))) * 10000) +
                 (new Number(eval(min.substring(0, min.indexOf("/")))) * 100) +
                  new Number(eval(min.substring(min.indexOf("/") + 1, min.lastIndexOf("/"))));
   if (NumVal < NumMin)
    { Invalid (field, " earliest date = " + min);
      return false;
    };
  };
  return true;
};

function vMax(field, max)
{ if (Value(field) == "" || max == "")
  { return true;
  };
  if (CheckLength)
  { CheckLength = false;
    var maximum = new Number(eval(max));
    if (Value(field).length > maximum)
    { Invalid (field, " too many items selected");
      return false;
    };
  }
  else
  { if (max.indexOf("/") < 0)
    { var maximum = new Number(eval(max));
      var val = new Number(eval(Value(field)));
      if (val > maximum)
      { Invalid (field, " maximum value = " + max);
        return false;
      };
    }
    else
    { var Val = Value(field);
      var NumVal = (new Number(eval(Val.substring(Val.lastIndexOf("/") + 1, Val.length))) * 10000) +
                   (new Number(eval(Val.substring(0, Val.indexOf("/")))) * 100) +
                    new Number(eval(Val.substring(Val.indexOf("/") + 1, Val.lastIndexOf("/"))));
      var NumMax = (new Number(eval(max.substring(max.lastIndexOf("/") + 1, max.length))) * 10000) +
                   (new Number(eval(max.substring(0, max.indexOf("/")))) * 100) +
                    new Number(eval(max.substring(max.indexOf("/") + 1, max.lastIndexOf("/"))));
      if (NumVal > NumMax)
      { Invalid (field, " latest date = " + max);
        return false;
      };
    };
  };
  return true;
};

function Check(field)
{ if (field.type == null)
  { field.type = field[0].type;
    field.name = field[0].name;
  };
  var Conditions = eval("document.Validations." + field.name + ".value");
  var Expression = "";
  var Index = 0;
  var Paren = Conditions.indexOf("(", Index);
  while (Paren >= 0)
  { Expression = Expression + Conditions.substring(Index, Paren + 1) + "field";
    Index = Paren + 1;
    if (Conditions.charAt(Index) != ")")
    { Expression = Expression + ",";
    };
    Paren = Conditions.indexOf("(", Index);
  };
  Expression = Expression + Conditions.substring(Index, Conditions.length);
  return eval(Expression);
};

function Validate(form)
{ if (!CV)
  { var Elements = document.Validations.elements;
    var Index = 0;
    while (Index < Elements.length)
    { var Name = Elements[Index].name;
      if (Name != null)
      { var Field = eval("form." + Name);
        if (Field != null)
        { if (!Check(Field))
          { return false;
          };
        };
      };
      Index += 1;
    };
    if (!ValidateCustom(form))
    { return false;
    };
  };
  CV = false;
  //alert ("Client validation OK");
  return true;
};


