﻿var _tdv_lastID = -1;
var _tdv_settings = null;
var _tdv_updElems = new Array();

function _tdv_settingsContainer (symbols, columns, width, borderWidth, borderColor, backColor, foreColor)
{
    this.divAll = document.getElementById('_tdv_all');
    this.container = document.getElementById('_tdv_widgetContainer');
    this.dataContainer = document.getElementById('_tdv_widgetDataContainer');
    this.dataUrl = 'http://data.tradeville.eu/quotations/QuotesWidget.ashx';
    this.cssUrl = 'http://www.tradeville.bg/tradeville.quoteswidget.css';
    this.symbols = symbols;
    this.columns = columns;
    this.columnsArray = columns.split(',');
    this.width = width;
    this.borderWidth = borderWidth;
    this.borderColor = borderColor;
    this.backColor = backColor;
    this.foreColor = foreColor;
    this.intervalID = -1;
    this.colorIntervalID = -1;
}

function _tdv_hasColumn(column)
{
    for (var i = 0; i < _tdv_settings.columnsArray.length; i++)
    {
        if (column.toLowerCase() == _tdv_settings.columnsArray[i].toLowerCase())
            return true;
    }
    return false;
}

function _tdv_updatedElement(id)
{
    this.id = id;
    this.date = new Date();
}

function _tdv_getRequestObject()
{
    var requestObj = null;

    if (window.XMLHttpRequest) // Mozilla, Safari, Opera etc
        requestObj = new XMLHttpRequest();
    else
    {
        if (window.ActiveXObject) // IE
        {
            try { requestObj = new ActiveXObject("Msxml2.XMLHTTP"); }
            catch (e)
            {
                try { requestObj = new ActiveXObject("Microsoft.XMLHTTP"); }
                catch (e) { }
            }
        }
    }

    return requestObj;
}

function _tdv_initializeWidget(symbols, columns, width, borderWidth, borderColor, backColor, foreColor)
{
    _tdv_settings = new _tdv_settingsContainer(symbols, columns, width, borderWidth, borderColor, backColor, foreColor);

    //build widget initial properties
   

    var div = _tdv_settings.container;
    div.style.borderWidth = borderWidth;
    div.style.borderColor = borderColor;
    div.style.borderStyle = 'solid'
    div.style.backgroundColor = backColor;
    div.style.color = foreColor;
    div.style.width = width;
    _tdv_settings.divAll.style.width = width;
    
    div.className = 'tdv_container';
    _tdv_addCSSlink();
    
    _tdv_loadInitialData();
    _tdv_settings.intervalID = window.setInterval("_tdv_refreshData()", 5000);
    _tdv_settings.colorIntervalID = window.setInterval("_tdv_checkColor()", 1000);
}

function _tdv_cleanUp()
{
    if (_tdv_settings)
    {
        window.clearInterval(_tdv_settings.intervalID);
        window.clearInterval(_tdv_settings.colorIntervalID);
    }
}

function _tdv_appendJS(url)
{
    var div = _tdv_settings.dataContainer
    var scriptElem = document.createElement("script");
    scriptElem.setAttribute("type", "text/javascript");
    scriptElem.setAttribute("src", url);
    scriptElem.setAttribute("id", "_tdv_" + (new Date()).getTime().toString());

    if (div.childNodes.length > 0)
        div.removeChild(div.childNodes[0]);

    div.appendChild(scriptElem);
    
}

function _tdv_addCSSlink()
{
    var head = document.getElementsByTagName("head")[0];
    var cssNode = document.createElement('link');
    cssNode.type = 'text/css';
    cssNode.rel = 'stylesheet';
    cssNode.href = _tdv_settings.cssUrl;
    cssNode.media = 'screen';
    head.appendChild(cssNode);
}

function _tdv_loadInitialData()
{
    var url = _tdv_settings.dataUrl + "?uniqueParam=" + (new Date()).getTime().toString();
    url += "&symbols=" + _tdv_settings.symbols + "&columns=" + _tdv_settings.columns;
    url += "&op=init";

    _tdv_appendJS(url);

}

function _tdv_loadInitialData_callback(response)
{
    if (response == '-')
        _tdv_settings.container.innerHTML = 'Error fetching data!';
    else
        _tdv_buildWidget(response);
}

