1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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();
};
|