var InputText_overwriteMode = false;
var InputText_keyAlreadyPressed = false;

function treatFocus(editbox, name) {
   if (!(is_ie5_5up || is_nav6up)) {
      return;
   }
   var form = editbox.form;
   form.CursorOn.value = name;
   InputText_overwriteMode = false;
   InputText_keyAlreadyPressed = false;
}

function treatKeyDown(editbox, mask, type, evt) {
   if (!(is_ie5_5up || is_nav6up)) {
      return true;
   }
   var whichCode = evtKeyCode(evt);
   if (whichCode == 45) {
      InputText_overwriteMode = !InputText_overwriteMode;
      return true;
   }
   if ((whichCode == 46) && (evt.shiftKey == 1)) {
      return true;
   }
   if ((whichCode == 8) || (whichCode == 46)) {
      if ((type == 'X') || (type == 'D')) {
         if (type == 'D') {
            mask = mask.replace(/y/g, '9');
            mask = mask.replace(/M/g, '9');
            mask = mask.replace(/d/g, '9');
            mask = mask.replace(/H/g, '9');
            mask = mask.replace(/m/g, '9');
            mask = mask.replace(/s/g, '9');
            mask = mask.replace(/S/g, '9');
         }
         mask = expandMask(mask);
         deleteChar(editbox, mask, whichCode);
         return false;
      }
      if (type == 'N') {
         mask = mask.replace(/#/g, 'Z');
         mask = expandMask(mask);
         deleteDigit(editbox, mask, whichCode);
         return false;
      }
   }
   return true;
}

function treatKeyPress(editbox, mask, type, evt) {
   if (!(is_ie5_5up || is_nav6up)) {
      return true;
   }
   if (evt.ctrlKey == 1) {
      return true;
   }
   var whichCode = evtKeyCode(evt);
   if ((whichCode == 0) || (whichCode == 8) || (whichCode == 13) || (whichCode == 27)) {
      return true;
   }
   var key = String.fromCharCode(whichCode); // Get key value from key code
   if ((type == 'X') || (type == 'D')) {
      if (type == 'D') {
         mask = mask.replace(/y/g, '9');
         mask = mask.replace(/M/g, '9');
         mask = mask.replace(/d/g, '9');
         mask = mask.replace(/H/g, '9');
         mask = mask.replace(/m/g, '9');
         mask = mask.replace(/s/g, '9');
         mask = mask.replace(/S/g, '9');
      }
      mask = expandMask(mask);
      if ((editbox.value.length >= mask.length) && !InputText_keyAlreadyPressed) {
         for (var i = 0; i < mask.length; i++) {
            if ((mask.charAt(i) != '9') && (mask.charAt(i) != 'A') && (mask.charAt(i) != 'X')) {
               InputText_overwriteMode = true;
               break;
            }
         }
      }
      InputText_keyAlreadyPressed = true;
      var value = editbox.value;
      insertChar(editbox, mask, key);
      if ((editbox.value != value) && !InputText_overwriteMode) {
         if (editbox.value.length >= mask.length) {
            var selectionPos = getSelectionPos(editbox, 0);
            for (var i = selectionPos[0]; i < mask.length; i++) {
               if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
                  return false;
               }
            }
            autoSkip(editbox);
         }
      }
      return false;
   }
   if (type == 'N') {
      if ((key >= '0') && (key <= '9') || (key == '+') || (key == '-')) {
         mask = mask.replace(/#/g, 'Z');
         mask = expandMask(mask);
         if ((editbox.value.length >= mask.length) && !InputText_keyAlreadyPressed) {
            for (var i = 0; i < mask.length; i++) {
               if (mask.charAt(i) == 'Z') {
                  break;
               }
               if (mask.charAt(i) == '9') {
                  InputText_overwriteMode = true;
                  break;
               }
            }
         }
         InputText_keyAlreadyPressed = true;
         var value = editbox.value;
         insertDigit(editbox, mask, key);
         if ((editbox.value != value) && !InputText_overwriteMode) {
            if ((key >= '0') && (key <= '9')) {
               var p = 0;
               if ((mask.indexOf('-') == 0) && (editbox.value.indexOf('-') != 0)) {
                  p = 1;
               }
               if ((mask.indexOf('DB') == 0) && (editbox.value.indexOf('DB') != 0)) {
                  p = 2;
               }
               for (var i = 0; i < editbox.value.length; i++) {
                  if (mask.charAt(i + p) == 'Z') {
                     if (editbox.value.charAt(i) != ' ') {
                        var selectionPos = getSelectionPos(editbox, 0);
                        for (var i1 = selectionPos[0]; i1 < editbox.value.length; i1++) {
                           if ((mask.charAt(i1 + p) == '9') || (mask.charAt(i1 + p) == 'Z')) {
                              return false;
                           }
                        }
                        autoSkip(editbox);
                     }
                     break;
                  }
                  if (mask.charAt(i + p) == '9') {
                     if (editbox.value.charAt(i) != '0') {
                        var selectionPos = getSelectionPos(editbox, 0);
                        for (var i1 = selectionPos[0]; i1 < editbox.value.length; i1++) {
                           if (mask.charAt(i1 + p) == '9') {
                              return false;
                           }
                        }
                        autoSkip(editbox);
                     }
                     break;
                  }
               }
            }
         }
      }
      return false;
   }
   return true;
}

//## mauricio - 27.12.2007 - i
// Tratamento de editbox com mï¿½scara e trigger...
function treatKeyPressTriggerJSF(editbox, mask, type, evt, trigger) {
   if (!(is_ie5_5up || is_nav6up)) {
      return true;
   }

   var whichCode = evtKeyCode(evt);
   if (whichCode == 13) {
      if (iyValidation()) {
         checkNewWindow(editbox.form);
         if (isTargetInNewWindow(editbox.form) == false) {
            disableElements(editbox);
         }
         if (trigger != '') {
            setOptAndSubmitIndirect(editbox.form, trigger, editbox.id);
         } else {
            submitIndirect(editbox.form, editbox.id);
         }
      }
      return false;
   }

   if (mask != '') {
      return(treatKeyPress(editbox, mask, type, evt));
   } else {
      return true;
   }
}

function treatKeyPressTriggerNJSF(editbox, mask, type, evt, trigger) {
   if (!(is_ie5_5up || is_nav6up)) {
      return true;
   }

   var whichCode = evtKeyCode(evt);
   if (whichCode == 13) {
      if (iyValidation()) {
         checkNewWindow(editbox.form);
         if (isTargetInNewWindow(editbox.form) == false) {
            disableElements(editbox);
         }
         setOptAndSubmit(editbox.form, trigger, evt);
      }
      return false;
   }
    
   if (mask != '') {
      return(treatKeyPress(editbox, mask, type, evt));
   } else {
      return true;
   }
}
//## mauricio - 27.12.2007 - f

function deleteChar(editbox, mask, whichCode) {
   var selectionPos = getSelectionPos(editbox, whichCode);
   var strText = '';
   for (var i = 0; i < selectionPos[0]; i++) {
      if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
         strText += editbox.value.charAt(i);
      }
   }      
   for (var i = selectionPos[1]; i < editbox.value.length; i++) {
      if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
         strText += editbox.value.charAt(i);
      }
   }
   if (formatText(editbox, mask, strText)) {
      setCaretPos(editbox, selectionPos[0]);
   }
}   
      
