//Array.prototype.indexOf = new Function("value", "for (var i = 0; i < this.length; i++) {if (this[i] == value) return i;} return -1;");
//Array.prototype.remove = new Function("index", "return this.splice(index, 1)");
//Array.prototype.add = new Function("value", "this[this.length] = value");


function JSStreamCreateLayer(url) {
  /*if (document.body && document.body.insertAdjacentHTML) {
    var frame = document.getElementById('jsFrame');
    if (frame != null) {
        this.output = frame;
        return;
    }
    jsFrame = "<iframe id='jsFrame' style='position:absolute; visibility: hidden' src='" + url + "'></iframe>";
    document.body.insertAdjacentHTML("BeforeEnd", jsFrame);
    this.output = jsFrame;
    return;
  }*/
  if (document.body && document.body.appendChild) {

    jsFrame = document.createElement("iframe");
    jsFrame.style.position = "absolute";
    jsFrame.style.visibility = "hidden";
    jsFrame.id = "jsFrame";
    jsFrame.src = url;
    document.body.appendChild(jsFrame);
    this.output = jsFrame;
    return;
  }
  if (document.layers) {
    alert("3");
    eval("jsFrame = new Layer(1).src ='" + url + "'");
    this.output = eval("jsFrame");
  }
  alert("4");
}

function ListenerToUrl() {
  var result = "@" + this.name + "=";  
  if (this.event != null) {
    if (typeof this.event == "string") {
      result += addMapping(this.event); //was: result += "parent." + this.event;
    }
    else {
      var eventName = this.event.toString();
      result += addMapping(eventName.slice(eventName.indexOf(" ") + 1, eventName.indexOf("("))); //was: result += "parent." + eventName.slice(eventName.indexOf(" ") + 1, eventName.indexOf("("));
    }
  }
  for (var i = 0; i < this.filters.length; i++)
    result += "&" + this.filters[i];
 		
  return result;
}

function ListenerAddFilter() {
  for (var i = 0; i < arguments.length; i++)
    this.filters[this.filters.length] = arguments[i];
}

function ListenerRemoveFilter(filter) {
  for (var i=0; i<this.filters.length; i++){
    if (this.filters[i] == filter ){
      this.filters.splice( i, 1 );
      return;
    }
  }
}

function Listener(name) {
  this.name = name;
  this.toUrl = ListenerToUrl;
  this.filters = new Array();
  this.addFilter = ListenerAddFilter;
  this.removeFilter = ListenerRemoveFilter;
  this.event = null;
}

function JSStreamAddListener(id) {
  var result = this.getListener(id);
  if (result){
    return result;
  }
  result = new Listener(id);
  this.listeners[this.listeners.length] = result;
  return result;
}

function JSStreamStart() {

  var url = this.url + "?" + "TICK=" + (new Date() * 1);  // new Date() * 1 ger antalet millisekunder från 1970-01-01, tror jag
  if (window.ip_addr) {
		url += "&IP_ADDR=" + window.ip_addr;
  }	
  if (this.customerId != ""){
    url += "&CUSTOMER_ID=" + this.customerId;
  }
  if (this.userId != ""){
    url += "&USER_ID=" + this.userId;
  }

  if (this.active) {
    if (this.request.loading) {      
    	return;
    }
    url += "&SESSION=" + window.session;
  }
  
  if ( this.refreshing ) {
	  url += "&REFRESH=1";
  }
  
  if ( this.listeners.length > 0 ) {
    url += "&";
    for (var i = 0; i < this.listeners.length; i++) {
      if (this.listeners[i])
        url += this.listeners[i].toUrl(); // ge mapping-id som argument?
    }
  }
  if (this.active) {
    this.request.src = url;  
    this.request.loading = true;
    return;
  }
  
  if (!this.output) {
    this.createLayer(url);
  } else {
  	//this.output.document.location = url;
  	this.output.src = url;
  }
    
  this.active = true;
  if ( !this.refreshing ) {
  	this.handshakeCheckTimeout = window.setTimeout("window.stream.handshakeFailed();",this.handshakeTimeoutTime);
  }  
  
  window.status = " ";
}

