
function DateTimeKeyCodes(eventType)
{
   if( eventType == 'keydown' )
   {
      this.s012345KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"] + ',' + keyboardHandling.KeyDown["3"] + ',' + keyboardHandling.KeyDown["NUM_3"] + ',' + keyboardHandling.KeyDown["4"] + ',' + keyboardHandling.KeyDown["NUM_4"] + ',' + keyboardHandling.KeyDown["5"] + ',' + keyboardHandling.KeyDown["NUM_5"];
      this.s0123KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"] + ',' + keyboardHandling.KeyDown["3"] + ',' + keyboardHandling.KeyDown["NUM_3"];
      this.s012KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"];
      this.s12KeyCodes = keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"];
      this.s01KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"];
      this.s9KeyCodes = keyboardHandling.KeyDown["9"] + ',' + keyboardHandling.KeyDown["NUM_9"];
      this.s0KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"];
      this.sNumericKeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["3"] + ',' + keyboardHandling.KeyDown["4"] + ',' + keyboardHandling.KeyDown["5"] + ',' + keyboardHandling.KeyDown["6"] + ',' + keyboardHandling.KeyDown["7"] + ',' + keyboardHandling.KeyDown["8"] + ',' + keyboardHandling.KeyDown["9"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["NUM_2"] + ',' + keyboardHandling.KeyDown["NUM_3"] + ',' + keyboardHandling.KeyDown["NUM_4"] + ',' + keyboardHandling.KeyDown["NUM_5"] + ',' + keyboardHandling.KeyDown["NUM_6"] + ',' + keyboardHandling.KeyDown["NUM_7"] + ',' + keyboardHandling.KeyDown["NUM_8"] + ',' + keyboardHandling.KeyDown["NUM_9"];
      this.sAPKeyCodes = keyboardHandling.KeyDown["A"] + ',' + keyboardHandling.KeyDown["P"];
      this.sMKeyCodes = keyboardHandling.KeyDown["M"];
   }
   else if( event.type == 'keypress' )
   {
      this.s012345KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"] + ',' + keyboardHandling.KeyDown["3"] + ',' + keyboardHandling.KeyDown["NUM_3"] + ',' + keyboardHandling.KeyDown["4"] + ',' + keyboardHandling.KeyDown["NUM_4"] + ',' + keyboardHandling.KeyDown["5"] + ',' + keyboardHandling.KeyDown["NUM_5"];
      this.s0123KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"] + ',' + keyboardHandling.KeyPress["3"] + ',' + keyboardHandling.KeyPress["NUM_3"];
      this.s012KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"];
      this.s12KeyCodes = keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"];
      this.s01KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"];
      this.s9KeyCodes = keyboardHandling.KeyPress["9"] + ',' + keyboardHandling.KeyPress["NUM_9"];
      this.s0KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"];
      this.sNumericKeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["3"] + ',' + keyboardHandling.KeyPress["4"] + ',' + keyboardHandling.KeyPress["5"] + ',' + keyboardHandling.KeyPress["6"] + ',' + keyboardHandling.KeyPress["7"] + ',' + keyboardHandling.KeyPress["8"] + ',' + keyboardHandling.KeyPress["9"];
      this.sAPKeyCodes = keyboardHandling.KeyPress["A"] + ',' + keyboardHandling.KeyPress["P"];
      this.sMKeyCodes = keyboardHandling.KeyPress["M"];
   }

   return this;
}

if( pageValidator.Masks["DateMask"] == null )
pageValidator.Masks["DateMask"] = function( event )
{
   if( !event ) event = window.event;

   var iKeyCode = String(event.keyCode ? event.keyCode : event.which);
   var oSrcElement = event.srcElement ? event.srcElement : event.currentTarget;
   var sValue = new String(oSrcElement.value);
   var iLength = sValue.length;

   if( !keyboardHandling.IsNumericKey( event ) && !keyboardHandling.IsNavigationKey( event ) )
   { 
        //w3c stop default behavior   
        if( event.cancelable ) event.preventDefault();
        //ie stop default behavior
        event.returnValue = false;
        //DOM level 0 stop default behavior
        return false; 
   }

   if( event.type == 'keydown' )
   {
      s0123KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"] + ',' + keyboardHandling.KeyDown["3"] + ',' + keyboardHandling.KeyDown["NUM_3"];
      s012KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"];
      s12KeyCodes = keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"];
      s01KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"];
      s9KeyCodes = keyboardHandling.KeyDown["9"] + ',' + keyboardHandling.KeyDown["NUM_9"];
      s0KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"];
   }
   else if( event.type == 'keypress' )
   {
      s0123KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"] + ',' + keyboardHandling.KeyPress["3"] + ',' + keyboardHandling.KeyPress["NUM_3"];
      s012KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"];
      s12KeyCodes = keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"];
      s01KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"];
      s9KeyCodes = keyboardHandling.KeyPress["9"] + ',' + keyboardHandling.KeyPress["NUM_9"];
      s0KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"];
   }

   if( !keyboardHandling.IsNavigationKey( event ) )
   {
      if (iLength == 2)
      {
         oSrcElement.value = sValue.substr(0,2) + '-';
         iLength++;
      }
      else if (iLength == 5)
      {
         oSrcElement.value = oSrcElement.value + '-';
         iLength++;
      }

      if( iLength == 0 )
      {
         if( !iKeyCode.IsIn(s0123KeyCodes) )
         {
                //w3c stop default behavior   
                if( event.cancelable ) event.preventDefault();
                //ie stop default behavior
               event.returnValue = false;
               //DOM level 0 stop default behavior
               return false; 
         }
      }
      else if( iLength == 1 )
      {
         if( sValue == '0' )
         {
            if( iKeyCode.IsIn(s0KeyCodes) )
            {
                    //w3c stop default behavior   
                    if( event.cancelable ) event.preventDefault();
                    //ie stop default behavior
                   event.returnValue = false;
                   //DOM level 0 stop default behavior
                   return false; 
            }
         }
         else if( sValue == '3' )
         {
            if( !iKeyCode.IsIn(s01KeyCodes) )
            {
                    //w3c stop default behavior   
                    if( event.cancelable ) event.preventDefault();
                    //ie stop default behavior
                   event.returnValue = false;
                   //DOM level 0 stop default behavior
                   return false; 
            }
         }
      }
      else if( iLength == 3 )
      {
         if( !iKeyCode.IsIn(s01KeyCodes) )
         {
                //w3c stop default behavior   
                if( event.cancelable ) event.preventDefault();
                //ie stop default behavior
               event.returnValue = false;
               //DOM level 0 stop default behavior
               return false; 
         }
      }
      else if( iLength == 4 )
      {
         sValue = sValue.substr(3,1);
         if( sValue == '0' )
         {
            if( iKeyCode.IsIn(s0KeyCodes) )
            {
                    //w3c stop default behavior   
                    if( event.cancelable ) event.preventDefault();
                    //ie stop default behavior
                   event.returnValue = false;
                   //DOM level 0 stop default behavior
                   return false; 
            }
         }   
         else if( sValue == '1' )
         {
            if( !iKeyCode.IsIn(s012KeyCodes) )
            {
                    //w3c stop default behavior   
                    if( event.cancelable ) event.preventDefault();
                    //ie stop default behavior
                   event.returnValue = false;
                   //DOM level 0 stop default behavior
                   return false; 
            }
         }
      }
      else if( iLength == 6 )
      {
         if( !iKeyCode.IsIn(s12KeyCodes) )
         {
                //w3c stop default behavior   
                if( event.cancelable ) event.preventDefault();
                //ie stop default behavior
               event.returnValue = false;
               //DOM level 0 stop default behavior
               return false; 
         }
      }
      else if( iLength == 7 )
      {
         sValue = sValue.substr(6,1);
         if( sValue == '1' )
         {
            if( !iKeyCode.IsIn(s9KeyCodes) )
            {
                    //w3c stop default behavior   
                    if( event.cancelable ) event.preventDefault();
                    //ie stop default behavior
                   event.returnValue = false;
                   //DOM level 0 stop default behavior
                   return false; 
            }
         }   
         else if( sValue == '2' )
         {
            if( !iKeyCode.IsIn(s0KeyCodes) )
            {
                    //w3c stop default behavior   
                    if( event.cancelable ) event.preventDefault();
                    //ie stop default behavior
                   event.returnValue = false;
                   //DOM level 0 stop default behavior
                   return false; 
            }
         }
      }
   }
}

if( pageValidator.Masks["TimeMask"] == null )
pageValidator.Masks["TimeMask"] = function( event )
{
   if( !event ) event = window.event;

   var iKeyCode = String(event.keyCode ? event.keyCode : event.which);
   var oSrcElement = event.srcElement ? event.srcElement : event.currentTarget;
   var sValue = new String(oSrcElement.value);
   var iLength = sValue.length;

   if( !keyboardHandling.IsNumericKey( event ) && !keyboardHandling.IsNavigationKey( event ) )
   { 
        //w3c stop default behavior   
        if( event.cancelable ) event.preventDefault();
        //ie stop default behavior
        event.returnValue = false;
        //DOM level 0 stop default behavior
        return false; 
   }

   if( event.type == 'keydown' )
   {
      s012345KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"] + ',' + keyboardHandling.KeyDown["3"] + ',' + keyboardHandling.KeyDown["NUM_3"] + ',' + keyboardHandling.KeyDown["4"] + ',' + keyboardHandling.KeyDown["NUM_4"] + ',' + keyboardHandling.KeyDown["5"] + ',' + keyboardHandling.KeyDown["NUM_5"];
      s0123KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"] + ',' + keyboardHandling.KeyDown["3"] + ',' + keyboardHandling.KeyDown["NUM_3"];
      s012KeyCodes = keyboardHandling.KeyDown["0"] + ',' + keyboardHandling.KeyDown["NUM_0"] + ',' + keyboardHandling.KeyDown["1"] + ',' + keyboardHandling.KeyDown["NUM_1"] + ',' + keyboardHandling.KeyDown["2"] + ',' + keyboardHandling.KeyDown["NUM_2"];
   }
   else if( event.type == 'keypress' )
   {
      s012345KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"] + ',' + keyboardHandling.KeyPress["3"] + ',' + keyboardHandling.KeyPress["NUM_3"] + ',' + keyboardHandling.KeyPress["4"] + ',' + keyboardHandling.KeyPress["NUM_4"] + ',' + keyboardHandling.KeyPress["5"] + ',' + keyboardHandling.KeyPress["NUM_5"];
      s0123KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"] + ',' + keyboardHandling.KeyPress["3"] + ',' + keyboardHandling.KeyPress["NUM_3"];
      s012KeyCodes = keyboardHandling.KeyPress["0"] + ',' + keyboardHandling.KeyPress["NUM_0"] + ',' + keyboardHandling.KeyPress["1"] + ',' + keyboardHandling.KeyPress["NUM_1"] + ',' + keyboardHandling.KeyPress["2"] + ',' + keyboardHandling.KeyPress["NUM_2"];
   }

   if( !keyboardHandling.IsNavigationKey( event ) )
   {
      if( iLength == 2 )
      {
         oSrcElement.value = sValue.substr(0, 2) + ':' + sValue.substr(2, iLength);
         iLength++;
      }   

      if( iLength == 0 )
      {
         if( !iKeyCode.IsIn(s012KeyCodes) )
         {
                //w3c stop default behavior   
                if( event.cancelable ) event.preventDefault();
                //ie stop default behavior
               event.returnValue = false;
               //DOM level 0 stop default behavior
               return false; 
         }
      }
      else if( iLength == 1 )
      {
         if( sValue == '2' )
         {
            if( !iKeyCode.IsIn(s0123KeyCodes) )
            {
                    //w3c stop default behavior   
                    if( event.cancelable ) event.preventDefault();
                    //ie stop default behavior
                   event.returnValue = false;
                   //DOM level 0 stop default behavior
                   return false; 
            }
         }
      }
      else if( iLength == 3 )
      {
         if( !iKeyCode.IsIn(s012345KeyCodes) )
         {
                //w3c stop default behavior   
                if( event.cancelable ) event.preventDefault();
                //ie stop default behavior
               event.returnValue = false;
               //DOM level 0 stop default behavior
               return false; 
         }
      }
   }
}

if( pageValidator.PostValidationMethods["IsValidTime"] == null )
pageValidator.PostValidationMethods["IsValidTime"] = function( pSrcElement )
{
   var iHour = pSrcElement.value.substr(0,2);
   var iMinute = pSrcElement.value.substr(3,2);
   
   if( iHour.length < 2 || iMinute.length < 2 )
   {
      return false;
   }

   if( iHour >= 0 && iHour <= 23 )
   {
      if( iMinute >= 0 && iMinute <= 59 )
      {
         return true;
      }   
   }
   return false;
}

if( pageValidator.PostValidationMethods["IsValidDate"] == null )
pageValidator.PostValidationMethods["IsValidDate"] = function( pSrcElement )
{
   var iDay = pSrcElement.value.substr(0,2);
   var iMonth = pSrcElement.value.substr(3,2);
   var iYear = pSrcElement.value.substr(6,4);

   if ((pSrcElement.value.substr(2,1) != "-") || (pSrcElement.value.substr(5,1) != "-"))
   {
      iDay = "";
      iMonth = "";
      iYear = "";
   }

   var arrayDia = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
   var arrayMes = new Array("01","02","03","04","05","06","07","08","09","10","11","12");
   var inpData = iDay + iMonth + iYear;
   var filter=/^[0-9]{2}[0-9]{2}[0-9]{4}$/;
   if (!filter.test(inpData))
   {
      return false;
   }

   // validando mes
   filter=/01|02|03|04|05|06|07|08|09|10|11|12/;
   if (! filter.test(iMonth))
   {
      return false;         
   }
   
   // checa o ano bissexto
   var N = Number(iYear);
   if ( ( N%4==0 && N%100 !=0 ) || ( N%400==0 ) )
     {
      arrayDia[1]=29;
     }

   // checando o dia valido para o mes
   for(var ctr=0; ctr<=11; ctr++)
     {
      if (arrayMes[ctr]==iMonth)
         {
         if (iDay<= arrayDia[ctr] && iDay >0 )
         {
            inpData = iDay + '/' + iMonth + '/' + iYear;
            
         }
         else
         {
            return false;               
         }
         }
   }
   return true;
}

function GetRawCustomDateTimeFormat(oSrcElement)
{
   var rawFormat;
   
   var elemID = oSrcElement.id;
   if (elemID == null || elemID.length == 0) elemID = elemID.name;
   
   if (elemID != null && elemID.length > 0)
   {
      var formatID;
      if (elemID.length > 5 && elemID.substring(elemID.length - 5, elemID.length) == "_NAME")
         formatID = elemID.substring(0, elemID.length - 5) + "_FORMAT";
      else
         formatID += "_FORMAT";
      var formatValue = formHelper.GetElementById(formatID);
      if (formatValue != null)
         rawFormat = formatValue.getAttribute("value");
   }
   
   if (rawFormat == null || rawFormat.length == 0)
      rawFormat = oSrcElement.getAttribute("iedatetimeformat"); 
   return rawFormat;
}


var lastDateFormat = null;


if( pageValidator.Masks["CustomDateTimeMask"] == null )
pageValidator.Masks["CustomDateTimeMask"] = function( event )
{   
   if( !event ) event = window.event;

   var iKeyCode = String(event.keyCode ? event.keyCode : event.which);
   var oSrcElement = event.srcElement ? event.srcElement : event.currentTarget;
   var sValue = new String(oSrcElement.value);
   var iLength = sValue.length;

   if( keyboardHandling.IsNavigationKey( event ) ) return;
   
   var rawFormat = GetRawCustomDateTimeFormat(oSrcElement);   
   if (rawFormat == null || rawFormat.length == 0)
   { 
        //w3c stop default behavior   
        if( event.cancelable ) event.preventDefault();
        //ie stop default behavior
        event.returnValue = false;
        //DOM level 0 stop default behavior
        return false; 
   }
   
   var parsedFormat;   
   if (lastDateFormat == null || lastDateFormat.rawFormat != rawFormat)
   {
      lastDateFormat = new DateTimeFormat(rawFormat);
   }
   parsedFormat = lastDateFormat;
   
   
   while (iLength < parsedFormat.formatLength)
   {   
      var currentSection = parsedFormat.indexLookup[iLength];
      
      var dtKeyCodes = new DateTimeKeyCodes(event.type);
      var subValue = sValue.substring(currentSection.lower, iLength);

      var ret = currentSection.filter.HandleKeyPress(iKeyCode, dtKeyCodes, subValue);
      
      if (ret.prepend && ret.prepend.length > 0)
      {
         sValue = new String(sValue + ret.prepend);
         iLength = sValue.length;         
         oSrcElement.value = sValue;
      }

      if (ret.thru)
         continue;
      
      else if (ret.result)
         return true;
         
      else if (currentSection.sectionIndex < parsedFormat.sections.length - 1)
      {
         var section2 = parsedFormat.sections[currentSection.sectionIndex + 1];
         var ret2 = section2.HandleKeyPress(iKeyCode, dtKeyCodes, "");
         if (ret2.result || ret2.thru)
         {
            sValue = new String(sValue.substring(0,currentSection.lower) + currentSection.filter.Expand(subValue));
            if (ret2.prepend && ret2.prepend.length > 0)
            {
               sValue = new String(sValue + ret2.prepend);
               iLength = sValue.length;         
               oSrcElement.value = sValue;
            }
            return true;
         }
         else
            break;
      }
      
      else 
         break;
   }   
      
   //w3c stop default behavior   
   if( event.cancelable ) event.preventDefault();
   //ie stop default behavior
   event.returnValue = false;
   //DOM level 0 stop default behavior
   return false;    
}

if( pageValidator.PostValidationMethods["IsValidCustomDateTime"] == null )
pageValidator.PostValidationMethods["IsValidCustomDateTime"] = function( pSrcElement )
{
   var sValue = new String(pSrcElement.value);
   var rawFormat = GetRawCustomDateTimeFormat(pSrcElement);   
   if (rawFormat == null || rawFormat.length == 0) return false; 
   if (lastDateFormat == null || lastDateFormat.rawFormat != rawFormat)
      lastDateFormat = new DateTimeFormat(rawFormat);
   var parsedFormat = lastDateFormat;
   var res = parsedFormat.Validate(sValue);
   if (res.str != undefined) pSrcElement.value = res.str;
   return res.result;
}

var DTCHAR_YEAR = "y";
var DTCHAR_MONTH = "M";
var DTCHAR_DAY = "d";   
var DTCHAR_HOUR = "h";
var DTCHAR_HOUR24 = "H";
var DTCHAR_MINUTE = "m";
var DTCHAR_SECOND = "s";
var DTCHAR_AMPM = "t";
var DTCHAR_MISC = "~";
   
function DateTimeFormat(rawFormat)
{   
   this.rawFormat = rawFormat;
   
   this.sections = new Array();
   this.indexLookup = new Array();
   
   var currentSection, currentChar, thisChar, currentMisc, thisMisc;
   
   for (var i = 0; i < rawFormat.length; i++)
   {
      thisChar = rawFormat.charAt(i);
      if (currentChar == thisChar)
         currentSection += thisChar;
      else
      {
         thisMisc = false;
         switch (thisChar)
         {
            case DTCHAR_YEAR:
               break;
            case DTCHAR_MONTH:
               break;
            case DTCHAR_DAY:
               break;
            case DTCHAR_HOUR:
               break;
            case DTCHAR_HOUR24:
               break;
            case DTCHAR_MINUTE:
               break;
            case DTCHAR_SECOND:
               break;
            case DTCHAR_AMPM:
               break;
            default:
               thisMisc = true;
               break;
         }
         
         if (currentChar == undefined)
         {
            currentChar = thisChar;
            currentSection = thisChar;
            currentMisc = thisMisc;
         }
         
         else if (currentMisc && thisMisc)
         {
            currentSection += thisChar
         }
         
         else
         {
            switch (currentChar)
            {
               case DTCHAR_YEAR:
                  this.sections[this.sections.length] = new YearSection(currentSection.length);
                  break;
               case DTCHAR_MONTH:
                  this.sections[this.sections.length] = new MonthSection(currentSection.length);
                  break;
               case DTCHAR_DAY:
                  this.sections[this.sections.length] = new DaySection(currentSection.length);
                  break;
               case DTCHAR_HOUR:
                  this.sections[this.sections.length] = new HourSection(currentSection.length);
                  break;
               case DTCHAR_HOUR24:
                  this.sections[this.sections.length] = new Hour24Section(currentSection.length);
                  break;
               case DTCHAR_MINUTE:
                  this.sections[this.sections.length] = new MinuteSection(currentSection.length);
                  break;
               case DTCHAR_SECOND:
                  this.sections[this.sections.length] = new SecondSection(currentSection.length);
                  break;
               case DTCHAR_AMPM:
                  this.sections[this.sections.length] = new AMPMSection(currentSection.length);
                  break;
               default:
                  this.sections[this.sections.length] = new MiscSection(currentSection);
                  break;
            }
            
            currentChar = thisChar;
            currentSection = thisChar;
            currentMisc = thisMisc;
         }
      }
   }
            
   switch (currentChar)
   {
      case DTCHAR_YEAR:
         this.sections[this.sections.length] = new YearSection(currentSection.length);
         break;
      case DTCHAR_MONTH:
         this.sections[this.sections.length] = new MonthSection(currentSection.length);
         break;
      case DTCHAR_DAY:
         this.sections[this.sections.length] = new DaySection(currentSection.length);
         break;
      case DTCHAR_HOUR:
         this.sections[this.sections.length] = new HourSection(currentSection.length);
         break;
      case DTCHAR_HOUR24:
         this.sections[this.sections.length] = new Hour24Section(currentSection.length);
         break;
      case DTCHAR_MINUTE:
         this.sections[this.sections.length] = new MinuteSection(currentSection.length);
         break;
      case DTCHAR_SECOND:
         this.sections[this.sections.length] = new SecondSection(currentSection.length);
         break;
      case DTCHAR_AMPM:
         this.sections[this.sections.length] = new AMPMSection(currentSection.length);
         break;
      default:
         this.sections[this.sections.length] = new MiscSection(currentSection);
         break;
   }
   var index = 0;
   for (var i = 0; i < this.sections.length; i++)
   {
      var currentSection = new FormatSection(index, this.sections[i], i);      
      for (var j = 0; j < this.sections[i].length; j++)
         this.indexLookup[index++] = currentSection;
   }
   this.formatLength = index;
   
   return this;
}

DateTimeFormat.prototype.Validate = function (sRawValue)
{
   var year = 1900, month = 1, day = 1;
   var hour = 0, minute = 0, second = 0, ampm = false, hr24 = null;
   var strOut = "";
   var baseIndex = 0;
   for (var i = 0; i < this.sections.length; i++)//  && baseIndex < sRawValue.length
   {
      var validateLength = this.sections[i].ValidateLength(sRawValue, baseIndex);
      var sSectionValue = "";
      if (baseIndex + validateLength <= sRawValue.length)
         sSectionValue = sRawValue.substring(baseIndex, baseIndex + validateLength);
      var res = this.sections[i].Validate(sSectionValue);
      baseIndex += validateLength;
      if (!res.result) return new ValidateResult(false);
      strOut += res.str;
      switch(res.part)
      {
         case DTCHAR_YEAR:
            year = res.value;
            break;
         case DTCHAR_MONTH:
            month = res.value;
            break;
         case DTCHAR_DAY:
            day = res.value;
            break;
         case DTCHAR_HOUR:
            hour = res.value;
            hr24 = false;
            break;
         case DTCHAR_HOUR24:
            hour = res.value;
            hr24 = true;
            break;
         case DTCHAR_MINUTE:
            minute = res.value;
            break;
         case DTCHAR_SECOND:
            second = res.value;
            break;
         case DTCHAR_AMPM:
            if (hr24 != true)
            {
               ampm = res.value;
               hr24 = false;
            }
            break;            
      }      
   }
   if (!hr24 && ampm)
   {
      if (hour < 12) 
         hour += 12;
      else if (hour > 12) 
         return new ValidateResult(false, undefined, undefined, strOut);
   }
   
   if (month == 4 || month == 6 || month == 9 || month == 11)
   {
      if (day > 30) return new ValidateResult(false, undefined, undefined, strOut);
   }
   
   else if (month == 2)
   {
      if (day > 29)
         return new ValidateResult(false, undefined, undefined, strOut);
         
      else if (day > 28 && !(year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)))
         return new ValidateResult(false, undefined, undefined, strOut);
   }
   
   return new ValidateResult(true, undefined, new Date(year, month - 1, day, hour, minute, second), strOut);
}

