_aspxMaskPartBase = _aspxCreateClass(null, {
 typeCode: 1,
 constructor: function() {
  this.valueInitialized = false;
  this.dateTimeRole = null;
 },
 Grow: function(text) {
  throw "Not supported";
 },
 GetSize: function() {
  throw "Not supported";
 },
 GetValue: function() {
  this.EnsureValueInitialized();
  return this.GetValueCore();
 },
 EnsureValueInitialized: function() {
  if(this.valueInitialized) return;
  this.InitValue();
  this.valueInitialized = true;
 },
 InitValue: function() {
  throw "Not supported";
 }, 
 GetValueCore: function() {
  throw "Not supported";
 },
 Clear: function(startPos, endPos) {
 },
 HandleKey: function(maskInfo, keyInfo, pos) {
  throw "Not supported";
 },
 HandleControlKey: function(maskInfo, keyInfo, pos) {   
  switch(keyInfo.keyCode) {
   case ASPxKey.Left:
    if(keyInfo.ctrlState)
     maskInfo.MoveToPrevNonLiteral();
    else
     maskInfo.IncCaretPos(-1);
    break;
   case ASPxKey.Right:
    if(keyInfo.ctrlState)
     maskInfo.MoveToNextNonLiteral();
    else
     maskInfo.IncCaretPos(1);
    break;
  }
 },
 HandleMouseWheel: function(maskInfo, delta, pos) {
 },
 AllowIncreaseSize: function() { 
  return false; 
 },
 SupportsUpDown: function() { 
  return false; 
 },
 IsValid: function() {
  return true;
 },
 GetHintHtml: function() {
  return "";
 }
}); 
_aspxLiteralMaskPart = _aspxCreateClass(_aspxMaskPartBase, {
 typeCode: 2,
 constructor: function() {
  this.constructor.prototype.constructor.call(this);  
  this.literal = "";
 },
 Grow: function(text) {
  this.literal += text;
 }, 
 GetSize: function() {
  return this.literal.length;
 },
 InitValue: function() {
 }, 
 GetValueCore: function() {
  return this.literal;
 },
 HandleKey: function(maskInfo, keyInfo, pos) {
  if(keyInfo.keyCode == 32){
   maskInfo.IncCaretPos();
   return true;
  }
  var ch = String.fromCharCode(keyInfo.keyCode).toLowerCase();
  var index = this.GetValue().toLowerCase().indexOf(ch, pos);
  if(index > -1){
   maskInfo.IncCaretPos(index - pos + 1);
   return true;
  }
  maskInfo.IncCaretPos();
  return false;
 },
 HandleControlKey: function(maskInfo, keyInfo, pos) {
  switch(keyInfo.keyCode) {
   case ASPxKey.Right:
   case ASPxKey.Delete:
    maskInfo.IncCaretPos(this.GetSize() - pos);
    break;
   case ASPxKey.Left:    
   case ASPxKey.Backspace:
    maskInfo.IncCaretPos(-pos);
    break;
   default:
    _aspxMaskPartBase.prototype.HandleControlKey.call(this, maskInfo, keyInfo, pos);
  }
 }
}); 
_aspxEnumMaskPart = _aspxCreateClass(_aspxMaskPartBase, {
 typeCode: 3,
 constructor: function(items) {
  this.constructor.prototype.constructor.call(this);
  this.items = [];
  this.itemIndex = 0;
  this.defaultItemIndex = 0;
  this.PrepareItems(items);
 },
 PrepareItems: function(items){ 
  var hash = {};
  for(var i = 0; i < items.length; i++){
   var item = String(items[i]);
   if(item.length > 0 && !_aspxIsExists(hash[item])){
    if(item.charAt(0) == "*"){
     this.defaultItemIndex = i;
     item = item.substr(1);
    }
    this.items.push(item);
    hash[item] = 1;
   } 
  }
 },
 GetSize: function() {
  return this.GetValue().length;
 },
 InitValue: function() {  
  this.itemIndex = this.defaultItemIndex;
 }, 
 GetValueCore: function() {
  return this.items[this.itemIndex];
 },
 Clear: function(startPos, endPos) {
  this.ClearInternal(startPos);
 },
 ClearInternal: function(pos) {
  var prefix = this.GetValue().substr(0, pos);
  if(prefix.length < 1)
   this.itemIndex = this.defaultItemIndex;
  else
   this.itemIndex = this.FindItemIndexByPrefix(prefix);
 },
 HandleKey: function(maskInfo, keyInfo, pos) {
  var ch = String.fromCharCode(keyInfo.keyCode);
  var prefix = this.GetValue().substr(0, pos) + ch;
  var index = this.FindItemIndexByPrefix(prefix);
  if(index < 0 && ch != " ") {
   maskInfo.SetCaret(maskInfo.caretPos, this.GetSize() - pos);
   return false;
  }
  if(index > -1)
   this.itemIndex = index;
  maskInfo.SetCaret(1 + maskInfo.caretPos, this.GetSize() - pos - 1);
  return true;
 },
 HandleControlKey: function(maskInfo, keyInfo, pos) {
  switch(keyInfo.keyCode) {
   case ASPxKey.Up:
    this.ChangeItemIndex(maskInfo, this.dateTimeRole != null ? 1 : -1, pos);
    break;
   case ASPxKey.Down:
    this.ChangeItemIndex(maskInfo, this.dateTimeRole != null ? -1 : 1, pos);
    break;    
   case ASPxKey.Backspace:
    if(keyInfo.ctrlState){
     this.itemIndex = this.defaultItemIndex;
     maskInfo.IncCaretPos(-pos);
    }
    else {
     this.ClearInternal(pos - 1);
     maskInfo.SetCaret(maskInfo.caretPos - 1, 0);
    }
    break;
   case ASPxKey.Delete:
    if(keyInfo.ctrlState){
     this.itemIndex = this.defaultItemIndex;
     maskInfo.IncCaretPos(this.GetSize() - pos);
    }
    else {
     this.ClearInternal(pos);
     maskInfo.SetCaret(maskInfo.caretPos + 1, 0);
    }
    break;    
   default:
    _aspxMaskPartBase.prototype.HandleControlKey.call(this, maskInfo, keyInfo, pos);
  }
 },
 HandleMouseWheel: function(maskInfo, delta, pos) {
  if(this.dateTimeRole == null)
   delta = -delta;
  this.ChangeItemIndex(maskInfo, delta, pos);
 },
 ChangeItemIndex: function(maskInfo, delta, pos) {
  this.itemIndex += delta;
  while(this.itemIndex < 0)
   this.itemIndex += this.items.length;
  while(this.itemIndex > this.items.length - 1)
   this.itemIndex -= this.items.length;
  maskInfo.SetCaret(maskInfo.caretPos - pos, this.GetSize());
 },
 FindItemIndexByPrefix: function(prefix) {  
  prefix = prefix.toLowerCase();
  for(var i = 0; i < this.items.length; i++) {
   var item = this.items[i];
   if(item.toLowerCase().indexOf(prefix) == 0)
    return i;
  }
  return -1;
 },
 SupportsUpDown: function() { 
  return true; 
 },
 GetHintHtml: function() {
  if(this.dateTimeRole != null)
   return "";
  var list = [];
  for(var i = 0; i < this.items.length; i++) {
   var text = this.items[i];
   if(i == this.itemIndex)
    text = "<strong>" + text + "</strong>";
   list.push(text);
  }
  return list.join(", ");
 }
});
_aspxRangeMaskPart = _aspxCreateClass(_aspxMaskPartBase, {
 typeCode: 4,
 constructor: function(minNumber, maxNumber) {
  this.constructor.prototype.constructor.call(this);  
  if(maxNumber < minNumber)
   maxNumber = minNumber;  
  this.minNumber = minNumber;
  this.maxNumber = maxNumber;
  this.defaultNumber = null;
  this.zeroFill = false;
  this.absNumber = 0;
  this.negative = false;
  this.enableGroups = false;
 },
 GetSize: function() {
  return this.GetValue().length;
 },
 InitValue: function() {
  var number = 0;
  if(this.defaultNumber != null)
   number = this.defaultNumber;
  else {
   if(this.maxNumber < 0)
    number = this.maxNumber;
   else if(this.minNumber < 0)
    number = 0;
   else
    number = this.minNumber;
  }
  this.SetNumber(number);
 }, 
 GetValueCore: function() {
  var value = String(this.absNumber);  
  if(this.zeroFill) {
   var size = Math.max(this.minNumber.toString().length, this.maxNumber.toString().length);
   var incSize = size - value.length;
   for(var i = 0; i < incSize; i++)
    value = "0" + value;
  }
  if(this.enableGroups)
   value = this.AddGroupSeparators(value);
  if(this.negative)
   value = "-" + value;
  return value;
 },
 AddGroupSeparators: function(text) {
  if(text.length < 4)
   return text;
  var temp = [ ];
  var count = Math.ceil(text.length / 3);
  for(var i = 1; i < count; i++)
   temp.unshift(text.substr(text.length - i * 3, 3));
  temp.unshift(text.substr(0, text.length % 3 || 3));
  return temp.join(__aspxCultureInfo.numGroupSeparator);
 },
 IsGroupSeparatorPos: function(pos) {
  if(!this.enableGroups)
   return false;
  var reversePos = this.GetSize() - pos;
  return reversePos > 0 && reversePos % 4 == 0;
 }, 
 GetNumber: function() {
  var result = this.absNumber;
  if(this.negative)
   result = -result;
  return result;
 },
 SetNumber: function(number) {
  this.negative = (number < 0);
  this.absNumber = Math.abs(number);
 },
 SetText: function(text, checkMinNumber) {
  checkMinNumber = checkMinNumber || Math.abs(this.minNumber) < 2;
  if(text == "") text = "0";
  if(text == "-") text = "-0";
  if(this.enableGroups) {
   text = text.split(__aspxCultureInfo.numGroupSeparator).join("");
  }
  var number = Number(text);
  if(number > this.maxNumber) {
   this.SetNumber(this.maxNumber);
  } else if(checkMinNumber && number < this.minNumber) {
   this.SetNumber(this.minNumber);
  } else {
   this.absNumber = Math.abs(number);
   this.negative = (text.indexOf("-") > -1);
  }  
 },
 Clear: function(startPos, endPos){
  var newText = _aspxInsertEx(this.GetValue(), "", startPos, endPos);
  this.SetText(newText, true);
 },
 HandleKey: function(maskInfo, keyInfo, pos) { 
  var keyCode = keyInfo.keyCode;    
  var ch = String.fromCharCode(keyCode);
  if((ch == __aspxCultureInfo.numGroupSeparator && this.IsGroupSeparatorPos(pos)
   || keyCode == 32) && pos < this.GetSize()) {
   maskInfo.IncCaretPos();
   return true;
  }
  var oldNumber = this.GetNumber();
  if(_aspxMaskManager.IsSignumCode(keyCode)) {
   if((ch == "-" && this.minNumber < 0)  || (ch == "+" && oldNumber < 0)) {      
    var newNumber = -oldNumber;
    if(this.CheckRange(newNumber)) {
     this.negative = !this.negative;
     maskInfo.SetCaret(maskInfo.caretPos - pos + (this.negative ? 1 : 0), 0);
     return true;
    }
   }
  }
  if(_aspxMaskManager.IsDigitCode(keyCode)) {
   if(!this.zeroFill && ch == "0" && oldNumber == 0 && pos > this.GetSize() - 1)
    return false;
   this.TryTypeAtPos(maskInfo, ch, pos, 1);
   return true;
  }
  return false;
 },
 HandleControlKey: function(maskInfo, keyInfo, pos) {
  switch(keyInfo.keyCode) {
   case ASPxKey.Up:    
    this.ChangeNumber(maskInfo, 1, pos);
    break;
   case ASPxKey.Down:
    this.ChangeNumber(maskInfo, -1, pos);
    break;
   case ASPxKey.Delete:
    if(keyInfo.ctrlState) {    
     var newText = this.GetValue().substr(0, pos);
     this.SetText(newText, false);
     maskInfo.IncCaretPos(this.GetSize() - pos);
    } else {        
     if(this.IsGroupSeparatorPos(pos)) {
      maskInfo.IncCaretPos();
     } else {        
      if(this.zeroFill)
       this.TryTypeAtPos(maskInfo, "0", pos, 1);
      else
       this.TryTypeAtPos(maskInfo, "", pos, 1);
    }
    }
    break;
   case ASPxKey.Backspace:
    if(keyInfo.ctrlState) {    
     var newText = this.GetValue().substr(pos);
     this.SetText(newText, false);
     maskInfo.IncCaretPos(-pos);
    } else {       
     if(this.IsGroupSeparatorPos(pos - 1)) {
      maskInfo.IncCaretPos(-1);
     } else {
      if(this.zeroFill)
       this.TryTypeAtPos(maskInfo, "0", pos, -1);
      else
       this.TryTypeAtPos(maskInfo, "", pos, -1);
     }
    }
    break;
   default:
    _aspxMaskPartBase.prototype.HandleControlKey.call(this, maskInfo, keyInfo, pos);
  }
 },
 HandleMouseWheel: function(maskInfo, delta, pos) {
  this.ChangeNumber(maskInfo, delta, pos);
 },
 ChangeNumber: function(maskInfo, delta, pos) {
  var number = this.GetNumber();
  if(number < this.minNumber)
   number = this.minNumber;
  var newNumber = number + delta;
  while(newNumber < this.minNumber)
   newNumber += 1 + this.maxNumber - this.minNumber;
  while(newNumber > this.maxNumber)
   newNumber -= 1 + this.maxNumber - this.minNumber;
  this.SetNumber(newNumber);
  maskInfo.SetCaret(maskInfo.caretPos - pos, this.GetSize()); 
 },
 CheckRange: function(number){
  return (this.minNumber <= number && number <= this.maxNumber);
 },
 TryTypeAtPos: function(maskInfo, str, pos, dir) {
  if(dir > 0 && this.IsGroupSeparatorPos(pos)) {
   pos++;
   maskInfo.IncCaretPos();
  }
  var oldSize = this.GetSize();
  var strPos = pos;
  if(dir < 0) strPos -= 1;
  var newText = _aspxInsertEx(this.GetValue(), str, strPos, strPos + 1);
  this.SetText(newText, false);
  var newPos;
  if(dir > 0 && oldSize == pos) {
   newPos = this.GetSize();
  } else  {      
   var diff = 0;
   if(!this.zeroFill) {
    diff = this.GetSize() - oldSize;
    if(dir < 0) diff += 1;
    if(diff > 0) diff = 0;
   }
   newPos = pos + dir + diff;
  }
  if(newPos < 0) newPos = 0;  
  if(newPos > this.GetSize()) newPos = this.GetSize();
  if(this.IsGroupSeparatorPos(newPos))
   newPos++;
  maskInfo.IncCaretPos(newPos - pos);
 }, 
 AllowIncreaseSize: function() {
  if(this.zeroFill) return false;
  var currentNumber = this.GetNumber();
  if(currentNumber < 0)
   return currentNumber * 10 >= this.minNumber;
  if(currentNumber >= 0)
   return currentNumber * 10 <= this.maxNumber;
  return false;
 },
 SupportsUpDown: function() { 
  return true; 
 },
 GetHintHtml: function() {
  if(this.dateTimeRole != null)
   return ""; 
  return this.minNumber + ".." + this.maxNumber;
 }
}); 
_aspxPromptMaskPart = _aspxCreateClass(_aspxMaskPartBase, {
 typeCode: 5,
 constructor: function() {
  this.constructor.prototype.constructor.call(this);
  this.required = false;
  this.size = 0;
  this.text = "";
 },
 Grow: function(text) {
  this.size += text.length;
 }, 
 GetSize: function() {
  return this.size;
 },
 InitValue: function() {  
  var size = this.GetSize();
  for(var i = 0; i < size; i++)
   this.text += " ";
 }, 
 GetValueCore: function() {
  return this.text;
 },
 Clear: function(startPos, endPos){
  this.ClearInternal(startPos, endPos - startPos);
 },
 ClearInternal: function(pos, count){
  for(var  i = 0; i < count; i++)
   this.SetCharInPos(" ", i + pos);         
 },
 HandleKey: function(maskInfo, keyInfo, pos) {
  var keyCode = keyInfo.keyCode;  
  if(maskInfo.IsPromptCode(keyCode))
   keyCode = 32;
  if(keyCode != 32 && !this.IsValidCharCode(keyCode, pos))
   return false;
  this.SetCharInPos(String.fromCharCode(keyCode), pos);
  maskInfo.IncCaretPos();
  return true;
 },
 HandleControlKey: function(maskInfo, keyInfo, pos) {
  switch(keyInfo.keyCode) {
   case ASPxKey.Delete:
    var count = keyInfo.ctrlState ? this.GetSize() - pos : 1;
    this.ClearInternal(pos, count);
    maskInfo.IncCaretPos(count);
    break; 
   case ASPxKey.Backspace:
    var count = keyInfo.ctrlState ? pos : 1;
    this.ClearInternal(pos - count, count);
    maskInfo.IncCaretPos(-count);
    break;
   default:
    _aspxMaskPartBase.prototype.HandleControlKey.call(this, maskInfo, keyInfo, pos);
  }
 }, 
 SetCharInPos: function(ch, pos) {
  this.text = _aspxInsertEx(this.GetValue(), ch, pos, pos + 1);
 }, 
 IsValidCharCode: function(code, pos) {
  throw "Not supported";
 },
 IsValid: function() {
  if(!this.required)
   return true;
  return this.GetValue().indexOf(" ") < 0;
 }
});
_aspxNumericMaskPart = _aspxCreateClass(_aspxPromptMaskPart, {
 typeCode: 6,
 constructor: function() {
  this.constructor.prototype.constructor.call(this);
  this.acceptsSignum = false;
 },
 IsValidCharCode: function(code, pos) {
  if(_aspxMaskManager.IsSignumCode(code)) {
   if(!this.acceptsSignum) return false;
   var value = this.GetValue();
   for(var i = 0; i < pos; i++){
    var currentCode = value.charCodeAt(i);
    if(_aspxMaskManager.IsDigitCode(currentCode) || _aspxMaskManager.IsSignumCode(currentCode))
     return false;
   }
   return true;
  }
  return _aspxMaskManager.IsDigitCode(code);
 } 
});
_aspxCharMaskPart = _aspxCreateClass(_aspxPromptMaskPart, {
 typeCode: 7,
 constructor: function() {
  this.constructor.prototype.constructor.call(this);
  this.caseConvention = 0;
 },
 SetCharInPos: function(ch, pos) {
  if(this.caseConvention < 0)
   ch = ch.toLowerCase();
  if(this.caseConvention > 0)
   ch = ch.toUpperCase();   
  _aspxPromptMaskPart.prototype.SetCharInPos.call(this, ch, pos);
 }, 
 IsValidCharCode: function(code, pos) {
  return code > 31;
 }
});
_aspxAlphaMaskPart = _aspxCreateClass(_aspxCharMaskPart, {
 typeCode: 8,
 IsValidCharCode: function(code, pos) {
  return _aspxMaskManager.IsAlphaCode(code);
 }
}); 
_aspxAlphaNumericMaskPart = _aspxCreateClass(_aspxCharMaskPart, {
 typeCode: 9,
 IsValidCharCode: function(code, pos) {
  return _aspxMaskManager.IsAlphaCode(code) || _aspxMaskManager.IsDigitCode(code);
 } 
}); 
_aspxMaskParser = {
 Parse: function(mask, dateTimeOnly) {
  this.result = [ ];
  this.currentCaseConvention = 0;  
  this.quoteMode = null;
  this.dateTimeOnly = (dateTimeOnly === true);
  mask.replace(this.GetMasterRegex(), this.ParseCallback);
  return this.result;
 },
 regex: {    
  ranges: "\\<-?\\d+(\\.\\.-?\\d+){1,2}g?\\>",
  enums: "\\<\\*?[^|*<>]*(\\|\\*?[^|*<>]*)+\\>",
  prompts: "[LlAaCc09#,.:/$<>~]",
  dates: "(y{1,4}|M{1,4}|d{1,4}|hh?|HH?|mm?|ss?|F{1,6}|f{1,6}|tt?)"
 }, 
 GetMasterRegex: function() {
  if(this.dateTimeOnly) {
   if(!this.__masterDateTimeOnlyRegex)
    this.__masterDateTimeOnlyRegex = this.CreateMasterRegex(true);
   return this.__masterDateTimeOnlyRegex;      
  }
  if(!this.__masterRegex)
   this.__masterRegex = this.CreateMasterRegex(false);
  return this.__masterRegex;
 }, 
 GetRangesRegex: function() {
  if(!this.__rangesRegex) 
   this.__rangesRegex = this.CreateAnchoredRegex(this.regex.ranges);
  return this.__rangesRegex;
 },
 GetEnumsRegex: function() {
  if(!this.__enumsRegex) 
   this.__enumsRegex = this.CreateAnchoredRegex(this.regex.enums);
  return this.__enumsRegex;
 },
 GetDatesRegex: function() {
  if(!this.__datesRegex)
   this.__datesRegex = this.CreateAnchoredRegex(this.regex.dates);
  return this.__datesRegex;
 },
 CreateAnchoredRegex: function(text) {
  return new RegExp("^" + text + "$");
 },
 CreateMasterRegex: function(dateTimeOnly) {
  var list = [ ];
  this.PushConditional(list, "\\\\\\\\", true);
  this.PushConditional(list, "\\\\[\"']", true);
  this.PushConditional(list, "[\"']", true);
  this.PushConditional(list, this.regex.ranges, !dateTimeOnly);
  this.PushConditional(list, this.regex.enums, !dateTimeOnly);
  this.PushConditional(list, "\\\\" + this.regex.dates, true);
  this.PushConditional(list, "\\\\" + this.regex.prompts, !dateTimeOnly);
  this.PushConditional(list, this.regex.dates, true);
  this.PushConditional(list, this.regex.prompts, !dateTimeOnly);
  this.PushConditional(list, ".", true);
  return new RegExp("(" + list.join("|") + ")", "g");
 },
 PushConditional: function(list, item, allow) {
  if(allow)
   list.push(item); 
 },
 ParseCallback: function(text) {  
  _aspxMaskParser.ParseCore(text, null);
 },
 ParseCore: function(text, dateTimeRole) {
  var acceptRangesEnums = (dateTimeRole != null || !this.dateTimeOnly);
  if(text == "'" || text == '"')
   this.ParseQuote(text);
  else if(this.quoteMode != null)
   this.ParseLiteral(text);
  else if(acceptRangesEnums && this.GetRangesRegex().test(text)) 
   this.ParseRange(text, dateTimeRole);
  else if(acceptRangesEnums && this.GetEnumsRegex().test(text)) 
   this.ParseEnum(text, dateTimeRole);
  else if(this.GetDatesRegex().test(text))
   this.ParseDate(text);
  else
   this.ParseSimple(text);
 },
 ParseRange: function(text, dateTimeRole) {  
  var enableGroups = false;
  text = this.StripBrockets(text);
  if(text.charAt(text.length - 1) == "g") {
   enableGroups = true;
   text = text.substr(0, text.length - 1);
  }
  var data = text.split("..");
  var minNumber, maxNumber = 0;
  var defaultNumber = null;
  if(data.length == 2){
   minNumber = Number(data[0]);
   maxNumber = Number(data[1]);
  }
  else if(data.length == 3){
   minNumber = Number(data[0]);
   maxNumber = Number(data[2]);
   defaultNumber = Number(data[1]);
  }
  var part = new _aspxRangeMaskPart(minNumber, maxNumber);
  part.defaultNumber = defaultNumber;
  part.zeroFill = (data[0] == "00") || (data[0].length > 1 && data[0].charAt(0) == "0");
  part.dateTimeRole = dateTimeRole;
  part.enableGroups = enableGroups;
  this.result.push(part);
 },
 ParseEnum: function(text, dateTimeRole) {
  text = this.StripBrockets(text);
  var part = new _aspxEnumMaskPart(text.split("|"));
  part.dateTimeRole = dateTimeRole;
  this.result.push(part);
 },
 StripBrockets: function(text) {
  return text.substr(1, text.length - 2);
 },   
 ParseSimple: function(text) {  
  switch(text) {
   case ":":
    this.ParseLiteral(__aspxCultureInfo.ts);
    break;
   case "/":
    this.ParseLiteral(__aspxCultureInfo.ds);
    break;
   default:
    if(this.dateTimeOnly) {
     this.ParseLiteral(text);     
    } else {
     switch(text) {
      case "L":
      case "l":
       this.ParseChar(text, _aspxAlphaMaskPart, text == "L");
       break;
      case "A":
      case "a":
       this.ParseChar(text, _aspxAlphaNumericMaskPart, text == "A");   
       break;
      case "C":
      case "c":
       this.ParseChar(text, _aspxCharMaskPart, text == "C");
       break;
      case ">":
        this.currentCaseConvention = 1;
        break;       
      case "<":
        this.currentCaseConvention = -1;
        break;      
      case "~":
        this.currentCaseConvention = 0;
        break;       
      case "0":
      case "9":
      case "#":
       this.ParseNumeric(text);   
       break;
      case ".":
       this.ParseLiteral(__aspxCultureInfo.numDecimalPoint);
       break;
      case ",":
       this.ParseLiteral(__aspxCultureInfo.numGroupSeparator);
       break;
      case "$":
       this.ParseLiteral(__aspxCultureInfo.currency);
       break;
      default:
       this.ParseLiteral(text);
       break;                       
     }
    }    
    break;
  }
 },
 ParseChar: function(text, ctor, required) {
  var part = this.GetCurrentPart();
  if(part == null || part.typeCode != ctor.prototype.typeCode || part.required != required || part.caseConvention != this.currentCaseConvention) {
   part = new ctor();
   part.required = required;
   part.caseConvention = this.currentCaseConvention;
   this.result.push(part);
  }
  part.Grow(text);
 },
 ParseNumeric: function(text) {
  var required = text == "0";
  var acceptsSignum = text == "#";
  var part = this.GetCurrentPart();
  if(part == null || part.typeCode != _aspxNumericMaskPart.prototype.typeCode || part.required != required || part.acceptsSignum != acceptsSignum) {
   part = new _aspxNumericMaskPart();
   part.required = required;
   part.acceptsSignum = acceptsSignum;
   this.result.push(part);
  }
  part.Grow(text);
 },
 ParseLiteral: function(text) {
  var part = this.GetCurrentPart();
  if(part == null || part.typeCode != _aspxLiteralMaskPart.prototype.typeCode) {
   part = new _aspxLiteralMaskPart();
   this.result.push(part);
  }
  if(text.length > 0 && text.charAt(0) == "\\")
   text = text.substr(1);
  part.Grow(text);
 },
 GetCurrentPart: function() {
  var len = this.result.length;
  if(len < 1)
   return null;
  return this.result[len - 1];
 },
 ParseDate: function(text) {
  this.ParseCore(this.GetDateSpecifierReplacement(text), this.GetDateTimeRole(text));
 },
 GetDateSpecifierReplacement: function(text) {
  var now = this.now || new Date();
  switch(text) {
   case "yyyy":    
    return "<0100.." + now.getFullYear() + "..9999>"; 
   case "yyy":    
    return "<100.." + now.getFullYear() + "..9999>"; 
   case "yy":    
    return "<00.." + (now.getFullYear() % 100) + "..99>";
   case "y":    
    return "<0.." + (now.getFullYear() % 100) + "..99>";
   case "MMMM":    
    return "<" + this.GetEnumItems(__aspxCultureInfo.genMonthNames, now.getMonth()).join("|") + ">";
   case "MMM":    
    return "<" + this.GetEnumItems(__aspxCultureInfo.abbrGenMonthNames, now.getMonth()).join("|") + ">";
   case "MM":    
    return "<01.." + (now.getMonth() + 1) + "..12>";
   case "M":    
    return "<1.." + (now.getMonth() + 1) + "..12>";
   case "dddd":
    return "<" + this.GetEnumItems(__aspxCultureInfo.dayNames, now.getDay()).join("|") + ">";
   case "ddd":
    return "<" + this.GetEnumItems(__aspxCultureInfo.abbrDayNames, now.getDay()).join("|") + ">";
   case "dd":    
    return "<01.." + now.getDate() + "..31>";
   case "d":    
    return "<1.." + now.getDate() + "..31>";
   case "hh":
    return "<01.." + this.GetShortHours(now) + "..12>";
   case "h":
    return "<1.." + this.GetShortHours(now) + "..12>";
   case "HH":
    return "<00.." + now.getHours() + "..23>";
   case "H":
    return "<0.." + now.getHours() + "..23>";
   case "mm":
    return "<00.." + now.getMinutes() + "..59>";
   case "m":
    return "<0.." + now.getMinutes() + "..59>";
   case "ss":
    return "<00.." + now.getSeconds() + "..59>";
   case "s":
    return "<0.." + now.getSeconds() + "..59>";
   case "tt":
   case "t":
    if(__aspxCultureInfo.am.length < 1)
     return "";
    return "<" + this.GetAmPmArray(now.getHours(), text.length == 1).join("|") + ">";
  }
  if(/^f{1,6}$/i.test(text)) {
   if(text.length == 1)
    return "<0..9>";
   if(text.length == 2)
    return "<0..99>";    
   return "<0..999>";
  }
  throw "Not supported";
 },  
 GetDateTimeRole: function(text) {
  var ch = text.charAt(0);
  if(ch == "y" || ch == "M" || ch =="d"
   || ch.toLowerCase() == "h" || ch == "m" || ch == "s" 
   || ch.toLowerCase() == "f" || ch == "t")
   return ch;
  return null;
 },
 GetEnumItems: function(items, defaultIndex){
   var result = [].concat(items);
   result[defaultIndex] = "*" + result[defaultIndex];
   return result;
 },
 GetShortHours: function(date){
  var result = (date.getHours() % 12);
  if(result == 0) result = 12;
  return result;
 },
 GetAmPmArray: function(hours, useFirstChar){
  var result = [__aspxCultureInfo.am, __aspxCultureInfo.pm];
  for(var i = 0; i < result.length; i++){
   if(useFirstChar)
    result[i] = result[i].charAt(0);
  }
  if(hours > 12)
   result[1] = "*" + result[1];
  return result;
 },
 ParseQuote: function(text) {  
  if(this.quoteMode == null) {
   this.quoteMode = text;
  } else {
   if(text == this.quoteMode)
    this.quoteMode = null;
   else
    this.ParseLiteral(text);
  }
 }
};
_aspxMaskIncludeLiterals = {
 All: 1,
 None: 2,
 DecimalSymbol: 3 
};
_aspxMaskInfo = _aspxCreateClass(null, { 
 constructor: function() {   
  this.parts = null;
  this.promptChar = "_";  
  this.includeLiterals = _aspxMaskIncludeLiterals.All;  
  this.errorText = "";
  this.caretPos = 0;
  this.selectionLength = 0; 
  this.lastEditedPart = null;
 },
 GetSize: function() { 
  var size = 0;
  for(var i = 0; i < this.parts.length; i++)
   size += this.parts[i].GetSize();
  return size;
 },
 GetText: function() {
  var result = "";
  for(var i = 0; i < this.parts.length; i++) {
   var part = this.parts[i];
   if(_aspxMaskManager.IsLiteralPart(part) || _aspxMaskManager.IsEnumPart(part))
    result += part.GetValue();
   else
    result += part.GetValue().split(" ").join(this.promptChar);
  }
  return result;
 },
 GetValue: function() {
  var list = [];
  for(var i = 0; i < this.parts.length; i++) {
   var part = this.parts[i];
   var partValue = part.GetValue();
   if(_aspxMaskManager.IsLiteralPart(part) && _aspxMaskManager.IsIgnorableLiteral(partValue, this.includeLiterals))
     continue;
   if(_aspxMaskManager.IsRangePart(part) && this.includeLiterals != _aspxMaskIncludeLiterals.All)
    partValue = partValue.split(__aspxCultureInfo.numGroupSeparator).join("");
   list.push(partValue);
  }  
  return list.join("");
 },
 SetText: function(text) {
  this.Clear();
  this.SetCaret(0, 0);
  this.SetValueCore(text, _aspxMaskIncludeLiterals.All);
  this.SetCaret(0, 0);
 },
 SetValue: function(value) {
  this.Clear();
  this.SetCaret(0, 0);
  this.SetValueCore(value, this.includeLiterals);
  this.SetCaret(0, 0);
 },
 SetValueCore: function(value, includeLiterals) {
  for(var i = 0; i < value.length; i++) {
   var keyInfo = _aspxMaskManager.CreateKeyInfo(value.charCodeAt(i), false, false);
   _aspxMaskManager.HandleKey(this, keyInfo, false, includeLiterals);
  }
 },
 Clear: function() {
  for(var i = 0; i < this.parts.length; i++) {
   var part = this.parts[i];
   part.Clear(0, part.GetSize());
  }
 },
 ProcessPaste: function(rawText, caretPosAfterPaste) {
  var currentText = this.GetText();
  var leadLength = 0;
  for(var i = 0; i < Math.min(rawText.length, currentText.length); i++) {
   if(rawText.charAt(i) != currentText.charAt(i))
    break;
   leadLength++;
  }
  var pastedText = rawText.substr(leadLength, caretPosAfterPaste - leadLength);  
  this.SetCaret(caretPosAfterPaste - pastedText.length, 0);
  var padLength = 0;
  for(var i = pastedText.length + rawText.length; i < currentText.length; i++) {
   pastedText += " ";
   padLength++;
  }
  this.SetValueCore(pastedText, _aspxMaskIncludeLiterals.All);
  this.caretPos -= padLength;
 },
 IsValid: function() {
  for(var i = 0; i < this.parts.length; i++) {
   if(!this.parts[i].IsValid())
    return false;
  }
  return true;
 },
 SetCaret: function(caretPos, selectionLength) {
  if(selectionLength < 0) throw "Internal Error";
  this.caretPos = caretPos;
  this.selectionLength = selectionLength;
 },
 IncCaretPos: function(delta) {
  if(!_aspxIsExists(delta))
   delta = 1;
  this.caretPos += delta;
  this.selectionLength = 0;
 },
 MoveToPrevNonLiteral: function() {
  var partPos = 0;
  var resultPos = 0;
  for(var i = 0; i < this.parts.length; i++) {
   if(partPos >= this.caretPos)
    break;
   var part = this.parts[i];
   var nextPartPos = partPos + part.GetSize();
   if(!_aspxMaskManager.IsLiteralPart(part))
    resultPos = nextPartPos < this.caretPos ? nextPartPos : partPos;
   partPos = nextPartPos;
  }
  this.SetCaret(resultPos, 0);
 },  
 MoveToNextNonLiteral: function() {
  var partPos = 0;
  for(var i = 0; i < this.parts.length; i++) {
   var part = this.parts[i];
   var nextPartPos = partPos + part.GetSize();   
   if(nextPartPos > this.caretPos && !_aspxMaskManager.IsLiteralPart(part)) {
    if(partPos <= this.caretPos)
     partPos = nextPartPos;
    break;
   }
   partPos = nextPartPos;
  }
  this.SetCaret(partPos, 0);
 }, 
 IsPromptCode: function(code) {
  return (code == 32 || code == this.promptChar.charCodeAt(0));
 },
 BeforeChange: function(part) {
  this.ApplyFixes(part);
  this.lastEditedPart = part;
  part.EnsureValueInitialized();
 },
 AfterChange: function(part) {
 },
 ApplyFixes: function(currentPart) {
  var result1 = this.FixLastRangePart(currentPart);
  var result2 = this.FixLastDatePart(currentPart);
  return result1 || result2;
 },
 FixLastRangePart: function(currentPart) {  
  var part = this.lastEditedPart;
  if(!part || part == currentPart || !_aspxMaskManager.IsRangePart(part))
   return false;
  var number = part.GetNumber();
  if(number >= part.minNumber) 
   return false;
  var prevSize = part.GetSize();
  part.SetNumber(part.minNumber);
  this.SetCaret(this.caretPos + part.GetSize() - prevSize, 0);
  return true;
 },
 FixLastDatePart: function(currentPart) {
  var part = this.lastEditedPart;
  if(!part || part == currentPart || part.dateTimeRole == null)
   return false;
  var bag = _aspxMaskDateTimeHelper.GetDateBag(this);
  if(!bag.hasDate)
   return false;
  var maxDay = _aspxMaskDateTimeHelper.GetMaxDayInMonth(bag.month, bag.year);
  if(bag.day > maxDay) {   
   if(bag.day == 29 && bag.month == 1) {
    bag.year = _aspxMaskDateTimeHelper.GetNextLeapYear(bag.year);
   } else {
    if(part.dateTimeRole == "d")
     bag.month--;
    else
     bag.day = maxDay;
   }   
  }
  var prefixSize = this.GetSizeBeforeEditedPart(currentPart);
  _aspxMaskDateTimeHelper.SetDate(this, _aspxMaskDateTimeHelper.CreateDateFromBag(bag));
  this.caretPos += this.GetSizeBeforeEditedPart(currentPart) - prefixSize;
  return true;
 },
 GetSizeBeforeEditedPart: function(currentPart) {
  var pos = 0;
  for(var i = 0; i < this.parts.length; i++) {
   if(this.parts[i] == currentPart)
    break;
   pos += this.parts[i].GetSize();
  }
  return pos;
 } 
});
_aspxMaskInfo.Create = function(maskText, dateTimeOnly) {
 var info = new _aspxMaskInfo();
 info.parts = _aspxMaskParser.Parse(maskText, dateTimeOnly);
 return info;
}
_aspxMaskManager = {
 OnKeyPress: function(maskInfo, keyInfo) {
  if(maskInfo.selectionLength > 0)
   this.ClearSelection(maskInfo);
  this.HandleKey(maskInfo, keyInfo, true, _aspxMaskIncludeLiterals.All);
 },
 OnKeyDown: function(maskInfo, keyInfo) {
  if(maskInfo.selectionLength > 0 && (keyInfo.keyCode == ASPxKey.Backspace || keyInfo.keyCode == ASPxKey.Delete))
   this.ClearSelection(maskInfo);
  else
   this.HandleControlKey(maskInfo, keyInfo);
 },
 OnMouseWheel: function(maskInfo, delta) {
  this.HandleMouseWheel(maskInfo, delta);
 },
 HandleKey: function(maskInfo, keyInfo, autoSkipLiterals, includeLiterals) { 
  var partStart = 0;
  var caretInfoBeforeSkip = null;  
  for(var i = 0; i < maskInfo.parts.length; i++) {
   var part = maskInfo.parts[i];
   if(this.IsCaretInPart(maskInfo.caretPos, partStart, part)) {    
    if(!this.IsLiteralPart(part) || !this.IsIgnorableLiteral(part.GetValue(), includeLiterals)) {
     var savedCaretPos = maskInfo.caretPos;
     maskInfo.BeforeChange(part);
     partStart += maskInfo.caretPos - savedCaretPos;
     if(this.savedKeyDownKeyInfo && this.savedKeyDownKeyInfo.keyCode == ASPxKey.Decimal)
      keyInfo.keyCode = __aspxCultureInfo.numDecimalPoint.charCodeAt(0);
     if(part.HandleKey(maskInfo, keyInfo, maskInfo.caretPos - partStart)) {        
      if(autoSkipLiterals)
       this.TrySkipLiteralOnPartEdge(maskInfo, partStart, i);
      maskInfo.AfterChange(part);
      return;
     }
     if(caretInfoBeforeSkip == null)
      caretInfoBeforeSkip = [ maskInfo.caretPos, maskInfo.selectionLength ];
    }         
    maskInfo.SetCaret(partStart + part.GetSize(), 0);
   }
   partStart += part.GetSize();
  }
  if(caretInfoBeforeSkip != null)
   maskInfo.SetCaret(caretInfoBeforeSkip[0], caretInfoBeforeSkip[1]);
 },
 HandleControlKey: function(maskInfo, keyInfo) {
  maskInfo.selectionLength = 0;
  var partStart = 0;  
  for(var i = 0; i < maskInfo.parts.length; i++) {
   var part = maskInfo.parts[i];
   if(this.IsCaretInPartOnControlKey(maskInfo.caretPos, partStart, part, keyInfo.keyCode)) {
    var savedCaretPos = maskInfo.caretPos;
    maskInfo.BeforeChange(part);
    partStart += maskInfo.caretPos - savedCaretPos;
    part.HandleControlKey(maskInfo, keyInfo, maskInfo.caretPos - partStart);
    if(keyInfo.keyCode == ASPxKey.Delete)
     this.TrySkipLiteralOnPartEdge(maskInfo, partStart, i);
    maskInfo.AfterChange(part);
    break;
   }
   partStart += part.GetSize();
  }
 },
 HandleMouseWheel: function(maskInfo, delta) {
  var partStart = 0;  
  for(var i = 0; i < maskInfo.parts.length; i++) {
   var part = maskInfo.parts[i];
   if(this.IsCaretInPartOnMouseWheel(maskInfo.caretPos, partStart, part)) {
    var savedCaretPos = maskInfo.caretPos;
    maskInfo.BeforeChange(part);
    partStart += maskInfo.caretPos - savedCaretPos;
    part.HandleMouseWheel(maskInfo, delta, maskInfo.caretPos - partStart);
    maskInfo.AfterChange(part);
    break;
   }   
   partStart += part.GetSize();
  }
 },
 TrySkipLiteralOnPartEdge: function(maskInfo, partStartPos, partIndex) {
  var part = maskInfo.parts[partIndex];
  var posInPart = maskInfo.caretPos - partStartPos;
  var amount = 0;
  if(part.AllowIncreaseSize()) return;
  if(partIndex > maskInfo.parts.length - 3 ||  posInPart < part.GetSize()) return;
  var sibling = maskInfo.parts[partIndex + 1];
  if(this.IsLiteralPart(sibling))
   amount = sibling.GetSize();
  maskInfo.IncCaretPos(amount);
  maskInfo.ApplyFixes(sibling);
 },
 ClearSelection: function(maskInfo){  
  var partStart = 0;
  for(var i = 0; i < maskInfo.parts.length; i++) {
   var part = maskInfo.parts[i];
   var outerLeft = Math.min(partStart, maskInfo.caretPos);
   var outerRight = Math.max(partStart + part.GetSize(), maskInfo.caretPos + maskInfo.selectionLength);
   var size = part.GetSize();
   if(size + maskInfo.selectionLength > outerRight - outerLeft){
    var innerLeft = Math.max(partStart, maskInfo.caretPos);
    var innerRight = Math.min(partStart + size, maskInfo.caretPos + maskInfo.selectionLength);    
    part.Clear(innerLeft - partStart, innerRight - partStart);
    maskInfo.selectionLength += part.GetSize() - size;    
   }
   partStart += part.GetSize();
  }
  maskInfo.selectionLength = 0;
 },
 IsCaretInPart: function(caretPos, partStartPos, part) {
  if(caretPos < partStartPos)
   return false;
  var nextPartPos = partStartPos + part.GetSize();
  if(caretPos > nextPartPos)
   return false;
  if(caretPos == nextPartPos)
   return part.AllowIncreaseSize();
  return true;
 },
 IsCaretInPartOnControlKey: function(caretPos, partStartPos, part, keyCode) {
  if(caretPos == partStartPos) {
   if(keyCode == ASPxKey.Backspace || keyCode == ASPxKey.Left)
    return false;
   return true;
  }
  var nextPartPos = partStartPos + part.GetSize();
  if(partStartPos < caretPos && caretPos < nextPartPos) 
   return true;
  if(caretPos == nextPartPos) {
   if(keyCode == ASPxKey.Up || keyCode == ASPxKey.Down)
    return part.SupportsUpDown();
   if(keyCode == ASPxKey.Backspace || keyCode == ASPxKey.Left)
    return true;
   return false;   
  }
  return false;
 },
 IsCaretInPartOnMouseWheel: function(caretPos, partStartPos, part) {
  if(!part.SupportsUpDown()) 
   return false;
  return caretPos >= partStartPos && caretPos <= partStartPos + part.GetSize();
 },
 GetHintHtml: function(maskInfo) {
  var pos = 0;
  for(var i = 0; i < maskInfo.parts.length; i++) {
   var part = maskInfo.parts[i];
   if(this.IsCaretInPartOnMouseWheel(maskInfo.caretPos, pos, part))
    return part.GetHintHtml();
   pos += part.GetSize();
  }
  return "";
 }, 
 CreateKeyInfo: function(keyCode, shiftState, ctrlState) {
  return {
   keyCode: keyCode,
   shiftState: shiftState,
   ctrlState: ctrlState
  }; 
 },
 CreateKeyInfoByEvent: function(evt) {
  return this.CreateKeyInfo(_aspxGetKeyCode(evt), evt.shiftKey, evt.ctrlKey);
 },
 IsLiteralPart: function(part) {
  return (part.typeCode == _aspxLiteralMaskPart.prototype.typeCode);
 }, 
 IsEnumPart: function(part) {
  return (part.typeCode == _aspxEnumMaskPart.prototype.typeCode);
 },
 IsRangePart: function(part) {
  return (part.typeCode == _aspxRangeMaskPart.prototype.typeCode);
 },
 IsAlphaCode: function(code) {  
  return (64 < code && code < 91 || 96 < code && code < 123 || code > 127);
 },
 IsDigitCode: function(code) {  
  return (47 < code && code < 58);
 },
 IsSignumCode: function(code) {  
  return (code == 43 || code == 45);
 },
 CanHandleControlKey: function(keyInfo) {
  if(keyInfo.shiftState)
   return false;
  return keyInfo.keyCode == ASPxKey.Up || keyInfo.keyCode == ASPxKey.Down
   || keyInfo.keyCode == ASPxKey.Left || keyInfo.keyCode == ASPxKey.Right
   || keyInfo.keyCode == ASPxKey.Backspace || keyInfo.keyCode == ASPxKey.Delete;
 }, 
 IsPrintableKeyCode: function(keyInfo) {
  if(keyInfo.ctrlState) 
   return false;
  var code = keyInfo.keyCode;  
  return code == 32
   || (code >= 48 && code <= 57)
   || (code >= 65 && code <= 90)
   || (code >= 96 && code <= 107)
   || (code >= 109 && code <= 111)
   || (code >= 186 && code <= 192)
   || (code >= 219 && code <= 222);  
 },
 IsIgnorableLiteral: function(text, mode) {
  if(mode == _aspxMaskIncludeLiterals.None)
   return true;
  if(mode == _aspxMaskIncludeLiterals.All)
   return false;
  return text != __aspxCultureInfo.numDecimalPoint;
 }
};
_aspxMaskManager.keyCancelled = false;
_aspxMaskManager.keyDownHandled = false;
_aspxMaskManager.savedKeyDownKeyInfo = null;
_aspxMaskDateTimeHelper = {
 GetDate: function(maskInfo) {
  return this.CreateDateFromBag(this.GetDateBag(maskInfo));
 },
 GetDateBag: function(maskInfo) {
  var now = new Date();
  var bag = {
   year: now.getFullYear(), 
   month: now.getMonth(), 
   day: now.getDate(),
   hours: 0,
   min: 0,
   sec: 0,
   msec: 0,
   pm: false,
   hasAmPm: false,
   hasDate: false
  };
  for(var i = 0; i < maskInfo.parts.length; i++) {
   var part = maskInfo.parts[i];
   switch(part.dateTimeRole) {
    case "y":     
     bag.year = Number(part.GetValue());
     if(bag.year < 100)
      bag.year = _aspxExpandTwoDigitYear(bag.year);     
     bag.hasDate = true;
     break;
    case "M":
     bag.month = _aspxMaskManager.IsEnumPart(part) ? part.itemIndex : Number(part.GetValue()) - 1;
     bag.hasDate = true;
     break;
    case "d":
     if(!_aspxMaskManager.IsEnumPart(part)) {
      bag.day = Number(part.GetValue());
      bag.hasDate = true;
     }
     break;
    case "H":
    case "h":
     bag.hours = Number(part.GetValue());
     break;
    case "m":
     bag.min = Number(part.GetValue());
     break;
    case "s":
     bag.sec = Number(part.GetValue());
     break;
    case "f":
    case "F":
     bag.msec = Number(part.GetValue());
     break;
    case "t":
     bag.hasAmPm = true;
     bag.pm = _aspxMaskManager.IsEnumPart(part) && part.itemIndex > 0;
     break;
   }
  }
  if(bag.hasAmPm) {
   if(!bag.pm && bag.hours == 12)
    bag.hours = 0;
   if(bag.pm && bag.hours < 12)
    bag.hours += 12;
  }
  return bag;
 },
 CreateDateFromBag: function(bag) {
  if(bag.year == 100 && bag.month == 0 && bag.day == 1 
   && bag.hours + bag.min + bag.sec + bag.msec == 0)
   return null;
  return new Date(bag.year, bag.month, bag.day, bag.hours, bag.min, bag.sec, bag.msec);
 },
 GetMaxDayInMonth: function(month, year) {
  if(month == 1)
   return this.IsLeapYear(year) ? 29 : 28;
  if(month == 3 || month == 5 || month == 8 || month == 10)
   return 30;
  return 31;
 },
 IsLeapYear: function(year) {
  if(year % 4 != 0)
   return false;
  if(year % 100 == 0)  
   return year % 400 == 0;
  return true;
 },
 GetNextLeapYear: function(year) {
  var result = 4 * (1 + Math.floor(year / 4));
  if(!this.IsLeapYear(result))
   result += 4;
  return result;
 }, 
 SetDate: function(maskInfo, date) {
  if(date == null)
   date = new Date(100, 0, 1);
  for(var i = 0; i < maskInfo.parts.length; i++) {
   var part = maskInfo.parts[i];
   part.EnsureValueInitialized();   
   switch(part.dateTimeRole) {
    case "y":
     this.SetYear(part, date);
     break;
    case "M":
     this.SetMonth(part, date);
     break;
    case "d":
     this.SetDay(part, date);
     break;
    case "h":
     this.SetHours(part, date, false);
     break;
    case "H":
     this.SetHours(part, date, true);
     break; 
    case "m":
     this.SetMinutes(part, date);
     break;
    case "s":
     this.SetSeconds(part, date);      
     break;
    case "f":
    case "F":
     this.SetMilliseconds(part, date);
     break;
    case "t":
     this.SetAmPm(part, date);      
     break;      
   }   
  }
 },
 SetYear: function(part, date) {
  if(!_aspxMaskManager.IsRangePart(part))
   return;
  var value = date.getFullYear();
  if(part.maxNumber < 100)
   value = value % 100;
  part.SetNumber(value);
 },
 SetMonth: function(part, date) { 
  if(_aspxMaskManager.IsRangePart(part))
   part.SetNumber(1 + date.getMonth());
  else if(_aspxMaskManager.IsEnumPart(part))
   part.itemIndex = date.getMonth();
 },
 SetDay: function(part, date) {
  if(_aspxMaskManager.IsRangePart(part))
   part.SetNumber(date.getDate());
  else if(_aspxMaskManager.IsEnumPart(part))
   part.itemIndex = date.getDay();
 },
 SetHours: function(part, date, full) {
  if(!_aspxMaskManager.IsRangePart(part))
   return; 
  var value = date.getHours();
  if(!full) {
   value = value % 12;
   if(value == 0)
    value = 12;
  }
  part.SetNumber(value);
 },
 SetMinutes: function(part, date) {
  if(!_aspxMaskManager.IsRangePart(part))
   return; 
  part.SetNumber(date.getMinutes());
 },
 SetSeconds: function(part, date) {
  if(!_aspxMaskManager.IsRangePart(part))
   return;
  part.SetNumber(date.getSeconds());
 },
 SetMilliseconds: function(part, date) {
  if(!_aspxMaskManager.IsRangePart(part))
   return;
  var value = date.getMilliseconds();
  while(value > part.maxNumber)
   value = value / 10;
  part.SetNumber(Math.round(value));
 },
 SetAmPm: function(part, date) {
  if(!_aspxMaskManager.IsEnumPart(part))
   return; 
  part.itemIndex = date.getHours() < 12 ? 0 : 1;
 }  
};
