	//global vars
	var myEngine;
	var debugAlerts;
	var remoteAlerts;
	//functions
	function pushPageSetting(
		domain,
		host,
		port,
		startMode,
		heuristicSlowing
	) {
		this.domain = domain;
		this.host = host;
		this.port = port;
		this.startMode = startMode;
		this.heuristicSlowing = heuristicSlowing;
	}
	function pushTableSetting(
		tableName,
		group,
		schema,
		redColor,
		greenColor,
		flashTime,
		fadeTime,
		backC1,
		backC2,
		startSnapshot,
		clearOnDisconnect,
		pushTableUpdateItem,
		pushTableFormatValues
	) {
		this.tableName = tableName;
		this.group = group;
		this.schema = schema;
		this.redColor = redColor;
		this.greenColor = greenColor;
		this.flashTime = flashTime;
		this.fadeTime = fadeTime;
		this.backC1 = backC1;
		this.backC2 = backC2;
		this.startSnapshot = startSnapshot;
		this.clearOnDisconnect = clearOnDisconnect;
		this.pushTableUpdateItem = pushTableUpdateItem;
		this.pushTableFormatValues = pushTableFormatValues;
	}
	function pushScrollTableSetting(
		tableName,
		item,
		schema,
		maxRows,
		upwardScroll,
		flashColor,
		flashTime,
		fadeTime,
		backColor,
		startSnapshot,
		clearOnDisconnect,
		clearOnRemove,
		clearOnAdd,
		pushScrollTableUpdateItem,
		pushScrollTableFormatValues
	) {
		this.tableName = tableName;
		this.item = item;
		this.schema = schema;
		this.maxRows = maxRows;
		this.upwardScroll = upwardScroll;
		this.flashColor = flashColor;
		this.flashTime = flashTime;
		this.fadeTime = fadeTime;
		this.backColor = backColor;
		this.startSnapshot = startSnapshot;
		this.clearOnDisconnect = clearOnDisconnect;
		this.clearOnRemove = clearOnRemove;
		this.clearOnAdd = clearOnAdd;
		this.pushScrollTableUpdateItem = pushScrollTableUpdateItem;
		this.pushScrollTableFormatValues = pushScrollTableFormatValues;
	}
	function pushChartSetting (
		group,
		schema,
		startSnapshot,
		clearOnDisconnect,
		areaClass,
		areaWidth,
		areaHeight,
		areaLeft
	) {
		this.group = group;
		this.schema = schema;
		this.startSnapshot = startSnapshot;
		this.clearOnDisconnect = clearOnDisconnect;
		this.areaClass = areaClass;
		this.areaWidth = areaWidth;
		this.areaHeight = areaHeight;
		this.areaLeft = areaLeft;
	}
