document.domain="boerse-duesseldorf.de";

function ArivaPush() {

this.optBlinkTime = 1000;
this.optTimeout = 30000;
this.optStatusTextActive = 'RT-Push: Aktiv';
this.optStatusTextInactive = 'RT-Push: Inaktiv';
this.optStatusTextConnect = 'RT-Push: Verbinde...';
this.optStatusTextUnknown = 'RT-Push: Unbekannt';
this.optServerLogin = 'bdrt11';
this.optServerPort=8081;
this.optServerPrefix='streaming';
this.optColorActive = "#f3f3f3";
this.optColorPlus = '#99cc33';
this.optColorMinus = '#cc0000';
this.optColorNeutral = '#bbbbbb';

this.arhpush_targets = [];
this.arhpush_blink = [];
this.arhpush_last = 0;
this.arhpush_status = 0;
this.mexx = 23;
this.allfields = [];


this.restartPushConnection = restartPushConnection;
this.arhpush_init = arhpush_init;
this.arhpush_update = arhpush_update;
this.getObject = getObject;
this.arhpush_unblink = arhpush_unblink;
this.time = time;
this.checkConnection = checkConnection;
this.arhpush_draw = arhpush_draw;
this.arhpush_update_status = arhpush_update_status;

function arhpush_init(el) {

  var id2node = [];

  var l = new Array;
  var r = '';
  var t = [];
  var allf = [];
  var bgcol = this.optColorActive;
  var regu = new RegExp('\\d+@\\d+');
  var already_id = new Array();

  var rec = function (mel) {
    for (var i = mel.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 1 && i.id != "PushMeClient"  ) {
          var id = 0;
          var field = 0;
          var opt = { 't' : i};
          var classParts = i.className.split(" ");
          for ( pidx in classParts ) {
             var p = classParts[pidx];
             if ( p.substring(0,4) == 'arp_' ) {
               var cmdParts = p.split("_");
               id = cmdParts[1];
               field = cmdParts[2];
               for ( pidx=3; pidx<cmdParts.length; pidx++ ) {
                   var kv = cmdParts[pidx].split('=');
                   opt[kv[0]]=kv[1]||'1';
               }
               if ( bgcol ) {
                   i.style.backgroundColor = bgcol;
               }
               opt['bg'] = i.style.backgroundColor;
               opt['blinked'] = 0;
             }

        };
        if ( id && field && ( id.match(regu))  ) {
            l[l.length]=id;
	    if ( !already_id[id] ) {
                r = r+id+',';
            }
            if ( !t[id+"_"+field] ) {
                t[id+"_"+field] = new Array();
            }
            t[id+"_"+field].push(opt) ;
            allf.push(opt);
	    already_id[id] = 1;
    }
        rec(i);
      }
    }
  }

  rec(el);
  this.arhpush_status = 1;
  this.arhpush_targets= t ;
  this.allfields = allf;

  this.url = "http://"+this.optServerPrefix+"."+document.domain+":"+this.optServerPort+"/push?secu="+r.substring(0,r.length-1)+"&domain="+document.domain+"&login="+this.optServerLogin;

  var tempIFrame=document.createElement('iframe');
  tempIFrame.setAttribute('id','iframe1');
  tempIFrame.style.border='0px';
  tempIFrame.style.width='0px';
  tempIFrame.style.height='0px';
  this.iframe = el.appendChild(tempIFrame);
  var me = this;

  this.checkConnection();
  this.restartPushConnection();

  window.setInterval(function(){ me.arhpush_unblink() },50);
  window.setInterval(function(){ me.checkConnection() },5000);
  window.arhpush_update = function(a,b,c) { me.arhpush_update(a,b,c); };

};


function restartPushConnection() {
  this.iframe.src=this.url+"&rand="+this.time();
  for ( fie in this.allfields ) {
	this.allfields[fie].lastValue = null;
  }
}


