document.domain="ariva.de";
var currDate = '20100316';
currDate = today();

function ArivaPush(change_rel_max) {

	this.optBlinkTime = 1000;
	this.optMinBlinkTime = 500;
	this.optTimeout = 5000;
	this.optStatusTextActive = 'aktiv';
	this.optStatusTextInactive = 'nicht aktiv';
	this.optStatusTextConnect = 'verbinde...';
	this.optStatusTextUnknown = 'unbekannt';
	this.optServerLogin = 'arivaami';
	if (document.domain == 'ariva.de') {
		this.optServerPort = 80;
		this.optServerPrefix = 'push';
		this.altServerPort = 8081;
		this.altServerPrefix = '';
		this.okPort = 0;
	} else {
		this.optServerPort = 8081;
		this.optServerPrefix = 'streaming';
		this.altServerPort = 8081;
		this.altServerPrefix = 'streaming';
		this.okPort = 1;
	}
	this.optColorActive = "";
	this.optColorPlus = '#b0ffb0';
	this.optColorMinus = '#ffaf9f';
	this.optColorNeutral = '#eaeaea';
	this.blinkNeutral = 1;

	this.arhpush_targets = [];
	this.subs = [];
	this.arhpush_blink = [];
	this.arhpush_last = 0;
	this.arhpush_status = 0;
	this.arhpush_stopclick = 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;
	this.subscribe = subscribe;

	this.setURL = setURL;
	this.change_rel_max = change_rel_max;
	this.lastQuoteTime = 0;
	this.params = "";

	this.simplePush = 0;

	var g = getObject('arpush_status');
	if ( g ) {
		g.innerHTML = this.optStatusTextInactive;
		g.style.color = "red";
	}
	var g = getObject('pushbutton');
	if ( g ) {
		g.style.display = "inline";
	}

	/* inner function */
	function subscribe(symbol,cb) {
		this.subs[symbol] = cb;
	}
	
	/* inner function */
	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();

		/* inner function level 2 */
		var rec = function (mel) {
			if (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 ) {
							if ( pidx >= 0 ) {
								var p = classParts[pidx];
								if ( p == "arp_hide" ) { 
									i.innerHTML = '&nbsp;';
								} else 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);

		for ( id in this.subs ) {
			if ( !already_id[id] ) {
				r = r+id+',';
			}
		}
	  
		this.arhpush_status = 1;
		this.arhpush_targets= t ;
		this.allfields = allf;
		this.arhpush_stopclick= 0 ;
		this.params = r.substring(0,r.length-1);

		this.setURL();

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

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

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

	};


	/* inner function */
	function restartPushConnection() {
		if (this.arhpush_stopclick == 0) {
			this.iframe.src=this.url;
			this.arhpush_status = 1;
			for ( fie in this.allfields ) {
				this.allfields[fie].lastValue = null;
				this.allfields[fie].lastFormattedValue = null;
				this.allfields[fie].lastBlinkTime = null;
			}

		}
	}



	/* inner function */
	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 ) {
			if ( d >= 0 ) {
				var second = data_arr[d].charAt(1);
				var third = data_arr[d].charAt(2);
				var splitAt = 3;
				if ( (third > -1 && third < 10 )  || third =="-" ) {
					splitAt = 2;
				}
				if ( (second > -1 && second < 10) || second =="-" ) {
					splitAt = 1;
				}
				var key = data_arr[d].substring(0,splitAt);
				var value = data_arr[d].substring(splitAt);
				if ( key.length > 0 && value>-1) {
					data[key] = value;
				}
			}
		}

		if ( this.subs[id] || this.subs[""+ag+"@"+boerse_id] ) {
			var s = this.subs[id] || this.subs[""+ag+"@"+boerse_id];
			s(data,id,ag,boerse_id);
		}

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



	/* inner function */
	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;
			}
		}

	};


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

	/* inner function */
	function setURL() {
		this.url = "http://" + (this.optServerPrefix ? this.optServerPrefix + "." : "") + document.domain + (this.optServerPort > 80 ? ":" + this.optServerPort : "") + "/push?secu=" + this.params + "&domain=" + document.domain;
		if (this.simplePush) {
			this.url = "http://www.ariva.de/test/pushsim?secus="+this.params+"&domain=ariva.de";
		}
	};

	/* inner function */
	function checkConnection() {
		var g = this.getObject('arpush_status');
		if ( g ) {
			var d = time()-this.arhpush_last;
			if ( d > this.optTimeout ) {
				if (this.arhpush_last > 0 && this.okPort == 0 && this.arhpush_last > 0) {
					if (this.optServerPort != this.altServerPort) {
						this.optServerPort = this.altServerPort;
						this.optServerPrefix = this.altServerPrefix;
					}
					else {
						this.okPort = 1;
						this.optServerPort = 1;
						this.simplePush = 1;
					}
					this.setURL();
				}
				this.arhpush_last = time();
				this.arhpush_status = 0;
				this.restartPushConnection();
			}
			if (this.arhpush_status == 2) {
				this.okPort = 1;
				if (this.simplePush == 0) {
					this.optTimeout = 3 * this.optTimeout;
				}
			}
			g.innerHTML = ""+ (this.arhpush_status == 0 ? this.optStatusTextInactive : this.arhpush_status == 2 ? this.optStatusTextActive+(this.simplePush == 1 ? " (3)" : this.optServerPort==this.altServerPort ? " (2)" : "") : this.arhpush_status == 1 ? this.optStatusTextConnect : this.optStatusTextUnknown);
			g.style.color = ""+ (this.arhpush_status == 2 ? 'green' : 'red');
		}
	};

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


	/* inner function */
	function arhpush_draw(ag,bid,qid,data) {

		if (this.arhpush_stopclick == 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]);
				}
				for ( fidx in targets ) {
					var target = targets[fidx];
					if ( targets ) {

						var f = target['t'];
						var nozero = target['nozero'];
						var blink = target['blink'];
						var value = data[field];
						if ( f!=null ) {
							var formattedValue = value; 
							/* Uhrzeit mit ohne bzw. mit Sekunden*/
							if ( target.format == 'time' || target.format == 'timesec' ) {
								var tdate = value.substr(0,8);
								if (tdate == currDate) {
									formattedValue = value.substr(8,2)+":"+value.substr(10,2); 
									if (target.format == 'timesec') { formattedValue = formattedValue+":"+value.substr(12,2); }
								}
								else {
									//window.alert(tdate+" und curr: "+currDate);
									formattedValue = value.substr(6,2)+"."+value.substr(4,2)+"."+value.substr(2,2);
								}
								this.lastQuoteTime = value;
							} else if ( target.format == 'timelong' ) {
								/* (deutsches ?) datetime mit 2 Jahresziffern */
								formattedValue = value.substr(6,2)+"."+value.substr(4,2)+"."+value.substr(2,2)+" "+value.substr(8,2)+":"+value.substr(10,2); 
								this.lastQuoteTime = value;
							} else if ( target.format == 'int' ) {
								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); }
								formattedValue = zahl; 
							} else if ( target.format == 'price' ) { 
								/* HashValue->price */
								if      (value < 0.01) { formattedValue = this.formatNum(value,4); }
								else if (value < 0.1)  { formattedValue = this.formatNum(value,3); }
								else if (value > 999)  { formattedValue = this.formatNum(value,0); }
								else if (value < 6 && value.length>5) { formattedValue = this.formatNum(value,4); }
								else if (value < 6 && value.length>4) { formattedValue = this.formatNum(value,3); }
								else                   { formattedValue = this.formatNum(value,2); }
							} else if ( target.format == 'priceh' ) {
								/* HashValue->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)+"%") : "-";
							}
							if ( nozero && value == 0 ) {
								formattedValue = '-';
							}

							/* von last-Wert-Aenderung abhaengige Werte aktualisieren */
							if (field == 'p' && target.lastValue && value != target.lastValue) {

								/* Aenderung zum Vortag aktualisieren */
								if (document.getElementById("arp_"+id+"_c") != null && document.getElementById("arp_"+id+"_percent") != null) {
									close_val = document.getElementById("arp_"+id+"_c").innerHTML;
									close_val = close_val.replace(".", "");
									close_val = parseFloat(close_val.replace(",", "."));
									if ( close_val > 0 ) {
										pvalue = (value - close_val) / close_val * 100;
										if (pvalue > -1000 && pvalue < 1000) {
											pformattedValue            = this.formatNum(Math.abs(pvalue),2)+"%";
											pformattedValue            = (pvalue >= 0 ? "+" : "-")+pformattedValue;
											var percentElement         = document.getElementById("arp_"+id+"_percent");
											percentElement.innerHTML   = pformattedValue;


											/* Farbgebung durch Klassennamen*/
											if (percentElement.className == 'colwin' || percentElement.className == 'colloss') {
												percentElement.className = (pvalue < 0 ? 'colloss' : 'colwin');
											}

											/* Balken aktualisieren */
											if (this.change_rel_max > 0 && document.getElementById("arp_"+id+"_balken") != null) {
												var width_percent = Math.abs(pvalue) / this.change_rel_max * 100;
												if (width_percent < 0) { width_percent = 0; }
												if (width_percent > 100) { width_percent = 100; }
												document.getElementById("arp_"+id+"_balken").style.width = width_percent+"%";
												document.getElementById("arp_"+id+"_balken").style.backgroundColor = (pvalue < 0 ? '#d5a3a3' : '#a3d5a3');
											}
										}
									}
								}else{
								}

							}
							f.innerHTML = formattedValue;
							if ( blink && target.lastValue && target.lastFormattedValue) {
								bgColor = "";
								if (formattedValue != target.lastFormattedValue && value > target.lastValue) {
									bgColor = this.optColorPlus;
								} else if (formattedValue != target.lastFormattedValue && value < target.lastValue) {
									bgColor = this.optColorMinus;
								} else if (this.blinkNeutral && target.lastBlinkTime < this.time() - this.optMinBlinkTime) {
									bgColor = this.optColorNeutral;
								}
								if (bgColor) {
									f.style.backgroundColor = bgColor;
									target.blinked++; 
									this.arhpush_blink.push(this.time());
									this.arhpush_blink.push(target);
									this.arhpush_blink.push(target.blinked);
									target.lastBlinkTime = this.time();
								}
							}
						}//endif ( f!=null )
					}//endif ( targets )
					target.lastValue = value;
					target.lastFormattedValue = formattedValue;
				}//endfor ( fidx in targets )
			}//endfor ( field in data )
		}//endif
	}

	this.formatNum = formatNum;

	/* inner function */
	function formatNum(value, stellen) {
		stellen = stellen >= 0 ? stellen : 2;
		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); 
			var i = Math.floor(value);
			var gz = i;
			gz = gz.toString();
			if (gz.length > 3) { gz = gz.substr(0,gz.length-3) + "." + gz.substr(gz.length-3); }
			if (gz.length > 7) { gz = gz.substr(0,gz.length-7) + "." + gz.substr(gz.length-7); }
			var fr = ""+(value-i+0.000002);
			fr = fr.substr(2,stellen);
			return "" + gz + (stellen ? ","+fr : "");
		}
	}

};//endof function ArivaPush(change_rel_max)

