//Javascryptor by Michel Chilowicz <michel@netastuces.org>
//Under GNU-GPL Licence (cf http://www.gnu.org)
//http://www.netastuces.org/new/?page=javascrypteur

values64 = new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
"P","Q","R","S","T","U","V","W","X","Y","Z",
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o",
"p","q","r","s","t","u","v","w","x","y","z",
"0","1","2","3","4","5","6","7","8","9","+","/");

function base64_encode(tab)
{
  var resultat ="";
  for (i=0;i<tab.length+1;i+=3)
  {
    if (tab.length < (i+1)) //==i
    {
      return resultat;
    } else if (tab.length == (i+1))
    {
      resultat+=values64[tab[i] >> 2]+values64[(tab[i] << 4)&48]+"==";
      return resultat;
    } else if (tab.length == (i+2))
    {
      resultat+=values64[tab[i] >> 2]+values64[((tab[i] << 4)&48) | (tab[i+1] >> 4)]+values64[(tab[i+1] << 2)&60]+"=";
      return resultat;
    } else
    {
      resultat+=values64[tab[i] >> 2]+values64[((tab[i] << 4)&48) | (tab[i+1] >> 4)]+values64[((tab[i+1] << 2)&60) | (tab[i+2] >>6)]+values64[tab[i+2]&63];
    }
  }
}

function base64_filter(text)
{
  var resultat = "";
  for (i=0;i<text.length;i++)
  {
    var ordinal = text.charCodeAt(i);
    if (((ordinal>47) && (ordinal<58)) || ((ordinal>64) && (ordinal<91)) || ((ordinal>96) && (ordinal<123)) || (ordinal==43) || (ordinal==47) || (ordinal==61))
    {
      resultat+=text.substr(i,1);
    }
  }
  return resultat;
}

function let2num(let)
{
  var ordinal = let;
  if ((ordinal>47) && (ordinal<58)) return (ordinal +4);
  if ((ordinal>64) && (ordinal<91)) return (ordinal-65);
  if ((ordinal>96) && (ordinal<123)) return (ordinal-71);
  if (ordinal==43) return 62;
  if (ordinal==47) return 63;
  if (ordinal==61) return -1;
  return -1;
}


function base64_decode(text)
{
  var j=0;
  data = new Array();
  text = base64_filter(text);
  for (i=0;i<text.length;i+=4)
  {
    var car0 = let2num(text.charCodeAt(i));
    var car1 = let2num(text.charCodeAt(i+1));
    var car2 = let2num(text.charCodeAt(i+2));
    var car3 = let2num(text.charCodeAt(i+3));
    if ((car0 > -1) && (car1>-1)) data[j++] = (car0 << 2) | (car1 >> 4);
    if ((car1 > -1) && (car2>-1)) data[j++] = ((car1 & 15) << 4) | (car2 >> 2);
    if ((car2 > -1) && (car3>-1)) data[j++] = ((car2 & 3) << 6) | (car3);
  }
  return data;
}

function encode_text(text)
{
  var data = new Array();
  for (i=0;i<text.length;i++) data[i] = text.charCodeAt(i);
  return base64_encode(data);
}

function decode_text(text)
{
  var data = new Array();
  var resultat = '';
  data = base64_decode(text);
  for (i=0;i<data.length;i++) resultat+=String.fromCharCode(data[i]);
  return resultat;
}

function mc4(data,key)
{
  var tab1 = new Array();
  var tab2 = new Array();
  var resultat = new Array();
  for (i=0;i<256;i++)
  {
    tab1[i] = i;
    tab2[i] = key[i%(key.length)];
  }
  var j=0;
  for (var i=0;i<256;i++)
  {
    j= (j+ tab1[i] + tab2[j])%256;
    var temp = tab1[i];
    tab1[i] = tab1[j];
    tab1[j] = temp;
  }
  i=0;j=0;
  for (var k=0;k<data.length;k++)
  {
    i = (i+1)%256;
    j = (j+tab1[i])%256;
    var temp = tab1[i];
    tab1[i] = tab1[j];
    tab1[j] = temp;
    resultat[k] = data[k] ^ tab1[(tab1[i] + tab1[j])%256];
  }
  return resultat;
}

function octet_alea()
{
  return (Math.floor(Math.random()*256));
}

function crypt_text(text,password)
{
  var data = new Array();
  var key = new Array();
  var hash = new Array();

  //data[0] = 19;data[1] = 29;
  //key[0] = 17;key[1] = 25;
  //data = mc4(data,key);
  //data = mc4(data,key);
  //alert(data[1]);

  for (var i=0;i<8;i++)
  {
    data[i] = 0;
    key[i] = octet_alea();
  }
  for (var j=0;j<text.length;j++) data[i+j] = text.charCodeAt(j);
  for (var j=0;j<password.length;j++) key[i+j] = password.charCodeAt(j);
  hash = calcmd5(key,0);
  data = mc4(data,hash);
  for (var i=0;i<8;i++) data[i] = key[i];
  resultat = base64_encode(data);
  return resultat;
}

function decrypt_text(text,password)
{
  var data = new Array();
  var key = new Array();
  var hash = new Array();
  data = base64_decode(text);
  for (i=0;i<8;i++)
  {
    key[i] = data[i];
  }
  //data = data.slice(8,data.length);
  for (j=0;j<password.length;j++) key[i+j] = password.charCodeAt(j);
  hash = calcmd5(key,0);
  data = mc4(data,hash);
  var resultat = "";
  for (i=8;i<data.length;i++) resultat+=String.fromCharCode(data[i]);
  return resultat;
}