function deleteDigit(editbox, mask, whichCode) {
   var selectionPos = getSelectionPos(editbox, whichCode);
   var p = 0;
   if ((mask.indexOf('-') == 0) && (editbox.value.indexOf('-') != 0)) {
      p = 1;
   }
   if ((mask.indexOf('DB') == 0) && (editbox.value.indexOf('DB') != 0)) {
      p = 2;
   }
   var strNumber = '';
   for (var i = 0; i < selectionPos[0]; i++) {
      if ((mask.charAt(i + p) == '9') || (mask.charAt(i + p) == 'Z') && (editbox.value.charAt(i) != ' ')) {
         if ((strNumber != '') || (editbox.value.charAt(i) != '0')) {
            strNumber += editbox.value.charAt(i);
         }
      }
   }
   for (var i = selectionPos[1]; i < editbox.value.length; i++) {
      if ((mask.charAt(i + p) == '9') || (mask.charAt(i + p) == 'Z') && (editbox.value.charAt(i) != ' ')) {
         if ((strNumber != '') || (editbox.value.charAt(i) != '0')) {
            strNumber += editbox.value.charAt(i);
         }
      }
   }
   var num = 0;
   for (var i = 0; i < mask.length; i++) {
      if (mask.charAt(i) == '9') {
         num += 1;
      }
   }   
   for (var i = strNumber.length; i < num; i++) {
      strNumber = '0' + strNumber;
   }
   formatNumber(editbox, mask, null, strNumber);
   setCaretPos(editbox, selectionPos[1]);
}

