var Crypto = null; if(!Crypto){Crypto = {}}; if(!Crypto.html){Crypto.html = {}}; if(!Crypto.base){Crypto.base = {}}; Crypto.html.urlDecode = function(){ var str = arguments[0]; str=str.replace(new RegExp('\\+','g'),' '); return unescape(str); } Crypto.html.urlEncode = function(){ var str = arguments[0]; str=escape(str); str=str.replace(new RegExp('\\+','g'),'%2B'); return str.replace(new RegExp('%20','g'),'+'); } var END_OF_INPUT = -1; var base64Chars = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'); var reverseBase64Chars = new Array(); for (var i=0; i < base64Chars.length; i++){ reverseBase64Chars[base64Chars[i]] = i; } var base64Str; var base64Count; Crypto.base.set64Str = function(){ var str = arguments[0]; base64Str = str; base64Count = 0; } Crypto.base.read64 = function(){ if (!base64Str) return END_OF_INPUT; if (base64Count >= base64Str.length) return END_OF_INPUT; var c = base64Str.charCodeAt(base64Count) & 0xff; base64Count++; return c; } Crypto.base.encode64=function(){ var str = arguments[0]; Crypto.base.set64Str(str); var result = ''; var inBuffer = new Array(3); var lineCount = 0; var done = false; while (!done && (inBuffer[0] = Crypto.base.read64()) != END_OF_INPUT){ inBuffer[1] = Crypto.base.read64(); inBuffer[2] = Crypto.base.read64(); result += (base64Chars[ inBuffer[0] >> 2 ]); if (inBuffer[1] != END_OF_INPUT){ result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]); if (inBuffer[2] != END_OF_INPUT){ result += (base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]); result += (base64Chars [inBuffer[2] & 0x3F]); }else{ result += (base64Chars [((inBuffer[1] << 2) & 0x3c)]); result += ('='); done = true; } }else { result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30)]); result += ('='); result += ('='); done = true; } lineCount += 4; if(lineCount >= 76){ result += ('\n'); lineCount = 0; } } return result; } Crypto.base.readReverse64 = function(){ if (!base64Str) return END_OF_INPUT; while (true){ if (base64Count >= base64Str.length) return END_OF_INPUT; var nextCharacter = base64Str.charAt(base64Count); base64Count++; if (reverseBase64Chars[nextCharacter]){ return reverseBase64Chars[nextCharacter]; } if (nextCharacter == 'A') return 0; } return END_OF_INPUT; } Crypto.ntos = function(){ var n = arguments[0] n=n.toString(16); if (n.length == 1) n="0"+n; n="%"+n; return unescape(n); } Crypto.base.decode64 = function(){ var str = arguments[0]; Crypto.base.set64Str(str); var result = ""; var inBuffer = new Array(4); var done = false; while (!done && (inBuffer[0] = Crypto.base.readReverse64()) != END_OF_INPUT && (inBuffer[1] = Crypto.base.readReverse64()) != END_OF_INPUT){ inBuffer[2] = Crypto.base.readReverse64(); inBuffer[3] = Crypto.base.readReverse64(); result += Crypto.ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4)); if (inBuffer[2] != END_OF_INPUT){ result += Crypto.ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2)); if (inBuffer[3] != END_OF_INPUT){ result += Crypto.ntos((((inBuffer[2] << 6) & 0xff) | inBuffer[3])); } else { done = true; } } else { done = true; } } return result; } var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'); Crypto.toHex = function(){ var n = arguments[0]; var result = '' var start = true; for (var i=32; i>0;){ i-=4; var digit = (n>>i) & 0xf; if (!start || digit != 0){ start = false; result += digitArray[digit]; } } return (result==''?'0':result); } Crypto.pad = function(){ var str = arguments[0]; var len = arguments[1]; var pad = arguments[2]; var result = str; for (var i=str.length; i