// BIBLIOTECA JAVASCRIPT DO MK-AUTH --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// POR FRANCISCO PEDRO FILHO DA COSTA FILHO -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



// FUNCAO PARA INICIARMOS O AJAX NO BROWSER DO CLIENTE ------------------------------------------------------------------------------------------------------------------------------------------------------------------
function openAjax() {

var ajax;

try{
    ajax = new XMLHttpRequest(); // XMLHttpRequest para browsers decentes, como: Firefox, Safari, dentre outros.
}catch(ee){
    try{
        ajax = new ActiveXObject("Msxml2.XMLHTTP"); // Para o IE da MS
    }catch(e){
        try{
            ajax = new ActiveXObject("Microsoft.XMLHTTP"); // Para o IE da MS
        }catch(E){
            ajax = false;
        }
    }
}
return ajax;
}


// FUNCOES PARA FORMATCAO DOS CAMPOS ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function Mascara(objeto, evt, mask) {

    var LetrasU = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    var LetrasL = 'abcdefghijklmnopqrstuvwxyz';
    var Letras  = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    var LetrasNumeros = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'; 
    var Numeros = '0123456789';
    var Fixos  = '().-:/ ';
    var Charset = " !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_/`abcdefghijklmnopqrstuvwxyz{|}~";
    
    evt = (evt) ? evt : (window.event) ? window.event : "";
    var value = objeto.value;
    if (evt) {
             var ntecla = (evt.which) ? evt.which : evt.keyCode;
             tecla = Charset.substr(ntecla - 32, 1);
             if (ntecla < 32) return true;
            
             var tamanho = value.length;
             if (tamanho >= mask.length) return false;
            
             var pos = mask.substr(tamanho,1);
             while (Fixos.indexOf(pos) != -1) {
                      value += pos;
                      tamanho = value.length;
                      if (tamanho >= mask.length) return false;
                      pos = mask.substr(tamanho,1);
             }
            
             switch (pos) {
                   case '#' : if (Numeros.indexOf(tecla) == -1) return false; break;
                   case 'N' : if (LetrasNumeros.indexOf(tecla) == -1) return false; break;
                   case 'A' : if (LetrasU.indexOf(tecla) == -1) return false; break;
                   case 'a' : if (LetrasL.indexOf(tecla) == -1) return false; break;
                   case 'Z' : if (Letras.indexOf(tecla) == -1) return false; break;
                   case '*' : objeto.value = value; return true; break;
                   default : return false; break;
             }
    }
    objeto.value = value;
    return true;
}


function MaskCEP(objeto, evt) {
        return Mascara(objeto, evt, '#####-###');
}

function MaskTelefone(objeto, evt) {
        return Mascara(objeto, evt, '(##)####-####');
}

function MaskCPF(objeto, evt) {
        return Mascara(objeto, evt, '###.###.###-##');
}

function MaskCNPJ(objeto, evt) {
        return Mascara(objeto, evt, '##.###.###/####-##');
}

function MaskData(objeto, evt) {
        return Mascara(objeto, evt, '##/##/####');
}

function MaskIP(objeto, evt) {
        return Mascara(objeto, evt, '###.###.###.###');
}

function MaskMAC(objeto, evt) {
        return Mascara(objeto, evt, 'NN:NN:NN:NN:NN:NN');
}




// FUNCAO EXIBE A CAIXA DE AJUDA -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
var Help = {
	show: function( message, helpLink ) {
		var helpDiv = document.createElement( 'div' );
		helpDiv.className = 'help_box';
		helpDiv.style.left = xPageX( helpLink ) + 16 + 'px';
		helpDiv.style.top = xPageY( helpLink ) + 16 + 'px';
		helpDiv.appendChild( document.createTextNode( message ) );
		helpLink.parentNode.insertBefore( helpDiv, helpLink.nextSibling );
	},
	
	hide: function( helpLink ) {
		helpLink.parentNode.removeChild( helpLink.nextSibling );
	}
}


function xPageY(e)
{
  var y = 0;
  while (e) {
    if (xDef(e.offsetTop)) y += e.offsetTop;
    e = xDef(e.offsetParent) ? e.offsetParent : null;
  }
  return y;
}
function xPageX(e)
{
  var x = 0;
  while (e) {
    if (xDef(e.offsetLeft)) x += e.offsetLeft;
    e = xDef(e.offsetParent) ? e.offsetParent : null;
  }
  return x;
}
function xDef()
{
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
  return true;
}