function JSStreamHandshakeCheckOK(){
	if ( this.handshakeCheckTimeout )
		clearTimeout(this.handshakeCheckTimeout);
	this.handshakeCheckTimeout = null;
}


function JSStreamHandshakeFailed(){
	if ( this.handshakeCheckTimeout )
		clearTimeout(this.handshakeCheckTimeout);
	this.handshakeCheckTimeout = null;
	if ( window.handShakeTimeOut ) {
		window.handShakeTimeOut();
	}
}

function JSStreamRemoveListener(name) {
  for (var i = 0; i < this.listeners.length; i++)
    if (this.listeners[i].name == name) {
      this.listeners.splice(i,1);
      return;
    }
}

function JSStreamGetListener(id) {
  for (var i = 0; i < this.listeners.length; i++)
    if (this.listeners[i].name == id) {
      return this.listeners[i];
    }
  return null;
}

function JSStreamSessionStarted(){
	if ( this.refreshing ) {
		this.flusher = window.setTimeout("window.stream.flushDataStream();",1000);
		this.checkConnectionInterval = window.setInterval( "window.stream.checkConnection();", this.refreshTimeout * 2 );
		this.lastCheckTime = new Number(new Date());
	}
	if ( startSession ) startSession();
}

function JSStreamCheckConnection(){
	now = new Number(new Date());
	if (( now - this.lastCheckTime ) > ( this.refreshTimeout * 2 )){
		window.clearInterval( this.checkConnectionInterval );
		if ( connectionDown ) 
			connectionDown();
	} 
}

function JSStreamStop(){
    if (this.output) {
         var frame = document.getElementById('jsFrame');
        //document.body.removeChild(frame);
        //this.output.src = "blank.htm";
    }
    /*this.active = false;
    this.loading = false;
    window.session = null;
    this.stopSession();
    */
}

function JSStreamStopSession(){
	if ( this.flusher ) clearTimeout(this.flusher); 
	this.flusher = null;
}

function JSStreamRenewFlushTimeout(){
	this.flusher = window.setTimeout("window.stream.flushDataStream();",this.refreshTimeout);
}

function JSStreamStopHandshake(){
	if ( this.handshakeCheckTimeout )
		clearTimeout(this.handshakeCheckTimeout);
	this.handshakeCheckTimeout = null;
}

function JSFlushStreamData(){
	var url = this.url + "?" + "TICK=" + (new Date() * 1);  // new Date() * 1 ger antalet millisekunder från 1970-01-01, tror jag
	url += "&SESSION=" + window.session;
	url += "&FLUSH=1";
	if ( this.output ) {
		this.flusher = null;
		/*this.output.document.open();
		this.output.document.write( "<html><script language=\"JavaScript\" src=\"" + url + "\" charset=\"windows-1252\"></script></html>" );
		this.output.document.close();*/

		var ifrmDoc = getIFrameDocument(this.output);
		ifrmDoc.open();
		ifrmDoc.write( "<html><script language=\"JavaScript\" src=\"" + url + "\" charset=\"windows-1252\"></script></html>" );
		ifrmDoc.close();
		
		this.lastCheckTime = new Number(new Date());

	}else{
		alert( "Real time communication not possible" );
	}
}

function getIFrameDocument(ifobj){
	var iDoc = (ifobj.contentWindow || ifobj.contentDocument);
	if (iDoc.document) iDoc = iDoc.document;
	return iDoc;
}

