// www.NicolaZordan.com 11:54 7/27/2007
//-- CryptNZ

  function EncryptNZ (text,key,seedIn) {
    //if (key!=null) CryptNZkey=key;
    //if (key!=null) CryptNZkey=key.length+key;
    if (key!=null) CryptNZkey=KeyChecksum(key)+key;
    var crypted='';
    var seed=seedIn;
    //if (seed==null) seed=13;
    if(typeof(seed)=='undefined') seed=13;
    var ch;
    var prevCh=null;
    for (var i=0;i<text.length;i++) {
      ch=text.substr(i,1);
      seed=CryptNZseed(seed,i,text.length,prevCh);
      crypted=crypted+CryptNZchar(ch,seed);
      prevCh=ch;
    };
  //alert(text.length+'\n'+crypted.length);
    //return 'ZZZZ';
    return crypted;
  };

  function DecryptNZ (text,key,seedIn) {
    //if (key!=null) CryptNZkey=key;
    //if (key!=null) CryptNZkey=key.length+key;
    if (key!=null) CryptNZkey=KeyChecksum(key)+key;
    var deCrypted='';
    var seed=seedIn;
    //if (seed==null) seed=13;
    if(typeof(seed)=='undefined') seed=13;
    var ch;
    var prevCh=null, deCryptedCh;
    for (var i=0;i<text.length;i++) {
      ch=text.charAt(i,1);
      seed=CryptNZseed(seed,i,text.length,prevCh);
      //deCrypted=deCrypted+DeCryptNZchar(ch,seed);
      //deCrypted=deCrypted+CryptNZchar(ch,seed);
      deCryptedCh=CryptNZchar(ch,seed);
      deCrypted=deCrypted+deCryptedCh;
      prevCh=deCryptedCh;
    };
  //alert(text.length+'\n'+deCrypted.length);
    return deCrypted;
  };



function CryptNZ (text,seedIn) {
  var crypted='';
  var seed=seedIn;
  if (seed==null) seed=13;
  var ch;
  var prevCh=null;
  for (var i=0;i<text.length;i++) {
    ch=text.substr(i,1);
    seed=CryptNZseed(seed,i,text.length,prevCh);
    crypted=crypted+CryptNZchar(ch,seed);
    prevCh=ch;
  };
//alert(text.length+'\n'+crypted.length);
  return crypted;
};

function DeCryptNZ (text,seedIn) {
  var deCrypted='';
  var seed=seedIn;
  if (seed==null) seed=13;
  var ch;
  var prevCh=null, deCryptedCh;
  for (var i=0;i<text.length;i++) {
    ch=text.charAt(i,1);
    seed=CryptNZseed(seed,i,text.length,prevCh);
    //deCrypted=deCrypted+DeCryptNZchar(ch,seed);
    //deCrypted=deCrypted+CryptNZchar(ch,seed);
    deCryptedCh=CryptNZchar(ch,seed);
    deCrypted=deCrypted+deCryptedCh;
    prevCh=deCryptedCh;
  };
//alert(text.length+'\n'+deCrypted.length);
  return deCrypted;
};

//var CryptNZchars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}[];:,./<>?';
//var CryptNZchars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.@'; // 64
//var CryptNZchars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz @'; // 64 [.,;:/()[]{}<>~!@#$%^&*'"`?\|]
//var CryptNZchars='0123456789112345678921234567893123456789412345678951234567896123';
//var CryptNZchars='01234567891123456789212345678931234567894123456789512345678961234567897123456789812345678991234567890123456789112345678921234567'; // 128
//var CryptNZchars='0123456789112345678921234567893123456789412345678951234567896123456789712345678981234567899123456789012345678911234567892123456789312345678941234567895123456789612345678971234567898123456789912345678901234567891123456789212345678931234567894123456789512345'; //256