function arhpush_update(resp) {
   var x = resp.split(':');

   var id = x[0];
   var id1= id.split('@');
   var id2= id1[1].split('.');

   var ag= id1[0];
   var boerse_id= id2[0];
   var qs= id2[1];

   var data_arr = x[1].split(' ');
   var data = [];

   for ( d in data_arr ) {
        var second = data_arr[d].charAt(1);
        var splitAt = 2;
        if (second > -1 && second < 10 ) {
           splitAt = 1;
        }
        var key = data_arr[d].substring(0,splitAt);
        var value = data_arr[d].substring(splitAt);
        if ( key ) {
           data[key] = value;
        }
   }

  this.arhpush_draw(ag,boerse_id,qs,data);
 //  getObject("response").innerHTML = resp;
};



function arhpush_unblink() {

  var t = this.time();

  while ( this.arhpush_blink.length && t-this.arhpush_blink[0] > this.optBlinkTime ) {
    var told = this.arhpush_blink.shift();
    var target = this.arhpush_blink.shift();
    var blinked = this.arhpush_blink.shift();
    if ( target['blinked'] == blinked ) {
      var f = target['t'];
      f.style.backgroundColor = target.bg;
    }
  }

};


function time() {
  return new Date().getTime();
};

function checkConnection() {
  var g = this.getObject('arpush_status');
  if ( g ) {
     var d = time()-this.arhpush_last;
     if ( d > this.optTimeout ) {
       this.arhpush_last = time();
       this.arhpush_status = 1;
       this.restartPushConnection();
     }
     g.innerHTML = ""+ (this.arhpush_status == 0 ? this.optStatusTextInactive : this.arhpush_status == 2 ? this.optStatusTextActive : this.arhpush_status == 1 ? this.optStatusTextConnect : this.optStatusTextUnknown);
  }
};

function arhpush_update_status(v) {
  this.arhpush_status = 2;
};


function arhpush_draw(ag,bid,qid,data) {

    function get_node(node, offset) {
      if ( node.hasChildNodes() ) {
        offset++;
        for (var i=0;i<node.childNodes.length;i++) { get_node(node.childNodes[i], offset); }
      }
      else {
        if ( offset > offset_save ) {
          offset_save = offset;
          node_save = node;
        }
        offset = 0;
      }
    }

    this.arhpush_last = time();
    if ( this.arhpush_status != 2 ) {
      this.arhpush_status = 2;
      this.checkConnection();
    }
    var id = ag+"@"+bid+"."+qid;
    var id_short = ag+"@"+bid;
    for ( field in data ) {
        var targets = this.arhpush_targets[id+"_"+field];
        if ( !targets ) { targets = new Array() }
       	var stargets = this.arhpush_targets[id_short+"_"+field]
        if ( !stargets ) { stargets = new Array() }
        for ( idx in stargets ) {
		targets.push(stargets[idx]);
	}
        //if ( !target ) { target = this.arhpush_targets[id_short+"_"+field] }
        for ( idx in targets ) {
	var target = targets[idx];
        if ( target ) {
            var f = target['t'];
            var blink = target['blink'];
            var value = data[field];
            if ( f!=null ) {
                var formattedValue = value;
                if ( target.format == 'time' ) {
                  formattedValue = value.substr(8,2)+":"+value.substr(10,2)+":"+value.substr(12,2);
                } else if ( target.format == 'iprice' ) {
                  formattedValue = this.formatNum(value,0);
                } else if ( target.format == 'price' ) {
                  formattedValue = this.formatNum(value,2);
                } else if ( target.format == 'kurs' ) {
					// Anzahl Nachkommastellen ermitteln
					var nks = /(\d+)\.(\d+)/;
					nks.exec(value);
					var nks_wert=RegExp.$2;
                	formattedValue=this.formatNum(value,nks_wert.length);
               } else if ( target.format == 'int' ) {
                  formattedValue = this.formatNum(value,0);
                } else if ( target.format == 'priceh' ) {
                  formattedValue = this.formatNum(value,4);
                } else if ( target.format == 'multipleprice' ) {
		  var fvalue = value*target.factor;
                  formattedValue = this.formatNum(fvalue,2)
                } else if ( target.format == 'multiplechangeabs' ) {
		  var fvalue = value*target.factor-target.base;
                  formattedValue = (fvalue<0?"":"+")+this.formatNum(fvalue,2)
                } else if ( target.format == 'multiplechangerel' ) {
		  var fvalue = (value*target.factor)/target.base*100-100;
                  formattedValue = (fvalue<0?"":"+")+this.formatNum(fvalue,2)+"%";
                } else if ( target.format == 'changeabs' ) {
		  var fvalue = value-target.base;
                  formattedValue = target.base > 0 ? ((fvalue<0?"":"+")+this.formatNum(fvalue,2)) : "-";
                } else if ( target.format == 'changerel' ) {
		  var fvalue = value/target.base*100-100;
                  formattedValue = target.base > 0 ? ((fvalue<0?"":"+")+this.formatNum(fvalue,2)+"%") : "-";
                }
                var offset_save = 0;
                var node_save;
                get_node(f, 0);
                if ( node_save && node_save.nodeType == 3 ) { node_save.data = formattedValue; }
                else { f.innerHTML = formattedValue; }
                if ( blink && target.lastValue) {
                  f.style.backgroundColor=value > target.lastValue ? this.optColorPlus : value < target.lastValue ? this.optColorMinus : this.optColorNeutral;
                  target.blinked++;
                  this.arhpush_blink.push(this.time());
                  this.arhpush_blink.push(target);
                  this.arhpush_blink.push(target.blinked);
                }
            }
            target.lastValue = value;
        }
        }
    }
}