function insertChar(editbox, mask, key) {
   var selectionPos = getSelectionPos(editbox, 0);
   var appendMode = false
   if (selectionPos[0] == editbox.value.length) {
      appendMode = true;
   } else {
      if (InputText_overwriteMode) {
         if (selectionPos[0] == selectionPos[1]) {
            selectionPos[1] = selectionPos[1] + 1;
         }
         if ((mask.charAt(selectionPos[0]) != 'A') && (mask.charAt(selectionPos[0]) != '9') && (mask.charAt(selectionPos[0]) != 'X')) {
            return;   
         }
      }
   }
   var strText = '';
   for (var i = 0; i < selectionPos[0]; i++) {
      if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
         strText += editbox.value.charAt(i);
      }
   }
   strText += key;  
   for (var i = selectionPos[1]; i < editbox.value.length; i++) {
      if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
         strText += editbox.value.charAt(i);
      }
   }      
   var num = 0;
   for (var i = 0; i < mask.length; i++) {
      if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
         num += 1;
      }
   }   
   if (strText.length <= num) {
      if (formatText(editbox, mask, strText)) {
         var pos = editbox.value.length;
         if (!appendMode) {
            if (InputText_overwriteMode) {
               for (var i = selectionPos[0] + 1; i < editbox.value.length; i++) {
                  if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
                     pos = i;
                     break;
                  }
               }
            } else {
               for (var i = selectionPos[0]; i < editbox.value.length; i++) {
                 if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
                     pos = i + 1;
                     break;
                  }
               }
            }
         }
         setCaretPos(editbox, pos);
      }
   }
}

