// Inserir nos campos input com máscara ao longo do sistema.
//
// * Não esquecer da referência no início do HTML:
//   <script src="lib/editMask.js" type="text/javascript" ></script>
//*****************************************************************************
function setMaskInteger(objInput, limit, autoSkip) {
  objInput.maxLength = limit;
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterInteger();');
  addEventCode(objInput, 'onblur', 'objBlur(this);');
  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + limit + ', event);');
  }

}

function setMaskText(objInput, limit, autoSkip) {
  objInput.maxLength = limit;
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterText();');
  addEventCode(objInput, 'onblur', 'objBlur(this);');
  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + limit + ', event);');
  }
}

function setMaskTextArea(objInput, limit, autoSkip) {
	addEventCode(objInput, 'onkeypress', 'limitaTexto(this, ' + limit + ');filterText();');
  	addEventCode(objInput, 'onblur', 'limitaTexto(this, ' + limit + ');');

  	if (autoSkip) {
    	addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + limit + ', event);limitaTexto(this, ' + limit + ');');
  	}
  	else	{
		addEventCode(objInput, 'onkeyup', 'limitaTexto(this, ' + limit + ');');	  
  	}
}

function setMaskEmailList (objInput, limit, autoSkip) {
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterEmailList();');
  addEventCode(objInput, 'onblur', 'objBlur(this);');

  if (objInput.type == 'text') {
    objInput.maxLength = limit;
  } else {
    addEventCode(objInput, 'onkeypress', 'limitaEntrada(this, ' + limit + ');');
    addEventCode(objInput, 'onblur', 'limitaTexto(this, ' + limit + ');');
  }
  
  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}

function setMaskEmail (objInput, autoSkip, size) {
  if (size){
      objInput.maxLength = size;
  }else{
      objInput.maxLength = 255;
  }    
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterEmail();');
  addEventCode(objInput, 'onblur', 'objBlur(this);');

  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}

function setMaskAlpha (objInput, limit, autoSkip) {
  objInput.maxLength = limit;
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterAlpha();');
  addEventCode(objInput, 'onblur', 'objBlur(this);');

  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}

function setMaskNumber (objInput, intNum, dec, autoSkip) {
  objInput.maxLength = intNum + Math.ceil((intNum / 3) - 1) +
                       dec + ((dec > 0) ? 1 : 0);
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterNumber();');
  addEventCode(objInput, 'onkeyup', 'formataNumber(this, ' + intNum + ', ' + dec + ');');
  addEventCode(objInput, 'onblur', 'objBlur(this);formataNumber(this, ' + intNum + ', ' + dec + ');');

  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}

function setMaskCnpj (objInput, autoSkip) {
  objInput.maxLength = 18;
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterCode();');
  addEventCode(objInput, 'onkeypress', 'mask(this, event, "CNPJ");');
  addEventCode(objInput, 'onblur', 'objBlur(this); validaCnpj(this);');

  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}

function setMaskCode (objInput, limit, autoSkip) {
  objInput.maxLength = limit;
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterCode();');
  addEventCode(objInput, 'onblur', 'objBlur(this);');

  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}

function setMaskPhone (objInput, limit, autoSkip) {
  objInput.maxLength = limit;
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterPhone();');
  addEventCode(objInput, 'onblur', 'objBlur(this);');

  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}

function setMaskDate (objInput, autoSkip) {
  objInput.maxLength = 10;
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterDate();');
  addEventCode(objInput, 'onkeypress', 'mask(this,event, "DATA");');
  addEventCode(objInput, 'onblur', 'validaDate(this, "EUA"); objBlur(this);');

  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}

function setMaskDateTime (objInput, autoSkip) {
  objInput.maxLength = 18;
  addEventCode(objInput, 'onfocus', 'objFocus(this);');
  addEventCode(objInput, 'onkeydown', 'filterDatetime();');
  addEventCode(objInput, 'onkeypress', 'mask(this,event, "DATAHORA");');
  addEventCode(objInput, 'onblur', 'validaDateHora(this, "EUA"); objBlur(this);');
  if (autoSkip) {
    addEventCode(objInput, 'onkeyup', 'saltaCampo(this, ' + objInput.maxLength + ', event);');
  }
}


//*****************************************************************************

function filterInteger(){

	event.returnValue = ((48 <= event.keyCode  && event.keyCode <= 57) || 
	                     (96 <= event.keyCode && event.keyCode <= 105));
}

function filterText () {
  //diferente de ENTER ' " \
  event.returnValue = (event.keyCode != 34 && 
					   event.keyCode != 39 &&
					   event.keyCode != 92 &&
					   event.keyCode != 192);
}

function filterAlpha () {
  var validAlpha = 'abcdefghijklmnopqrstuvwxyz';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validAlpha.indexOf(chrPressed.toLowerCase()) > -1);
}

