1
+ − 1
// Base64 encoder/decoder - pulled from http://ostermiller.org/calc/encode.html. Licensed under the GPL.
+ − 2
+ − 3
var END_OF_INPUT = -1;
+ − 4
+ − 5
var base64Chars = new Array(
+ − 6
'A','B','C','D','E','F','G','H',
+ − 7
'I','J','K','L','M','N','O','P',
+ − 8
'Q','R','S','T','U','V','W','X',
+ − 9
'Y','Z','a','b','c','d','e','f',
+ − 10
'g','h','i','j','k','l','m','n',
+ − 11
'o','p','q','r','s','t','u','v',
+ − 12
'w','x','y','z','0','1','2','3',
+ − 13
'4','5','6','7','8','9','+','/'
+ − 14
);
+ − 15
+ − 16
var reverseBase64Chars = new Array();
+ − 17
for (var i=0; i < base64Chars.length; i++){
+ − 18
reverseBase64Chars[base64Chars[i]] = i;
+ − 19
}
+ − 20
+ − 21
var base64Str;
+ − 22
var base64Count;
+ − 23
+ − 24
function setBase64Str(str){
+ − 25
base64Str = str;
+ − 26
base64Count = 0;
+ − 27
}
+ − 28
function readBase64(){
+ − 29
if (!base64Str) return END_OF_INPUT;
+ − 30
if (base64Count >= base64Str.length) return END_OF_INPUT;
+ − 31
var c = base64Str.charCodeAt(base64Count) & 0xff;
+ − 32
base64Count++;
+ − 33
return c;
+ − 34
}
+ − 35
function encodeBase64(str){
+ − 36
setBase64Str(str);
+ − 37
var result = '';
+ − 38
var inBuffer = new Array(3);
+ − 39
var lineCount = 0;
+ − 40
var done = false;
+ − 41
while (!done && (inBuffer[0] = readBase64()) != END_OF_INPUT){
+ − 42
inBuffer[1] = readBase64();
+ − 43
inBuffer[2] = readBase64();
+ − 44
result += (base64Chars[ inBuffer[0] >> 2 ]);
+ − 45
if (inBuffer[1] != END_OF_INPUT){
+ − 46
result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]);
+ − 47
if (inBuffer[2] != END_OF_INPUT){
+ − 48
result += (base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]);
+ − 49
result += (base64Chars [inBuffer[2] & 0x3F]);
+ − 50
} else {
+ − 51
result += (base64Chars [((inBuffer[1] << 2) & 0x3c)]);
+ − 52
result += ('=');
+ − 53
done = true;
+ − 54
}
+ − 55
} else {
+ − 56
result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30)]);
+ − 57
result += ('=');
+ − 58
result += ('=');
+ − 59
done = true;
+ − 60
}
+ − 61
lineCount += 4;
+ − 62
if (lineCount >= 76){
+ − 63
result += ('\n');
+ − 64
lineCount = 0;
+ − 65
}
+ − 66
}
+ − 67
return result;
+ − 68
}
+ − 69
function readReverseBase64(){
+ − 70
if (!base64Str) return END_OF_INPUT;
+ − 71
while (true){
+ − 72
if (base64Count >= base64Str.length) return END_OF_INPUT;
+ − 73
var nextCharacter = base64Str.charAt(base64Count);
+ − 74
base64Count++;
+ − 75
if (reverseBase64Chars[nextCharacter]){
+ − 76
return reverseBase64Chars[nextCharacter];
+ − 77
}
+ − 78
if (nextCharacter == 'A') return 0;
+ − 79
}
+ − 80
return END_OF_INPUT;
+ − 81
}
+ − 82
+ − 83
function ntos(n){
+ − 84
n=n.toString(16);
+ − 85
if (n.length == 1) n="0"+n;
+ − 86
n="%"+n;
+ − 87
return unescape(n);
+ − 88
}
+ − 89
+ − 90
function decodeBase64(str){
+ − 91
setBase64Str(str);
+ − 92
var result = "";
+ − 93
var inBuffer = new Array(4);
+ − 94
var done = false;
+ − 95
while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT
+ − 96
&& (inBuffer[1] = readReverseBase64()) != END_OF_INPUT){
+ − 97
inBuffer[2] = readReverseBase64();
+ − 98
inBuffer[3] = readReverseBase64();
+ − 99
result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
+ − 100
if (inBuffer[2] != END_OF_INPUT){
+ − 101
result += ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
+ − 102
if (inBuffer[3] != END_OF_INPUT){
+ − 103
result += ntos((((inBuffer[2] << 6) & 0xff) | inBuffer[3]));
+ − 104
} else {
+ − 105
done = true;
+ − 106
}
+ − 107
} else {
+ − 108
done = true;
+ − 109
}
+ − 110
}
+ − 111
return result;
+ − 112
}
+ − 113