function insertDigit(editbox, mask, key) {
   var selectionPos = getSelectionPos(editbox, 0);
   var p = 0;
   if ((mask.indexOf('-') == 0) && (editbox.value.indexOf('-') != 0)) {
      p = 1;
   }
   if ((mask.indexOf('DB') == 0) && (editbox.value.indexOf('DB') != 0)) {
      p = 2;
   }
   var appendMode = false
   var length = editbox.value.length;
   for (var i = editbox.value.length - 1; i >= 0; i--) {
      if ((mask.charAt(i + p) == '9') || (mask.charAt(i + p) == 'Z') && (editbox.value.charAt(i) != ' ')) {
         length = i + 1;
         break;
      }
   }
   if (selectionPos[0] >= length) {
      appendMode = true;
   } else {
      if (InputText_overwriteMode) {
         if (selectionPos[0] == selectionPos[1]) {
            if (selectionPos[0] == editbox.value.length) {
               return;
            }
            selectionPos[1] = selectionPos[1] + 1;
         }
         if ((mask.charAt(selectionPos[0] + p) != '9') && ((mask.charAt(selectionPos[0] + p) != 'Z') || (editbox.value.charAt(selectionPos[0]) == ' '))) {
            return;   
         }
      }
   }
   var strNumber = '';
   for (var i = 0; i < selectionPos[0]; i++) {
      if ((mask.charAt(i + p) == '9') || (mask.charAt(i + p) == 'Z') && (editbox.value.charAt(i) != ' ')) {
         if ((strNumber != '') || (editbox.value.charAt(i) != '0')) {
            strNumber += editbox.value.charAt(i);
         }
      }
   }
   if ((key >= '0') && (key <= '9')) {
      strNumber += key;
   }
   for (var i = selectionPos[1]; i < editbox.value.length; i++) {
      if ((mask.charAt(i + p) == '9') || (mask.charAt(i + p) == 'Z') && (editbox.value.charAt(i) != ' ')) {
         if ((strNumber != '') || (editbox.value.charAt(i) != '0')) {
            strNumber += editbox.value.charAt(i);
         }
      }
   }
   var num = 0;
   for (var i = 0; i < mask.length; i++) {
      if (mask.charAt(i) == '9') {
         num += 1;
      }
   }   
   for (var i = strNumber.length; i < num; i++) {
      strNumber = '0' + strNumber;
   }
   for (var i = 0; i < mask.length; i++) {
      if (mask.charAt(i) == 'Z') {
         num += 1;
      }
   }
   if (strNumber.length <= num) {
      if ((key != '+') && (key != '-')) {
         formatNumber(editbox, mask, null, strNumber);
      } else {
         formatNumber(editbox, mask, key, strNumber);
      }
      var pos = editbox.value.length;
      if (!appendMode) {
         if (InputText_overwriteMode) {
            for (var i = selectionPos[1]; i < editbox.value.length; i++) {
               if ((mask.charAt(i + p) == '9') || (mask.charAt(i + p) == 'Z') && (editbox.value.charAt(i) != ' ')) {
                  pos = i;
                  break;
               }
            }
         } else {
            for (var i = selectionPos[1] - 1; i >= 0; i--) {
               if ((mask.charAt(i + p) == '9') || (mask.charAt(i + p) == 'Z') && (editbox.value.charAt(i) != ' ')) {
                  pos = i + 1;
                  break;
               }
            }
         }
      } else {
         for (var i = editbox.value.length - 1; i >= 0; i--) {
            if ((mask.charAt(i + p) == '9') || (mask.charAt(i + p) == 'Z') && (editbox.value.charAt(i) != ' ')) {
               pos = i + 1;
               break;
            }
         }
      }
      setCaretPos(editbox, pos);
   }
}

function formatText(editbox, mask, strText) {
   var strCheckN = '0123456789';
   var strCheckA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   var aux = '';
   if (strText != '') {
      var j = 0;
      for (var i = 0; i < mask.length; i++) {
         if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'A') || (mask.charAt(i) == 'X')) {
            if ((mask.charAt(i) == '9') && (strCheckN.indexOf(strText.charAt(j)) == -1)) {
               return false;
            }
            if ((mask.charAt(i) == 'A') && (strCheckA.indexOf(strText.charAt(j)) == -1)) {
               return false;
            }
            aux += strText.charAt(j++);
            if (j == strText.length) {
               break;
            }
         } else {
            aux += mask.charAt(i);
        }
      }
   }
   editbox.value = aux;
   return true;
} 

