1 // ========================================================================== 2 // Project: The M-Project - Mobile HTML5 Application Framework 3 // Copyright: (c) 2010 M-Way Solutions GmbH. All rights reserved. 4 // Creator: Dominik 5 // Date: 11.11.2010 6 // License: Dual licensed under the MIT or GPL Version 2 licenses. 7 // http://github.com/mwaylabs/The-M-Project/blob/master/MIT-LICENSE 8 // http://github.com/mwaylabs/The-M-Project/blob/master/GPL-LICENSE 9 // ========================================================================== 10 11 m_require('core/foundation/object.js'); 12 13 /** 14 * @class 15 * 16 * This prototype defines decoding and encoding mechanisms based on the Base64 algorithm. You 17 * normally don't call this object respectively its methods directly, but let M.Cypher handle 18 * this. 19 * 20 * @extends M.Object 21 */ 22 M.Base64 = M.Object.extend( 23 /** @scope M.Base64.prototype */ { 24 25 /** 26 * The type of this object. 27 * 28 * @type String 29 */ 30 type: 'M.Base64', 31 32 /** 33 * The key string for the base 64 decoding and encoding. 34 * 35 * @type String 36 */ 37 keyString: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", 38 39 /** 40 * This method encodes a given input string, using the base64 encoding. 41 * 42 * @param {String} input The string to be encoded. 43 * @returns {String} The base64 encoded string. 44 */ 45 encode: function(input) { 46 var output = ''; 47 var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 48 var i = 0; 49 50 input = M.Cypher.utf8_encode(input); 51 52 while (i < input.length) { 53 chr1 = input.charCodeAt(i++); 54 chr2 = input.charCodeAt(i++); 55 chr3 = input.charCodeAt(i++); 56 57 enc1 = chr1 >> 2; 58 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 59 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 60 enc4 = chr3 & 63; 61 62 if(isNaN(chr2)) { 63 enc3 = enc4 = 64; 64 } else if(isNaN(chr3)) { 65 enc4 = 64; 66 } 67 68 output += this.keyString.charAt(enc1) + this.keyString.charAt(enc2) + this.keyString.charAt(enc3) + this.keyString.charAt(enc4); 69 } 70 71 return output; 72 }, 73 74 /** 75 * This method decodes a given input string, using the base64 decoding. 76 * 77 * @param {String} input The string to be decoded. 78 * @returns {String} The base64 decoded string. 79 */ 80 decode: function(input) { 81 var output = ""; 82 var chr1, chr2, chr3; 83 var enc1, enc2, enc3, enc4; 84 var i = 0; 85 86 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 87 88 while (i < input.length) { 89 enc1 = this.keyString.indexOf(input.charAt(i++)); 90 enc2 = this.keyString.indexOf(input.charAt(i++)); 91 enc3 = this.keyString.indexOf(input.charAt(i++)); 92 enc4 = this.keyString.indexOf(input.charAt(i++)); 93 94 chr1 = (enc1 << 2) | (enc2 >> 4); 95 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 96 chr3 = ((enc3 & 3) << 6) | enc4; 97 98 output = output + String.fromCharCode(chr1); 99 100 if(enc3 != 64) { 101 output = output + String.fromCharCode(chr2); 102 } 103 104 if(enc4 != 64) { 105 output = output + String.fromCharCode(chr3); 106 } 107 } 108 109 return M.Cypher.utf8_decode(output); 110 } 111 112 });