function ntos(n){
    n=n.toString(16);
    if (n.length == 1) n="0"+n;
    n="%"+n;
    return unescape(n);
}

var digitArray = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
		'a', 'b', 'c', 'd', 'e', 'f');
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 encodeHex(str) {
	var result = "";
	for ( var i = 0; i < str.length; i++) {
		result += pad(toHex(str.charCodeAt(i) & 0xff), 2, '0');
	}
	return result;
}

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;

}

function base64_encode(str)
{
	return encodeHex(str);
}

function base64_decode(str)
{
	return decodeHex(str);
}