/* neue Version: Anzahl Tausendertrenner wird dynamisch ermittelt, Vorzeichen wird beibehalten - mn */
this.formatNum = formatNum;
function formatNum(value, stellen) {
   stellen = stellen >= 0 ? stellen : 2;

// Vorzeichen
	var wort  = value.toString();
	var minus = wort.indexOf("-");

   if (stellen == 0) {
     var zahl = Math.round(value);
     zahl = zahl.toString();
     if (zahl.length > 3) { zahl = zahl.substr(0,zahl.length-3) + "." + zahl.substr(zahl.length-3); }
     if (zahl.length > 7) { zahl = zahl.substr(0,zahl.length-7) + "." + zahl.substr(zahl.length-7); }
     return zahl;
   }
   else {
     value = Math.abs(value); // Vorzeichen entfernen
     var i = Math.floor(value); // Ganzzahl abgerundet
     var gz = i;
     gz = gz.toString();

	var anz_zeichen=gz.length;
	var anz_z=anz_zeichen;
	var count=0;
	if(anz_z>3){
		while((anz_zeichen >= 2 && anz_z%3!=0)||(anz_zeichen > 2 && anz_z%3==0)){
			count++; // Anzahl Schleifendurchlauf
			var teil1=gz.substr(0,gz.length-(3*count+(count-1)));
			var teil2=gz.substr(gz.length-(3*count+(count-1)));
			gz = teil1 + "." + teil2;
			anz_zeichen--; // ein Zeichen mehr wegen eingefügtem Tausendertrenner
			anz_zeichen-=3; // 3 Zeichen, die bearbeitet wurden
		}
	}
    var fr = ""+(value-i+0.000002);
    fr = fr.substr(2,stellen);
    var ausgabe="" + gz + (stellen ? ","+fr : "");
    if(minus !=-1){ ausgabe = "-" + ausgabe; }
    return ausgabe;
   }
}


function getObject(name) {
  if(document.getElementById) return document.getElementById(name);
  else if(document.all) return document.all[name];
  else if(document.layers) return document.layers[name];
}

};





