/**
* base64 v1.00 Friday, 29 October 2004
* 
* Funzioni di codifica e decodifica in Base64
*
* Copyright (c) 2004 Bonomo Giuseppe <moya@email.it>
*
*/

var b64chars = 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 b64revchars = new Array();

for (i=0; i<b64chars.length; i++) { 
	b64revchars[b64chars[i]] = i;
}

var b64trail = "=";
b64revchars[b64trail] = 255;

function b64encode(data) {
	
	var bytes3 = '';
	var result = '';
	var triples = Math.floor(data.length/3);
	var carry = data.length - (triples*3);

	for (i=0; i<triples; i++) { 
		bytes3 = data.charCodeAt(i*3) * 65536 + data.charCodeAt(i*3+1) * 256 + data.charCodeAt(i*3+2);
		result += b64chars[bytes3 >> 18] + b64chars[(bytes3 >> 12) & 63] + b64chars[(bytes3 >> 6) & 63] + b64chars[bytes3 & 63];
	}

	if (carry == 1) {
		bytes3 = data.charCodeAt(triples*3) * 65536;
		result += b64chars[bytes3 >> 18] + b64chars[(bytes3 >> 12) & 63] + b64trail + b64trail;
	}
	
	if (carry == 2) {
		bytes3 = data.charCodeAt(triples*3) * 65536 + data.charCodeAt(i*3+1) * 256;
		result += b64chars[bytes3 >> 18] + b64chars[(bytes3 >> 12) & 63] + b64chars[(bytes3 >> 6) & 63] + b64trail;
	}
	
	return result;
}

function b64decode(data) {
	
	var bytes3 = '';
	var result = '';
	var trails = 0;
	var quadruples = Math.floor(data.length/4);
	if (data.substr(data.length-2,2) == "==") { trails = 2; } else if (data.substr(data.length-1,1) == "=") {  trails = 1; }

	for (i=0; i<quadruples; i++) { 
		bytes3 = (b64revchars[data.charAt(i*4)] << 18) + (b64revchars[data.charAt(i*4+1)] << 12) + (b64revchars[data.charAt(i*4+2)] << 6) + b64revchars[data.charAt(i*4+3)];
		result += String.fromCharCode(bytes3 >> 16 , (bytes3 >> 8) & 255 , bytes3 & 255);
	}
	
	for (i=0; i<trails; i++) { result = result.substr(0,result.length-1); }
	
	return result;
}