function FormatSection(index, filter, sectionIndex)
{
   this.lower = index;
   this.upper = index + filter.length;
   this.filter = filter;
   this.sectionIndex = sectionIndex;
   return this;
}

function DateTimeFormatSection(length,formatChecker)
{
   this.length = length;
   this.formatChecker = formatChecker;
   return this;
}

function YearSection(length)
{
   this.isMisc = false;   
   if (length < 2) length = 2;
   else if (length == 3) length = 4;
   else if (length > 4) length = 4;
   this.length = length;
   return this;
}

YearSection.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var relPos = (4 - this.length) + sValue.length;
   
   if (relPos == 0)
   {
      if (iKeyCode.IsIn(dtKeyCodes.s12KeyCodes))
         return new KeyPressReturn(true, "");
         
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "20");
   }
   
   else if (relPos == 1)
   {
      if (sValue == "1")
      {
         if (iKeyCode.IsIn(dtKeyCodes.s9KeyCodes))
            return new KeyPressReturn(true, "");
      }
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   else if (relPos == 2)
   {
      if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   else if (relPos == 3)
   {
      if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   return new KeyPressReturn(false, "");
}

YearSection.prototype.Validate = function (sValue)
{
   filter=/^[0-9][0-9]$|^19[0-9][0-9]$|^2[0-9][0-9][0-9]$/;
   
   if (filter.test(sValue))
   {
      var val = parseFloatSansZeroes(sValue);
      return new ValidateResult(true, DTCHAR_YEAR, val, padYear(val));
   }
   return new ValidateResult(false);
}

YearSection.prototype.Expand = function (sValue)
{
   var val = parseFloatSansZeroes(sValue);
   if (val == 0 || isNaN(val)) return "1900";
   return padYear(val);
}

YearSection.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   return this.length;
}

function MonthSection()
{
   this.isMisc = false;   
   this.length = 2;   
   return this;
}

MonthSection.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var relPos = (2 - this.length) + sValue.length;
   
   if (relPos == 0)
   {
      if (iKeyCode.IsIn(dtKeyCodes.s01KeyCodes))
         return new KeyPressReturn(true, "");
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "0");      
   }
   
   else if (relPos == 1)
   {
      if (sValue == "1")
      {
         if (iKeyCode.IsIn(dtKeyCodes.s012KeyCodes))
            return new KeyPressReturn(true, "");
      }
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   return new KeyPressReturn(false, "");
}

