summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryajax.js235
1 files changed, 235 insertions, 0 deletions
diff --git a/binaryajax.js b/binaryajax.js
new file mode 100644
index 0000000..f674d9c
--- /dev/null
+++ b/binaryajax.js
@@ -0,0 +1,235 @@
+
+/*
+ * 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"
+);