//=============================================================================
var inputFocusRef   = null;
var firstInputFocus = false;
_ToolTip = new ToolTip()
var validFunctions = new ValidatorFunctions();
var hiddenLinkedToolTip = null;
//=============================================================================
var MESSAGES = 
{
    EMPTY             : 'Required field', 
    EMAIL             : 'Not a valid e-mail!', 
    PHONE             : 'Only digits spaces - and + are valid!',
    ALPHANUMERIC      : 'Only alpha-numeric characters allowed!',
    ALPHANUMERICSPACE : 'Only alpha-numeric and space characters allowed!',
    ALPHANUMERICDELI  : 'Only alpha-numeric, (,) characters allowed!',
    PASSWORD          : 'Password must contain at least 4 characters!',
    NUMERIC           : 'Only digits allowed!',
    IMAGEEXTENTION    : 'A picture must be selected!',
    TERMOFSERVICE     : 'You must read and agree to terms of service'  
}; 
//=============================================================================
function Validator()
{
    this.formobj = (Validator.arguments.length == 1) ? document.forms[Validator.arguments[0]] : document.forms[0];
    if(this.formobj.onsubmit)
    {
         this.formobj.old_onsubmit = this.formobj.onsubmit;
	    this.formobj.onsubmit     = null;
    }
    else
    {
         this.formobj.old_onsubmit = null;
    }
    //=========================================================================
    this.formobj.onsubmit = function()
    {
         var pageValid = true;
         firstInputFocus = false;
         for(var itr = 0; itr < this.elements.length; itr++)
         {
              if(this.elements[itr].inputValidationSettings && !this.elements[itr].inputValidationSettings.validate())
              {
                   //inputFocusRef.focus(); 
                   return false;
              }
         }
         //This for adding another function that will execute after the validation...
         if(this.addnlvalidation)
         {
	         eval(" var ret = " + this.addnlvalidation + "()");	
	         if(!ret) 
              {
                   return ret;
              }
         }
         return true;
    } 
    //=========================================================================
    this.addValidation = function(inputName, descriptor)
    {
         var inputRef = $(inputName);
         //check if there is a validation for this input...
         if(!inputRef.inputValidationSettings)
         {
	         inputRef.inputValidationSettings = new inputValidationSettings(inputRef);
         }        
         inputRef.inputValidationSettings.attachValidationToInput(descriptor);       
    }
    //=========================================================================    
    this.addEvent = function(inputName, descriptor1, descriptor2, ajaxFunction)
    {
         var inputRef = $(inputName);
         //check if there is a validation for this input...
         switch(descriptor1) 
         { 
              case "onkeypress": 
                   //ValidatorHookupEvent(inputRef, "onkeypress", "clearErrorMsg('" + inputName + "')");
                   inputRef.onkeypress = (BrowserDetector && BrowserDetector.isFirefox()) ? function(e) {clearErrorMsg(inputName, e);} : new Function("clearErrorMsg('" + inputName + "', event);");
                   break;
              case "onchange": 
                   //ValidatorHookupEvent(inputRef, "onchange",  "validateSwitch('" + descriptor2 + "','" + inputName + "')");                   
                   inputRef.onchange = (BrowserDetector && BrowserDetector.isFirefox()) ? function(e) {validateSwitch(descriptor2, inputName);} : new Function("validateSwitch('" + descriptor2 + "','" + inputName + "')");                   
                   
                   break;
              case "onblur":
                   //ValidatorHookupEvent(inputRef, "onblur", "validateSwitch('" + descriptor2 + "','" + inputName + "','" + ajaxFunction + "')");
                   inputRef.onblur = (BrowserDetector && BrowserDetector.isFirefox()) ? function(e) {validateSwitch(descriptor2, inputName, ajaxFunction);} : new Function("validateSwitch('" + descriptor2 + "','" + inputName + "','" + ajaxFunction + "')");                   
                   break;
         }
    }    
    //=========================================================================   
    this.setAddnlValidationFunction = function(functionname)
    {    
         this.formobj.addnlvalidation = functionname;    
    }
    //=========================================================================
    this.clearAllValidations = function()
    {
         for(var itr = 0; itr < this.formobj.elements.length; itr++)
         {
              this.formobj.elements[itr].inputValidationSettings = null;
         }
    }
    //========================================================================        
}
//=============================================================================
//for each input there is one inputValidationSet object...
function inputValidationSettings(inputItem)
{
    this.validationSettings       = new Array();
    this.itemObject               = inputItem;
    //=========================================================================
    this.attachValidationToInput = function(desc, error)
    {             
         this.validationSettings[this.validationSettings.length] = new ValidationDesc(this.itemObject, desc, error);                                                     
    }             
    //=========================================================================        
    this.validate = function()
    {    
         for(var itr = 0; itr < this.validationSettings.length; itr++)
         {
              if(!this.validationSettings[itr].validate())
	         {
	              if(!firstInputFocus)
	              {
	                   inputFocusRef = this.validationSettings[itr].itemObject;
	                   firstInputFocus = true;
	              }
	              return false;
	         }
         }
         return true;    
    } 
    //=========================================================================           
}
//=============================================================================
function ValidationDesc(inputItem, description, error)
{
    this.description = description;
    this.error       = error;
    this.itemObject  = inputItem;
    this.validate    = function()
    {    
         if(!validateSwitch(this.description, this.itemObject, this.error))
         {                                         
	         this.itemObject.focus();
	         return false;
         }
         return true;
    }    
}
//=============================================================================
function validateSwitch(validationStr, objValue, extraValidation) 
{ 
    if(validFunctions.isString(objValue)) objValue = $(objValue);
    var validationCommand = validationStr; 
      
    //objValue.value = objValue.value.trim();
    switch(validationCommand) 
    {          
         case "required": 
         {  
              if(validFunctions.isEmpty(objValue.value)) 
              { 
                   showErrorMsg(objValue, MESSAGES.EMPTY);
                   return false; 
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break;
         }
         case "email": 
         {
              var array = objValue.value.sliceString(";");
              if(objValue.getAttribute('multipleEmails') == 'multiple' && array.length > 1)
              {
                   var len = array.length;
                   for(var i = 0; i < len; i++)
                   {
                        array.remove("");
                   }
                   objValue.value = array.join(";");
              }
              else
              {
                   array.remove(";");
              }

              if(!validFunctions.isEmail(objValue.value)) 
              { 
                   showErrorMsg(objValue, MESSAGES.EMAIL);
                   return false; 
              }
              else if((hiddenLinkedToolTip && $(hiddenLinkedToolTip).value == "false") || (typeof(hiddenLinkedToolTip) == "undefined"))
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
         case "email_Event": 
         { 
              if(!validFunctions.isEmail(objValue.value))
              {
                   showErrorMsg(objValue, MESSAGES.EMAIL);    
                   return false;   
              }
              else if(extraValidation != "undefined")
              {
	              //Execute User Function... 
	              eval(extraValidation + "()");
              }
              else if((hiddenLinkedToolTip && $(hiddenLinkedToolTip).value == "false") || (typeof(hiddenLinkedToolTip) == "undefined"))
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
         case "code_event": 
         { 
              if(extraValidation != "undefined")
              {              
	              //Execute User Function... 
	              eval(extraValidation + "()");
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }                  
         case "alphanumeric": 
         { 
              if(!validFunctions.isEmpty(objValue.value) &&  objValue.value.search("[^A-Za-z0-9]") >= 0) 
              { 
                   showErrorMsg(objValue, MESSAGES.ALPHANUMERIC); 
                   return false; 
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
         case "alphaNumericSpace": 
         { 
              if(!validFunctions.isEmpty(objValue.value) && !validFunctions.isAlphaNumericSpace(objValue.value.trim())) 
              { 
                   showErrorMsg(objValue, MESSAGES.ALPHANUMERICSPACE); 
                   return false; 
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }          
         case "password": 
         {         
              if(!validFunctions.isEmpty(objValue.value) && !validFunctions.isPassword(objValue.value))
              { 
                   showErrorMsg(objValue, MESSAGES.PASSWORD);
                   return false; 
              }              
              else if((hiddenLinkedToolTip && $(hiddenLinkedToolTip).value == "false") || (typeof(hiddenLinkedToolTip) == "undefined"))
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
         case "alphaNumericEvent": 
         {             
              if(!validFunctions.isEmpty(objValue.value) && !validFunctions.isAlphaNumericSpace(objValue.value.trim())) 
              { 
                   showErrorMsg(objValue, MESSAGES.ALPHANUMERICSPACE);
                   return false; 
              }      
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
         case "required_alphanumeric_Event": 
         {             
              if(validFunctions.isEmpty(objValue.value.trim()))
              {
                   showErrorMsg(objValue, MESSAGES.EMPTY);  
                   return false;      
              }              
              else if(!validFunctions.isEmpty(objValue.value) && !validFunctions.isAlphaNumeric(objValue.value.trim())) 
              { 
                   showErrorMsg(objValue, MESSAGES.ALPHANUMERIC);
                   return false; 
              }
              else if(extraValidation != "undefined")
              {
	              //Execute User Function... 
	              eval(extraValidation + "()");
              }              
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }  
         case "alphanumeric_Event": 
         { 
              if(!validFunctions.isEmpty(objValue.value) && !validFunctions.isAlphaNumeric(objValue.value.trim()))
              {
                   showErrorMsg(objValue, MESSAGES.ALPHANUMERIC);
                   return false;   
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }         
         case "required_Location_Event": 
         {
              if(extraValidation != "undefined")
              {
	              //Execute User Function... 
	              clearErrorMsg(objValue);
	              eval(extraValidation + "()");
              }              
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
         case "alphaNumericTags": 
         { 
              if(!validFunctions.isEmpty(objValue.value.trim()) && !validFunctions.isAlphaNumericSpace(objValue.value.trim())) 
              { 
                   showErrorMsg(objValue, MESSAGES.ALPHANUMERICDELI);
                   return false; 
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
         case "alphaNumericDescription": 
         { 
              if(!validFunctions.isEmpty(objValue.value.trim()) && !validFunctions.isAlphaNumericSpace(objValue.value.trim())) 
              { 
                   showErrorMsg(objValue, MESSAGES.ALPHANUMERICDELI);
                   return false; 
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
         case "numeric": 
         { 
              if(!validFunctions.isEmpty(objValue.value.trim()) &&  !validFunctions.isNumeric(objValue.value))
              { 
                   showErrorMsg(objValue, MESSAGES.NUMERIC);  
                   return false;                  
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break;
         } 
         case "phone": 
         { 
              if(!validFunctions.isEmpty(objValue.value) &&  !validFunctions.isPhone(objValue.value)) 
              { 
                   showErrorMsg(objValue, MESSAGES.PHONE);  
                   return false;
              }
              else
              {
                   clearErrorMsg(objValue); 
              }
              break;
         }
         case "image_extention": 
         { 
              if(!validFunctions.isEmpty(objValue.value) &&  !validFunctions.isImageExtention(objValue.value)) 
              { 
                   showErrorMsg(objValue, MESSAGES.IMAGEEXTENTION);  
                   return false;
              }
              else
              {
                   clearErrorMsg(objValue); 
              }
              break;
         }
         case "requiredCheckBox": 
         { 
              if(!objValue.checked)
              { 
                   showErrorMsg($("hiddenToolTip"), MESSAGES.TERMOFSERVICE); 
                   return false;
              }
              else
              {
                   clearErrorMsg(objValue);
              }
              break; 
         }
    }
    return true; 
}
//=============================================================================     
function showErrorMsg(objValue, msg)
{
    _ToolTip.title    = "";
    _ToolTip.message  = msg;
    _ToolTip.id       = "toolTip";
    _ToolTip.setPosition(objValue);    
    _ToolTip.setContainer(objValue.getAttribute('toolTipPlaceHolder'));
    _ToolTip.getContainer().innerHTML = _ToolTip.draw();
    _ToolTip.show();
} 
//============================================================================= 
function clearErrorMsg(objValue, evt)
{
    if(evt && !isEnterClicked(evt))
    {
         if(validFunctions.isString(objValue)) 
         {
              objValue = $(objValue);
         }
         _ToolTip.setContainer(objValue.getAttribute('toolTipPlaceHolder'));
         _ToolTip.hide();
    }
}
//=============================================================================
function ValidatorFunctions() 
{
    //=========================================================================
    this.isUndefined      = function(val){return (typeof(val) == "undefined");};
    //=========================================================================
    this.isString         = function(val){return (typeof(val) == "string");};
    //=========================================================================
    this.isNull           = function(val){return (val == null);};
    //=========================================================================
    this.isEmpty          = function(val){return (val == "");};
    //=========================================================================
    this.isNumeric        = function(val){return /^\d+$/.test(val);};  
    //=========================================================================
    this.isPhone          = function(val){return (val.replace(/[0-9 +-]*/g, "") == "");};
    //=========================================================================
    //TODO: All pages that use this function must include globelfunctions.js...
    this.isEmail          = function(valArr)
    {
         var array = valArr.sliceString(";");
         var validEmail  = false;
         for(var i = 0; i < array.length; i++) 
         { 
              validEmail = /^([A-Za-z0-9\-_]*[\.A-Za-z0-9\-_]+@[A-Za-z0-9\-_]+(\.[A-Za-z0-9\-_]+){1,3})*$/.test(array[i]);                                 
              if(!validEmail)
              {
                   return validEmail;
              }        
         } 
         return validEmail; 
    };
    //=========================================================================
    this.isValidFirstName = function(val){return /^[0-9a-zA-Z_]{2,15}$/.test(val);};  
    //=========================================================================  
    this.isValidLastName  = function(val){return /^[0-9a-zA-Z_]{2,50}$/.test(val);};   
    //=========================================================================    
    this.isPassword       = function(val){return new RegExp("^[A-Za-z0-9\-_]{4,20}$").test(val);}; 
    //=========================================================================
    this.isAlphaNumericSpace = function(val){return !(val.search("[^A-Za-z0-9, ]") >= 0);};  
    //=========================================================================
    this.isAlphaNumeric = function(val){return !(val.search("[^A-Za-z0-9]") >= 0);};
    //=========================================================================
    this.isImageExtention = function(val){return /.*\.(gif|GIF|jpg|JPG|jpeg|JPEG)/.test(val);};
    //=========================================================================
};
//=============================================================================