MonthSection.prototype.Validate = function (sValue)
{
   filter=/^0?[1-9]$|^1[0-2]$/;
   if (filter.test(sValue))
   {
      var val = parseFloatSansZeroes(sValue);
      return new ValidateResult(true, DTCHAR_MONTH, val, pad2digitNumber(val));
   }
   return new ValidateResult(false);
}

MonthSection.prototype.Expand = function (sValue)
{
   var val = parseFloatSansZeroes(sValue);
   if (val == 0 || isNaN(val)) return "1";
   return pad2digitNumber(val);
}

MonthSection.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   filter=/[0-9]/;
   if (nBaseIndex == sRawValue.length - 1 || !filter.test(sRawValue.substring(nBaseIndex+1,nBaseIndex+2))) return 1;
   return 2;
}

function DaySection()
{
   this.isMisc = false;   
   this.length = 2;   
   return this;
}

DaySection.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var relPos = (2 - this.length) + sValue.length;
   
   if (relPos == 0)
   {
      if (iKeyCode.IsIn(dtKeyCodes.s0123KeyCodes))
         return new KeyPressReturn(true, "");
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "0");         
   }
   else if (relPos == 1)
   {
      if (sValue == "3")
      {
         if (iKeyCode.IsIn(dtKeyCodes.s01KeyCodes))
            return new KeyPressReturn(true, "");
      }
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   return new KeyPressReturn(false, "");
}

