var cset1="OJUFZBMYGSCXTWRNIQAHDVPLEK"
var cset2="*2176394058"+cset1+" .,;:+-/=()[]!?£$%'@#"
var padding = "            ";

function keyval(key)
{var t=0; 
 key = key.toUpperCase();
 for (s=0;s<5;s++)
 {t = c2n(cset1,key,s);
  if (t==-1) break;}
 if (t==-1)
  {alert("Invalid key " + key + ". Key must consist of five letters (A-Z).");
   return "";}
 else
  return key;}

function c2n(cset,tx,n)
{return cset.indexOf(tx.substring(n,n+1));}

function nordn(x,n)
{while (x>n-1) x-=n;
 return x;}

function norup(x,n)
{while (x<0) x+=n;
 return x;}

function encsym(txt,key)
{var tmp = 0; var tmp2 = 0; var outp = ""; var init = "CRYPT"; 
 var numb1 = 0; var numb2 = 0; var numb3 = 0; var numb4 = 0; var numb5 = 0;
 key = keyval(key);
 if (key != "")
 {if (txt.length%4 != 0)
  txt += padding.substring(0,4-txt.length%4);
  txt = txt.toUpperCase();
  for (s=0;s<txt.length;s+=4)
  {tmp=0;
   numb1 = c2n(cset2,txt,s+1);
   numb1 = (numb1 == -1 ? 0 : numb1); 
   numb2 = c2n(cset2,txt,s+3);
   numb2 = (numb2 == -1 ? 0 : numb2); 
   numb3 = c2n(cset2,txt,s);
   numb3 = (numb3 == -1 ? 0 : numb3); 
   numb4 = c2n(cset2,txt,s+2);
   numb4 = (numb4 == -1 ? 0 : numb4); 
   tmp = numb1 + numb2*58 + numb3*3364 + numb4*195112;
   numb1 = (tmp%26)
   tmp2 = tmp-numb1;
   numb2 = (Math.round(tmp2/26)%26)
   tmp2 -= numb2*26;
   numb3 = (Math.round(tmp2/676)%26)
   tmp2 -= numb3*676
   numb4 = (Math.round(tmp2/17576)%26)
   tmp2 -= numb4*17576;
   numb5 = (Math.round(tmp2/456976)%26)
   numb1 += (c2n(cset1,key,0)+c2n(cset1,init,0));
   numb1 = nordn(numb1,26);
   numb2 += (c2n(cset1,key,1)+c2n(cset1,init,1));
   numb2 = nordn(numb2,26);
   numb3 += (c2n(cset1,key,2)+c2n(cset1,init,2));
   numb3 = nordn(numb3,26);
   numb4 += (c2n(cset1,key,3)+c2n(cset1,init,3));
   numb4 = nordn(numb4,26);
   numb5 += (c2n(cset1,key,4)+c2n(cset1,init,4));
   numb5 = nordn(numb5,26);
   init = cset1.charAt(numb1) + cset1.charAt(numb2) + cset1.charAt(numb3);
   init += cset1.charAt(numb4) + cset1.charAt(numb5) + " ";
   outp += init;}}
 return outp;}

function encasy(txt,keyn)
{//11,881,376
 //assumes the txt is in normalised form "AAAAA" and key is a number
 //some sample key pairs: 7364775-4516601 10875715-1005661 553311-11328065 4309913-7571463
 var trs = 0; var tmp = 0; var tmp2 = 0; var outp = "";
 var numb1 = 0; var numb2 = 0; var numb3 = 0; var numb4 = 0; var numb5 = 0;
 txt = keyval(txt);
 if (txt != "")
 {numb1 = c2n(cset1,txt,0);
  numb2 = c2n(cset1,txt,1);
  numb3 = c2n(cset1,txt,2);
  numb4 = c2n(cset1,txt,3);
  numb5 = c2n(cset1,txt,4);
  tmp = numb1 + numb2*26 + numb3*676 + numb4*17576 + numb5*456976;
  keyn = 1*keyn;
  tmp += keyn;
  tmp = nordn(tmp,11881376);
  numb1 = (tmp%26);
  tmp2 = tmp-numb1;
  numb2 = (Math.round(tmp2/26)%26);
  tmp2 -= numb2*26;
  numb3 = (Math.round(tmp2/676)%26);
  tmp2 -= numb3*676;
  numb4 = (Math.round(tmp2/17576)%26);
  tmp2 -= numb4*17576;
  numb5 = (Math.round(tmp2/456976)%26);
  outp += cset1.charAt(numb1) + cset1.charAt(numb2) + cset1.charAt(numb3);
  outp += cset1.charAt(numb4) + cset1.charAt(numb5);
  return outp;}}

