1
+ //------------------------------------------------------------------------------
2
+ // base64.js: base64 implementation in JavaScript
3
+ // This file is a part of pk-core-js library
4
+ // Copyright (c) Alexander Gladysh <[email protected] >
5
+ // Copyright (c) Dmitry Potapov <[email protected] >
6
+ // See file `COPYRIGHT` for the license
7
+ //------------------------------------------------------------------------------
8
+ //
9
+ // Inspired by CC-BY-licensed webtoolkit's implementation.
10
+ // See http://www.webtoolkit.info/javascript-base64.html
11
+ // See http://www.webtoolkit.info/license for the license
12
+ //
13
+ //------------------------------------------------------------------------------
14
+
15
+ if ( ! window . Base64 )
16
+ {
17
+
18
+ var Base64 = {
19
+
20
+ // private property
21
+ _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ,
22
+
23
+ // public method for encoding
24
+ encode : function ( input ) {
25
+ var output = "" ;
26
+ var chr1 , chr2 , chr3 , enc1 , enc2 , enc3 , enc4 ;
27
+ var i = 0 ;
28
+
29
+ input = Base64 . _utf8_encode ( input ) ;
30
+
31
+ while ( i < input . length ) {
32
+
33
+ chr1 = input . charCodeAt ( i ++ ) ;
34
+ chr2 = input . charCodeAt ( i ++ ) ;
35
+ chr3 = input . charCodeAt ( i ++ ) ;
36
+
37
+ enc1 = chr1 >> 2 ;
38
+ enc2 = ( ( chr1 & 3 ) << 4 ) | ( chr2 >> 4 ) ;
39
+ enc3 = ( ( chr2 & 15 ) << 2 ) | ( chr3 >> 6 ) ;
40
+ enc4 = chr3 & 63 ;
41
+
42
+ if ( isNaN ( chr2 ) ) {
43
+ enc3 = enc4 = 64 ;
44
+ } else if ( isNaN ( chr3 ) ) {
45
+ enc4 = 64 ;
46
+ }
47
+
48
+ output = output +
49
+ this . _keyStr . charAt ( enc1 ) + this . _keyStr . charAt ( enc2 ) +
50
+ this . _keyStr . charAt ( enc3 ) + this . _keyStr . charAt ( enc4 ) ;
51
+
52
+ }
53
+
54
+ return output ;
55
+ } ,
56
+
57
+ // public method for decoding
58
+ decode : function ( input ) {
59
+ var output = "" ;
60
+ var chr1 , chr2 , chr3 ;
61
+ var enc1 , enc2 , enc3 , enc4 ;
62
+ var i = 0 ;
63
+
64
+ input = input . replace ( / [ ^ A - Z a - z 0 - 9 \+ \/ \= ] / g, "" ) ;
65
+
66
+ while ( i < input . length ) {
67
+
68
+ enc1 = this . _keyStr . indexOf ( input . charAt ( i ++ ) ) ;
69
+ enc2 = this . _keyStr . indexOf ( input . charAt ( i ++ ) ) ;
70
+ enc3 = this . _keyStr . indexOf ( input . charAt ( i ++ ) ) ;
71
+ enc4 = this . _keyStr . indexOf ( input . charAt ( i ++ ) ) ;
72
+
73
+ chr1 = ( enc1 << 2 ) | ( enc2 >> 4 ) ;
74
+ chr2 = ( ( enc2 & 15 ) << 4 ) | ( enc3 >> 2 ) ;
75
+ chr3 = ( ( enc3 & 3 ) << 6 ) | enc4 ;
76
+
77
+ output = output + String . fromCharCode ( chr1 ) ;
78
+
79
+ if ( enc3 != 64 ) {
80
+ output = output + String . fromCharCode ( chr2 ) ;
81
+ }
82
+ if ( enc4 != 64 ) {
83
+ output = output + String . fromCharCode ( chr3 ) ;
84
+ }
85
+
86
+ }
87
+
88
+ output = Base64 . _utf8_decode ( output ) ;
89
+
90
+ return output ;
91
+
92
+ } ,
93
+
94
+ // private method for UTF-8 encoding
95
+ _utf8_encode : function ( string ) {
96
+ string = string . replace ( / \r \n / g, "\n" ) ;
97
+ var utftext = "" ;
98
+
99
+ for ( var n = 0 ; n < string . length ; n ++ ) {
100
+
101
+ var c = string . charCodeAt ( n ) ;
102
+
103
+ if ( c < 128 ) {
104
+ utftext += String . fromCharCode ( c ) ;
105
+ }
106
+ else if ( ( c > 127 ) && ( c < 2048 ) ) {
107
+ utftext += String . fromCharCode ( ( c >> 6 ) | 192 ) ;
108
+ utftext += String . fromCharCode ( ( c & 63 ) | 128 ) ;
109
+ }
110
+ else {
111
+ utftext += String . fromCharCode ( ( c >> 12 ) | 224 ) ;
112
+ utftext += String . fromCharCode ( ( ( c >> 6 ) & 63 ) | 128 ) ;
113
+ utftext += String . fromCharCode ( ( c & 63 ) | 128 ) ;
114
+ }
115
+
116
+ }
117
+
118
+ return utftext ;
119
+ } ,
120
+
121
+ // private method for UTF-8 decoding
122
+ _utf8_decode : function ( utftext ) {
123
+ var string = "" ;
124
+ var i = 0 ;
125
+ var c = c1 = c2 = 0 ;
126
+
127
+ while ( i < utftext . length ) {
128
+
129
+ c = utftext . charCodeAt ( i ) ;
130
+
131
+ if ( c < 128 ) {
132
+ string += String . fromCharCode ( c ) ;
133
+ i ++ ;
134
+ }
135
+ else if ( ( c > 191 ) && ( c < 224 ) ) {
136
+ c2 = utftext . charCodeAt ( i + 1 ) ;
137
+ string += String . fromCharCode ( ( ( c & 31 ) << 6 ) | ( c2 & 63 ) ) ;
138
+ i += 2 ;
139
+ }
140
+ else {
141
+ c2 = utftext . charCodeAt ( i + 1 ) ;
142
+ c3 = utftext . charCodeAt ( i + 2 ) ;
143
+ string += String . fromCharCode ( ( ( c & 15 ) << 12 ) | ( ( c2 & 63 ) << 6 ) | ( c3 & 63 ) ) ;
144
+ i += 3 ;
145
+ }
146
+
147
+ }
148
+
149
+ return string ;
150
+ }
151
+
152
+ }
153
+ }
0 commit comments