--- googlecode.com/svn/trunk/public_html/meteor.js 2007/10/10 22:25:57 31
+++ googlecode.com/svn/trunk/public_html/meteor.js 2007/12/20 21:24:24 32
@@ -1,350 +1,286 @@
-// Set domain at highest level
-var domainparts = document.domain.split(".");
-document.domain = domainparts[domainparts.length-2]+"."+domainparts[domainparts.length-1];
-
-Function.prototype.bind = function(obj) {
- var method = this,
- temp = function() {
- return method.apply(obj, arguments);
- };
- return temp;
-}
-Function.prototype.andThen=function(g) {
- var f=this;
- var a=this.arguments
- return function(args) {
- f(a);g(args);
- }
-};
-
-function Meteor(instID) {
-
- this.transferDoc = false;
- this.pingtimer = false;
- this.updatepollfreqtimer = false;
- this.lastrequest = 0;
- this.recvtimes = [];
- this.MHostId = false;
- this.callback_process = function() {};
- this.callback_reset = function() {};
- this.callback_eof = function() {};
- this.callback_changemode = function() {};
- this.callback_statuschanged = function() {};
- this.persist = 1;
- this.frameloadtimer = false;
- this.debugmode = false;
- this.subsurl = false;
- this.channels = {};
- this.channelcount = 0;
- this.streamreq = false;
- this.byteoffset = 0;
-
- // Documented public properties
- this.subdomain = "data";
- this.dynamicpageaddress = "push";
- this.smartpoll = 1;
- this.pollfreq = 2000;
- this.minpollfreq = 2000;
- this.mode = "stream";
- this.polltimeout = 30000;
- this.pingtimeout = 10000;
- this.maxmessages = 0;
- this.status = 0;
-
- /* Statuses: 0 = Uninitialised,
- 1 = Loading stream,
- 2 = Loading controller frame,
- 3 = Controller frame timeout, retrying.
- 4 = Controller frame loaded and ready
- 5 = Receiving data
- */
-
- this.instID = (typeof(instID) != "undefined") ? instID : 0;
- this.MHostId = Math.floor(Math.random()*100000000)+""+this.instID;
-}
-
-Meteor.instances = new Array();
-
-Meteor.create = function(instID) {
- if (!instID) instID = Meteor.instances.length;
- Meteor.instances[instID] = new Meteor(instID);
- return Meteor.instances[instID];
-}
-
-Meteor.register = function(ifr) {
- instid = new String(ifr.window.frameElement.id);
- instid = instid.replace(/.*_([0-9]*)$/, "$1");
- ifr.p = this.instances[instid].process.bind(this.instances[instid]);
- ifr.r = this.instances[instid].reset.bind(this.instances[instid]);
- ifr.eof = this.instances[instid].eof.bind(this.instances[instid]);
- ifr.get = this.instances[instid].get.bind(this.instances[instid]);
- ifr.increasepolldelay = this.instances[instid].increasepolldelay.bind(this.instances[instid]);
- clearTimeout(this.instances[instid].frameloadtimer);
- this.instances[instid].setstatus(4);
- if (this.debugmode) console.log("Frame registered");
-}
-
-Meteor.reset = function(ifr) {
- instid = new String(ifr.window.frameElement.id);
- instid = instid.replace(/.*_([0-9]*)$/, "$1");
- this.instances[instid].reset();
-}
-
-window.onunload = function() {
- for (var i in Meteor.instances) {
- if (Meteor.instances[i].transferDoc) delete Meteor.instances[i].transferDoc;
- }
-}
-
-
-Meteor.prototype.joinChannel = function(channelname, backtrack) {
- if (typeof(this.channels[channelname]) != "undefined") throw "Cannot join channel "+channelname+": already subscribed";
- this.channels[channelname] = {backtrack:backtrack, lastmsgreceived:0};
- if (this.debugmode) console.log("Joined channel "+channelname+", channel list follows");
- if (this.debugmode) console.log(this.channels);
- if (this.status != 0) this.start();
- this.channelcount++;
-}
-
-Meteor.prototype.leaveChannel = function(channelname) {
- if (typeof(this.channels[channelname]) == "undefined") throw "Cannot leave channel "+channelname+": not subscribed";
- delete this.channels[channelname];
- if (this.status != 0) this.start();
- this.channelcount--;
-}
-
-Meteor.prototype.start = function() {
- this.persist = (this.persist)?1:0;
- this.smartpoll = (this.smartpoll)?1:0;
- this.mode = (this.mode=="stream")?"stream":"poll";
- if (!this.subdomain || !this.channelcount) throw "Channel or Meteor subdomain host not specified";
- this.stop();
- var now = new Date();
- var t = now.getTime();
- this.setstatus(1);
- this.updateSubsUrl();
- if (this.mode=="stream") {
- if (document.all) {
- this.createIframe(this.subsurl);
- } else {
- this.createIframe("http://"+this.subdomain+"."+location.hostname+"/stream.html");
- }
- var f = this.pollmode.bind(this);
- clearTimeout(this.pingtimer);
- this.pingtimer = setTimeout(f, this.pingtimeout);
-
- } else {
- this.createIframe("http://"+this.subdomain+"."+location.hostname+"/poll.html?nc="+t);
- this.recvtimes[0] = t;
- if (this.updatepollfreqtimer) clearTimeout(this.updatepollfreqtimer);
- this.updatepollfreqtimer = setInterval(this.updatepollfreq.bind(this), 2500);
- }
- this.lastrequest = t;
-}
-
-Meteor.prototype.updateSubsUrl = function() {
-
- // If streaming or long polling, connection should persist
- this.persist = (this.mode == "stream" || (this.mode=='poll' && this.maxmessages > 0)) ? 1 : 0;
- var surl = "http://" + this.subdomain + "." + location.hostname + "/" + this.dynamicpageaddress + "?id=" + this.MHostId;
- if (this.persist && this.mode != "stream") surl += "&maxmessages=" + this.maxmessages;
- surl += "&persist="+this.persist;
- for (var c in this.channels) {
- surl += "&channel="+c;
- if (this.channels[c].lastmsgreceived > 0) {
- surl += "&restartfrom="+(this.channels[c].lastmsgreceived+1);
- } else if (this.channels[c].backtrack > 0) {
- surl += "&backtrack="+this.channels[c].backtrack;
- } else if (this.channels[c].backtrack < 0 || isNaN(this.channels[c].backtrack)) {
- surl += "&restartfrom=";
- }
- }
- this.subsurl = surl;
-}
-
-Meteor.prototype.createIframe = function(url) {
- delete this.transferDoc;
- if (document.all) try { this.transferDoc = new ActiveXObject("htmlfile") } catch(ex) { this.transferDoc = null }
- if (document.all && this.transferDoc) {
- this.transferDoc.open();
- this.transferDoc.write("");
- this.transferDoc.write("