﻿

var b64s='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var f64;

function b64arrays() {
	if (!f64) {
		f64 = [];
		for (var i=0; i<b64s.length ;i++) {
			f64[b64s.charAt(i)] = i;
		}
	}
}

function decode_utf8(utftext)
{
    var plaintext = ""; var i=0; var c=c1=c2=0;
    while(i<utftext.length)
        {
        c = utftext[i];
        if (c<128) {
            plaintext += String.fromCharCode(c);
            i++;}
        else
       {
            c2 = utftext[i+1];
 	   if((c>191) && (c<224)) {
            plaintext += String.fromCharCode(((c&31)<<6) | (c2&63));
            i+=2;}
        else {
            c3 = utftext[i+2];
            plaintext += String.fromCharCode(((c&15)<<12) | ((c2&63)<<6) | (c3&63));
            i+=3;}
        }
       }
    return plaintext;
}

function b64t2d(t) {
	b64arrays();
     var d=[]; var i=0;
     t=t.replace(/\n|\r/g,""); t=t.replace(/=/g,"");
     while (i<t.length)
         {
         d[d.length] = (f64[t.charAt(i)]<<2) | (f64[t.charAt(i+1)]>>4);
         d[d.length] = (((f64[t.charAt(i+1)]&15)<<4) | (f64[t.charAt(i+2)]>>2));
         d[d.length] = (((f64[t.charAt(i+2)]&3)<<6) | (f64[t.charAt(i+3)]));
         i+=4;
         }
     if (t.length%4 == 2)
         d = d.slice(0, d.length-2);
     if (t.length%4 == 3)
         d = d.slice(0, d.length-1);
	return d;
}

var decryption_cache = new Array();

function decrypt_string(crypted_string,decryption_key) {
	var cache_index = "'"+crypted_string+"'";

	if(decryption_cache[cache_index])
		return decryption_cache[cache_index];

	var data = b64t2d(crypted_string);	

	for (var i=0; i<data.length ;i++) {
		data[i] = data[i] ^ decryption_key;
	}

	var decrypted_string = decode_utf8(data);

	decryption_cache[cache_index] = decrypted_string;

	return decrypted_string;
}

function decrypt_and_echo(crypted_string,decryption_key) {
	document.write(decrypt_string(crypted_string,decryption_key));
}