DaySection.prototype.Validate = function (sValue)
{
   filter=/^0?[1-9]$|^[12][0-9]$|^3[01]$/;
   if (filter.test(sValue))
   {
      var val = parseFloatSansZeroes(sValue);
      return new ValidateResult(true, DTCHAR_DAY, val, pad2digitNumber(val));
   }
   return new ValidateResult(false);
}

DaySection.prototype.Expand = function (sValue)
{
   var val = parseFloatSansZeroes(sValue);
   if (val == 0 || isNaN(val)) return "1";
   return pad2digitNumber(val);
}

DaySection.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   filter=/[0-9]/;
   if (nBaseIndex == sRawValue.length - 1 || !filter.test(sRawValue.substring(nBaseIndex+1,nBaseIndex+2))) return 1;
   return 2;
}

function HourSection()
{
   this.isMisc = false;   
   this.length = 2;   
   return this;
}

HourSection.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var relPos = (2 - this.length) + sValue.length;
   
   if (relPos == 0)
   {
      if (iKeyCode.IsIn(dtKeyCodes.s01KeyCodes))
         return new KeyPressReturn(true, "");
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "0");         
   }
   
   else if (relPos == 1)
   {
      if (sValue == "1")
      {
         if (iKeyCode.IsIn(dtKeyCodes.s012KeyCodes))
            return new KeyPressReturn(true, "");
      }
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   return new KeyPressReturn(false, "");
}

