﻿var _Filter_Email = /^([\w-\.]+)@((\[\d{1,3}\.\d{1,3}\.\d{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|\d{1,3})(\]?)$/g;
var _Filter_Phone15 = /^\([2-9]{1}\d{2}\) \d{3}-\d{4} x\d{1,5}$/g;
var _Filter_Phone10 = /^\([2-9]{1}\d{2}\) \d{3}-\d{4}$/g;
var _Filter_Zip10 = /^\d{5}-\d{4}$/g;
var _Filter_Zip5 = /^\d{5}$/g;
var _Filter_PostalCode = /^[a-zA-Z]\d[a-zA-Z] \d[a-zA-Z]\d$/g; // cn postal code is A0A 0A0
var _Filter_IPAddress = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/g;
var _Filter_Numeric = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)|(^-?\d*$)/g;
var _Filter_SSN = /^\d{3}-\d{2}-\d{4}$/g;
var _Filter_Date = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/g;

var _ValidationClasses = 
      ".val-required," +
      ".val-requiredif," + 
      ".val-phone," +
      ".val-email," +
      ".val-zip," +
      ".val-ip," +
      ".val-ssn," +
      ".val-date," +
      ".val-year," +
      ".val-match," +
      ".val-min," +
      ".val-max"

$(function(){
  if (_Environment == "Development") {
    $(_ValidationClasses).each(function(){
      var field = $(this);
      if (!field.attr("label")) {
        alert(field.attr("id") + " is missing Label for validation.");
      }
    });
  }
});

function ValidateForm(container) {
  FieldFocus_Stop();

  var inputs = null;
  
  if (container) {
    inputs = $(container + " > " + _ValidationClasses);
  } else {
    inputs = $(_ValidationClasses);
  }

  var valid = true;

  for (i = 0; i < inputs.length && valid; i++) {
    valid = ValidateField(inputs.eq(i));
  }

  return valid;
}

function ValidateField(field) {
  var value = field.val().trim();
	
  if (field.hasClass("val-required")) {
    if (value == "") {
      Validation_Error("Invalid Input", field.attr("label") + " is required.", field);
      return false;
    }
  }
  
  if (field.hasClass("val-requiredif")) {
    var field2 = (_IsMasterPage) ? $c(field.attr("rel")) : $m(field.attr("rel"));
    var required = false;
    if (field2.attr("type") == "checkbox" || field2.attr("type") == "radio") {
      required = field2.attr("checked");
    } else {
      var relvalue = field.attr("relvalue");
      required = (relvalue) ? (field2.val() == relvalue) : (field2.val() != "");
    }
    
    if (value == "" && required) {
      Validation_Error("Invalid Input", field.attr("label") + " is required.", field);
      return false;
    }
  }
  
  if (field.hasClass("val-phone")) {
    if (value != "") {
      if (!IsValidPhoneNumber(value)) {
        Validation_Error("Invalid Input", "Please enter a valid " + field.attr("label") + ".", field, "<br/><br/><b>Format:</b>&nbsp; (999) 999-9999 x?????");
        return false;
      }
    }
  }
  
  if (field.hasClass("val-email")) {
    if (value != "") {
      if (!IsValidEmail(value)) {
        Validation_Error("Invalid Input", "Please enter a valid " + field.attr("label") + ".", field, "<br/><br/><b>Format:</b>&nbsp; your.name@emailserver.com");
        return false;
      }
    }
  }

  if (field.hasClass("val-zip")) {
    if (value != "") {
      if (!IsValidZipCode(value)) {
        Validation_Error("Invalid Input", "Please enter a valid " + field.attr("label") + ".", field, "<br/><br/><b>Zip Code Format:</b>&nbsp; 99999-????<br/><b>Postal Code Format:</b>&nbsp; A9A 9A9");
        return false;
      }
    }
  }

  if (field.hasClass("val-ip")) {
    if (value != "") {
      if (!IsValidIPAddress(value)) {
        Validation_Error("Invalid Input", "Please enter a valid " + field.attr("label") + ".", field, "<br/><br/><b>Format:</b>&nbsp; 999.999.999.999");
        return false;
      }
    }
  }

  if (field.hasClass("val-ssn")) {
    if (value != "") {
      if (!IsValidSSN(value)) {
        Validation_Error("Invalid Input", "Please enter a valid " + field.attr("label") + ".", field, "<br/><br/><b>Format:</b>&nbsp; 999-99-9999");
        return false;
      }
    }
  }

  if (field.hasClass("val-date")) {
    if (value != "") {
      if (!IsValidDate(value)) {
        Validation_Error("Invalid Input", "Please enter a valid date for " + field.attr("label") + ".", field, "<br/><br/><b>Format:</b>&nbsp; MM/DD/YYYY");
        return false;
      }
    }
  }

  if (field.hasClass("val-year")) {
    if (value != "" && (parseFloat(value) < 1920 || parseFloat(value) > 2050)) {
      Validation_Error("Invalid Input", "Please enter a valid " + field.attr("label") + ".", field);
      return false;
    }
  }

  if (field.hasClass("val-match")) {
    var field2 = ($c(field.attr("rel"))) ? $c(field.attr("rel")) : $m(field.attr("rel"));
    if (value != field2.val()) {
      Validation_Error("Invalid Input", field.attr("label") + " does not match " + field2.attr("label") + ".", field);
      return false;
    }
  }
  
  if (field.hasClass("val-min")) {
    var min = $c(field.attr("min"));
    if (value != "" && parseFloat(value) > parseFloat(min)) {
      Validation_Error("Invalid Input", field.attr("label") + " cannot be less than " + min + ".", field);
      return false;
    }
  }
  
  if (field.hasClass("val-max")) {
    var max = $c(field.attr("max"));
    if (value != "" && parseFloat(value) > parseFloat(max)) {
      Validation_Error("Invalid Input", field.attr("label") + " cannot be greater than " + max + ".", field);
      return false;
    }
  }
  
  return true;
}

function Validation_Error(title, error, field, format) {
  if (window.Dialog_ValidationError) {
    if (format) error += format;
    Dialog_ValidationError(title, error, field);
  } else {
    alert(error);
    FieldFocus_Start(field);
  }
}


function IsValidEmail(address) {
  return address.match(_Filter_Email);
}

function IsValidPhoneNumber(phone) {
  return (phone.match(_Filter_Phone15) || phone.match(_Filter_Phone10));
}

function IsValidZipCode(zip) {
  return (zip.match(_Filter_Zip10) || zip.match(_Filter_Zip5) || zip.match(_Filter_PostalCode));
}

function IsValidIPAddress(ip) {
  return (ip.match(_Filter_IPAddress));
}

function IsValidSSN(ssn) {
  return ssn.match(_Filter_SSN);
}

function IsValidDate(date) {
	var dm = date.match(_Filter_Date);
	if (dm == null) return false;
	
	var dp = date.split("/");
	var mm = parseInt(dp[0]) - 1;
	var dd = parseInt(dp[1]);
	var yyyy = parseInt(dp[2]);
	
	if (yyyy < 1920 || yyyy > 2050) return false;

	var ed = new Date(yyyy, mm, dd);
	
  return ((dd == ed.getDate()) && (mm == ed.getMonth()) && (yyyy == ed.getFullYear()));
}
