﻿/* Instrument stream (C) EuroInvestor */


function Arrow(inputNumber)
{
    if (inputNumber < 0)
    {
        return '<img src="' + 'http://i.euroinvestor.com/downsmall.gif' + '" style="vertical-align:middle" width="8px" height="4px" border="0" alt="down" />';
    }
    if (inputNumber > 0)
    {
        return '<img src="' + 'http://i.euroinvestor.com/upsmall.gif' + '" style="vertical-align:middle" width="8px" height="4px" border="0" alt="up" />';
    }
    return '<img src="http://i.euroinvestor.com/marketoverview/risingfallinggrayarrow.png" style="vertical-align:baseline;padding-right:3px" width="4px" height="8px" border="0" alt="unchanged" />';
}

function JSFormatChange(inputnumber, decimals, useColor, usePCT, useArrow, showArrowBeforeNumber, onBlackBackground, usePlusSign)
{
    var extraStr = "";
    var spanStr = "";
    var arrowStr = "";

    inputnumber = inputnumber.toFixed(decimals);
    
    //Skal der stå procent efter.
    if (usePCT) { extraStr = "%"; }

    //Skal der være en pil
    if (useArrow) { arrowStr += "&nbsp;" + Arrow(inputnumber); }

    //Skal der bruges farve
    if (useColor)
    {
        if (inputnumber > 0) { spanStr += ' class="green"'; }
        else if (inputnumber < 0) { spanStr += ' class="red"'; }

        // If no change and on black bacground
        if (onBlackBackground && iNumber == 0) spanStr += ' class="white"';
    }

    var ps = "";

    if (usePlusSign && !(inputnumber < 0)) ps = "+";

    var resstring;
    if (showArrowBeforeNumber) resstring = "<span" + spanStr + ">" + arrowStr + "&nbsp;" + ps + JSFloatToLocalizedString(inputnumber, decimals) + extraStr + "</span>";
    else resstring = "<span" + spanStr + ">" + ps + JSFloatToLocalizedString(inputnumber, decimals) + extraStr + arrowStr + "</span>";
    return resstring;
}

/*function isTodayServerTime(jsdate) 
{
    return EI.Localization.serverNowDay().getUTCFullYear() == jsdate.getUTCFullYear()
        && EI.Localization.serverNowDay().getUTCMonth() == jsdate.getUTCMonth()
        && EI.Localization.serverNowDay().getUTCDate() == jsdate.getUTCDate()
}*/

function JSTimeAspFormat(dateobj, format)
{
    var hours = dateobj.getUTCHours();
    var res = format.replace('HH', hours < 10 ? "0" + hours : "" + hours);
    res = res.replace('H', "" + hours);
    res = res.replace('hh', hours > 11 ? (hours > 21 ? "" + (hours - 12) : "0" + (hours - 12)) : (hours > 9 ? "" + hours : "0" + hours));
    res = res.replace('h', hours > 11 ? "" + (hours - 12) : "" + hours);
    res = res.replace('tt', hours > 11 ? "PM" : "AM");

    var minutes = dateobj.getUTCMinutes();
    res = res.replace('mm', minutes < 10 ? "0" + minutes : "" + minutes);
    res = res.replace('m', "" + minutes);

    var seconds = dateobj.getUTCSeconds();
    res = res.replace('ss', seconds < 10 ? "0" + seconds : "" + seconds);
    res = res.replace('s', "" + seconds);
    //if(isTodayServerTime(dateobj)) return res;

    /*var day = dateobj.getUTCDate();
    res = res.replace('dd', day < 10 ? "0" + day : "" + day);
    res = res.replace('d', "" + day);

    var month = dateobj.getUTCMonth();
    res = res.replace('MM', month < 9 ? "0" + (month + 1) : "" + (month + 1));
    res = res.replace('M', "" + (month + 1));
    
    var year = dateobj.getUTCFullYear();
    res = res.replace('yyyy', "" + year);*/
    return res;
}