HourSection.prototype.Validate = function (sValue)
{
   filter=/^0?[0-9]$|^1[0-2]$/;
   
   if (filter.test(sValue))
   {
      var val = parseFloatSansZeroes(sValue);
      return new ValidateResult(true, DTCHAR_HOUR, val, pad2digitNumber(val));
   }
   else
      return new ValidateResult(false);
}

HourSection.prototype.Expand = function (sValue)
{
   var val = parseFloatSansZeroes(sValue);
   return pad2digitNumber(val);
}

HourSection.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   filter=/[0-9]/;
   
   if (nBaseIndex == sRawValue.length - 1 || !filter.test(sRawValue.substring(nBaseIndex+1,nBaseIndex+2)))
      return 1;
   else
      return 2;
}

function Hour24Section()
{
   this.isMisc = false;   
   this.length = 2;   
   return this;
}

Hour24Section.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var relPos = (2 - this.length) + sValue.length;
   
   if (relPos == 0)
   {
      if (iKeyCode.IsIn(dtKeyCodes.s012KeyCodes))
         return new KeyPressReturn(true, "");
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "0");         
   }
   else if (relPos == 1)
   {
      if (sValue == "2")
      {
         if (iKeyCode.IsIn(dtKeyCodes.s0123KeyCodes))
            return new KeyPressReturn(true, "");
      }
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   return new KeyPressReturn(false, "");
}