// FUNCAO PARA TESTA A SEGURANCA DA SENHA --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function TestaSenha(valor) {
   var d = document.getElementById('seguranca');
   ERaz = /[a-z]/;
   ERAZ = /[A-Z]/;
   ER09 = /[0-9]/;
   ERxx = /[@!#$%&*+=?|-]/;

   if(valor.length == ''){
      d.innerHTML = '<b> nivel de seguranca: ! </b>';
   } else {
      if(valor.length < 5){
         d.innerHTML = '<font color=\'red\'><b> nivel de seguranca baixo </b></font>';
      } else {
         if(valor.length > 7 && valor.search(ERaz) != -1 && valor.search(ERAZ) != -1 && valor.search(ER09) != -1 || valor.length > 7 && valor.search(ERaz) != -1 && valor.search(ERAZ) != -1 && valor.search(ERxx) || valor.length > 7 && valor.search(ERaz) != -1 && valor.search(ERxx) != -1 && valor.search(ER09) || valor.length > 7  && valor.search(ERxx) != -1 && valor.search(ERAZ) != -1 && valor.search(ER09)){
            d.innerHTML = '<font color=\'green\'><b> nivel de seguranca alto </b></font>';
         } else {
            if(valor.search(ERaz) != -1 && valor.search(ERAZ) != -1 || valor.search(ERaz) != -1 && valor.search(ER09) != -1 || valor.search(ERaz) != -1 && valor.search(ERxx) != -1 ||valor.search(ERAZ) != -1 && valor.search(ER09) != -1 ||valor.search(ERAZ) != -1 && valor.search(ERxx) != -1 ||valor.search(ER09) != -1 && valor.search(ERxx) != -1){
               d.innerHTML = ' <font color=\'orange\'><b> nivel de seguranca medio </b></font>';
            } else {
               d.innerHTML = ' <font color=\'red\'><b> nivel de seguranca baixo </b></font>';
            }
         }
      }
   }
}




// FUNCAO QUE EXIBE A IMAGEM LOANDING NO CANTO ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
function OnLoad() {
if (document.getElementById) // IE5 NN6
	document.getElementById("loading").style.visibility="hidden";
else if (document.layers) // NN4
	document.loading.visibility="hidden";
else if (document.all) // IE4
	document.all.loading.style.visibility="hidden";
}




// FUNCAO PARA REDIMENCIONAR JANELA --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function winSizer()
{
	windowWidth = window.screen.availWidth;
	windowHeight = window.screen.availHeight;
	window.moveTo(0,0); window.resizeTo(windowWidth,windowHeight);
}




// FUNCAO PARA REDIMENCIONAR JANELA ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function redWin(redw,redh)
{
	windowWidth = redw;
	windowHeight = redh;
	window.moveTo(0,0); window.resizeTo(windowWidth,windowHeight);
}




// FUNCAO QUE VERIFICA SE DADO UM STRING EH STRING NUMERICO ----------------------------------------------------------------------------------------------------------------------------------------
function numero(string){
    if (!string) return false;
    var Chars = "0123456789";

    for (var i = 0; i < string.length; i++) {
       if (Chars.indexOf(string.charAt(i)) == -1)
          return false;
    }
    return true;
} 