function filterEmail () {
  var validEmail = 'abcdefghijklmnopqrstuvwxyz1234567890@._-';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validEmail.indexOf(chrPressed.toLowerCase()) > -1);
}

function filterEmailList () {
  var validEmailList = 'abcdefghijklmnopqrstuvwxyz1234567890@._-,; ';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validEmailList.indexOf(chrPressed.toLowerCase()) > -1);
}

function filterBinary () {
  var validBinary = '01';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validBinary.indexOf(chrPressed) > -1);
}

function filterDigit () {
  var validDigit = '0123456789';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validDigit.indexOf(chrPressed) > -1);
}

function filterNumber () {
  var validNumber = '0123456789,.';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validNumber.indexOf(chrPressed) > -1);
}

function filterCode () {
  var validCode = '0123456789,./-';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validCode.indexOf(chrPressed) > -1);
}

function filterPhone () {
  var validPhone = '0123456789-() ';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validPhone.indexOf(chrPressed) > -1);
}

function filterDate () {
  var validDate = '0123456789/';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validDate.indexOf(chrPressed) > -1);
}

function filterTime () {
  var validTime = '0123456789:';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validTime.indexOf(chrPressed) > -1);
}

function filterDatetime () {
  var validDatetime = '0123456789/:';
  var chrPressed = getCharPressed(event);

  event.returnValue = (chrPressed.length = 0) ||
                      (validDatetime.indexOf(chrPressed) > -1);
}


//*****************************************************************************


function getEventCode (strCode) {
  return (strCode.length > 23) ? strCode.substring(23, strCode.length - 1) : '';
}

function setEventCode (obj, eventName, newCode) {
  switch (eventName) {
    case 'onfocus' : {
                       obj.onfocus = Function(newCode);
                       break;
                     }
    case 'onkeydown' : {
                       obj.onkeydown = Function(newCode);
                       break;
                     }
    case 'onkeyup' : {
                       obj.onkeyup = Function(newCode);
                       break;
                     }
    case 'onkeypress' : {
                       obj.onkeypress = Function(newCode);
                       break;
                     }
    case 'onblur' : {
                       obj.onblur = Function(newCode);
                       break;
                     }
  }
}

function addEventCode (obj, eventName, newCode) {
  var oldCode = '';

  switch (eventName) {
    case 'onfocus' : {
                       if (obj.onfocus) {
                         oldCode = getEventCode(obj.onfocus.toString());
                       }
                       obj.onfocus = Function(oldCode + newCode);
                       break;
                     }
    case 'onkeydown' : {
                         if (obj.onkeydown) {
                           oldCode = getEventCode(obj.onkeydown.toString());
                         }
                         obj.onkeydown = Function(oldCode + newCode);
                         break;
                       }
    case 'onkeyup' : {
                       if (obj.onkeyup) {
                         oldCode = getEventCode(obj.onkeyup.toString());
                       }
                       obj.onkeyup = Function(oldCode + newCode);
                       break;
                     }
    case 'onkeypress' : {
                          if (obj.onkeypress) {
                            oldCode = getEventCode(obj.onkeypress.toString());
                          }
                          obj.onkeypress = Function(oldCode + newCode);
                          break;
                        }
    case 'onblur' : {
                      if (obj.onblur) {
                        oldCode = getEventCode(obj.onblur.toString());
                      }
                      obj.onblur = Function(oldCode + newCode);
                      break;
                    }
  }
}

function insertEventCode (obj, eventName, newCode) {
  var oldCode = '';

  switch (eventName) {
    case 'onfocus' : {
                       if (obj.onfocus) {
                         oldCode = getEventCode(obj.onfocus.toString());
                       }
                       obj.onfocus = Function(newCode + oldCode);
                       break;
                     }
    case 'onkeydown' : {
                         if (obj.onkeydown) {
                           oldCode = getEventCode(obj.onkeydown.toString());
                         }
                         obj.onkeydown = Function(newCode + oldCode);
                         break;
                       }
    case 'onkeyup' : {
                       if (obj.onkeyup) {
                         oldCode = getEventCode(obj.onkeyup.toString());
                       }
                       obj.onkeyup = Function(newCode + oldCode);
                       break;
                     }
    case 'onkeypress' : {
                          if (obj.onkeypress) {
                            oldCode = getEventCode(obj.onkeypress.toString());
                          }
                          obj.onkeypress = Function(newCode + oldCode);
                          break;
                        }
    case 'onblur' : {
                      if (obj.onblur) {
                        oldCode = getEventCode(obj.onblur.toString());
                      }
                      obj.onblur = Function(newCode + oldCode);
                      break;
                    }
  }
}