Hour24Section.prototype.Validate = function (sValue)
{
   filter=/^[0-1]?[0-9]$|^2[0-3]$/;
   
   if (filter.test(sValue))
   {
      var val = parseFloatSansZeroes(sValue);
      return new ValidateResult(true, DTCHAR_HOUR24, val, pad2digitNumber(val));
   }
   return new ValidateResult(false);
}

Hour24Section.prototype.Expand = function (sValue)
{
   var val = parseFloatSansZeroes(sValue);
   return pad2digitNumber(val);
}

Hour24Section.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   filter=/[0-9]/;
   if (nBaseIndex == sRawValue.length - 1 || !filter.test(sRawValue.substring(nBaseIndex+1,nBaseIndex+2))) return 1;
   return 2;
}

function MinuteSection()
{
   this.isMisc = false;   
   this.length = 2;   
   return this;
}

MinuteSection.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var relPos = (2 - this.length) + sValue.length;
   if (relPos == 0)
   {
      if (iKeyCode.IsIn(dtKeyCodes.s012345KeyCodes))
         return new KeyPressReturn(true, "");   
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "0");      
   }
   else if (relPos == 1)
   {
      if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   return new KeyPressReturn(false, "");
}

MinuteSection.prototype.Validate = function (sValue)
{
   filter=/^[0-5]?[0-9]$/;
   
   if (filter.test(sValue))
   {
      var val = parseFloatSansZeroes(sValue);
      return new ValidateResult(true, DTCHAR_MINUTE, val, pad2digitNumber(val));
   }
   return new ValidateResult(false);
}

