﻿/******************************************************
* Validator
******************************************************/
function Validator()
{
}

Validator._instance = null;

Validator.getInstance = function()
{
   if(Validator._instance == null)
   {
      Validator._instance = new Validator();
   } 

   return Validator._instance;
}


Validator.prototype.IsEmpty = function(element)
{ 
   if(element == null)
   {
      throw new Error("ELEMENT IS NULL");
   } 
   
   if( element.value == "")
   {
      this.indicateError(element,"Field cannot be empty!");
      return false;
   }
   
   if( this.Sanitize(element.value) == "")
   {
      this.indicateError(element,"Field name is invalid or field cannot be empty!");
      return false;
   }
   
   return true;
}


Validator.prototype.Sanitize = function(original)
{
    var results = "";

    if (original == null || original.length == 0)
    {
        return "";
    }

    var c;
    original = original.replace(/^\s+|\s+$/g, '');
    
    for (i = 0; i < original.length; i++)
    {
           c = original.charAt(i);
           if ((c >= 'A' && c <= 'Z') ||
               (c >= 'a' && c <= 'z') ||
               (c >= '0' && c <= '9') ||
                c == ' ' || c == '-')
               {
                  results += c;
               }
    }
    
    if (results.charAt(0) == '-')
    {
        results = "";
    }

    return results;
}


Validator.prototype.IsValidDate = function(element)
{  
  
   return this.validate( element, 
                   /^\d\d\d\d[/](0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])$/, 
                        "Date Format is invalid!"
                       );
}


Validator.prototype.validate = function(element, rexExpPattern, errorMsg)
{
   if(element == null)
   {
      throw new Error("ELEMENT IS NULL");
   } 
   element.style.backgroundColor = "";

   var value = element.value;
   if( !value.match( rexExpPattern ) || !Validator.getInstance().IsValidDateScorpe(element))
   {
      this.indicateError(element, errorMsg);
      return false;	
   } 
 
   return true;
}

Validator.prototype.IsValidDateScorpe = function(element)
{
   var value = element.value;
   var year = parseInt(value.substring(0, 4), 10);
   var month = parseInt(value.substring(5, 7), 10);
   var day = parseInt(value.substring(8, 10), 10);
   
   if (month > 0 && month <= 12 &&
       getDays(month, year) >= day)
   {
       return true;
   }
   return false;
}

Validator.prototype.indicateError = function(element, errorMsg)
{
   var oldBC = element.style.backgroundColor;
   element.style.backgroundColor = "red";

   alert(errorMsg);   

   if( element.visible == true)
   {
      element.focus();
   }

   element.style.backgroundColor = oldBC;
}


Validator.prototype.validateDatesRange = function(startDate, endDate)
{
   var start = this.normalizeDate(startDate.value);
   var end   = this.normalizeDate(endDate.value);

   if ( start > end) 
   {
      window.status = start + " "+ end;
      this.indicateError(endDate, "Start Date occurs after End Date!");
      
      return false;
   }
   
   endDate.style.backgroundColor = "";
   return true;
}


Validator.prototype.validateTimeRange = function(startDate, startTime, endDate, endTime)
{
   var start = this.normalizeDate(startDate.value);
   var end   = this.normalizeDate(endDate.value);

   if(Date.parse(start) < Date.parse(end))
   {
      return true;
   }

   if( this.compareTimes(startTime.value, endTime.value) == false) 
   {
      this.indicateError(endTime, "Start Time occurs after End Time!");
      
      return false;
   }
   
   endTime.style.backgroundColor = "";
   return true;
}

Validator.prototype.normalizeDate = function(date)
{
   var d = new Date();
   var arr = date.split('/');
   d.setFullYear(arr[0], arr[1], arr[2]);
   return d; 
}

Validator.prototype.compareTimes = function(startTime, endTime)
{
   var startTimeArr = startTime.split(":");
   var endTimeArr   = endTime.split(":");
   
   if( startTimeArr[0] >  endTimeArr[0])
   {
      return false;
   }
 
   if( ( startTimeArr[0] == endTimeArr[0]) &&  (startTimeArr[1] > endTimeArr[1]) )
   {
      return false;
   }
   
   return true;
}

Validator.prototype.validateFieldLength = function(element, limit)
{
   if(element == null)
   {
      throw new Error("ELEMENT IS NULL");
   } 
   
   if( element.value.length > limit)
   {
      this.indicateError(element, "Field length cannot exceed more than " + limit + " symbols");
      return false;
   } 

   element.style.backgroundColor = "";
   return true;
}