//	function pushTableUpdateItem(item, updateInfo) {
//		if (updateInfo == null) {
//			return;
//		}
//		var oldValue = parseFloat(updateInfo.getOldValue(1));
//		var newValue = parseFloat(updateInfo.getNewValue(1));
//		var isChanged = updateInfo.isValueChanged(1);
//		if (oldValue == null) { //first update for this item
//			updateInfo.addField(schema.length+1,greenColor,true);
//			if (doFade) {
//				updateInfo.addField(schema.length+2,false,true);
//			}
//		} else if (isChanged) {
//			//at least second update
//			if (oldValue > newValue) {
//				updateInfo.addField(schema.length+1,redColor,true);
//			} else {
//				updateInfo.addField(schema.length+1,greenColor,true);
//			}
//			if (doFade) {
//				updateInfo.addField(schema.length+2,true,true);
//			}
//		}
//	}
//	function pushTableFormatValues(item, itemUpdate) { //onChangingValues
//		if (itemUpdate == null) {
//			return;
//		}
//		if (doFade) {
//			if (itemUpdate.getServerValue(schema.length+2) == true) {
//				itemUpdate.setHotToColdTime(fadeTime);
//			}
//		}
//		itemUpdate.setHotTime(flashTime);
//		var backC = (item % 2 == 1) ? backC1 : backC2;
//		itemUpdate.setRowAttribute(itemUpdate.getServerValue(schema.length+1),backC,"backgroundColor");
//	}
	function pushGetNewChart(item,xStart) {
		chart = new ChartLine();
		chart.setPointClass("pushpo"+item);
		chart.setLineClass("pushpx"+item);
		chart.onpushYOverflow = pushYOverflow;
		
		xStart = new String(xStart);
		
		maxX = pushGetSeconds(xStart)+300; //-- Schrittweite der X-Achse (min - max, wobei min + 60 Sekunden = max ist)
		minX = pushGetSeconds(xStart);
		pushChart.positionXAxis(minX, maxX)
		
		chart.setYAxis(item,2,true); //bid
		chart.positionYAxis(minY,maxY);
		
		var lblFrmttr = {};
		lblFrmttr.formatValue = pushFormatYlbl;
		chart.setYLabels(4,"pushLabel pushLabelY",lblFrmttr); //--- Anzahl der Y-Achsenlabels
		
		return chart;
	}
	function pushOnChartUpdate(item, upOb) {
		if (upOb == null) {
			return;
		}
		upOb.addField(3,pushGetSeconds(upOb.getNewValue(1)),true);
		if (upOb.getOldValue(1) == null) { //first update for this item
			if (!lines[item]) {
				lines[item] = pushGetNewChart(item,upOb.getNewValue(3));
				pushChart.addLine(lines[item],"t"+item);
			}
		}
	}
	function pushGetSeconds(stringDate) {
		stringDate = new String(stringDate);
		i1 = stringDate.indexOf(':');
		i2= stringDate.lastIndexOf(':');
		return(stringDate.substring(0,i1)*3600+stringDate.substring(i1+1,i2)*60+stringDate.substring(i2+1,stringDate.length)*1);
	}
	function pushYPosition(yValue) {
		var y = new String(yValue);
		if (y.indexOf(",") > -1 ) {
			var y=y.replace(",",".");
		}
		return new Number(y);
	}
	function pushYOverflow(lastY, minY, maxY) {
		var _shift = (maxY - minY)/2;
		var newMax;
		var newMin;
		
		if (lastY > maxY) {
			newMax = maxY + _shift;
			if (lastY > newMax) {
				newMax = lastY;
			}
			newMin = minY;
			
		} else if (lastY < minY) {
			newMin = minY - _shift;
			if (lastY < newMin) {
				newMin = lastY;
			}
			newMax = maxY;
		} 
		
		for (var item in lines) {
			lines[item].positionYAxis(newMin,newMax);
		}
	}
	function pushFormatYlbl (val) {
		return pushFormatDecimal(val,decimalPlaces,true);
	}
	
	function pushFormatXlbl (val) {
		return pushFormatTime(pushGetTime(val));
	}
	
	function pushGetTime(secondsStr) {
		var hours = Math.floor(secondsStr/(60*60));
		var seconds = secondsStr - (hours * (60*60));
		var minutes = Math.floor(seconds/60);
		var seconds = Math.round(seconds - (minutes * 60));
		if (minutes.toString().length < 2) {
			minutes = ":0" + minutes; 
		} else {
			minutes = ":" + minutes; 
		}
		
		if (seconds.toString().length < 2) {
			seconds = ":0" + seconds; 
		} else {
			seconds = ":" + seconds; 
		}
		
		var result = hours +  minutes + seconds;
		if(result != "0:00:00")
			return hours +  minutes + seconds;
		else
			return "";
	}
	function pushFormatTime(val) {
		var a = new Number(val.substring(0,val.indexOf(":")));
		var b = val.substring(val.indexOf(":"),val.length);
		
		var result = a + b;
		if(result != "0")
			return result;
		else
			return "";
	}
	function pushFormatDecimal(value, decimals, keepZero) {
		var mul = new String("1");
		var zero = new String("0");
		for (var i = decimals; i > 0; i--) {
			mul += zero;
		}
		value = Math.round(value * mul);
		value = value / mul;
		var strVal = new String(value);
		if (!keepZero) {
			return strVal;	
		}
		var nowDecimals = 0;
		var dot = strVal.indexOf(".");
		if (dot == -1) {
			strVal += ".";
		} else {
			nowDecimals = strVal.length - dot - 1;
		}
		for (var i = nowDecimals; i < decimals; i++) {
			strVal = strVal + zero;
		}
		return strVal;
	}
	function pushChartInit(oC) {
		lines = {};
		pushChart = new ChartTable(oC.group, oC.schema, "MERGE");
		pushChart.setSnapshotRequired(oC.startSnapshot);
		pushChart.setRequestedMaxFrequency(0.9);
		pushChart.setAreaClass(oC.areaClass);
		pushChart.setAreaWidth(oC.areaWidth);
		pushChart.setAreaHeight(oC.areaHeight);
		pushChart.setAreaLeft(oC.areaLeft);
		pushChart.onItemUpdate = pushOnChartUpdate;
		pushChart.setClearOnRemove(true);
		pushChart.setClearOnDisconnected(oC.clearOnDisconnect);
		pushChart.setClearOnAdd(false);
		//--- x
		pushChart.setXAxis(3,false); //aus item2 in pushOnChartUpdate
		var labelFormatter = {};
		labelFormatter.formatValue = pushFormatXlbl;
		pushChart.setXLabels(6,"pushLabel",labelFormatter); //Anzahl der X-Achsenlabels
		//---
		page.addTable(pushChart,"pushchart");
	}
	function pushTableInit(o) {
		var pushTable = new OverwriteTable(o.group,o.schema,"MERGE");
		pushTable.setSnapshotRequired(o.startSnapshot);
		pushTable.setPushedHtmlEnabled(true); 
		pushTable.setRequestedMaxFrequency(1);
		pushTable.setClearOnDisconnected(o.clearOnDisconnect);
		pushTable.setClearOnRemove(false); //default is false
		pushTable.setClearOnAdd(false); //default is true
		pushTable.onItemUpdate = o.pushTableUpdateItem;
		pushTable.onChangingValues = o.pushTableFormatValues;
		page.addTable(pushTable,o.tableName);
	}
	function pushScrollTableInit(o) {
		var pushScrollTable = new DynaScrollTable(o.item,o.shema,"MERGE");
		pushScrollTable.setSnapshotRequired(o.startSnapshot); 
		pushScrollTable.setPushedHtmlEnabled(false); 
		pushScrollTable.setClearOnDisconnected(o.clearOnDisconnect); 
		pushScrollTable.setClearOnRemove(o.clearOnRemove); 
		pushScrollTable.setClearOnAdd(o.clearOnAdd); 
		pushScrollTable.setMaxDynaRows(o.maxRows); 
		pushScrollTable.setUpwardScroll(o.upwardScroll);
		pushScrollTable.onRowUpdate = o.pushScrollTableUpdateItem;
		pushScrollTable.onChangingValues = o.pushScrollTableFormatValues;
		page.addTable(pushScrollTable,o.tableName);
	}
	function pushTableRemove(o) {
		page.removeTable(o.tableName);
	}
	function pushPageInit(o) {
		page = new PushPage();
		if (location.href.indexOf(".int/") > -1) {
			debugAlerts = true;
			remoteAlerts = false;
		} else {
			debugAlerts = false;
			remoteAlerts = true;
		}
		page.context.setDebugAlertsOnClientError(debugAlerts);
		page.context.setRemoteAlertsOnClientError(remoteAlerts);
		page.context.setDomain(o.domain);
		page.onEngineCreation = function(engine) {
			engine.context.setDebugAlertsOnClientError(debugAlerts);
			engine.context.setRemoteAlertsOnClientError(remoteAlerts);
			/* engine.policy.setMaxBandwidth(30);  //Vivace only! */
			engine.policy.setSlowingEnabled(o.heuristicSlowing);
			engine.policy.setIdleTimeout(30000);
			engine.policy.setPollingInterval(1000);
			engine.connection.setLSHost(o.host);
			engine.connection.setLSPort(o.port);
			engine.connection.setAdapterName("SmarthouseFeed");
			engine.onStatusChange = pushServerMessage;
			engine.onClientAlert = pushSHErrorhandler;
			//console.log('EVENT onEngineCreation');
		}
		page.onEngineReady = function(engine) {
		//console.log('EVENT onEngineReady');
 		//console.log('isMasterPushPage ',String(page.isMasterPushPage()));
			myEngine = engine;
			pushSetMode(o.startMode);
		}
		page.onEngineLost = function() {
			myEngine = null;
			//console.log('EVENT onEngineLost');
		}
		page.onClientAlert = pushSHErrorhandler;
		page.bind();
		page.createEngine("SHEngine", "/Scripts/Pushv2/","SHARE_SESSION");
	}
	function pushSetMode(mode) {
		switch (mode.toUpperCase()) {
			case "STREAMING":
				if (myEngine.getStatus()!="STREAMING") {
					myEngine.changeStatus("STREAMING");
				}
				break;
			case "POLLING":
				if (myEngine.getStatus()!="POLLING") {
					myEngine.changeStatus("POLLING");
				}
				break;
			case "DISCONNECTED":
				if (myEngine.getStatus()!="DISCONNECTED") {
					myEngine.changeStatus("DISCONNECTED");
				}
				break;
		/*
			default :
				statement;
		*/
		}
	}
	function pushSwitchMode() {
		if (myEngine.getStatus()== "STREAMING") {
			myEngine.changeStatus("DISCONNECTED");
		} else {
			myEngine.changeStatus("STREAMING");
		};
	}
	function pushServerMessage() {
		defaultStatus = "Smarthouse Pushserver: " + myEngine.getStatus();
	};
	function pushSHErrorhandler(number,message) {
		switch (number){
			case 100:
				alert('Antivirussoftware oder eine Firewall verhindern eine Verbindung zum Smarthouse Pushserver\r\nAntivirus software or a firewall are blocking your connection to Smarthouse Pushserver');
				break;
			case 120: 
				alert('Es sind zu viele Browserfenster / Browsertabs mit einer Verbindung zum Smarthouse Pushserver geöffnet. Bitte schließen Sie min. eines dieser Fenster\r\nToo many browser windows / browser tabs are connected to Smarthouse Pushserver - please consider to close some of them');
				break;
		/*
			default :
				statement;
		*/
		}
	};

