function Rc4B64Class() {var sbox = new Array(256);var key = new Array(256);var keyStr = "ABCDEFGHIJKLMNOP" +                "QRSTUVWXYZabcdef" +                "ghijklmnopqrstuv" +                "wxyz0123456789+/" +                "=";                this.Encrypt = _RC4Enc;this.Decrypt = _RC4Dec;this.Raw     = _RC4Raw;//this.Enc64 = encode64;this.f1 = encode64;this.f2 = decode64;this.f3 = encodeURIComponentNew;this.f4 = _RC4;//this.f5 = ;function _RC4Enc(strTexto,strClave){	return encodeURIComponentAscii(encode64(_RC4(strTexto,strClave)))//	return encodeURIComponentNew(encode64(_RC4(strTexto,strClave)))//	return encode64(_RC4(strTexto,strClave))//	return _RC4(decode64(encode64(_RC4(strTexto,strClave))),strClave)}function _RC4Dec(strTexto,strClave){	return _RC4(decode64(strTexto),strClave)}function InicializarRC4(strLlave) {	// Contadores	var a, b, tempSwap;	// Initialize key[] and sbox[]	// key[]: With the Unicode values of the key until 256.	// sbox[]: With numbers 0 - 255.	// this was originally 1-255 -- I changed it to match the C# code.  lk	for (a = 0; a < 128; a++) {		key[a] = ((strLlave.charCodeAt(a % strLlave.length)) % 128);		sbox[a] = a;	}	// Re-order the array sbox[] from the private key.	// Iterating each element of sbox[] re-calculate the counter 'b'	// Then we do the swap	// This is, interchange the element in sbox[a] by sbox[b]	b = 0;	for (a = 0; a < 128; a++) {		b = (b + sbox[a] + key[a]) % 128;		tempSwap = sbox[a];		sbox[a] = sbox[b];		sbox[b] = tempSwap;	}	// This gives a new order to elements in sbox[]	// This is a permutation calculated from the private key.//document.forms[0].d7.value = document.forms[0].d7.value + "\nsbox[4]=" + sbox[4]//document.forms[0].d7.value = document.forms[0].d7.value + "\nkey[45]=" + key[45]}function _RC4(strTexto,strClave) {	// Variables	var i, j, k, temp, cipherby, cipher;	i = 0;	j = 0;	cipher = "";	temp = 0;	// Inicialize key	InicializarRC4(strClave);	// Cipher stage:	// For each byte of the message (from a = 0 until a = message length)	// We calculate the variables i, j.	// Then we swap sbox[i] and sbox[j]	// Finally, we calculate the variable cipherby and the byte is ciphered.	for (a = 0; a < strTexto.length; a++) {		i = (i + 1) % 128;		j = (j + sbox[i]) % 128;		temp = sbox[i];		sbox[i] = sbox[j];		sbox[j] = temp;		k = sbox[(sbox[i] + sbox[j]) % 128];		cipherby = strTexto.charCodeAt(a) ^ k;		cipher = cipher + String.fromCharCode(cipherby);//document.forms[0].d7.value = document.forms[0].d7.value + "\na=" + a + ", cipherby=" +cipherby//document.forms[0].d7.value = document.forms[0].d7.value + "\nj=" + j//document.forms[0].d7.value = document.forms[0].d7.value + "\nk=" + k//document.forms[0].d7.value = document.forms[0].d7.value + "\nsbox[i]=" + sbox[i]//document.forms[0].d7.value = document.forms[0].d7.value + "\nsbox[j]=" + sbox[j]//document.forms[0].d7.value = document.forms[0].d7.value + "\n(sbox[i] + sbox[j]) % 128 = " + (sbox[i] + sbox[j]) % 128	}document.forms[0].d7.value = document.forms[0].d7.value + "\nRC4=" + cipherdocument.forms[0].d7.value = document.forms[0].d7.value + "\nlen(RC4)=" + cipher.length	return(cipher);}function _RC4Raw(strTexto,strClave) {	// Variables	var i, j, k, temp, cipherby, cipher;	i = 0;	j = 0;	cipher = "";	temp = 0;	// Inicialize key	InicializarRC4(strClave);	// Cipher stage:	// For each byte of the message (from a = 0 until a = message length)	// We calculate the variables i, j.	// Then we swap sbox[i] and sbox[j]	// Finally, we calculate the variable cipherby and the byte is ciphered.	for (a = 0; a < strTexto.length; a++) {		i = (i + 1) % 128;		j = (j + sbox[i]) % 128;		temp = sbox[i];		sbox[i] = sbox[j];		sbox[j] = temp;		k = sbox[(sbox[i] + sbox[j]) % 128];		cipherby = strTexto.charCodeAt(a) ^ k;		if (a > 0) {		    cipher = cipher + ", ";		}		cipher = cipher + cipherby;	}	return(cipher);}// encode a string in base64function encode64(input) {//document.forms[0].d7.value = document.forms[0].d7.value + "\nStarting encode64. input=" + input//document.forms[0].d7.value = document.forms[0].d7.value + "\nlen(input)=" + input.length//document.forms[0].d7.value = document.forms[0].d7.value + "\nzeroth char is " + input.charCodeAt(0)//document.forms[0].d7.value = document.forms[0].d7.value + "\noneth char is " + input.charCodeAt(1)      var output = "";      var chr1, chr2, chr3 = "";      var enc1, enc2, enc3, enc4 = "";      var i = 0;            // this line is necessary!  fixes problem with encoding.  lk//      input=utf8(input);      do {         chr1 = input.charCodeAt(i++);         chr2 = input.charCodeAt(i++);         chr3 = input.charCodeAt(i++);         enc1 = chr1 >> 2;         enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);         enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);         enc4 = chr3 & 63;         if (isNaN(chr2)) {            enc3 = enc4 = 64;         } else if (isNaN(chr3)) {            enc4 = 64;         }         output = output +             keyStr.charAt(enc1) +             keyStr.charAt(enc2) +             keyStr.charAt(enc3) +             keyStr.charAt(enc4);//document.forms[0].d7.value = document.forms[0].d7.value + "\n" + chr1 + " " + chr2 + " " + chr3//document.forms[0].d7.value = document.forms[0].d7.value + "\n" + enc1 + enc2 + enc3 + enc4         chr1 = chr2 = chr3 = "";         enc1 = enc2 = enc3 = enc4 = "";      } while (i < input.length);      return output;   }// decode a base64 stringfunction decode64(input) {      var output = "";      var chr1, chr2, chr3 = "";      var enc1, enc2, enc3, enc4 = "";      var i = 0;      // remove all characters that are not A-Z, a-z, 0-9, +, /, or =      var base64test = /[^A-Za-z0-9\+\/\=]/g;      if (base64test.exec(input)) {         Response.write("There were invalid base64 characters in the input text.\n" +               "Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '='\n" +               "Expect errors in decoding.");      }      input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");      do {         enc1 = keyStr.indexOf(input.charAt(i++));         enc2 = keyStr.indexOf(input.charAt(i++));         enc3 = keyStr.indexOf(input.charAt(i++));         enc4 = keyStr.indexOf(input.charAt(i++));         chr1 = (enc1 << 2) | (enc2 >> 4);         chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);         chr3 = ((enc3 & 3) << 6) | enc4;         output = output + String.fromCharCode(chr1);         if (enc3 != 64) {            output = output + String.fromCharCode(chr2);         }         if (enc4 != 64) {            output = output + String.fromCharCode(chr3);         }         chr1 = chr2 = chr3 = "";         enc1 = enc2 = enc3 = enc4 = "";      } while (i < input.length);      return output;}/* ***************************** Most of this code was kindly ** provided to me by** Andrew Clover (and at doxdesk dot com)** http://and.doxdesk.com/ ** in response to my plea in my blog at ** http://worldtimzone.com/blog/date/2002/09/24** It was unclear whether he created it.** Converts a string to UTF-8 encoding.*/function utf8(wide) {  var c, s;  var enc = "";  var i = 0;  while(i<wide.length) {    c= wide.charCodeAt(i++);    // handle UTF-16 surrogates    if (c>=0xDC00 && c<0xE000) continue;    if (c>=0xD800 && c<0xDC00) {      if (i>=wide.length) continue;      s= wide.charCodeAt(i++);      if (s<0xDC00 || c>=0xDE00) continue;      c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000;    }    // output value    if (c<0x80) enc += String.fromCharCode(c);    else if (c<0x800) enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F));    else if (c<0x10000) enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F));    else enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+(c&0x3F));  }  return enc;}var hexchars = "0123456789ABCDEF";function toHex(n) {  return hexchars.charAt(n>>4)+hexchars.charAt(n & 0xF);}var okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";function encodeURIComponentNew(s) {  var s = utf8(s);  var c;  var enc = "";  for (var i= 0; i<s.length; i++) {    if (okURIchars.indexOf(s.charAt(i))==-1)      enc += "%"+toHex(s.charCodeAt(i));    else      enc += s.charAt(i);  }  return enc;}function encodeURIComponentAscii(s) {  //var s = utf8(s);  var c;  var enc = "";  for (var i= 0; i<s.length; i++) {    if (okURIchars.indexOf(s.charAt(i))==-1)      enc += "%"+toHex(s.charCodeAt(i));    else      enc += s.charAt(i);  }  return enc;}function buildURL(fld){	if (fld == "") return false;	var encodedField = "";	var s = fld;	if (typeof encodeURIComponent == "function")	{		// Use JavaScript built-in function		// IE 5.5+ and Netscape 6+ and Mozilla		encodedField = encodeURIComponent(s);	}	else 	{		// Need to mimic the JavaScript version		// Netscape 4 and IE 4 and IE 5.0		encodedField = encodeURIComponentNew(s);	}	alert ("New encoding: " + encodeURIComponentNew(fld) +		 "\n           escape(): " + escape(fld));	return true;}}