var CryptNZkey='Nicola';
//var CryptNZchars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz @'; // 64 [.,;:/()[]{}<>~!@#$%^&*'"`?\|]
var CryptNZchars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz @'; // 64
function CryptNZseed(seedIn,i,l,pch) {
  var pchAdd=0;
  if (pch!=null && CryptNZchars.indexOf(pch)>=0) {
    var pchN=pch.charCodeAt(0);
    pchAdd=pchN;
    pchAdd=CryptNZchars.indexOf(pch);
    //pchAdd=CryptNZchars.indexOf(pch);
    //if (pchAdd==-1) pchAdd=0;
    //alert(pchAdd+'\n['+String.fromCharCode(pchAdd)+']');
  };
  var signAdd=CryptNZkey.length;
  if (CryptNZkey.length>0) {
    var signAddIx=i%CryptNZkey.length;
    //signAdd=signAdd+signAddIx+CryptNZkey.charCodeAt(signAddIx);
    //signAdd=signAdd+CryptNZkey.charCodeAt(signAddIx);
    //signAdd=CryptNZkey.length+signAddIx+CryptNZkey.charCodeAt(signAddIx);
    //signAdd=seedIn+i+CryptNZkey.length+signAddIx+CryptNZkey.charCodeAt(signAddIx);
    //signAdd=i+CryptNZkey.length+signAddIx+CryptNZkey.charCodeAt(signAddIx);
    signAdd=seedIn/3+i+CryptNZkey.length+signAddIx+CryptNZkey.charCodeAt(signAddIx);
    //var signAddChar=CryptNZkey.charAt(signAddIx);
    //var signAddCharIx=
    //signAdd=CryptNZchars.indexOf(CryptNZkey.charAt(signAddIx));
  };
  //var seed=seedIn+i*l;
  //var seed=Math.floor(((seedIn+i*l)+7)/2);
  //var seed=Math.floor(((seedIn+i*l)+7)/2+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i)+7)/2+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd)+7)/2+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd*7)+7)*2/2+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd*7)+13)/2+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd*7)+13)+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd*7+l)+13)+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd+l)+13)+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd+l/7)+13)+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd+l+l/7)+13)+CryptNZchars.length);
  //var seed=Math.floor(((seedIn+i+pchAdd+signAdd+l+l/7)+13)+CryptNZchars.length);
  var seed=Math.floor(((seedIn+i+pchAdd+signAdd+signAdd*pchAdd+l+l/7)+13)+CryptNZchars.length);
  //seed=seed%32768;
  //seed=seed%1024;
  //seed=seed%256;
  seed=seed%16384;
//if (i==0) seedArray[seedArray.length]='\n';
////seedArray[seedArray.length]=[i,seed];
//seedArray[seedArray.length]=seed;
//alert(i+'. '+seed+'\n'+seedArray);
  return seed;
};
//var seedArray=[];


function CryptNZchar(ch,seed) {
  if (ch.length!=1) return '';
  var ascii=ch.charCodeAt(0);
  var ich=CryptNZchars.indexOf(ch);
  if (ich==-1) return ch; // do not encrypt
  var sv=seed%64;
  // XOR ^; NOT ~; OR |; AND &;
  //sv=~sv;
  //ascii=ascii^sv;
  //cc=String.fromCharCode(ascii);
  var ech=ich^sv;
  var cc=CryptNZchars.charAt(ech);
  return cc;
};


function CryptNZchar0(ch,seed) {
  if (ch.length<1) return '';
  var ascii=ch.charCodeAt(0);
  var cc='';
  // math with seed
  var sv=seed%256;
  //ascii=ascii+sv;
  //ascii=ascii%256;
  // XOR ^; NOT ~; OR |; AND &;
  //sv=~sv;
  ascii=ascii^sv;
  cc=String.fromCharCode(ascii);
  return cc;
};

function DeCryptNZchar1(ch,seed) {
  if (ch.length<1) return '';
  var ascii=ch.charCodeAt(0);
  var cc='';
  // math with seed
  var sv=seed%256;
  // XOR
  //ascii=ascii-sv;
  ascii=ascii^sv;
  //ascii=ascii%256;
  cc=String.fromCharCode(ascii);
  return cc;
};

  function KeyChecksum(key) {
    var chk='A';
    var sumN=key.length;
    for (var i=0;i<key.length;i++) {
      sumN=sumN ^ key.charCodeAt(i);
    };
    var sv=sumN%64;
    chk=CryptNZchars.charAt(sv);
    return chk;
  };


//-- /CryptNZ