MinuteSection.prototype.Expand = function (sValue)
{
   var val = parseFloatSansZeroes(sValue);
   return pad2digitNumber(val);
}

MinuteSection.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   return 2;
}

function SecondSection()
{
   this.isMisc = false;   
   this.length = 2;   
   return this;
}

SecondSection.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var relPos = (2 - this.length) + sValue.length;
   
   if (relPos == 0)
   {
      if (iKeyCode.IsIn(dtKeyCodes.s012345KeyCodes))
         return new KeyPressReturn(true, "");   
      else if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "0");      
   }
   else if (relPos == 1)
   {
      if (iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   return new KeyPressReturn(false, "");
}

SecondSection.prototype.Validate = function (sValue)
{
   filter=/^[0-5]?[0-9]$/;
   
   if (filter.test(sValue))
   {
      var val = parseFloatSansZeroes(sValue);
      return new ValidateResult(true, DTCHAR_SECOND, val, pad2digitNumber(val));
   }
   return new ValidateResult(false);
}

SecondSection.prototype.Expand = function (sValue)
{
   var val = parseFloatSansZeroes(sValue);
   return pad2digitNumber(val);
}

SecondSection.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   return 2;
}

function AMPMSection()
{
   this.isMisc = false;   
   this.length = 2;   
   return this;
}