function push_button(timeout) {
	if (ap.arhpush_status == 0) {
		ap.arhpush_init(getObject('realpush'));
		if (document.getElementById("pushbutton")) {
			document.getElementById("pushbutton").value = "Push stoppen";
		} else if (document.getElementById("pushlink")) {
			document.getElementById("pushlink").innerHTML = "Push stoppen";
		}
		timeout = timeout ? timeout : 12*3600;
		setTimeout ('push_button()', timeout*1000);
	}else{
		ap.iframe.src="";
		ap.arhpush_status = 0;
		ap.arhpush_stopclick = 1;
		if (document.getElementById("pushbutton")) {
			document.getElementById("pushbutton").value = "Push starten";
		} else if (document.getElementById("pushlink")) {
			document.getElementById("pushlink").innerHTML = "Push starten";
		}
	}
}

function today() {
	var date=new Date(); 
	var yyyy=date.getYear();
	if (yyyy<200) {yyyy=yyyy+1900};
	var yyyy=new String(yyyy);
	
	var dd = new String(date.getDate());          if (dd.length<2) {dd = "0"+dd+""};
	var mm = new String(date.getMonth() + 1);     if (mm.length<2) {mm = "0"+mm+""};
	var HH = new String(date.getHours());         if (HH.length<2) {HH = "0"+HH+""};
	var MM = new String(date.getMinutes());       if (MM.length<2) {MM = "0"+MM+""};
	var SS = new String(date.getSeconds());       if (SS.length<2) {SS = "0"+SS+""};
	return yyyy+mm+dd;
}

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];
}

function showstatus () {
	var res = document.getElementById("pushi");
	if (res) {
		res.style.display = "block";
		res.style.left = (document.getElementById("pushbutton").offsetLeft)+"px";
		res.style.top = (document.getElementById("pushbutton").offsetTop+31)+"px";
	}
	window.status = "Fertig";
};

function hidestatus () {
	var res = document.getElementById("pushi");
	if (res) {
		res.style.display = "none";
	}
	window.status = "Fertig";
};