function formatNumber(editbox, mask, key, strNumber) {
   var sign = '';
   var signPos = '';
   if (mask.indexOf('+') != -1) {
      sign = '+';
   }
   if (mask.indexOf('-') != -1) {
      sign = '-';
   }
   if (mask.indexOf('CR') != -1) {
      sign = 'CR';
   }
   if (mask.indexOf('DB') != -1) {
      sign = 'DB';
   }
   if (sign != '') {
      if (mask.indexOf(sign) == 0) {
         signPos = 'L';
      } else {
         if (mask.indexOf(sign) == mask.length - sign.length) {
            signPos = 'R';
         } else {
            sign = '';
         }
      }
   }
   var signTyped = '';
   if (key == '+') {
      if ((sign == '+') || (sign == 'CR')) {
         signTyped = sign;
      }
   }
   if (key == '-') {
      if ((sign == '+') || (sign == '-')) {
         signTyped = '-';
      }
      if ((sign == 'CR') || (sign == 'DB')) {
         signTyped = 'DB';
      }
   }
   if ((key != '+') && (key != '-')) {
      if ((sign == '+') || (sign == 'CR')) {
         signTyped = sign;
      }
      if (sign != '') {
         if (editbox.value.indexOf('+') != -1) {
            signTyped = '+';
         }
         if (editbox.value.indexOf('-') != -1) {
            signTyped = '-';
         }
         if (editbox.value.indexOf('CR') != -1) {
            signTyped = 'CR';
         }
         if (editbox.value.indexOf('DB') != -1) {
            signTyped = 'DB';
         }
      }
   }
   var aux = '';
   if (strNumber != '') {
      var j = strNumber.length - 1;
      for (var i = mask.length - 1; i >= 0; i--) {
         if ((mask.charAt(i) == '9') || (mask.charAt(i) == 'Z')) {
            aux = strNumber.charAt(j--) + aux;
            if (j == -1) {
               for (var i1 = 0; i1 <= i; i1++) {
                  if (mask.charAt(i1) == 'Z') {
                     for (var i2 = i1; i2 < i; i2++) {
                        aux = ' ' + aux;
                     }
                     aux = mask.substring(0, i1) + aux;
                     break;
                  }
               }
               break;
            }
         } else {
            aux = mask.charAt(i) + aux;
         }
      }   
      if (sign != '') {
         aux = aux.replace(sign, '');
      }
      aux = aux.replace(/B/g, ' ');
      if (signTyped != '') {
         if (signPos == 'L') {
            aux = signTyped + aux;
         }
         if (signPos == 'R') {
            aux += signTyped;
        }
     }
   }
   editbox.value = aux;
}

function autoSkip(editbox) {
   var form = editbox.form;
   for (var i = 0; i < form.length; i++) {
      if (form[i] == editbox) {
         for (var j = i + 1; j < form.length; j++) {
            if ((form[j].disabled == false) && (form[j].type != "hidden")) {
               form[j].focus();
               break;
            }
         }
         break;
      }
   }
}

//## mauricio - 05.01.2009 - i
// Usando o 'input hidden' FocusedVar para setar o foco.
function setFocusIndirect() {
    var focusHidden = document.getElementById('FocusedVar');
    if(focusHidden == null) {
        return;
    }
    setFocus(focusHidden.value);
}
//## mauricio - 05.01.2009

function setFocus(id) {
   if (id == "" || null) {
      return;
   }
   for(var i = 0; i < document.forms.length; i++) {
      for(var j = 0; j < document.forms[i].length; j++) {
         if (document.forms[i][j].id == id) {
            document.forms[i][j].focus();
            return;
         }
      }
   }
// Tratamento de foco no JSF
   var lastIndex = id.lastIndexOf(":");
   var prefix = lastIndex != -1 ? id.substring(0, lastIndex + 1) : "";
   var suffix = lastIndex != -1 ? id.substring(lastIndex + 1) : id;
   for(var i = 0; i < document.forms.length; i++) {
      for(var j = 0; j < document.forms[i].length; j++) {
         if ((prefix != "") && (document.forms[i][j].id.indexOf(prefix) == -1)) {
            continue;
         }
         lastIndex = document.forms[i][j].id.lastIndexOf(":");
         if ((lastIndex != -1) && (document.forms[i][j].id.substring(lastIndex + 1) == suffix)) {
            document.forms[i][j].focus();
            return;
         }
      }
   }
}

