function vwdStreamer(){this.version="1.0.3";this.initialized=false;this.initializationStarted=false;this.connected=false;this.reconnected=false;this.requestFormAvailable=false;this.functionQueue=new vwdStreamerQueue();this.heartbeatInterval=5*1000;this.reconnectInterval=15*60*1000;this.initialize=function(d,c,b){document.vwdStreamerInstance=this;this.domain=d;this.host=c;this.port=b;this.mappings=new Array();this.reversedMappings=new Array();this.subscribers=new Array();this.logListeners=new Array();this.cachedValues=new Array();this.triggers=new Array();this.parsers=new Array();this.subscribedFields=new Array();this._initializeTriggers();this._initializeParsers();if(this.domain!=null){document.domain=this.domain}var a=this;if(document.addEventListener){window.addEventListener("load",function(){a._initializeComponents()},false)}else{if(document.attachEvent){window.attachEvent("onload",function(){a._initializeComponents()})}}setTimeout(function(){a._initializeComponents()},1000);setInterval(function(){if(a.initialized){a.functionQueue.flush()}},100);setInterval(function(){a._checkHeartbeatAndReconnect()},this.heartbeatInterval)};this.connect=function(b){this._log(vwdStreamerLogLevel.TRACE,"Connecting with SessionId: "+b);this.lastConnectTime=new Date();this.sessionId=null;var a=this;this.functionQueue.enqueue(function(){a.responseFrame.src=a._getResponseURL(b)})};this.getSubscription=function(b){var a=new vwdStreamerSubscription(this,b);this.subscribers[this.subscribers.length]=a;return a};this.removeSubscription=function(b){var c=-1;for(var a in this.subscribers){if(this.subscribers[a]==b){c=a;break}}b.unsubscribeAllFields();this.subscribers.splice(c,1)};this.addLogListener=function(b,c){var a={listener:b,logLevel:c};this.logListeners[this.logListeners.length]=a};this.removeLogListener=function(c){var a=-1;for(var b in this.logListeners){if(this.logListeners[b]==c){listenerIndexToRemove=b;break}}this.logListeners.splice(a,1)};this.isConnected=function(){return this.connected};this.getVersion=function(){return this.version};this.setSessionId=function(a){this._log(vwdStreamerLogLevel.TRACE,"SessionId received: "+a);this.sessionId=a};this.setRequestFormAvailable=function(a){this.requestFormAvailable=a};this.heartbeatReceived=function(){this.lastDataReceived=new Date()};this.ackSubscribe=function(b,a){this.lastDataReceived=new Date();this.mappings[b]=a;this.reversedMappings[a]=b};this.ackUnsubscribe=function(a){this.lastDataReceived=new Date();delete this.reversedMappings[this.mappings[a]];delete this.mappings[a];this._removeCachedValue(a)};this.update=function(c,d,b){this.lastDataReceived=new Date();var a=this._getDataNameById(c);if(a==null){return}b=vwdStreamerDataType.parseDataType(b,d);if(b==vwdStreamerDataType.TIME){d=Date.parseVwdStreamerTime(d)}else{if(b==vwdStreamerDataType.DATE){d=Date.parseVwdStreamerDate(d)}else{if(b==vwdStreamerDataType.DATETIME){d=Date.parseVwdStreamerDateTime(d)}}}this._update(a,d,b)};this.accessDenied=function(a,b){this.lastDataReceived=new Date();this._log(vwdStreamerLogLevel.WARNING,a+" not subsribed. Reason: "+b)};this.subscriptionRefreshReceived=function(){this.lastDataReceived=new Date();if(this.reconnected){this._log(vwdStreamerLogLevel.TRACE,"Refreshing subscription set...");var b="";for(var a in this.subscribedFields){b+=this._getFieldRequestAsString(a)}this._sendDataToServer(b)}};this._initializeTriggers=function(){var a;if(typeof AbsoluteDifferenceTrigger=="function"){a=new AbsoluteDifferenceTrigger(this);this.triggers[a.getFieldName()]=a}if(typeof RelativeDifferenceTrigger=="function"){a=new RelativeDifferenceTrigger(this);this.triggers[a.getFieldName()]=a}};this._initializeParsers=function(){var a;if(typeof TExParser=="function"){a=new TExParser();this.parsers[a.getFieldName()]=a}if(typeof ZExParser=="function"){a=new ZExParser();this.parsers[a.getFieldName()]=a}if(typeof BlockExParser=="function"){a=new BlockExParser();this.parsers[a.getFieldName()]=a}};this._initializeComponents=function(){if(this.initializationStarted){return}this.initializationStarted=true;try{this.requestFrame=document.createElement('<iframe name="vwdStreamerRequestFrame">')}catch(a){this.requestFrame=document.createElement("iframe")}this.requestFrame.id="vwdStreamerRequestFrame";this.requestFrame.name="vwdStreamerRequestFrame";this.requestFrame.height=0;this.requestFrame.width=0;this.requestFrame.style.visibility="hidden";this.requestFrame.style.position="absolute";document.body.appendChild(this.requestFrame);this.requestFrame.src=this._getRequestFormURL();try{this.responseFrame=document.createElement('<iframe name="vwdStreamerResponseFrame">')}catch(a){this.responseFrame=document.createElement("iframe")}this.responseFrame.id="vwdStreamerResponseFrame";this.responseFrame.name="vwdStreamerResponseFrame";this.responseFrame.height=0;this.responseFrame.width=0;this.responseFrame.style.visibility="hidden";this.responseFrame.style.position="absolute";document.body.appendChild(this.responseFrame);document.vwdStreamerInstance=this;this.initialized=true};this._subscribe=function(a){var c="";for(var b in a){c+=this._subscribeField(a[b]);if(this._isTriggeredField(this._getFieldName(a[b]))){c+=this._subscribeToRequiredTriggerSubscriptions(a[b])}}if(c.length>0){this._sendDataToServer(c)}};this._unsubscribe=function(a){var c="";for(var b in a){c+=this._unsubscribeField(a[b]);if(this._isTriggeredField(this._getFieldName(a[b]))){c+=this._unsubscribeFromRequiredTriggerSubscriptions(a[b])}}if(c.length>0){this._sendDataToServer(c)}};this._update=function(c,k,j,b){var m=this._getCachedValue(c);m=m!=null?m.value:null;this._updateCachedValue(c,k,j);var i=new Object();i.dataName=c;i.rawValue=k;i.oldRawValue=m;var e=this._getFieldParser(this._getFieldName(c));if(e==null){i.type=j;i.value=k;i.values=null;i.oldValue=m;i.oldValues=null}else{var g=e.getParsedValues(i.rawValue);i.type=g.type;i.value=g.value;i.values=g.values;var l=e.getParsedValues(i.oldRawValue);i.oldValue=l.value;i.oldValues=l.values}if(b!=null){b.update(i);return}else{for(var f in this.subscribers){this.subscribers[f].update(i)}}for(var d in this.triggers){var a=this.triggers[d].getFields();for(var h in a){if(a[h]==this._getFieldName(c)){this.triggers[d].fire(this._getIdentifier(c))}}}};this._log=function(d,b){for(var a in this.logListeners){var c=this.logListeners[a];if(d>=c.logLevel){c.listener(d,b)}}};this._getDataNameById=function(a){return this.reversedMappings[a]};this._getDataIdByName=function(a){return this.mappings[a]};this._updateCachedValue=function(a,d,b){if(d==""){d=null}if(this.cachedValues[a]!=null){if(d==null){delete this.cachedValues[a]}else{this.cachedValues[a].value=d;this.cachedValues[a].dataType=b}}else{if(d!=null){var c=new Object();c.dataName=a;c.value=d;c.dataType=b;this.cachedValues[a]=c}}};this._getCachedValue=function(a){return this.cachedValues[a]};this._removeCachedValue=function(a){delete this.cachedValues[a]};this._sendDataToServer=function(e){var a=this;var d=e;if(this.sessionId==null||this.requestFormAvailable==false){setTimeout(function(){a._sendDataToServer(d)},100);return}this.requestFormAvailable=false;var b=this.requestFrame.contentWindow.document.getElementById("requestForm");b.action=this._getRequestURL(this.sessionId);var c=this.requestFrame.contentWindow.document.getElementById("requestData");c.value=e;b.submit()};this._getIdentifier=function(a){if(a!=null){var b=a.indexOf(".");if(b>-1){return a.substring(0,b)}else{return a}}return null};this._getFieldName=function(a){if(a!=null){var b=a.indexOf(".");if(b>-1){return a.substring(b+1)}else{return null}}return null};this._subscribeField=function(a){if(this.subscribedFields[a]!=null){this.subscribedFields[a]++;return""}this.subscribedFields[a]=1;if(!this._isTriggeredField(this._getFieldName(a))){return this._getFieldRequestAsString(a)}else{return""}};this._unsubscribeField=function(a){if(this.subscribedFields[a]!=null){this.subscribedFields[a]--;if(this.subscribedFields[a]<1){delete this.subscribedFields[a];this._removeCachedValue(a);if(!this._isTriggeredField(this._getFieldName(a))){return this.__getFieldReleaseAsString(a)}}}return""};this._subscribeToRequiredTriggerSubscriptions=function(b){var a="";var c=this.triggers[this._getFieldName(b)];if(c!=null){var d=c.getFields();for(var e in d){var f=this._getIdentifier(b)+"."+d[e];a+=this._subscribeField(f)}}return a};this._unsubscribeFromRequiredTriggerSubscriptions=function(b){var a="";var c=this.triggers[this._getFieldName(b)];if(c!=null){var d=c.getFields();for(var e in d){var f=this._getIdentifier(b)+"."+d[e];a+=this._unsubscribeField(f)}}return a};this._isTriggeredField=function(a){return this.triggers[a]!=null};this._getFieldParser=function(a){return this.parsers[a]};this._reconnect=function(){this._log(vwdStreamerLogLevel.INFO,"Performing reconnect...");this.heartbeatReceived();this.connect(this.sessionId);this.reconnected=true};this._checkHeartbeatAndReconnect=function(){var a=new Date();if(a-this.lastConnectTime>this.reconnectInterval){this._log(vwdStreamerLogLevel.INFO,"Reconnect interval passed, performing auto reconnect...");this._reconnect();return}if(a-this.lastDataReceived>this.heartbeatInterval*3){this.connected=false;this._log(vwdStreamerLogLevel.INFO,"No data received for "+((a-this.lastDataReceived)/1000)+" seconds, reconnecting...");this._reconnect();return}this.connected=this.lastDataReceived!=null};this._getResponseURL=function(b){var a="";if(this.host!=null){a+="http://"+this.host}if(this.port!=null){a+=":"+this.port}a+="/STREAMING/";if(b!=null){a+=escape(b)}if(this.domain!=null){a+="?domain="+escape(this.domain)}return a};this._getRequestURL=function(b){var a="";if(this.host!=null){a+="http://"+this.host}if(this.port!=null){a+=":"+this.port}a+="/STREAMING/";if(b!=null){a+=escape(b)}if(this.domain!=null){a+="?domain="+escape(this.domain)}return a};this._getRequestFormURL=function(){var a="";if(this.host!=null){a+="http://"+this.host}if(this.port!=null){a+=":"+this.port}a+="/STREAMING/streamerResponseForm.html";if(this.domain!=null){a+="?domain="+escape(this.domain)}return a};this._getFieldRequestAsString=function(a){return"req("+a+");"};this._getFieldReleaseAsString=function(a){return"rel("+a+");"}}var vwdStreamerTick=function(e,d,c,f,b,a){this.tickType=e;this.dateTime=d;this.price=c;this.indication=f;this.lastVolume=b;this.cummulativeVolume=a};var TExParser=function(){this.fieldName="T!";this.getFieldName=function(){return this.fieldName};this.getParsedValues=function(c){var a=new Object();if(c!=null&&c.length>0){var b=c.split("|");a.values=new vwdStreamerTick(b[0]!=""?b[0].substr(0,1):null,b[0]!=""?b[0].substr(1):null,b[1]!=""?Number(b[1]):null,b[2]!=""?b[2]:null,b[3]!=""?Number(b[3]):null,b[4]!=""?Number(b[4]):null);a.value=a.values.price;a.type=vwdStreamerDataType.NUMBER}return a}};var ZExParser=function(){this.fieldName="Z!";this.getFieldName=function(){return this.fieldName};this.getParsedValues=function(c){var a=new Object();if(c!=null&&c.length>0){var b=c.split("|");a.values=new vwdStreamerTick(b[0]!=""?b[0].substr(0,1):null,b[0]!=""?b[0].substr(1):null,b[1]!=""?Number(b[1]):null,b[2]!=""?b[2]:null,b[3]!=""?Number(b[3]):null,b[4]!=""?Number(b[4]):null);a.value=a.values.price;a.type=vwdStreamerDataType.NUMBER}return a}};var BlockExParser=function(){this.fieldName="Block!";this.getFieldName=function(){return this.fieldName};this.getParsedValues=function(c){var a=new Object();if(c!=null&&c.length>0){var b=c.split("|");a.values=new vwdStreamerTick(b[0]!=""?b[0].substr(0,1):null,b[0]!=""?b[0].substr(1):null,b[1]!=""?Number(b[1]):null,null,b[3]!=""?Number(b[3]):null,b[4]!=""?Number(b[4]):null);a.value=a.values.price;a.type=vwdStreamerDataType.NUMBER}return a}};function vwdStreamerQueue(){this.elements=new Array();this.enqueue=function(a){this.elements.push(a)};this.dequeue=function(){return this.elements.shift()()};this.flush=function(){while(!this.isEmpty()){this.dequeue()}};this.isEmpty=function(){return this.elements.length==0}}var vwdStreamerSubscription=function(b,a){this.streamerInstance=b;this.postbackMethod=a;this.subscribedFields=[];this.subscribe=function(d){var c=[];for(var e in d){if(!this._isSubscribedToField(d[e])){this.subscribedFields[d[e]]=true}else{c[c.length]=e}var g=this.streamerInstance._getCachedValue(d[e]);if(g!=null){this.streamerInstance._update(g.dataName,g.value,g.dataType,this)}}for(var f=c.length-1;f>0;f--){d.splice(c[f],1)}this.streamerInstance._subscribe(d)};this.unsubscribe=function(c){var f=[];for(var d in c){if(!this._isSubscribedToField(c[d])){f[f.length]=d}else{this._removeFieldSubscription(c[d])}}for(var e=f.length-1;e>0;e--){c.splice(f[e],1)}this.streamerInstance._unsubscribe(c)};this.unsubscribeAllFields=function(){for(var c in this.subscribedFields){this.streamerInstance._unsubscribe(this.subscribedFields[c])}this.subscribedFields=[]};this.update=function(c){if(this._isSubscribedToField(c.dataName)){this.postbackMethod(c)}};this._isSubscribedToField=function(c){return this.subscribedFields[c]};this._removeFieldSubscription=function(c){delete this.subscribedFields[c]}};var AbsoluteDifferenceTrigger=function(a){this.streamerInstance=a;this.fieldName="AbsoluteDifference";this.fields=new Array("LastDate","PreviousCloseDate","LastPrice","ClosePrice","PreviousClosePrice");this.getFieldName=function(){return this.fieldName};this.getFields=function(){return this.fields};this.fire=function(d){var h=this.streamerInstance._getCachedValue(d+"."+this.fieldName);var e=this.streamerInstance._getCachedValue(d+".ClosePrice");var c=this.streamerInstance._getCachedValue(d+".LastDate");var g=this.streamerInstance._getCachedValue(d+".PreviousClosePrice");var b=this.streamerInstance._getCachedValue(d+".PreviousCloseDate");if(e==null){e=this.streamerInstance._getCachedValue(d+".LastPrice")}if((e==null)||(e.value==0)||(g==null)||(g.value==0)){if(h!=null){this.streamerInstance._update(d+"."+this.fieldName,null,vwdStreamerDataType.UNKNOWN)}return}if((c!=null)&&(b!=null)&&(c.value==b.value)){if(h!=null){this.streamerInstance._update(d+"."+this.fieldName,null,vwdStreamerDataType.UNKNOWN)}return}var f=Number(e.value)-Number(g.value);this.streamerInstance._update(d+"."+this.fieldName,f,vwdStreamerDataType.NUMBER)}};var RelativeDifferenceTrigger=function(a){this.streamerInstance=a;this.fieldName="RelativeDifference";this.fields=new Array("LastDate","PreviousCloseDate","LastPrice","ClosePrice","PreviousClosePrice");this.getFieldName=function(){return this.fieldName};this.getFields=function(){return this.fields};this.fire=function(d){var g=this.streamerInstance._getCachedValue(d+"."+this.fieldName);var e=this.streamerInstance._getCachedValue(d+".ClosePrice");var c=this.streamerInstance._getCachedValue(d+".LastDate");var h=this.streamerInstance._getCachedValue(d+".PreviousClosePrice");var b=this.streamerInstance._getCachedValue(d+".PreviousCloseDate");if(e==null){e=this.streamerInstance._getCachedValue(d+".LastPrice")}if((e==null)||(e.value==0)||(h==null)||(h.value==0)){if(g!=null){this.streamerInstance._update(d+"."+this.fieldName,null,vwdStreamerDataType.UNKNOWN)}return}if((c!=null)&&(b!=null)&&(c.value==b.value)){if(g!=null){this.streamerInstance._update(d+"."+this.fieldName,null,vwdStreamerDataType.UNKNOWN)}return}var f=(Number(e.value)-Number(h.value))/Number(h.value);this.streamerInstance._update(d+"."+this.fieldName,f,vwdStreamerDataType.NUMBER)}};var vwdStreamerLogLevel={TRACE:0,INFO:1,WARNING:2,ERROR:3};var vwdStreamerDataType={UNKNOWN:0,NUMBER:1,STRING:2,DATE:3,TIME:4,DATETIME:5};vwdStreamerDataType.regTimeString=/^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/;vwdStreamerDataType.regDateString=/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[01])$/;vwdStreamerDataType.regDateTimeString=/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/;vwdStreamerDataType.parseDataType=function(a,b){if(a=="NUMBER"){return vwdStreamerDataType.NUMBER}if(a=="DATE"){if(vwdStreamerDataType.regDateString.test(b)){return vwdStreamerDataType.DATE}else{return vwdStreamerDataType.STRING}}if(a=="TIME"){if(vwdStreamerDataType.regTimeString.test(b)){return vwdStreamerDataType.TIME}else{return vwdStreamerDataType.STRING}}if(a=="DATETIME"){if(vwdStreamerDataType.regDateTimeString.test(b)){return vwdStreamerDataType.DATETIME}else{return vwdStreamerDataType.STRING}}if(a=="STRING"){if(vwdStreamerDataType.regTimeString.test(b)){return vwdStreamerDataType.TIME}else{if(vwdStreamerDataType.regDateString.test(b)){return vwdStreamerDataType.DATE}else{if(vwdStreamerDataType.regDateTimeString.test(b)){return vwdStreamerDataType.DATETIME}else{return vwdStreamerDataType.STRING}}}}return vwdStreamerDataType.UNKNOWN};Date.parseVwdStreamerTime=function(b){var a=new Date();a.setHours(b.substring(0,2));a.setMinutes(b.substring(3,5));a.setSeconds(b.substring(6,8));return a};Date.parseVwdStreamerDate=function(b){var a=new Date();a.setFullYear(b.substring(0,4));a.setMonth(Number(b.substring(5,7))-1);a.setDate(b.substring(8,10));return a};Date.parseVwdStreamerDateTime=function(b){var a=new Date();a.setFullYear(b.substring(0,4));a.setMonth(Number(b.substring(5,7))-1);a.setDate(b.substring(8,10));a.setHours(b.substring(11,13));a.setMinutes(b.substring(14,16));a.setSeconds(b.substring(17,19));return a};if(document.all&&!document.getElementById){document.getElementById=function(a){return document.all[a]}};