| |
| /* |
| * Binary Ajax 0.1.5 |
| * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/ |
| * MIT License [http://www.opensource.org/licenses/mit-license.php] |
| */ |
| |
| |
| var BinaryFile = function(strData, iDataOffset, iDataLength) { |
| var data = strData; |
| var dataOffset = iDataOffset || 0; |
| var dataLength = 0; |
| |
| this.getRawData = function() { |
| return data; |
| } |
| |
| if (typeof strData == "string") { |
| dataLength = iDataLength || data.length; |
| |
| this.getByteAt = function(iOffset) { |
| return data.charCodeAt(iOffset + dataOffset) & 0xFF; |
| } |
| } else if (typeof strData == "unknown") { |
| dataLength = iDataLength || IEBinary_getLength(data); |
| |
| this.getByteAt = function(iOffset) { |
| return IEBinary_getByteAt(data, iOffset + dataOffset); |
| } |
| } |
| |
| this.getLength = function() { |
| return dataLength; |
| } |
| |
| this.getSByteAt = function(iOffset) { |
| var iByte = this.getByteAt(iOffset); |
| if (iByte > 127) |
| return iByte - 256; |
| else |
| return iByte; |
| } |
| |
| this.getShortAt = function(iOffset, bBigEndian) { |
| var iShort = bBigEndian ? |
| (this.getByteAt(iOffset) << 8) + this.getByteAt(iOffset + 1) |
| : (this.getByteAt(iOffset + 1) << 8) + this.getByteAt(iOffset) |
| if (iShort < 0) iShort += 65536; |
| return iShort; |
| } |
| this.getSShortAt = function(iOffset, bBigEndian) { |
| var iUShort = this.getShortAt(iOffset, bBigEndian); |
| if (iUShort > 32767) |
| return iUShort - 65536; |
| else |
| return iUShort; |
| } |
| this.getLongAt = function(iOffset, bBigEndian) { |
| var iByte1 = this.getByteAt(iOffset), |
| iByte2 = this.getByteAt(iOffset + 1), |
| iByte3 = this.getByteAt(iOffset + 2), |
| iByte4 = this.getByteAt(iOffset + 3); |
| |
| var iLong = bBigEndian ? |
| (((((iByte1 << 8) + iByte2) << 8) + iByte3) << 8) + iByte4 |
| : (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1; |
| if (iLong < 0) iLong += 4294967296; |
| return iLong; |
| } |
| this.getSLongAt = function(iOffset, bBigEndian) { |
| var iULong = this.getLongAt(iOffset, bBigEndian); |
| if (iULong > 2147483647) |
| return iULong - 4294967296; |
| else |
| return iULong; |
| } |
| this.getStringAt = function(iOffset, iLength) { |
| var aStr = []; |
| for (var i=iOffset,j=0;i<iOffset+iLength;i++,j++) { |
| aStr[j] = String.fromCharCode(this.getByteAt(i)); |
| } |
| return aStr.join(""); |
| } |
| |
| this.getCharAt = function(iOffset) { |
| return String.fromCharCode(this.getByteAt(iOffset)); |
| } |
| this.toBase64 = function() { |
| return window.btoa(data); |
| } |
| this.fromBase64 = function(strBase64) { |
| data = window.atob(strBase64); |
| } |
| } |
| |
| |
| var BinaryAjax = (function() { |
| |
| function createRequest() { |
| var oHTTP = null; |
| if (window.XMLHttpRequest) { |
| oHTTP = new XMLHttpRequest(); |
| } else if (window.ActiveXObject) { |
| oHTTP = new ActiveXObject("Microsoft.XMLHTTP"); |
| } |
| return oHTTP; |
| } |
| |
| function getHead(strURL, fncCallback, fncError) { |
| var oHTTP = createRequest(); |
| if (oHTTP) { |
| if (fncCallback) { |
| if (typeof(oHTTP.onload) != "undefined") { |
| oHTTP.onload = function() { |
| if (oHTTP.status == "200") { |
| fncCallback(this); |
| } else { |
| if (fncError) fncError(); |
| } |
| oHTTP = null; |
| }; |
| } else { |
| oHTTP.onreadystatechange = function() { |
| if (oHTTP.readyState == 4) { |
| if (oHTTP.status == "200") { |
| fncCallback(this); |
| } else { |
| if (fncError) fncError(); |
| } |
| oHTTP = null; |
| } |
| }; |
| } |
| } |
| oHTTP.open("HEAD", strURL, true); |
| oHTTP.send(null); |
| } else { |
| if (fncError) fncError(); |
| } |
| } |
| |
| function sendRequest(strURL, fncCallback, fncError, aRange, bAcceptRanges, iFileSize) { |
| var oHTTP = createRequest(); |
| if (oHTTP) { |
| |
| var iDataOffset = 0; |
| if (aRange && !bAcceptRanges) { |
| iDataOffset = aRange[0]; |
| } |
| var iDataLen = 0; |
| if (aRange) { |
| iDataLen = aRange[1]-aRange[0]+1; |
| } |
| |
| if (fncCallback) { |
| if (typeof(oHTTP.onload) != "undefined") { |
| oHTTP.onload = function() { |
| |
| if (oHTTP.status == "200" || oHTTP.status == "206") { |
| this.binaryResponse = new BinaryFile(this.responseText, iDataOffset, iDataLen); |
| this.fileSize = iFileSize || this.getResponseHeader("Content-Length"); |
| fncCallback(this); |
| } else { |
| if (fncError) fncError(); |
| } |
| oHTTP = null; |
| }; |
| } else { |
| oHTTP.onreadystatechange = function() { |
| if (oHTTP.readyState == 4) { |
| if (oHTTP.status == "200" || oHTTP.status == "206") { |
| this.binaryResponse = new BinaryFile(oHTTP.responseBody, iDataOffset, iDataLen); |
| this.fileSize = iFileSize || this.getResponseHeader("Content-Length"); |
| fncCallback(this); |
| } else { |
| if (fncError) fncError(); |
| } |
| oHTTP = null; |
| } |
| }; |
| } |
| } |
| oHTTP.open("GET", strURL, true); |
| |
| if (oHTTP.overrideMimeType) oHTTP.overrideMimeType('text/plain; charset=x-user-defined'); |
| |
| if (aRange && bAcceptRanges) { |
| oHTTP.setRequestHeader("Range", "bytes=" + aRange[0] + "-" + aRange[1]); |
| } |
| |
| oHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 1970 00:00:00 GMT"); |
| |
| oHTTP.send(null); |
| } else { |
| if (fncError) fncError(); |
| } |
| } |
| |
| return function(strURL, fncCallback, fncError, aRange) { |
| |
| if (aRange) { |
| getHead( |
| strURL, |
| function(oHTTP) { |
| var iLength = parseInt(oHTTP.getResponseHeader("Content-Length"),10); |
| var strAcceptRanges = oHTTP.getResponseHeader("Accept-Ranges"); |
| |
| var iStart, iEnd; |
| iStart = aRange[0]; |
| if (aRange[0] < 0) |
| iStart += iLength; |
| iEnd = iStart + aRange[1] - 1; |
| |
| sendRequest(strURL, fncCallback, fncError, [iStart, iEnd], (strAcceptRanges == "bytes"), iLength); |
| } |
| ); |
| |
| } else { |
| sendRequest(strURL, fncCallback, fncError); |
| } |
| } |
| |
| }()); |
| |
| |
| document.write( |
| "<script type='text/vbscript'>\r\n" |
| + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n" |
| + " IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n" |
| + "End Function\r\n" |
| + "Function IEBinary_getLength(strBinary)\r\n" |
| + " IEBinary_getLength = LenB(strBinary)\r\n" |
| + "End Function\r\n" |
| + "</script>\r\n" |
| ); |