function expandMask(mask) {
   var matchExpandable = /\S\(\d+\)/g;
   var matchArguments = /(\S)\(0*(\d+)\)/;
   var expandable = mask.match(matchExpandable);
   if ( !expandable) {
      return mask;
   }
   for(var i = 0; i < expandable.length; i++) {
      var arguments = expandable[i].match(matchArguments);
      var specialChar = arguments[1];
      var number = parseInt(arguments[2]);
      // ï¿½ necessï¿½rio acrescentar mais um caracter destes
      // abaixo na mï¿½scara para que a contagem de dï¿½gitos
      // seja consistemte.
      if (specialChar == "-" || specialChar == "+" || specialChar == "$") {
         number++;
      }
      // O caracter '$' ï¿½ especial. Para que apareï¿½a um ï¿½nico caracter
      // '$' em um replace, vocï¿½ precisa de uma string com '$$'.
      // Sendo assim, duplica o nï¿½mero de repetiï¿½ï¿½es para ele.
      if(specialChar == "$") {
         number = number * 2;
      }
      var replaceString = "";
      for(var j = 0; j < number; j++) {
         replaceString = replaceString + specialChar;
      }
      var replaceRegExp = new RegExp("\\" + arguments[1] + 
            "\\(0*" + arguments[2] + "\\)");
      mask = mask.replace(replaceRegExp, replaceString);
   }
   return mask;
}

function getSelectionPos(editbox, whichCode) {
   /* mauricio - 2009-11-18 - i.
      Problemas no tratamento de máscara para textarea.
      Detectado em Ipatinga.
      
      código original....
      
   var selectionPos = new Array(2);
   if (document.selection) {
      var sel = document.selection.createRange();
      if (sel.text == '') {
         if (whichCode == 8) {
            sel.moveStart('character', -1);
         }
         if (whichCode == 46) {
            sel.moveEnd('character', 1);
         }
      }
      var len = sel.text.length;
      sel.moveStart('character', -editbox.value.length);
      selectionPos[0] = sel.text.length - len;
      selectionPos[1] = sel.text.length;
   } else {
      selectionPos[0] = editbox.selectionStart;
      selectionPos[1] = editbox.selectionEnd;
      if (selectionPos[0] == selectionPos[1]) {
         if (whichCode == 8) {
            selectionPos[0] = selectionPos[0] - 1;
         }
         if (whichCode == 46) {
            selectionPos[1] = selectionPos[1] + 1;
         }
      }
   }

   abaixo, o código novo.
   
   */
    
   var selectionPos = new Array(2);
   if (document.selection) {
      var sel = document.selection.createRange();
      var len = sel.text.length;
      if (editbox.type != 'textarea') {
          sel.moveStart('character', -editbox.value.length);
          selectionPos[0] = sel.text.length - len;
          selectionPos[1] = sel.text.length;
      } else {
          var stored_range = sel.duplicate();
          stored_range.moveToElementText( editbox );
          stored_range.setEndPoint( 'EndToEnd', sel );
          selectionPos[0] = stored_range.text.length - len;
          selectionPos[1] = selectionPos[0] + len;
      }
   } else {
      selectionPos[0] = editbox.selectionStart;
      selectionPos[1] = editbox.selectionEnd;
   }
   
   if (selectionPos[0] == selectionPos[1]) {
      if (whichCode == 8) {
         selectionPos[0] = selectionPos[0] - 1;
      }
      if (whichCode == 46) {
         selectionPos[1] = selectionPos[1] + 1;
      }
   }
   
   // mauricio - 2009-11-19 - f
   return selectionPos;
}

function setCaretPos(editbox, pos) {
   if (editbox.createTextRange) {
      var range = editbox.createTextRange();
      range.collapse(true);
      range.moveEnd('character', pos)
      range.moveStart('character', pos)
      range.select();
   } else {
      if (editbox.setSelectionRange) {
         editbox.setSelectionRange(pos, pos);
      }
   }
}

function evtKeyCode(evt) {
    var whichCode = 0;
    
    if (is_ie6up) {
        whichCode = evt.keyCode;
    } else if (is_nav6up) {
        whichCode = evt.which;
    }
    
    return whichCode;
}
