/* base64 encode/decode system compatible with php base64_encode and base64_decode
 *
 * usage: encode = base64.encode( "mymessage" );
 *        decode = base64.decode( encode );
 *
 * Version: 1.00.09
 */
var base64 = {
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    
    encode : function( string ) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;
 
        string = base64._utf8_encode( string );
 
        while ( i < string.length ) {
 
            chr1 = string.charCodeAt( i++ );
            chr2 = string.charCodeAt( i++ );
            chr3 = string.charCodeAt( i++ );
 
            enc1 = chr1 >> 2;
            enc2 = ( ( chr1 & 3 ) << 4 ) | ( chr2 >> 4 );
            enc3 = ( ( chr2 & 15 ) << 2 ) | ( chr3 >> 6 );
            enc4 = chr3 & 63;
 
            if ( isNaN( chr2 ) ) {
                enc3 = enc4 = 64;
            } else if ( isNaN( chr3 ) ) {
                enc4 = 64;
            }
 
            output = output +
            this._keyStr.charAt( enc1 ) + this._keyStr.charAt( enc2 ) +
            this._keyStr.charAt( enc3 ) + this._keyStr.charAt( enc4 );
 
        }
 
        return output;
    },
    
    decode : function( string ) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
 
        string = str.replace( /[^A-Za-z0-9\+\/\=]/g, "", string );
 
        while ( i < string.length ) {
 
            enc1 = this._keyStr.indexOf( string.charAt( i++ ) );
            enc2 = this._keyStr.indexOf( string.charAt( i++ ) );
            enc3 = this._keyStr.indexOf( string.charAt( i++ ) );
            enc4 = this._keyStr.indexOf( string.charAt( i++ ) );
 
            chr1 = ( enc1 << 2 ) | ( enc2 >> 4 );
            chr2 = ( ( enc2 & 15 ) << 4 ) | ( enc3 >> 2 );
            chr3 = ( ( enc3 & 3 ) << 6 ) | enc4;
 
            output = output + String.fromCharCode(chr1);
 
            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }
 
        }
 
        output = base64._utf8_decode(output); 
        return output;
    },
    
    _utf8_encode : function( string ) {
        string = str.replace( /\r\n/g, "\n", string );
        var utftext = "";
        
        for ( var i = 0; i < string.length; i++ ) {
            var _charStr = string.charCodeAt( i );
            
            if ( _charStr < 128 ) {
                utftext += String.fromCharCode( _charStr );
            }
            else if ( ( _charStr > 127 ) && ( _charStr < 2048 ) ) {
                utftext += String.fromCharCode( ( _charStr >> 6 ) | 192 );
                utftext += String.fromCharCode( ( _charStr & 63 ) | 128 );
            }
            else {
                utftext += String.fromCharCode( ( _charStr >> 12 ) | 224 );
                utftext += String.fromCharCode( ( ( _charStr >> 6 ) & 63 ) | 128);
                utftext += String.fromCharCode( ( _charStr & 63 ) | 128 );
            }
        }
        
        return utftext;
    },
    
    _utf8_decode : function( string ) {
        var output = "";
        var i = 0;
        var c = c1 = c2 = 0;
 
        while ( i < string.length ) {
 
            c = string.charCodeAt( i );
 
            if ( c < 128 ) {
                output += String.fromCharCode(c);
                i++;
            }
            else if ( ( c > 191 ) && ( c < 224 ) ) {
                c2 = string.charCodeAt( i + 1 );
                output += String.fromCharCode( ( ( c & 31 ) << 6 ) | ( c2 & 63 ) );
                i += 2;
            }
            else {
                c2 = string.charCodeAt( i + 1 );
                c3 = string.charCodeAt( i + 2 );
                output += String.fromCharCode( ( ( c & 15 ) << 12 ) | ( ( c2 & 63 ) << 6 ) | ( c3 & 63 ) );
                i += 3;
            }
        }
 
        return output;
    }   
}