function _tdv_buildWidget(initialData)
{
    var idx = initialData.lastIndexOf("|");
    initialData = initialData.substr(0, idx);
    var dataRows = initialData.split("|");

    var html = "<div class='tdv_firstrow_left'>Котировки BVB</div><a class='tdv_logo' href='http://www.tradeville.eu'></a>";
    html += "<table border='0' cellspacing='0' cellpadding='0' class='tdv_widgettable'>";
    html += "<thead>"
    + "<tr><td class='tdv_th_symbol'><div>Код</div></td> ";
    if (_tdv_hasColumn("lastprice"))
        html += "<td class='tdv_th_lastprice'><div>Цена</div></td> ";
    if (_tdv_hasColumn("variation"))
        html += "<td class='tdv_th_variation'><div>Промяна</div></td> ";
    if (_tdv_hasColumn("bid"))
        html += "<td class='tdv_th_bid'><div>Купува</div></td> ";
    if (_tdv_hasColumn("ask"))
        html += "<td class='tdv_th_ask'><div>Продава</div></td>";
    html += "</thead><tbody>";

    for (var i = 0; i < dataRows.length; i++)
    {
        var rowItems = dataRows[i].split('~');
        var symbol = rowItems[0];
        var lastPrice = rowItems[1];
        var variation = rowItems[2];
        var bid = rowItems[3];
        var ask = rowItems[4];

        html += "<tr>";
        html += "<td class='tdv_symbolcell'><div>" + symbol + "</div></td>";
        if (_tdv_hasColumn("lastprice"))
            html += _tdv_createCell("lastprice", symbol, lastPrice);
        if (_tdv_hasColumn("variation"))
            html += _tdv_createVariationCell(symbol, variation);
        if (_tdv_hasColumn("bid"))
            html += _tdv_createCell("bid", symbol, bid);
        if (_tdv_hasColumn("ask"))
            html += _tdv_createCell("ask", symbol, ask);
        html += "</tr>";
    }
    
    var colSpan = 1;
    if (_tdv_hasColumn("lastprice"))
        colSpan++;
    if (_tdv_hasColumn("variation"))
        colSpan++;
    if (_tdv_hasColumn("bid"))
        colSpan++;
    if (_tdv_hasColumn("ask"))
        colSpan++;

    html += "<tr><td colspan='" + colSpan.toString() + "'><div class='tdv_delayedQuotes'>Котировки с 15 мин. закъснение</div></td></tr>";

    html += "</tbody>";

    _tdv_settings.container.innerHTML = html;
}

function _tdv_createCell(kind, symbol, value)
{
    var cellID = "_tdv_cell_" + kind + "_" + symbol + "__";
    _tdv_updElems[_tdv_updElems.length] = new _tdv_updatedElement(cellID);
    var html = "<td id='" + cellID + "' class='tdv_cell'><div>" + value + "</div></td>";
    return html;
}

function _tdv_createVariationCell(symbol, variation)
{
    var cellID = "_tdv_cell_variation_" + symbol + "__";
    _tdv_updElems[_tdv_updElems.length] = new _tdv_updatedElement(cellID);
    var cellClass = "tdv_varsame";
    if (parseFloat(variation) > 0)
        cellClass = "tdv_varup";
    else if (parseFloat(variation) < 0)
        cellClass = "tdv_vardown";
    var html = "<td id='" + cellID + "' class='" + cellClass + "'><div class='minu'>" + variation + "</div></td>";
    return html;
}

function _tdv_refreshData()
{
    var url = _tdv_settings.dataUrl + "?uniqueParam=" + (new Date()).getTime().toString();
    url += "&symbols=" + _tdv_settings.symbols + "&columns=" + _tdv_settings.columns;
    url += "&op=refresh";

    _tdv_appendJS(url);
}

function _tdv_refreshData_callback(response)
{
    if (response != '-')
        _tdv_refreshWidget(response);
}