function getLSDomain(domain)
{
    if (document.domain == "localhost") return 'localhost';
    var domarr = domain.split('.');
    var tempdom = '';
    for (var i = 1; i < domarr.length; i++)
    {
        tempdom += domarr[i] + '.';
    }
    return tempdom.substr(0, tempdom.length - 1);
}

function isBot()
{
    return navigator.userAgent.toLowerCase().indexOf("bot") > -1;
}

var lsPage = null;
var lsDomain = getLSDomain(document.domain);

//alert('2');
///Light streamer client for streaming instrument data
function lsInstrumentStream(tableName, useRealtime)
{
    var tableName = tableName;
    var offsetHours = 0;
    this.offsetHours = function(value) { offsetHours = value; }
    var enableRowId = false;
    this.enableRowId = function(value) { enableRowId = value; }
    var enableLast = false;
    this.enableLast = function(value) { enableLast = value; }
    var roundLastDec = 4;
    this.roundLast = function(value) { roundLastDec = value; }
    var enableVolume = false;
    this.enableVolume = function(value) { enableVolume = value; }
    var roundVolumeDec = 4;
    this.roundVolume = function(value) { roundVolumeDec = value; }
    var enableBid = false;
    this.enableBid = function(value) { enableBid = value; }
    var roundBidDec = 4;
    this.roundBid = function(value) { roundBidDec = value; }
    var enableAsk = false;
    this.enableAsk = function(value) { enableAsk = value; }
    var roundAskDec = 4;
    this.roundAsk = function(value) { roundAskDec = value; }
    var enableLow = false;
    this.enableLow = function(value) { enableLow = value; }
    var roundLowDec = 4;
    this.roundLow = function(value) { roundLowDec = value; }
    var enableHigh = false;
    this.enableHigh = function(value) { enableHigh = value; }
    var roundHighDec = 4;
    this.roundHigh = function(value) { roundHighDec = value; }
    var enableChange = false;
    this.enableChange = function(value) { enableChange = value; }
    var roundChangeDec = 4;
    this.roundChange = function(value) { roundChangeDec = value; }
    var enableChangeArrowFormatting = false;
    this.enableChangeArrowFormatting = function(value) { enableChangeArrowFormatting = value; }
    var enablePctChg = false;
    this.enablePctChg = function(value) { enablePctChg = value; }
    var roundPctChgDec = 4;
    this.roundPctChg = function(value) { roundPctChgDec = value; }
    var enablePctChgArrowFormatting = false;
    this.enablePctChgArrowFormatting = function(value) { enablePctChgArrowFormatting = value; }
    var enableTime = false;
    this.enableTime = function(value) { enableTime = value; }
    var enableUnixTime = false;
    this.enableUnixTime = function(value) { enableUnixTime = value; }
    var useFade = false;
    this.useFade = function(value) { useFade = value; }
    var updateCallBack = null;
    this.updateCallBack = function(value) { updateCallBack = value; }
    var updateCallBackExtra = null;
    this.updateCallBackExtra = function(value) { updateCallBackExtra = value; }
    var timestampFormat = 'HH:mm:ss';
    this.setTimeFormat = function(value) { timestampFormat = value; }
    
    var pushtable;

    if (lsPage == null && document.domain != "localhost" && !isBot())
    {
        lsPage = new PushPage();

        if (document.domain != "localhost") lsPage.context.setDebugAlertsOnClientError(false);
        else lsPage.context.setDebugAlertsOnClientError(true);

        lsPage.context.setDomain(lsDomain);

        lsPage.onEngineReady = function(lsEng)
        {
            if (document.domain != "localhost") lsEng.connection.setLSHost("ls2." + lsDomain);
            else lsEng.connection.setLSHost("localhost");
            lsEng.connection.setLSPort("8081");
            lsEng.connection.setAdapterName(useRealtime ? "EIRTAdapterProxy" : "EIAdapterProxy");
            lsEng.changeStatus("STREAMING");

            lsEng.onStatusChange = function(newStatus)
            {
                if (newStatus == "STREAMING") window.status = lsDomain + " is in streaming mode";
                else if (newStatus == "CONNECTING") window.status = "Connecting to EuroInvestor streaming server...";
            };
        };

        lsPage.bind();
        lsPage.createEngine("SLEngine", "/js/ls/", "SHARE_SESSION");
    }

    this.startStreaming = function()
    {
        if (document.domain == "localhost" || isBot()) return;
        var schema = new Array();
        if (enableRowId) schema.push("rowid");
        if (enableLast) schema.push("last");
        if (enableVolume) schema.push("volume");
        if (enableBid) schema.push("bid");
        if (enableAsk) schema.push("ask");
        if (enableLow) schema.push("low");
        if (enableHigh) schema.push("high");
        if (enableChange) schema.push("change");
        if (enablePctChg) schema.push("pctchg");
        if (enableTime)
        {
            schema.push("time");
            schema.push("unixtime");
        }
        else if (enableUnixTime) schema.push("unixtime");

        pushtable = new OverwriteTable(null, schema, "MERGE");
        if (enablePctChgArrowFormatting) pushtable.setPushedHtmlEnabled(true);

        pushtable.onChangingValues = function(item, itemUpdate)
        {
            if (itemUpdate == null) return;

            if (updateCallBackExtra != null) updateCallBackExtra(item, itemUpdate);

            if (updateCallBack != null) updateCallBack(item, itemUpdate);
            else
            {
                if (enableLast)
                {
                    var last = itemUpdate.getServerValue("last");
                    if (last == "-") itemUpdate.setFormattedValue("last", "");
                    else
                    {
                        var lastdirection = itemUpdate.getServerValue("#lastdirection");
                        itemUpdate.setFormattedValue("last", JSFloatToLocalizedString(parseFloat(last.replace(',', '.')), roundLastDec));
                        switch (lastdirection)
                        {
                            case "up": itemUpdate.setAttribute("last", "#00FF00", "transparent", "backgroundColor"); break;
                            case "down": itemUpdate.setAttribute("last", "#FF0000", "transparent", "backgroundColor"); break;
                        }
                    }
                }

                if (enableVolume)
                {
                    var volume = itemUpdate.getServerValue("volume");
                    if (volume == "-") itemUpdate.setFormattedValue("volume", "0");
                    else itemUpdate.setFormattedValue("volume", JSIntToLocalizedString(parseInt(volume)));
                }

                if (enableBid)
                {
                    var bid = itemUpdate.getServerValue("bid");
                    if (bid == "-") itemUpdate.setFormattedValue("bid", "");
                    else
                    {
                        var biddirection = itemUpdate.getServerValue("#biddirection");
                        itemUpdate.setFormattedValue("bid", JSFloatToLocalizedString(parseFloat(bid.replace(',', '.')), roundBidDec));
                        switch (biddirection)
                        {
                            case "up": itemUpdate.setAttribute("bid", "#00FF00", "transparent", "backgroundColor"); break;
                            case "down": itemUpdate.setAttribute("bid", "#FF0000", "transparent", "backgroundColor"); break;
                        }
                    }
                }

                if (enableAsk)
                {
                    var ask = itemUpdate.getServerValue("ask");
                    if (ask == "-") itemUpdate.setFormattedValue("ask", "");
                    else
                    {
                        var askdirection = itemUpdate.getServerValue("#askdirection");
                        itemUpdate.setFormattedValue("ask", JSFloatToLocalizedString(parseFloat(ask.replace(',', '.')), roundAskDec));
                        switch (askdirection)
                        {
                            case "up": itemUpdate.setAttribute("ask", "#00FF00", "transparent", "backgroundColor"); break;
                            case "down": itemUpdate.setAttribute("ask", "#FF0000", "transparent", "backgroundColor"); break;
                        }
                    }
                }

                if (enableLow)
                {
                    var low = itemUpdate.getServerValue("low");
                    if (low == "-") itemUpdate.setFormattedValue("low", "");
                    else
                    {
                        var lowdirection = itemUpdate.getServerValue("#lowdirection");
                        itemUpdate.setFormattedValue("low", JSFloatToLocalizedString(parseFloat(low.replace(',', '.')), roundLowDec));
                        switch (lowdirection)
                        {
                            case "up": itemUpdate.setAttribute("low", "#00FF00", "transparent", "backgroundColor"); break;
                            case "down": itemUpdate.setAttribute("low", "#FF0000", "transparent", "backgroundColor"); break;
                        }
                    }
                }

                if (enableHigh)
                {
                    var high = itemUpdate.getServerValue("high");
                    if (high == "-") itemUpdate.setFormattedValue("high", "");
                    else
                    {
                        var highdirection = itemUpdate.getServerValue("#highdirection");
                        itemUpdate.setFormattedValue("high", JSFloatToLocalizedString(parseFloat(high.replace(',', '.')), roundHighDec));
                        switch (highdirection)
                        {
                            case "up": itemUpdate.setAttribute("high", "#00FF00", "transparent", "backgroundColor"); break;
                            case "down": itemUpdate.setAttribute("high", "#FF0000", "transparent", "backgroundColor"); break;
                        }
                    }
                }

                if (enableChange)
                {
                    var change = itemUpdate.getServerValue("change");
                    if (change == "-") itemUpdate.setFormattedValue("change", "");
                    else
                    {
                        var changeServer = parseFloat(change.replace(",", "."));
                        if (enableChangeArrowFormatting) itemUpdate.setFormattedValue("change", JSFormatChange(changeServer, roundChangeDec, true, false, true, false, false, false));
                        else
                        {
                            itemUpdate.setFormattedValue("change", JSFloatToLocalizedString(changeServer, roundChangeDec));
                            if (changeServer > 0) itemUpdate.setAttribute("change", "#007D00", "#007D00", "color");
                            else if (changeServer < 0) itemUpdate.setAttribute("change", "#F70000", "#F70000", "color");
                            else itemUpdate.setAttribute("change", "#066AA2", "#066AA2", "color");
                        }
                    }
                }

                if (enablePctChg)
                {
                    var pctchangeServer = itemUpdate.getServerValue("pctchg");
                    if (pctchangeServer == "-") itemUpdate.setFormattedValue("pctchg", "");
                    else
                    {
                        var pctchangeFloat = parseFloat(pctchangeServer.replace(",", "."));
                        if (enablePctChgArrowFormatting) itemUpdate.setFormattedValue("pctchg", JSFormatChange(pctchangeFloat, roundPctChgDec, true, true, true, false, false, false));
                        else
                        {
                            itemUpdate.setFormattedValue("pctchg", JSFloatToLocalizedString(pctchangeFloat, roundPctChgDec));

                            if (pctchangeServer > 0) itemUpdate.setAttribute("pctchg", "#007D00", "#007D00", "color");
                            else if (pctchangeServer < 0) itemUpdate.setAttribute("pctchg", "#F70000", "#F70000", "color");
                            else itemUpdate.setAttribute("pctchg", "#066AA2", "#066AA2", "color");
                        }
                    }
                }

                if (enableTime)
                {
                    var unixtime = itemUpdate.getServerValue("unixtime");
                    var localdate = new Date();
                    localdate.setTime(parseInt(unixtime) - parseInt(EI.Localization.instrumentTimeZoneLocalOffset()));
                    var localpresentation = JSTimeAspFormat(localdate, timestampFormat);
                    itemUpdate.setFormattedValue('time', localpresentation);
                }

                if (useFade && navigator.appName == "Microsoft Internet Explorer")
                {
                    itemUpdate.setHotTime(0);
                    itemUpdate.setHotToColdTime(500);
                }
                else itemUpdate.setHotTime(500);

            }
        }

        pushtable.onItemUpdate = function(item, updateInfo)
        {
            if (updateInfo == null) return;

            if (enableLast)
            {
                var oldval = updateInfo.getOldValue("last");
                if (updateInfo.isValueChanged("last") && oldval != null)
                {
                    var oldfloat = parseFloat(oldval.replace(',', '.')).toFixed(roundLastDec);
                    var newfloat = parseFloat(updateInfo.getNewValue("last").replace(',', '.')).toFixed(roundLastDec);
                    if (newfloat > oldfloat) updateInfo.addField("#lastdirection", "up");
                    else if (newfloat < oldfloat) updateInfo.addField("#lastdirection", "down");
                    else updateInfo.addField("#lastdirection", "unchg");
                }
                else updateInfo.addField("#lastdirection", "unchg");
            }

            if (enableBid)
            {
                var oldval = updateInfo.getOldValue("bid");
                if (updateInfo.isValueChanged("bid") && oldval != null)
                {
                    var oldfloat = parseFloat(oldval.replace(',', '.')).toFixed(roundBidDec);
                    var newfloat = parseFloat(updateInfo.getNewValue("bid").replace(',', '.')).toFixed(roundBidDec);
                    if (newfloat > oldfloat) updateInfo.addField("#biddirection", "up");
                    else if (newfloat < oldfloat) updateInfo.addField("#biddirection", "down");
                    else updateInfo.addField("#biddirection", "unchg");
                }
                else updateInfo.addField("#biddirection", "unchg");
            }

            if (enableAsk)
            {
                var oldval = updateInfo.getOldValue("ask");
                if (updateInfo.isValueChanged("ask") && oldval != null)
                {
                    var oldfloat = parseFloat(oldval.replace(',', '.')).toFixed(roundAskDec);
                    var newfloat = parseFloat(updateInfo.getNewValue("ask").replace(',', '.')).toFixed(roundAskDec);
                    if (newfloat > oldfloat) updateInfo.addField("#askdirection", "up");
                    else if (newfloat < oldfloat) updateInfo.addField("#askdirection", "down");
                    else updateInfo.addField("#askdirection", "unchg");
                }
                else updateInfo.addField("#askdirection", "unchg");
            }

            if (enableLow)
            {
                var oldval = updateInfo.getOldValue("low");
                if (updateInfo.isValueChanged("low") && oldval != null)
                {
                    var oldfloat = parseFloat(oldval.replace(',', '.')).toFixed(roundLowDec);
                    var newfloat = parseFloat(updateInfo.getNewValue("low").replace(',', '.')).toFixed(roundLowDec);
                    if (newfloat > oldfloat) updateInfo.addField("#lowdirection", "up");
                    else if (newfloat < oldfloat) updateInfo.addField("#lowdirection", "down");
                    else updateInfo.addField("#lowdirection", "unchg");
                }
                else updateInfo.addField("#lowdirection", "unchg");
            }

            if (enableHigh)
            {
                var oldval = updateInfo.getOldValue("high");
                if (updateInfo.isValueChanged("high") && oldval != null)
                {
                    var oldfloat = parseFloat(oldval.replace(',', '.')).toFixed(roundHighDec);
                    var newfloat = parseFloat(updateInfo.getNewValue("high").replace(',', '.')).toFixed(roundHighDec);
                    if (newfloat > oldfloat) updateInfo.addField("#highdirection", "up");
                    else if (newfloat < oldfloat) updateInfo.addField("#highdirection", "down");
                    else updateInfo.addField("#highdirection", "unchg");
                }
                else updateInfo.addField("#highdirection", "unchg");
            }
        }

        lsPage.addTable(pushtable, tableName);
        return lsDomain;
    }
    this.haltStreaming = function()
    {
        if (document.domain == "localhost" || isBot()) return;
        lsPage.removeTable(pushtable.getId()); 
    }
}