function decsym(txt,key)
{var tmp = 0; var tmp2 = 0; var outp = ""; var init = "CRYPT";
 var numb1 = 0; var numb2 = 0; var numb3 = 0; var numb4 = 0; var numb5 = 0;
 key = keyval(key);
 if (key != "")
 {for (s=0;s<txt.length;s+=6)
  {numb1 = c2n(cset1,txt,s);
   numb2 = c2n(cset1,txt,s+1);
   numb3 = c2n(cset1,txt,s+2);
   numb4 = c2n(cset1,txt,s+3);
   numb5 = c2n(cset1,txt,s+4);
   numb1 -= (c2n(cset1,key,0)+c2n(cset1,init,0));
   numb1 = norup(numb1,26);
   numb2 -= (c2n(cset1,key,1)+c2n(cset1,init,1));
   numb2 = norup(numb2,26);
   numb3 -= (c2n(cset1,key,2)+c2n(cset1,init,2));
   numb3 = norup(numb3,26);
   numb4 -= (c2n(cset1,key,3)+c2n(cset1,init,3));
   numb4 = norup(numb4,26);
   numb5 -= (c2n(cset1,key,4)+c2n(cset1,init,4));
   numb5 = norup(numb5,26);
   init = txt.substring(s,s+5);
   tmp = numb1 + numb2*26 + numb3*676 + numb4*17576 + numb5*456976;
   numb1 = tmp%58;
   tmp2 = tmp-numb1;
   numb2 = (Math.round(tmp2/58))%58;
   tmp2 -= numb2*58;
   numb3 = (Math.round(tmp2/3364))%58;
   tmp2 -= numb3*3364;
   numb4 = (Math.round(tmp2/195112))%58;
   outp += cset2.charAt(numb3) + cset2.charAt(numb1) + cset2.charAt(numb4) + cset2.charAt(numb2);}}
   return outp;}

function hash(txt)
{var tmp = 0; var tmp2 = 0; var outp = ""; 
 var numb1 = 0; var numb2 = 0; var numb3 = 0; var numb4 = 0; var numb5 = 0;
 if (txt.length%12 != 0) txt += padding.substring(0,12-txt.length%12);
 txt = txt.toUpperCase();
 for (s=0;s<txt.length;s+=12)
 {tmp += c2n(cset2,txt,s);
  tmp += c2n(cset2,txt,s+1)*2;
  tmp += c2n(cset2,txt,s+2)*3;
  tmp += c2n(cset2,txt,s+3)*5;
  tmp += c2n(cset2,txt,s+4)*7;
  tmp += c2n(cset2,txt,s+5)*11;
  tmp += c2n(cset2,txt,s+6)*13;
  tmp += c2n(cset2,txt,s+7)*17;
  tmp += c2n(cset2,txt,s+8)*19;
  tmp += c2n(cset2,txt,s+9)*23;
  tmp += c2n(cset2,txt,s+10)*29;
  tmp += c2n(cset2,txt,s+11)*31;}
 numb1 = (tmp%26);
 tmp2 = tmp-numb1;
 numb2 = (Math.round(tmp2/26)%26);
 tmp2 -= numb2*26;
 numb3 = (Math.round(tmp2/676)%26);
 tmp2 -= numb3*676
 numb4 = (Math.round(tmp2/17576)%26);
 tmp2 -= numb4*17576;
 numb5 = (Math.round(tmp2/456976)%26);
 numb1 += numb4;
 numb1 = nordn(numb1,26);
 numb2 += numb1;
 numb2 = nordn(numb2,26);
 numb3 += numb1;
 numb3 = nordn(numb3,26);
 numb4 += numb1+3;
 numb4 = nordn(numb4,26);
 numb5 += numb1+14;
 numb5 = nordn(numb5,26);
 outp += cset1.charAt(numb1) + cset1.charAt(numb2) + cset1.charAt(numb3);
 outp += cset1.charAt(numb4) + cset1.charAt(numb5) + " ";
 return outp;}