// FUNCAO DE CONTROLE DO TECLADO --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
shortcut = {
	'all_shortcuts':{},// Todos os atalhos sao armazenados nesta disposicao
	'add': function(shortcut_combination,callback,opt) {
		var default_options = {
			'type':'keydown',
			'propagate':false,
			'disable_in_input':false,
			'target':document,
			'keycode':false
		}
		if(!opt) opt = default_options;
		else {
			for(var dfo in default_options) {
				if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
			}
		}

		var ele = opt.target
		if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
		var ths = this;
		shortcut_combination = shortcut_combination.toLowerCase();

		var func = function(e) {
			e = e || window.event;
			
			if(opt['disable_in_input']) { // nao permite chaves de atalho na entrada, campos de Textarea
				var element;
				if(e.target) element=e.target;
				else if(e.srcElement) element=e.srcElement;
				if(element.nodeType==3) element=element.parentNode;

				if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
			}
	
			if (e.keyCode) code = e.keyCode;
			else if (e.which) code = e.which;
			var character = String.fromCharCode(code).toLowerCase();
			
			if(code == 188) character=","; // Se o usuario pressiona, quando o tipo for onkeydown
			if(code == 190) character="."; // Se o usuário pressiona, quando o tipo for onkeydown
	
			var keys = shortcut_combination.split("+");
			var kp = 0;
			
			var shift_nums = {
				"`":"~",
				"1":"!",
				"2":"@",
				"3":"#",
				"4":"$",
				"5":"%",
				"6":"^",
				"7":"&",
				"8":"*",
				"9":"(",
				"0":")",
				"-":"_",
				"=":"+",
				";":":",
				"'":"\"",
				",":"<",
				".":">",
				"/":"?",
				"\\":"|"
			}

			var special_keys = {
				'esc':27,
				'escape':27,
				'tab':9,
				'space':32,
				'return':13,
				'enter':13,
				'backspace':8,
	
				'scrolllock':145,
				'scroll_lock':145,
				'scroll':145,
				'capslock':20,
				'caps_lock':20,
				'caps':20,
				'numlock':144,
				'num_lock':144,
				'num':144,
				
				'pause':19,
				'break':19,
				
				'insert':45,
				'home':36,
				'delete':46,
				'end':35,
				
				'pageup':33,
				'page_up':33,
				'pu':33,
	
				'pagedown':34,
				'page_down':34,
				'pd':34,
	
				'left':37,
				'up':38,
				'right':39,
				'down':40,
	
				'f1':112,
				'f2':113,
				'f3':114,
				'f4':115,
				'f5':116,
				'f6':117,
				'f7':118,
				'f8':119,
				'f9':120,
				'f10':121,
				'f11':122,
				'f12':123
			}
	
			var modifiers = { 
				shift: { wanted:false, pressed:false},
				ctrl : { wanted:false, pressed:false},
				alt  : { wanted:false, pressed:false},
				meta : { wanted:false, pressed:false}	// Especificacao do Meta
			};
                        
			if(e.ctrlKey)	modifiers.ctrl.pressed = true;
			if(e.shiftKey)	modifiers.shift.pressed = true;
			if(e.altKey)	modifiers.alt.pressed = true;
			if(e.metaKey)   modifiers.meta.pressed = true;
                        
			for(var i=0; k=keys[i],i<keys.length; i++) {
				// Modificadores
				if(k == 'ctrl' || k == 'control') {
					kp++;
					modifiers.ctrl.wanted = true;

				} else if(k == 'shift') {
					kp++;
					modifiers.shift.wanted = true;

				} else if(k == 'alt') {
					kp++;
					modifiers.alt.wanted = true;
				} else if(k == 'meta') {
					kp++;
					modifiers.meta.wanted = true;
				} else if(k.length > 1) { // para chave especial
					if(special_keys[k] == code) kp++;
					
				} else if(opt['keycode']) {
					if(opt['keycode'] == code) kp++;

				} else { // As chaves especiais nao combinaram
					if(character == k) kp++;
					else {
						if(shift_nums[character] && e.shiftKey) { // Erro estupido da chave de deslocamento criado usando o lowercase
							character = shift_nums[character]; 
							if(character == k) kp++;
						}
					}
				}
			}

			if(kp == keys.length && 
						modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
						modifiers.shift.pressed == modifiers.shift.wanted &&
						modifiers.alt.pressed == modifiers.alt.wanted &&
						modifiers.meta.pressed == modifiers.meta.wanted) {
				callback(e);
	
				if(!opt['propagate']) { // Para do evento
					e.cancelBubble = true;
					e.returnValue = false;
	
					if (e.stopPropagation) {
						e.stopPropagation();
						e.preventDefault();
					}
					return false;
				}
			}
		}
		this.all_shortcuts[shortcut_combination] = {
			'callback':func, 
			'target':ele, 
			'event': opt['type']
		};
		if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
		else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
		else ele['on'+opt['type']] = func;
	},

	'remove':function(shortcut_combination) {
		shortcut_combination = shortcut_combination.toLowerCase();
		var binding = this.all_shortcuts[shortcut_combination];
		delete(this.all_shortcuts[shortcut_combination])
		if(!binding) return;
		var type = binding['event'];
		var ele = binding['target'];
		var callback = binding['callback'];

		if(ele.detachEvent) ele.detachEvent('on'+type, callback);
		else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
		else ele['on'+type] = false;
	}
}




// ABRE UM JANELA POP-UP -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function abre_janela(width, height, nome) {
var top; var left;
top = ( (screen.height/2) - (height/2) )
left = ( (screen.width/2) - (width/2) )
window.open('',nome,'width='+width+',height='+height+',scrollbars=no,toolbar=no,location=no,status=no,menubar=no,resizable=no,left='+left+',top='+top);
}