function _tdv_refreshWidget(refreshData)
{
    var idx = refreshData.lastIndexOf("|");
    refreshData = refreshData.substr(0, idx);
    var dataRows = refreshData.split("|");
    for (var i = 0; i < dataRows.length; i++)
    {
        var rowItems = dataRows[i].split('~');
        var whatsupID = parseInt(rowItems[0]);
        if (whatsupID != NaN && whatsupID > _tdv_lastID)
        {
            _tdv_lastID = whatsupID;
            
            var symbol = rowItems[1];
            var lastPrice = rowItems[2];
            var variation = rowItems[3];

            var variationNumber = parseFloat(variation);
            if (!isNaN(variationNumber))
                variation = variationNumber.toFixed(2);
            
            var bid = rowItems[4];
            var ask = rowItems[5];

            var elem = _tdv_findUpdatableElement('lastprice', symbol);
            if (elem != null)
                _tdv_updateElementValue(elem, lastPrice);
            
            elem = _tdv_findUpdatableElement('variation', symbol);
            if (elem != null)
                _tdv_updateVariationElement(elem, variation);

            elem = _tdv_findUpdatableElement('ask', symbol);
            if (elem != null)
                _tdv_updateElementValue(elem, ask);

            elem = _tdv_findUpdatableElement('bid', symbol);
            if (elem != null)
                _tdv_updateElementValue(elem, bid);
        }
    }
}

function _tdv_findUpdatableElement(kind, symbol)
{
    for (var i = 0; i < _tdv_updElems.length; i++)
    {
        var elem = _tdv_updElems[i];
        if (elem.id.indexOf(kind + "_" + symbol + "__") != -1)
            return elem;
    }
    return null;
}

function _tdv_updateVariationElement(elem, newVal)
{
    var htmlElem = document.getElementById(elem.id);
    if (htmlElem != null)
    {
        var strOld = _tdv_utils_getTextFromElement(htmlElem);
        var decimals = _tdv_utils_decimalNo(strOld);
        if (parseFloat(newVal) > 0)
        {
            htmlElem.innerHTML = "<div class='minu'>" + parseFloat(newVal).toFixed(decimals) + "</div>";
            htmlElem.className = 'tdv_varup';
        }
        else if (parseFloat(newVal) < 0)
        {
            htmlElem.innerHTML = "<div class='minu'>" + parseFloat(newVal).toFixed(decimals) + "</div>";
            htmlElem.className = 'tdv_vardown';
        }
    }
}

function _tdv_updateElementValue(elem, newVal)
{
    var htmlElem = document.getElementById(elem.id);
    if (htmlElem != null)
    {
        var strOld = _tdv_utils_getTextFromElement(htmlElem);
        var decimals = _tdv_utils_decimalNo(strOld);
        if (parseFloat(strOld) > parseFloat(newVal))
        {
            htmlElem.innerHTML = '<div>' + parseFloat(newVal).toFixed(decimals) + '</div>';
            htmlElem.className = 'tdv_cell tdv_down';
            elem.date = new Date();
        }
        else if (parseFloat(strOld) < parseFloat(newVal))
        {
            htmlElem.innerHTML = '<div>' + parseFloat(newVal).toFixed(decimals) + '</div>';
            htmlElem.className = 'tdv_cell tdv_up';
            elem.date = new Date();
        }
    }
}

function _tdv_utils_decimalNo(str)
{
    if (str == null || str == "-" || str == "N/A") return 4;
    var decimalNo = 0;
    if (str.toString().indexOf(".") > -1)
        decimalNo = str.toString().length - str.toString().indexOf(".") - 1;
    if (decimalNo > 4)
        return 4; //TODO : to improve exceptions
    return decimalNo;
}

function _tdv_utils_getTextFromElement(elem) // Returns the inner text of any given HTML element
{
    if (elem == null)
        return "";
    if (typeof (elem.innerText) != "undefined") //IE
        return elem.innerText;
    else
        return elem.textContent;
}

function _tdv_checkColor()
{
    for (var i = 0; i < _tdv_updElems.length; i++)
    {
        var elem = _tdv_updElems[i];
        var diff = (new Date()).getTime() - elem.date.getTime();
        var elemHtml = document.getElementById(elem.id);
        if (elemHtml != null && diff > 3 * 1000) // max 10 seconds
        {
            if (elemHtml.className != "" && elemHtml.id.indexOf("_variation_") == -1)
                elemHtml.className = "tdv_cell";
        }
    }
}