function JSStream(output) { 
  this.output = output;
  this.stop = JSStreamStop;
  this.url = "/scripts/webevents.dll";
  this.listeners = new Array();
  this.addListener = JSStreamAddListener;
  this.start = JSStreamStart;
  this.removeListener = JSStreamRemoveListener;
  this.getListener = JSStreamGetListener;
  this.createLayer = JSStreamCreateLayer;
  this.request = new Image();
  this.request.loading = false;
  this.request.onerror = new Function("", "this.loading = false");
  this.active = false;
  this.data = JSStreamData;
  this.customerId = "";
  this.userId = "";
  this.refreshing = false;
  this.sessionStarted = JSStreamSessionStarted;
  this.refreshTimeout = 10000;  // 10 sekunder default
  this.flushDataStream = JSFlushStreamData;
  this.stopSession = JSStreamStopSession;
  this.flusher = null;
  this.renewFlushTimeout = JSStreamRenewFlushTimeout;
  this.handshakeFailed = JSStreamHandshakeFailed;
  this.handshakeCheckOK = JSStreamHandshakeCheckOK;
  this.handshakeTimeoutTime = 10000;
  this.handshakeCheckTimeout = null;
  this.checkConnection = JSStreamCheckConnection;
  this.stopHandshake = JSStreamStopHandshake;
  this.lastCheckTime = 0;
  window.ip_addr = null;  
  window.session = null;
  window.stream = this;
}

/* Funktioner för "komprimerad data"
  OBS JSStream instansen är ej tillgänglig!
  Det blir därför nödvändigt med en "blandning" av medlems-metoder och globala.

  data är i formatet: "a1||3,1|ERI B|2&b2|Senaste nytt|2002-04-30"
  skall mappas till:
  (om a == updateTicker och b == updateNews i mappings)
  parent.beforeEvent();
  eval('parent.updateTicker("1", "", "3,1", "ERI B", "2")');
  eval('updateNews("2", "Senaste nytt", "2002-04-30")');
  afterEvent();
*/
function Mapping(id, name) {
  this.id = id;
  this.name = name;
}
var mappings = new Array();
var nextMapping = "A".charCodeAt(0) - 1;

function mapFunction(id) {
  for (var i = 0; i < mappings.length; i++) {
    if (mappings[i].id == id) {
    	return mappings[i].name;
    }
  }
	return id; // om funtionen saknas så skicka samma som innan (kan vara alert osv.)
}

function addMapping(name) {
  for (var i = 0; i < mappings.length; i++) { // OBS!!! återanvänd "kortnamnen", det kan förekomma många pren/avpren !!!
    if (mappings[i].name == name)
      return mappings[i].id;
  }
   
  _A = "A".charCodeAt(0);
  _Z = "Z".charCodeAt(0);
  _a = "a".charCodeAt(0);
  _y = "y".charCodeAt(0);  // OBS z är upptaget för event-metoden
  nextMapping++; // mapping får vara mellan A..Y, a..z (kom ihåg att A < Y < a < z)
    
  if (nextMapping > _y)
  	nextMapping = _y // tillåt flera bokstäver för metodnamnen, det kommer att dyka upp lösningar med mer än 49 listerners! garanterat!
  else
  	if ((nextMapping > _Z) && (nextMapping < _a))
  		nextMapping = _a;

  mappings[mappings.length] = new Mapping(String.fromCharCode(nextMapping), name);
  return String.fromCharCode(nextMapping);
}

function JSStreamData(data) { // verkar som att this inte är giltigt när det anropas från strömmen ???
  var func = "";
  var args = "";
  if (window.beforeEvent)
    window.beforeEvent();
  data = data.replace(/\x1B&/g, String.fromCharCode(1));
  data = data.replace(/\x1B\|/g, String.fromCharCode(2));
  
  var rows = data.split("&");
  for (var i = 0; i < rows.length; i++) {
    func = rows[i].charAt(0);
    func = mapFunction(func) + "(";
    //rows[i] = rows[i].replace(/¤/g, "&");
    
    rows[i] = rows[i].slice(1);
    args = rows[i].split("|");
    for (var k = 0; k < args.length; k++) {
      func += '"' + args[k].replace(/\x01/g, "&").replace(/\x02/g, "|") + '"';
      if (k < (args.length - 1))
        func += ",";
    }
    func += ")";
    eval(func);
  }
  if (window.afterEvent)
    window.afterEvent();
}