// Streaming HTTP Handler
// (c) 2010 David Troy

function Streamer () {
  this.xhReq = new XMLHttpRequest();
  this.interval = 0;
  this.xhReq.streamer = this;
  this.xhReq.onprogress = function () {
    if (this.readyState != 3) return;
    var allMessages = this.responseText;
    do {
      var unprocessed = allMessages.substring(this.nextReadPos);

      var messageXMLEndIndex = unprocessed.indexOf("\r\n");
      if (messageXMLEndIndex!=-1) {
        var endOfFirstMessageIndex = messageXMLEndIndex + 2;
        var anUpdate = unprocessed.substring(0, endOfFirstMessageIndex);
        this.streamer.computeInterval();
        Streamer.processor(anUpdate);
        this.nextReadPos += endOfFirstMessageIndex;
      }
    } while (messageXMLEndIndex != -1);
    if (this.responseText.length>1048576) this.abort();
  }

  this.xhReq.start = function () {
    this.nextReadPos = 0;
    this.open("GET", Streamer.url, true);
    this.send(null);
  }
  this.xhReq.onabort = function () { this.start(); };

  this.xhReq.start();
}

Streamer.prototype.computeInterval = function () {
  var now = new Date().getTime();
  var newInterval = now - this.lastItemTime;
  var interval = this.interval;
	this.interval = (((interval << 5) - interval) + newInterval) >> 5;
	this.lastItemTime = now;
}

Streamer.prototype.getRate = function () {
  return this.interval ? (60000 / this.interval) : 0;
}

Streamer.start = function (url, processor) {
  Streamer.processor = processor;
  Streamer.url = url;
  if (Streamer.current)
    Streamer.current.xhReq.abort();
  else
    Streamer.current = new Streamer();
}

