XChecks = new Object();
XChecks.isPass        = "isPass";
XChecks.isMail        = "isMail";
XChecks.isLink        = "isLink";
XChecks.isEmpty       = "isEmpty";
XChecks.isPhone       = "isPhone";
XChecks.isDate        = "isDate";
XChecks.isTime        = "isTime";
XChecks.isSimpleChars = "isSimpleChars";
XChecks.isDigits      = "isDigits";
XChecks.checkLength   = "checkLength";

// METHOD :: Class used for validating user input
var XValidate = function() {

   var checkLength = function(obj, min, max) {
      if (obj.value.length < min || (max && obj.value.length > max))
         return false;
      else
         return true
   };

   var isEmpty = function(obj) {
      if (obj.value.length > 0)
         return false;
      else
         return true;
   };

   var isDigits = function(obj) {
      if (isNaN(obj.value))
         return false;
      else
         return true;
   };

   var isSimpleChars = function(obj) {
      var regSimpleChars  = /^[a-zA-Z0-9._-]+$/;
      if (!regSimpleChars.test(obj.value))
         return false;
      else
         return true;
   };
   
   var isDate = function(obj) {
      var regSimpleChars = /^(0[1-9]|[12][0-9]|3[01])[\/\.\s-](0[1-9]|1[0-2])[\/\.\s-](19|20)\d{2}$/;
      if (!regSimpleChars.test(obj.value))
         return false;
      else
         return true;
   };
   
   var isTime = function(obj) {
      var regSimpleChars = /^([0-1][0-9]|2[0-3]):([0-5][0-9])$/;
      if (!regSimpleChars.test(obj.value))
         return false;
      else
         return true;
   };

   var isPass = function(obj) {
      var regPass = /(?=^.{6,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[0-9a-zA-Z!@#$%^&*()]*$/;
      if (!regPass.test(obj.value))
         return false;
      else

         return true;
   };

   var isMail = function(obj) {
      var regMail  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z]{2,4})$/;
      if (!regMail.test(obj.value))
         return false;
      else
         return true;
   };

   var isLink = function(obj) {
      var regLink  = /^(http|shttp):\/\/[a-zA-Z0-9.-]+\.[a-zA-Z0-9]*(\/\S*)?$/;
      if (!regLink.test(obj.value))
         return false;
      else
         return true;
   };

   var isPhone = function(obj) {
      var regPhone = /^[0-9\s\(\)\+\-]+$/;
      if (!regPhone.test(obj.value))
         return false;
      else

         return true;
   };

   return function(obj, type, min, max) {
      switch (type) {
         case "checkLength":
            var result = checkLength(obj, min, max);
            break;

         case "isSimpleChars":
            var result = isSimpleChars(obj);
            break;

         case "isDigits":
            var result = isDigits(obj);
            break;

         case "isDate":
            var result = isDate(obj);
            break;
            
         case "isTime":
            var result = isTime(obj);
            break;

         case "isMail":
            var result = isMail(obj);
            break;

         case "isLink":
            var result = isLink(obj);
            break;

         case "isPhone":
            var result = isPhone(obj);
            break;

         case "isPass":
            var result = isPass(obj);
            break;

         case true:
            var result = true;
            break;

         default:
            var result = false;
            break;
      }

      if (min || max) {
         result = (result && checkLength(obj, min, max));
      }

      if (!min && !obj.value) {
         result = true;
      }

      obj.style.backgroundColor = (result) ? "#b3ffab" : "#ffabab";

      if (obj.id && document.getElementById(obj.id + "_err")) {
         document.getElementById(obj.id + "_err").style.display = (result ? 'none' : 'block');
      }


      return result;
   };
}();

// METHOD :: Class used for keeping track of all input fields and associated events
var fieldValidator = function() {
   var private = {
      eListeners: new Array()
      };

   var public = {
      add : function(oId, event, func) {
         private.eListeners.push(new Array(oId, event, func));
      },

      registerEvents : function() {
         var cObj;
         for (var i = 0; i < private.eListeners.length; i++) {
            var oId   = private.eListeners[i][0];
            var event = private.eListeners[i][1];
            var func  = private.eListeners[i][2];

            if (cObj = document.getElementById(oId)) {
               cObj.style.background = "#fffad1";
               addListener(cObj, event, func);
            }
         }
      }
   };

   return public;
}();

addListener(window, 'load', fieldValidator.registerEvents);