function AJAX_B64_urlDecode(str){
    str=str.replace(new RegExp('\\+','g'),' ');
    return unescape(str);
}
function AJAX_B64_urlEncode(str){
    str=escape(str);
    str=str.replace(new RegExp('\\+','g'),'%2B');
    return str.replace(new RegExp('%20','g'),'+');
}

var AJAX_B64_END_OF_INPUT = -1;

var AJAX_B64_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 AJAX_B64_reverseBase64Chars = new Array();
for (var i=0; i < AJAX_B64_base64Chars.length; i++){
    AJAX_B64_reverseBase64Chars[AJAX_B64_base64Chars[i]] = i;
}

var AJAX_B64_base64Str;
var AJAX_B64_base64Count;
function AJAX_B64_setBase64Str(str){
    AJAX_B64_base64Str = str;
    AJAX_B64_base64Count = 0;
}
function AJAX_B64_readBase64(){    
    if (!AJAX_B64_base64Str) return AJAX_B64_END_OF_INPUT;
    if (AJAX_B64_base64Count >= AJAX_B64_base64Str.length) return AJAX_B64_END_OF_INPUT;
    var c = AJAX_B64_base64Str.charCodeAt(AJAX_B64_base64Count) & 0xff;
    AJAX_B64_base64Count++;
    return c;
}
function AJAX_B64_encodeBase64(str){
    AJAX_B64_setBase64Str(str);
    var AJAX_B64_result = '';
    var AJAX_B64_inBuffer = new Array(3);
    var AJAX_B64_lineCount = 0;
    var AJAX_B64_done = false;
    while (!AJAX_B64_done && (AJAX_B64_inBuffer[0] = AJAX_B64_readBase64()) != AJAX_B64_END_OF_INPUT){
        AJAX_B64_inBuffer[1] = AJAX_B64_readBase64();
        AJAX_B64_inBuffer[2] = AJAX_B64_readBase64();
        AJAX_B64_result += (AJAX_B64_base64Chars[ AJAX_B64_inBuffer[0] >> 2 ]);
        if (AJAX_B64_inBuffer[1] != AJAX_B64_END_OF_INPUT){
            AJAX_B64_result += (AJAX_B64_base64Chars [(( AJAX_B64_inBuffer[0] << 4 ) & 0x30) | (AJAX_B64_inBuffer[1] >> 4) ]);
            if (AJAX_B64_inBuffer[2] != AJAX_B64_END_OF_INPUT){
                AJAX_B64_result += (AJAX_B64_base64Chars [((AJAX_B64_inBuffer[1] << 2) & 0x3c) | (AJAX_B64_inBuffer[2] >> 6) ]);
                AJAX_B64_result += (AJAX_B64_base64Chars [AJAX_B64_inBuffer[2] & 0x3F]);
            } else {
                AJAX_B64_result += (AJAX_B64_base64Chars [((AJAX_B64_inBuffer[1] << 2) & 0x3c)]);
                AJAX_B64_result += ('=');
                AJAX_B64_done = true;
            }
        } else {
            AJAX_B64_result += (AJAX_B64_base64Chars [(( AJAX_B64_inBuffer[0] << 4 ) & 0x30)]);
            AJAX_B64_result += ('=');
            AJAX_B64_result += ('=');
            AJAX_B64_done = true;
        }
        AJAX_B64_lineCount += 4;
        if (AJAX_B64_lineCount >= 76){
            AJAX_B64_result += ('\n');
            AJAX_B64_lineCount = 0;
        }
    }
    return AJAX_B64_result;
}
function AJAX_B64_readReverseBase64(){   
    if (!AJAX_B64_base64Str) return AJAX_B64_END_OF_INPUT;
    while (true){      
        if (AJAX_B64_base64Count >= AJAX_B64_base64Str.length) return AJAX_B64_END_OF_INPUT;
        var AJAX_B64_nextCharacter = AJAX_B64_base64Str.charAt(AJAX_B64_base64Count);
        AJAX_B64_base64Count++;
        if (AJAX_B64_reverseBase64Chars[AJAX_B64_nextCharacter]){
            return AJAX_B64_reverseBase64Chars[AJAX_B64_nextCharacter];
        }
        if (AJAX_B64_nextCharacter == 'A') return 0;
    }
    return AJAX_B64_END_OF_INPUT;
}

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

function AJAX_B64_decodeBase64(str){
    AJAX_B64_setBase64Str(str);
    var AJAX_B64_result = "";
    var AJAX_B64_inBuffer = new Array(4);
    var AJAX_B64_done = false;
    while (!AJAX_B64_done && (AJAX_B64_inBuffer[0] = AJAX_B64_readReverseBase64()) != AJAX_B64_END_OF_INPUT
        && (AJAX_B64_inBuffer[1] = AJAX_B64_readReverseBase64()) != AJAX_B64_END_OF_INPUT){
        AJAX_B64_inBuffer[2] = AJAX_B64_readReverseBase64();
        AJAX_B64_inBuffer[3] = AJAX_B64_readReverseBase64();
        AJAX_B64_result += AJAX_B64_ntos((((AJAX_B64_inBuffer[0] << 2) & 0xff)| AJAX_B64_inBuffer[1] >> 4));
        if (AJAX_B64_inBuffer[2] != AJAX_B64_END_OF_INPUT){
            AJAX_B64_result +=  AJAX_B64_ntos((((AJAX_B64_inBuffer[1] << 4) & 0xff)| AJAX_B64_inBuffer[2] >> 2));
            if (AJAX_B64_inBuffer[3] != AJAX_B64_END_OF_INPUT){
                AJAX_B64_result +=  AJAX_B64_ntos((((AJAX_B64_inBuffer[2] << 6)  & 0xff) | AJAX_B64_inBuffer[3]));
            } else {
                AJAX_B64_done = true;
            }
        } else {
            AJAX_B64_done = true;
        }
    }
    return AJAX_B64_result;
}

var AJAX_B64_digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function AJAX_B64_toHex(n){
    var AJAX_B64_result = ''
    var AJAX_B64_start = true;
    for (var i=32; i>0;){
        i-=4;
        var AJAX_B64_digit = (n>>i) & 0xf;
        if (!AJAX_B64_start || AJAX_B64_digit != 0){
            AJAX_B64_start = false;
            AJAX_B64_result += AJAX_B64_digitArray[AJAX_B64_digit];
        }
    }
    return (AJAX_B64_result==''?'0':AJAX_B64_result);
}

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

function AJAX_B64_encodeHex(str){
    var AJAX_B64_result = "";
    for (var i=0; i<str.length; i++){
        AJAX_B64_result += pad(AJAX_B64_toHex(str.charCodeAt(i)&0xff),2,'0');
    }
    return AJAX_B64_result;
}

function AJAX_B64_decodeHex(str){
    str = str.replace(new RegExp("s/[^0-9a-zA-Z]//g"));
    var AJAX_B64_result = "";
    var AJAX_B64_nextchar = "";
    for (var i=0; i<str.length; i++){
        AJAX_B64_nextchar += str.charAt(i);
        if (AJAX_B64_nextchar.length == 2){
            AJAX_B64_result += AJAX_B64_ntos(eval('0x'+AJAX_B64_nextchar));
            AJAX_B64_nextchar = "";
        }
    }
    return AJAX_B64_result;
    
}
