aboutsummaryrefslogtreecommitdiffstats
path: root/src/XSitePost.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/XSitePost.js')
-rw-r--r--src/XSitePost.js100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/XSitePost.js b/src/XSitePost.js
new file mode 100644
index 00000000..7d81e207
--- /dev/null
+++ b/src/XSitePost.js
@@ -0,0 +1,100 @@
+// Copyright (C) 2008,2009 BRAT Tech LLC
+
+if (typeof nglr == 'undefined') nglr = {};
+
+if (typeof console == 'undefined') console = {};
+if (typeof console.log == 'undefined')
+ console.log = function() {};
+if (typeof console.error == 'undefined')
+ console.error = function() {};
+
+nglr.XSitePost = function(baseUrl, window, prefix) {
+ this.baseUrl = baseUrl;
+ this.post = jQuery.post;
+ this.window = window;
+ this.inQueue = {};
+ this.outQueue = [];
+ this.maxMsgSize = 100000;
+ this.delay = 20;
+ this.prefix = prefix;
+ this.setTimeout=function(fn, delay){window.setTimeout(fn, delay);};
+};
+
+nglr.XSitePost.prototype.init = function() {
+ this.window.name = '';
+ this.response('ready', 'null');
+};
+
+nglr.XSitePost.prototype.incomingFragment = function(fragment) {
+ var parts = fragment.split(";");
+ this.incomingMsg(parts.shift(), 1*parts.shift(), 1*parts.shift(), parts.shift());
+};
+
+nglr.XSitePost.prototype.incomingMsg = function(id, partNo, totalParts, msgPart) {
+ var msg = this.inQueue[id];
+ if (!msg) {
+ msg = {id:id, parts:[], count:0};
+ this.inQueue[id] = msg;
+ }
+ msg.parts[partNo] = msgPart;
+ msg.count++;
+ if (totalParts === msg.count) {
+ delete this.inQueue[id];
+ var request = this.decodePost(msg.parts.join(''));
+ var self = this;
+ this.post(this.baseUrl + request.url, request.params, function(response, status){
+ self.response(id, response, status);
+ });
+ }
+};
+
+nglr.XSitePost.prototype.response = function(id, response, status) {
+ var start = 0;
+ var end;
+ var msg = Base64.encode(response);
+ var msgLen = msg.length;
+ var total = Math.ceil(msgLen / this.maxMsgSize);
+ var part = 0;
+ while (start < msgLen) {
+ end = Math.min(msgLen, start + this.maxMsgSize);
+ this.outQueue.push(id + ':'+part+':'+total+':' + msg.substring(start, end));
+ start = end;
+ part++;
+ }
+};
+
+nglr.XSitePost.prototype.decodePost = function(post) {
+ var parts = post.split(':');
+ var url = Base64.decode(parts.shift());
+ var params = {};
+ while(parts.length !== 0) {
+ var key = parts.shift();
+ var value = Base64.decode(parts.shift());
+ params[key] = value;
+ }
+ return {url:url, params:params};
+};
+
+nglr.XSitePost.prototype.listen = function() {
+ console.log("listen()");
+ var self = this;
+ var window = this.window;
+ var outQueue = this.outQueue;
+ var setTimeout = this.setTimeout;
+ var prefix = this.prefix;
+ var prefixLen = prefix.length;
+ var prefixRec = prefix + '>';
+ var prefixRecLen = prefixRec.length;
+ window.name = prefix;
+ var pull = function(){
+ var value = window.name;
+ if (value == prefix && outQueue.length > 0) {
+ window.name = prefix + '<' + outQueue.shift();
+ } else if (value.substr(0, prefixRecLen) == prefixRec) {
+ self.incomingFragment(value.substr(prefixRecLen));
+ window.name = prefix;
+ }
+ setTimeout(pull, self.delay);
+ };
+ pull();
+};