function base64(c)
{
	var theChar = 0;
	if (0 <= c && c <= 25) {
		theChar = String.fromCharCode(c + 65);
	} else if (26 <= c && c <= 51) {
		theChar = String.fromCharCode(c - 26 + 97);
	} else if (52 <= c && c <= 61) {
		theChar = String.fromCharCode(c - 52 + 48);
	} else if (c == 62) {
		theChar = '+';
	} else if( c == 63 ) {
		theChar = '/';
	} else {
		theChar = String.fromCharCode(0xFF);
	}
	return theChar;
}

function baseEncode(str) {
	var result = "";
	var i = 0;
	var sextet = 0;
	var leftovers = 0;
	var octet = 0;

	for (i=0; i < str.length; i++) {
		octet = str.charCodeAt(i);
		switch( i % 3 )
		{
			case 0:
			{
				sextet = ( octet & 0xFC ) >> 2 ;
				leftovers = octet & 0x03 ;
				break;
			}
			case 1:
			{
				sextet = ( leftovers << 4 ) | ( ( octet & 0xF0 ) >> 4 );
				leftovers = octet & 0x0F ;
				break;
			}
			case 2:
			{
				sextet = ( leftovers << 2 ) | ( ( octet & 0xC0 ) >> 6 ) ;
				leftovers = ( octet & 0x3F ) ;
				break;
			}
		}
		result = result + base64(sextet);
		if( (i % 3) == 2 )
		{
			result = result + base64(leftovers);
		} 
	}

	switch( str.length % 3 )
	{
		case 0:
		{
			break ;
		}
		case 1:
		{
			leftovers =  leftovers << 4 ;
			result = result + base64(leftovers);
			result = result + "==";
			break ;
		}
		case 2:
		{
			leftovers = leftovers << 2 ;
			result = result + base64(leftovers);
			result = result + "=";
			break ;
		}
	}
	return result.toString();
}