AMPMSection.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var relPos = (2 - this.length) + sValue.length;
   
   if (relPos == 0)
   {
      if (iKeyCode.IsIn(dtKeyCodes.sAPKeyCodes))
         return new KeyPressReturn(true, "");   
      else if (iKeyCode.IsIn(dtKeyCodes.sMKeyCodes))
         return new KeyPressReturn(true, "A");      
   }
   
   else if (relPos == 1)
   {
      if (iKeyCode.IsIn(dtKeyCodes.sMKeyCodes))
         return new KeyPressReturn(true, "");      
   }
   return new KeyPressReturn(false, "");
}

AMPMSection.prototype.Validate = function (sValue)
{
   amFilter=/^AM$|^am$/;
   pmFilter=/^PM$|^pm$/;
   if (amFilter.test(sValue)) return new ValidateResult(true, DTCHAR_AMPM, false, sValue.toUpperCase());
   if (pmFilter.test(sValue)) return new ValidateResult(true, DTCHAR_AMPM, true, sValue.toUpperCase());
   return new ValidateResult(false);
}

AMPMSection.prototype.Expand = function (sValue)
{
   if (sValue == "" || sValue.charAt(0).toUpperCase() == "A") return "AM";
   if (sValue.toUpperCase() == "P") return "PM";
   return "AM";
}

AMPMSection.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   return 2;
}

function MiscSection(section)
{
   this.isMisc = true;   
   this.section = section;   
   this.length = section.length;   
   return this;
}

MiscSection.prototype.HandleKeyPress = function (iKeyCode, dtKeyCodes, sValue)
{
   var thru = iKeyCode.IsIn(dtKeyCodes.sNumericKeyCodes);
   return new KeyPressReturn(false, this.section, thru);
}

MiscSection.prototype.Validate = function (sValue)
{
   if (sValue.toUpperCase() == this.section.toUpperCase())
      return new ValidateResult(true, DTCHAR_MISC, 0, this.section);
   return false;
}

MiscSection.prototype.Expand = function (sValue)
{
   return sValue;//section;
}

MiscSection.prototype.ValidateLength = function (sRawValue, nBaseIndex)
{
   return this.length;
}

function KeyPressReturn(result, prepend, thru)
{
   this.result = result;
   this.prepend = prepend;
   this.thru = thru;
   return this;
}

function ValidateResult(result, part, value, str)
{
   this.result = result;
   this.part = part;
   this.value = value;
   this.str = str;
   return this;
}

function parseFloatSansZeroes(sRaw)
{
   var startIndex = 0;
   while (startIndex < sRaw.length && sRaw.charAt(startIndex) == "0")
      startIndex++;
   if (startIndex == sRaw.length) return 0;
   return parseFloat(sRaw.substring(startIndex, sRaw.length));
}

function pad2digitNumber(nValue)
{
   var sRaw = nValue.toString();
   if (sRaw.length == 1)  return "0" + sRaw;
   return sRaw;
}

function padYear(nValue)
{
   var sRaw = nValue.toString();
   if (sRaw.length == 3) return "2" + sRaw;
   if (sRaw.length == 2) return "20" + sRaw;
   if (sRaw.length == 1) return "200" + sRaw;
   return sRaw;
}


