1/*jslint adsafe: false, bitwise: true, browser: true, cap: false, css: false, 2 debug: false, devel: true, eqeqeq: true, es5: false, evil: false, 3 forin: false, fragment: false, immed: true, laxbreak: false, newcap: true, 4 nomen: false, on: false, onevar: true, passfail: false, plusplus: true, 5 regexp: false, rhino: true, safe: false, strict: false, sub: false, 6 undef: true, white: false, widget: false, windows: false */ 7/*global jQuery: false, window: false */ 8"use strict"; 9 10/* 11 * Original code (c) 2010 Nick Galbreath 12 * http://code.google.com/p/stringencoders/source/browse/#svn/trunk/javascript 13 * 14 * jQuery port (c) 2010 Carlo Zottmann 15 * http://github.com/carlo/jquery-base64 16 * 17 * Permission is hereby granted, free of charge, to any person 18 * obtaining a copy of this software and associated documentation 19 * files (the "Software"), to deal in the Software without 20 * restriction, including without limitation the rights to use, 21 * copy, modify, merge, publish, distribute, sublicense, and/or sell 22 * copies of the Software, and to permit persons to whom the 23 * Software is furnished to do so, subject to the following 24 * conditions: 25 * 26 * The above copyright notice and this permission notice shall be 27 * included in all copies or substantial portions of the Software. 28 * 29 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 30 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 31 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 32 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 33 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 34 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 35 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 36 * OTHER DEALINGS IN THE SOFTWARE. 37*/ 38 39/* base64 encode/decode compatible with window.btoa/atob 40 * 41 * window.atob/btoa is a Firefox extension to convert binary data (the "b") 42 * to base64 (ascii, the "a"). 43 * 44 * It is also found in Safari and Chrome. It is not available in IE. 45 * 46 * if (!window.btoa) window.btoa = $.base64.encode 47 * if (!window.atob) window.atob = $.base64.decode 48 * 49 * The original spec's for atob/btoa are a bit lacking 50 * https://developer.mozilla.org/en/DOM/window.atob 51 * https://developer.mozilla.org/en/DOM/window.btoa 52 * 53 * window.btoa and $.base64.encode takes a string where charCodeAt is [0,255] 54 * If any character is not [0,255], then an exception is thrown. 55 * 56 * window.atob and $.base64.decode take a base64-encoded string 57 * If the input length is not a multiple of 4, or contains invalid characters 58 * then an exception is thrown. 59 */ 60 61jQuery.base64 = (function ($) { 62 63 var _PADCHAR = "=", 64 _ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 65 _VERSION = "1.0"; 66 67 68 function _getbyte64(s, i) { 69 // This is oddly fast, except on Chrome/V8. 70 // Minimal or no improvement in performance by using a 71 // object with properties mapping chars to value (eg. 'A': 0) 72 73 var idx = _ALPHA.indexOf(s.charAt(i)); 74 75 if (idx === -1) { 76 throw "Cannot decode base64"; 77 } 78 79 return idx; 80 } 81 82 83 function _decode(s) { 84 var pads = 0, 85 i, 86 b10, 87 imax = s.length, 88 x = []; 89 90 s = String(s); 91 92 if (imax === 0) { 93 return s; 94 } 95 96 if (imax % 4 !== 0) { 97 throw "Cannot decode base64"; 98 } 99 100 if (s.charAt(imax - 1) === _PADCHAR) { 101 pads = 1; 102 103 if (s.charAt(imax - 2) === _PADCHAR) { 104 pads = 2; 105 } 106 107 // either way, we want to ignore this last block 108 imax -= 4; 109 } 110 111 for (i = 0; i < imax; i += 4) { 112 b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12) | (_getbyte64(s, i + 2) << 6) | _getbyte64(s, i + 3); 113 x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff, b10 & 0xff)); 114 } 115 116 switch (pads) { 117 case 1: 118 b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12) | (_getbyte64(s, i + 2) << 6); 119 x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff)); 120 break; 121 122 case 2: 123 b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12); 124 x.push(String.fromCharCode(b10 >> 16)); 125 break; 126 } 127 128 return x.join(""); 129 } 130 131 132 function _getbyte(s, i) {
133 var x = s.charCodeAt(i); 134 135 if (x > 255) { 136 throw "INVALID_CHARACTER_ERR: DOM Exception 5"; 137 } 138 139 return x; 140 } 141 142 143 function _encode(s) { 144 if (arguments.length !== 1) { 145 throw "SyntaxError: exactly one argument required"; 146 } 147 148 s = String(s); 149 150 var i, 151 b10, 152 x = [], 153 imax = s.length - s.length % 3; 154 155 if (s.length === 0) { 156 return s; 157 } 158 159 for (i = 0; i < imax; i += 3) { 160 b10 = (_getbyte(s, i) << 16) | (_getbyte(s, i + 1) << 8) | _getbyte(s, i + 2); 161 x.push(_ALPHA.charAt(b10 >> 18)); 162 x.push(_ALPHA.charAt((b10 >> 12) & 0x3F)); 163 x.push(_ALPHA.charAt((b10 >> 6) & 0x3f)); 164 x.push(_ALPHA.charAt(b10 & 0x3f)); 165 } 166 167 switch (s.length - imax) { 168 case 1: 169 b10 = _getbyte(s, i) << 16; 170 x.push(_ALPHA.charAt(b10 >> 18) + _ALPHA.charAt((b10 >> 12) & 0x3F) + _PADCHAR + _PADCHAR); 171 break; 172 173 case 2: 174 b10 = (_getbyte(s, i) << 16) | (_getbyte(s, i + 1) << 8); 175 x.push(_ALPHA.charAt(b10 >> 18) + _ALPHA.charAt((b10 >> 12) & 0x3F) + _ALPHA.charAt((b10 >> 6) & 0x3f) + _PADCHAR); 176 break; 177 } 178 179 return x.join(""); 180 } 181 182 183 return { 184 decode: _decode, 185 encode: _encode, 186 VERSION: _VERSION 187 }; 188 189}(jQuery));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.