/* DATA ENCRYPTION */

/* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| BASE64 */

/* : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : variables
- set variables
*/
var END_OF_INPUT = -1;
var base64Chars = 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',
	'+','/'
);

var reverseBase64Chars = new Array();
for (var i=0; i < base64Chars.length; i++) { reverseBase64Chars[base64Chars[i]] = i; }


/* : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : function
- set variables
- basic functions:
	set base64 string
	read string forward
	read string in reverse
	convert a number to a string
*/
var base64Str;	var base64Count;
function setBase64Str(str) {
	base64Str = str;
	base64Count = 0;
}

function readBase64() {
	if (!base64Str) { return END_OF_INPUT; }
	if (base64Count >= base64Str.length) { return END_OF_INPUT; }
	var c = base64Str.charCodeAt(base64Count) & 0xff;
	base64Count++;
	return c;
}

function readReverseBase64(){   
	if (!base64Str) return END_OF_INPUT;
	while (true){	  
		if (base64Count >= base64Str.length) return END_OF_INPUT;
		var nextCharacter = base64Str.charAt(base64Count);
		base64Count++;
		if (reverseBase64Chars[nextCharacter]) {
			return reverseBase64Chars[nextCharacter];
		}
		if (nextCharacter == 'A') return 0;
	}
	return END_OF_INPUT;
}

function ntos(n){
	n = n.toString(16);
	if (n.length == 1) { n = "0" + n; }
	n = "%" + n;
	return unescape(n);
}


/* : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : function
- encode data :: onblur="encodeBase64(document.form[0].element[0].value);"
*/
function encodeBase64(str) {
	setBase64Str(str);
	var result = '';
	var inBuffer = new Array(3);
	var lineCount = 0;
	var done = false;
	while (!done && (inBuffer[0] = readBase64()) != END_OF_INPUT) {
		inBuffer[1] = readBase64();
		inBuffer[2] = readBase64();
		result += (base64Chars[ inBuffer[0] >> 2 ]);
		if (inBuffer[1] != END_OF_INPUT) {
			result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]);
			if (inBuffer[2] != END_OF_INPUT) {
				result += (base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]);
				result += (base64Chars [inBuffer[2] & 0x3F]);
			} else {
				result += (base64Chars [((inBuffer[1] << 2) & 0x3c)]);
				result += ('=');
				done = true;
			}
		} else {
			result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30)]);
			result += ('=');
			result += ('=');
			done = true;
		}
		lineCount += 4;
		if (lineCount >= 76) {
			result += ('\n');
			lineCount = 0;
		}
	}
	return result;
}


/* : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : function
- decrypt data data :: onblur="decodeBase64(document.form[0].element[0].value);"
*/
function decodeBase64(str) {
	setBase64Str(str);
	var result = "";
	var inBuffer = new Array(4);
	var done = false;
	while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT && (inBuffer[1] = readReverseBase64()) != END_OF_INPUT) {
		inBuffer[2] = readReverseBase64();
		inBuffer[3] = readReverseBase64();
		result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
		if (inBuffer[2] != END_OF_INPUT) {
			result +=  ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
			if (inBuffer[3] != END_OF_INPUT) {
				result +=  ntos((((inBuffer[2] << 6)  & 0xff) | inBuffer[3]));
			} else {
				done = true;
			}
		} else {
			done = true;
		}
	}
	return result;
}

/* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| END BASE64 */


/* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| HEX */

/* : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : variables
- set variables
*/
var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');


/* : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : function
- basic functions:
	set hex string
	read string
*/
function toHex(n){
	var result = '';
	var start = true;
	for (var i=32; i>0;) {
		i-=4;
		var digit = (n>>i) & 0xf;
		if (!start || digit != 0)	{
			start = false;
			result += digitArray[digit];
		}
	}
	return (result==''?'0':result);
}

function pad(str, len, pad) {
	var result = str;
	for (var i=str.length; i<len; i++) {
		result = pad + result;
	}
	return result;
}


/* : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : function
- encode data :: onblur="encodeHex(document.form[0].element[0].value);"
*/
function encodeHex(str){
    var result = "";
    for (var i=0; i<str.length; i++) {
        result += pad(toHex(str.charCodeAt(i)&0xff),2,'0');
    }
    return result;
}


/* : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : function
- decrypt data data :: onblur="decodeHex(document.form[0].element[0].value);"
*/
function decodeHex(str){
	str = str.replace(new RegExp("s/[^0-9a-zA-Z]//g"));
	var result = "";
	var nextchar = "";
	for (var i=0; i<str.length; i++) {
		nextchar += str.charAt(i);
		if (nextchar.length == 2) {
			result += ntos(eval('0x'+nextchar));
			nextchar = "";
		}
	}
	return result;  
}

/* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| END HEX */


/* END DATA ENCRYPTION */