
var hexcase = 0;

function hex_md5(s,key){ return binl2hex(Amc_encode(s, Amc(key)),key);}
function md5_hex(s,key){ return Amc_decode(hex2binl(s),Amc(key));}
function hex_md51(s,key){ return Amc_encode(s, Amc(key));}
function md5_hex1(s,key){ return hex2binl(s);}


function Amc(key){
	var keycode = 0;
	for (var i = 0 ; i < key.length-1 ; i++ ){
		keycode += key.charCodeAt(i) + (key.charCodeAt(i+1)) + i ;
	}
	return String.fromCharCode(((keycode)%26) + 97);
}

function Amc_encode(str,key){
	var strl = str.length;
	var at =  Array();
	for (var i = 0; i < str.length ; i++){
		at[i*2] = safe_add(str.charCodeAt(i), key);
		at[(i*2)+1] = safe_add1(str.charCodeAt(i), key);
	}
	return at;
}


function binl2hex(binarray)
{
  var hex_tab = hexcase ? "E2NYUQOK7B4XPWZG8ILMD6F50VSTJA931RHC" : "e2nyuqok7b4xpwzg8ilmd6f50vstja931rhc";
  var str = "";
  for(var i = 0; i < binarray.length ; i++)
  {
    str += hex_tab.charAt(binarray[i]);
       
  }
    
  return str;
}

function hex2binl(str)
{
  var hex_tab = hexcase ? "E2NYUQOK7B4XPWZG8ILMD6F50VSTJA931RHC" : "e2nyuqok7b4xpwzg8ilmd6f50vstja931rhc";
	var at = Array();
	 for (var i = 0; i < str.length ; i++){
		at[i] = hex_tab.indexOf(str.charAt(i));
	}
  return at;
}

function safe_add(x,key)
{
  return (x+(key.charCodeAt(0) % 43))%36;
}
function safe_add1(x,key)
{
  return Math.floor((x+(key.charCodeAt(0) % 43))/36);
}

function Amc_decode(array,key){
	
	var totalstr = "";
	var str = "";
	for (i=0; i<array.length ;i+=2 ){
		str = String.fromCharCode((array[i] + array[i+1]*36)-(key.charCodeAt(0)%43));
		totalstr += str;
	}	

	  return totalstr;	
}