// VALIDA OS DADOS DO FORMULARIO ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function verifica_form(form) {
var passed = false;
var ok = false
var campo
for (var i = 0; i < form.length; i++) {
  campo = form[i].getAttribute("name");
  if (form[i].getAttribute("df_verificar") == "sim") {
    if (form[i].getAttribute("type") == "text"  | form[i].getAttribute("type") == "textarea" | form[i].type == "password") {
      if (form[i].value == "" | form[i].value == "http://") {
		        form[campo].focus();
        alert("Preencha corretamente o campo");
        return passed;
        stop;
      }
    }

    var msg = ""
    if (form[campo].getAttribute("df_validar") == "cpf") msg = checa_cpf(form[campo].value);
    if (form[campo].getAttribute("df_validar") == "senha") msg = valida_senha(form[campo].value);
    if (form[campo].getAttribute("df_validar") == "letras") msg = chega_letras(form[campo].value);
    if (form[campo].getAttribute("df_validar") == "mac") msg = valida_mac(form[campo].value);
    if (form[campo].getAttribute("df_validar") == "cnpj") msg = checa_cnpj(form[campo].value);
    if (form[campo].getAttribute("df_validar") == "cpf_cnpj") {
	  msg = checa_cpf(form[campo].value);
	  if (msg != "") msg = checa_cnpj(form[campo].value);
	}
    if (form[campo].getAttribute("df_validar") == "email") msg = checa_email(form[campo].value);
    if (form[campo].getAttribute("df_validar") == "numerico") msg = checa_numerico(form[campo].value);
    if (msg != "") {
	  if (form[campo].getAttribute("df_validar") == "cpf_cnpj") msg = "informe corretamente o número do CPF ou CNPJ";
	       form[campo].focus();
      form[campo].select();
      alert(msg);
      return passed;
      stop;
    }
  }
}
passed = true;
return passed;
}




// CHEGA SE DADO E NUMERICO --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function checa_numerico(String) {
var mensagem = "Este campo aceita somente números"
var msg = "";
if (isNaN(String)) msg = mensagem;
return msg;
}




// CHEGA SE DADO E UM TEXTO --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function chega_letras(String){
var regexTexto = /^[a-z' 'A-ZãÃáÁàÀêÊéÉèÈíÍìÌôÔõÕóÓòÒúÚùÙûÛçÇ.;:,ºª]+$/;
var mensagem = "Este campo aceita somente letras"
var msg = "";

if (!regexTexto.test(String)) msg = mensagem;
return msg;
}




// CHEGA SE AS SENHAS CONFEREM --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function valida_senha(String) {
var mensagem = "As senhas nao conferem!"
var msg = "";
if ( (String) != document.form.senha2.value )  msg = mensagem;
return msg;
}   




// CHEGA SE DADO E UM E-MAIL --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function checa_email(campo) {
var mensagem = "Informe corretamente o email"
var msg = "";
var email = campo.match(/(\w+)@(.+)\.(\w+)$/);
if (email == null){
  msg = mensagem;
  }
return msg;
}




// CHEGA SE E UM CPF VALIDO --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function checa_cpf(CPF) {
var mensagem = "informe corretamente o número do CPF"
var msg = "";
if (CPF.length != 11 || CPF == "00000000000" || CPF == "11111111111" ||
  CPF == "22222222222" ||	CPF == "33333333333" || CPF == "44444444444" ||
  CPF == "55555555555" || CPF == "66666666666" || CPF == "77777777777" ||
  CPF == "88888888888" || CPF == "99999999999")
msg = mensagem;
soma = 0;
for (y=0; y < 9; y ++)
soma += parseInt(CPF.charAt(y)) * (10 - y);
resto = 11 - (soma % 11);
if (resto == 10 || resto == 11)resto = 0;
if (resto != parseInt(CPF.charAt(9)))
  msg = mensagem; soma = 0;
for (y = 0; y < 10; y ++)
  soma += parseInt(CPF.charAt(y)) * (11 - y);
resto = 11 - (soma % 11);
if (resto == 10 || resto == 11) resto = 0;
if (resto != parseInt(CPF.charAt(10)))
  msg = mensagem;
return msg;
}