function getCharPressed (e) {
  if (e.altKey || e.altLeft || e.crtlKey || e.ctrlLeft || e.repeat)
    return '';

  var codeKey = (e.shiftKey || e.shiftLeft) ? (e.keyCode + 1000) : e.keyCode;

  switch (codeKey) {
    case 49 : { return '1'; break; }
    case 50 : { return '2'; break; }
    case 51 : { return '3'; break; }
    case 52 : { return '4'; break; }
    case 53 : { return '5'; break; }
    case 54 : { return '6'; break; }
    case 55 : { return '7'; break; }
    case 56 : { return '8'; break; }
    case 57 : { return '9'; break; }
    case 48 : { return '0'; break; }

    case 65 : { return 'a'; break; }
    case 66 : { return 'b'; break; }
    case 67 : { return 'c'; break; }
    case 68 : { return 'd'; break; }
    case 69 : { return 'e'; break; }
    case 70 : { return 'f'; break; }
    case 71 : { return 'g'; break; }
    case 72 : { return 'h'; break; }
    case 73 : { return 'i'; break; }
    case 74 : { return 'j'; break; }
    case 75 : { return 'k'; break; }
    case 76 : { return 'l'; break; }
    case 77 : { return 'm'; break; }
    case 78 : { return 'n'; break; }
    case 79 : { return 'o'; break; }
    case 80 : { return 'p'; break; }
    case 81 : { return 'q'; break; }
    case 82 : { return 'r'; break; }
    case 83 : { return 's'; break; }
    case 84 : { return 't'; break; }
    case 85 : { return 'u'; break; }
    case 86 : { return 'v'; break; }
    case 87 : { return 'w'; break; }
    case 88 : { return 'x'; break; }
    case 89 : { return 'y'; break; }
    case 90 : { return 'z'; break; }

    case 96 : { return '0'; break; }
    case 97 : { return '1'; break; }
    case 98 : { return '2'; break; }
    case 99 : { return '3'; break; }
    case 100 : { return '4'; break; }
    case 101 : { return '5'; break; }
    case 102 : { return '6'; break; }
    case 103 : { return '7'; break; }
    case 104 : { return '8'; break; }
    case 105 : { return '9'; break; }

    case 106 : { return '*'; break; }
    case 107 : { return '+'; break; }
    case 109 : { return '-'; break; }
    case 110 : { return ','; break; }
    case 111 : { return '/'; break; }
    case 194 : { return '.'; break; }

    case 186 : { return 'ç'; break; }
    case 187 : { return '='; break; }
    case 188 : { return ','; break; }
    case 189 : { return '-'; break; }
    case 190 : { return '.'; break; }
    case 191 : { return ';'; break; }
    case 192 : { return '\''; break; }
    case 193 : { return '/'; break; }
    case 219 : { return '´'; break; }
    case 220 : { return ']'; break; }
    case 221 : { return '['; break; }
    case 222 : { return '~'; break; }
    case 226 : { return '\\'; break; }

    case 1049 : { return '!'; break; }
    case 1050 : { return '@'; break; }
    case 1051 : { return '#'; break; }
    case 1052 : { return '$'; break; }
    case 1053 : { return '%'; break; }
    case 1054 : { return '¨'; break; }
    case 1055 : { return '&'; break; }
    case 1056 : { return '*'; break; }
    case 1057 : { return '('; break; }
    case 1048 : { return ')'; break; }

    case 1065 : { return 'A'; break; }
    case 1066 : { return 'B'; break; }
    case 1067 : { return 'C'; break; }
    case 1068 : { return 'D'; break; }
    case 1069 : { return 'E'; break; }
    case 1070 : { return 'F'; break; }
    case 1071 : { return 'G'; break; }
    case 1072 : { return 'H'; break; }
    case 1073 : { return 'I'; break; }
    case 1074 : { return 'J'; break; }
    case 1075 : { return 'K'; break; }
    case 1076 : { return 'L'; break; }
    case 1077 : { return 'M'; break; }
    case 1078 : { return 'N'; break; }
    case 1079 : { return 'O'; break; }
    case 1080 : { return 'P'; break; }
    case 1081 : { return 'Q'; break; }
    case 1082 : { return 'R'; break; }
    case 1083 : { return 'S'; break; }
    case 1084 : { return 'T'; break; }
    case 1085 : { return 'U'; break; }
    case 1086 : { return 'V'; break; }
    case 1087 : { return 'W'; break; }
    case 1088 : { return 'X'; break; }
    case 1089 : { return 'Y'; break; }
    case 1090 : { return 'Z'; break; }

    case 1186 : { return 'Ç'; break; }
    case 1187 : { return '+'; break; }
    case 1188 : { return '<'; break; }
    case 1189 : { return '_'; break; }
    case 1190 : { return '>'; break; }
    case 1191 : { return ':'; break; }
    case 1192 : { return '"'; break; }
    case 1193 : { return '?'; break; }
    case 1219 : { return '`'; break; }
    case 1220 : { return '}'; break; }
    case 1221 : { return '{'; break; }
    case 1222 : { return '^'; break; }
    case 1226 : { return '|'; break; }

    default : { return ''; break; }
  }
}
