1 function Base64() {
2
3 // private property
4 var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
5
6 // public method for encoding
7 this.encode = function (input) {
8 var output = "";
9 var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
10 var i = 0;
11 input = _utf8_encode(input);
12 while (i < input.length) {
13 chr1 = input.charCodeAt(i++);
14 chr2 = input.charCodeAt(i++);
15 chr3 = input.charCodeAt(i++);
16 enc1 = chr1 >> 2;
17 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
18 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
19 enc4 = chr3 & 63;
20 if (isNaN(chr2)) {
21 enc3 = enc4 = 64;
22 } else if (isNaN(chr3)) {
23 enc4 = 64;
24 }
25 output = output +
26 _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
27 _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
28 }
29 return output;
30 }
31
32 // public method for decoding
33 this.decode = function (input) {
34 var output = "";
35 var chr1, chr2, chr3;
36 var enc1, enc2, enc3, enc4;
37 var i = 0;
38 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
39 while (i < input.length) {
40 enc1 = _keyStr.indexOf(input.charAt(i++));
41 enc2 = _keyStr.indexOf(input.charAt(i++));
42 enc3 = _keyStr.indexOf(input.charAt(i++));
43 enc4 = _keyStr.indexOf(input.charAt(i++));
44 chr1 = (enc1 << 2) | (enc2 >> 4);
45 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
46 chr3 = ((enc3 & 3) << 6) | enc4;
47 output = output + String.fromCharCode(chr1);
48 if (enc3 != 64) {
49 output = output + String.fromCharCode(chr2);
50 }
51 if (enc4 != 64) {
52 output = output + String.fromCharCode(chr3);
53 }
54 }
55 output = _utf8_decode(output);
56 return output;
57 }
58
59 // private method for UTF-8 encoding
60 var _utf8_encode = function (string) {
61 string = string.replace(/\r\n/g, "\n");
62 var utftext = "";
63 for (var n = 0; n < string.length; n++) {
64 var c = string.charCodeAt(n);
65 if (c < 128) {
66 utftext += String.fromCharCode(c);
67 } else if ((c > 127) && (c < 2048)) {
68 utftext += String.fromCharCode((c >> 6) | 192);
69 utftext += String.fromCharCode((c & 63) | 128);
70 } else {
71 utftext += String.fromCharCode((c >> 12) | 224);
72 utftext += String.fromCharCode(((c >> 6) & 63) | 128);
73 utftext += String.fromCharCode((c & 63) | 128);
74 }
75
76 }
77 return utftext;
78 }
79
80 // private method for UTF-8 decoding
81 var _utf8_decode = function (utftext) {
82 var string = "";
83 var i = 0;
84 var c = c1 = c2 = 0;
85 while (i < utftext.length) {
86 c = utftext.charCodeAt(i);
87 if (c < 128) {
88 string += String.fromCharCode(c);
89 i++;
90 } else if ((c > 191) && (c < 224)) {
91 c2 = utftext.charCodeAt(i + 1);
92 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
93 i += 2;
94 } else {
95 c2 = utftext.charCodeAt(i + 1);
96 c3 = utftext.charCodeAt(i + 2);
97 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
98 i += 3;
99 }
100 }
101 return string;
102 }
103 }
104
105
106 var base = new Base64();
107
108 function encode(str){
109 return base.encode(str);
110 }
111 function decode(str) {
112 return base.decode(str);
113 }
114 function safeEncode(str) {
115 return encode(str).replace(/[\+=\/]/g, function (c) {
116 switch (c) {
117 case '+': return '.';
118 case '=': return '-';
119 case '/': return '_';
120 }
121 })
122 }
123
124
125 export {
126 encode,
127 decode,
128 safeEncode
129 }