--- googlecode.com/svn/trunk/public_html/meteor.js 2006/11/20 18:05:33 5 +++ googlecode.com/svn/trunk/public_html/meteor.js 2006/11/21 09:49:07 6 @@ -1,279 +1,279 @@ -// 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.lastmsgreceived = -1; - this.transferDoc = false; - this.pingtimer = false; - this.updatepollfreqtimer = false; - this.lastrequest = 0; - this.recvtimes = new Array(); - this.MHostId = false; - this.callback_process = function() {}; - this.callback_reset = function() {}; - this.callback_eof = function() {}; - this.callback_changemode = function() {}; - this.persist = true; - - // Documented public properties - this.channel = false; - this.subdomain = "data"; - this.dynamicpageaddress = "push"; - this.backtrack = 0; - this.smartpoll = true; - this.pollfreq = 2000; - this.minpollfreq = 2000; - this.mode = "stream"; - this.polltimeout=30000; - this.maxmessages=0; - this.pingtimeout = 10000; - - // Set or retrieve host id. Cookie takes this form: - // MeteorID=123:6356353/124:098320454; - var MeteIds = Meteor.readCookie("MeteorID"); - var regex1 = new RegExp("^([0-9\:\/M]+\/)*"+instID+"\:([^\/]+)(\/[0-9\:\/M]+)*$"); - var regex2 = new RegExp("^([0-9\:\/M]+\/)*M\:([^\/]+)(\/[0-9\:\/M]+)*$"); - if (typeof(instID) == "Number" && regex1.exec(MeteIds)) { - this.MHostId = ma[2]; - } else if (typeof(instID) == "Number") { - this.MHostId = Math.floor(Math.random()*1000000); - var newcookie = (MeteIds)?MeteIds+"/":""; - newcookie += instID+":"+this.MHostId; - Meteor.createCookie("MeteorID", newcookie); - } else if (ma = regex2.exec(MeteIds)) { - this.MHostId = ma[2]; - } else { - this.MHostId = Math.floor(Math.random()*1000000); - var newcookie = (MeteIds)?MeteIds+"/":""; - newcookie += "M:"+this.MHostId; - Meteor.createCookie("MeteorID", newcookie); - } - this.instID = (typeof(instID) != "undefined") ? instID : 0; -} - -Meteor.instances = new Array(); -Meteor.servertimeoffset = 0; - -Meteor.create = function(instID) { - if (!instID) instID = 0; - Meteor.instances[instID] = new Meteor(instID); - return Meteor.instances[instID]; -} - -Meteor.register = function(ifr) { - instid = new String(ifr.window.frameElement.id); - instid = instid.replace("meteorframe_", ""); - 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]); -} - -Meteor.setServerTime = function(timestamp) { - var now = new Date(); - var clienttime = (now.getTime() / 1000); - Meteor.servertimeoffset = timestamp - clienttime; -} - -Meteor.prototype.start = function() { - this.persist = (this.maxmessages)?1:0; - this.smartpoll = (this.smartpoll)?1:0; - this.mode = (this.mode=="stream")?"stream":"poll"; - if (!this.subdomain || !this.channel) throw "Channel or Meteor subdomain host not specified"; - var now = new Date(); - var t = now.getTime(); - if (typeof(this.transferDoc)=="object") { - this.transferDoc.open(); - this.transferDoc.close(); - delete this.transferDoc; - } - if (document.getElementById("meteorframe_"+this.instID)) { - document.body.removeChild(document.getElementById("meteorframe_"+this.instID)); - } - if (this.mode=="stream") { - if (document.all) { - this.transferDoc = new ActiveXObject("htmlfile"); - this.transferDoc.open(); - this.transferDoc.write(""); - this.transferDoc.write("