// CHEGA SE E UM CNPJ VALIDO ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function checa_cnpj(s) {
var mensagem = "informe corretamente o número do CNPJ"
var msg = "";
var y;
var c = s.substr(0,12);
var dv = s.substr(12,2);
var d1 = 0;
for (y = 0; y < 12; y++)
{
d1 += c.charAt(11-y)*(2+(y % 8));
}
if (d1 == 0) msg = mensagem;
d1 = 11 - (d1 % 11);
if (d1 > 9) d1 = 0;
if (dv.charAt(0) != d1)msg = mensagem;
d1 *= 2;
for (y = 0; y < 12; y++)
{
d1 += c.charAt(11-y)*(2+((y+1) % 8));
}
d1 = 11 - (d1 % 11);
if (d1 > 9) d1 = 0;
if (dv.charAt(1) != d1) msg = mensagem;
return msg;
}




// VALIDA ENDERECO MAC ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function valida_mac(String) {
var mensagem = "Informe corretamente o endereco MAC"
var msg = "";
var regex = /^[a-f0-9]{12}$/i;  
if(!regex.test( (String) ))  msg = mensagem;
return msg;
}  




// FUNCOES PARA CONTROLE DE AVANCO EM CAMPOS DE TEXTO ----------------------------------------------------------------------------------------------------------------------------------------
function semTab() {
	checatab = false;
}

function comTab() {
	checatab = true;
} 

checatab = true;

function pula(origem, tamanho, destino) {
	if ((origem.value.length == tamanho) && checatab)
		destino.focus();
}






// GERA UM HASH SHA256 DA STRING --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function SHA256(s){

	var chrsz   = 8;
	var hexcase = 0;

function safe_add (x, y) {
	var lsw = (x & 0xFFFF) + (y & 0xFFFF);
	var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
	return (msw << 16) | (lsw & 0xFFFF);
}

function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
function R (X, n) { return ( X >>> n ); }
function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }

function core_sha256 (m, l) { // array para o hash
	var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
	var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
	var W = new Array(64);
	var a, b, c, d, e, f, g, h, i, j;
	var T1, T2;

	m[l >> 5] |= 0x80 << (24 - l % 32);
	m[((l + 64 >> 9) << 4) + 15] = l;

	for ( var i = 0; i<m.length; i+=16 ) {
		a = HASH[0];
		b = HASH[1];
		c = HASH[2];
		d = HASH[3];
		e = HASH[4];
		f = HASH[5];
		g = HASH[6];
		h = HASH[7];

	for ( var j = 0; j<64; j++) {
		if (j < 16) W[j] = m[j + i];
		else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);

		T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
		T2 = safe_add(Sigma0256(a), Maj(a, b, c));

		h = g;
		g = f;
		f = e;
		e = safe_add(d, T1);
		d = c;
		c = b;
		b = a;
		a = safe_add(T1, T2);
	}

	HASH[0] = safe_add(a, HASH[0]);
	HASH[1] = safe_add(b, HASH[1]);
	HASH[2] = safe_add(c, HASH[2]);
	HASH[3] = safe_add(d, HASH[3]);
	HASH[4] = safe_add(e, HASH[4]);
	HASH[5] = safe_add(f, HASH[5]);
	HASH[6] = safe_add(g, HASH[6]);
	HASH[7] = safe_add(h, HASH[7]);
	}
	return HASH;
}

function str2binb (str) { // passa de string para binario
	var bin = Array();
	var mask = (1 << chrsz) - 1;
	for(var i = 0; i < str.length * chrsz; i += chrsz) {
		bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
	}
	return bin;
}


function Utf8Encode(string) { // usa utf8 para como encode
	string = string.replace(/\r\n/g,"\n");
	var utftext = "";

	for (var n = 0; n < string.length; n++) {

	var c = string.charCodeAt(n);

	if (c < 128) {
		utftext += String.fromCharCode(c);
	}
	else if((c > 127) && (c < 2048)) {
	utftext += String.fromCharCode((c >> 6) | 192);
	utftext += String.fromCharCode((c & 63) | 128);
	}
	else {
	utftext += String.fromCharCode((c >> 12) | 224);
	utftext += String.fromCharCode(((c >> 6) & 63) | 128);
	utftext += String.fromCharCode((c & 63) | 128);
	}

	}

	return utftext;
}

function binb2hex (binarray) { // passa de binario para hexadecimal
	var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
	var str = "";
	for(var i = 0; i < binarray.length * 4; i++) {
		str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
		hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
	}
	return str;
}


s = Utf8Encode(s); // novamente utf8 encode no binario
return binb2hex(core_sha256(str2binb(s), s.length * chrsz));

}





// SSL POR AJAX ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function aSSL() {
if (document.getElementById) // IE5 NN6
document.getElementById("connecting").style.display="none";
document.getElementById("connected").style.display="block";
}




// JavaScript Document ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function link(vlink) {
	window.location.href=vlink;
}

