﻿(function($) {
    var defaults =
  {
      engine: null,
      cellIdPrefix: 'market-rates-ticker_',
      marketStatusClass: 'market-rates-ticker-status',
      marketStatusUpClass: 'market-rates-ticker-status-up',
      instrumentClass: 'market-rates-ticker-instrument',
      wrapperClass: 'market-rates-ticker',
      ratesList: [
        { instrumentName: 'EURUSD', displayDecimalPrecision: 4 },
        { instrumentName: 'GBPUSD', displayDecimalPrecision: 4 },
        { instrumentName: 'USDJPY', displayDecimalPrecision: 4 },
        { instrumentName: 'USDCHF', displayDecimalPrecision: 4 },
        { instrumentName: 'AUDUSD', displayDecimalPrecision: 4}]
  };

    MarketRatesTicker = function(input, options) {
        //private data members
        var base,
        $input,
        config,
        $container,
        $wrapper,
        crossesList = [];

        var buildLayout = function() {
            $wrapper = $("<div>").addClass(config.wrapperClass);
            $container = $("<ul>").appendTo($wrapper);


            $.each(config.ratesList, function() {
                crossesList.push(this.instrumentName);

                var html = '<div>' +
			               '<span class="' + config.instrumentClass + '">' + this.instrumentName + '</span>' +
			               '<span class="' + config.marketStatusClass + ' ' + config.marketStatusUpClass + '">&nbsp;</span>' +
			               '<span class="rate">-</span>'
			              // + '/<span class="rate">-</span>'
                '</div>';

                $("<li>").attr('id', config.cellIdPrefix + this.instrumentName)
			           .data('InstrumentData', this)
			           .append(html)
			           .appendTo($container)
            });

            $wrapper.appendTo($input);

            $container.ticker();
        }

        var handleCellUpdate = function(data, bidRateStatus, askRateStatus) {
            var cell = $("#" + config.cellIdPrefix + data.InstrumentName);

            if (cell.length > 0) {

                var instrumentData = cell.data('InstrumentData');

                var newDisplayBid = Number(data.BidRate).toFixed(instrumentData.displayDecimalPrecision);
                var newDisplayAsk = Number(data.AskRate).toFixed(instrumentData.displayDecimalPrecision);

                var cellEditor = cell.find('span').eq(1);

                if (bidRateStatus !== config.engine.marketRateStatus.noChange) {
                    cellEditor.toggleClass(config.marketStatusUpClass,
				                        bidRateStatus === config.engine.marketRateStatus.up)
                }


                // Update market status class and bid and ask values
                cellEditor.next().html(newDisplayBid)
				          .next().html(newDisplayAsk);
            }
        }

        var init = function() {
            // To avoid scope issues, use 'base' instead of 'this'
            base = this;

            //get current input element as jquery object
            $input = $(input);

            // Add a reverse reference to the DOM object
            $input.data("MarketRatesTicker", base);

            // Extend config with defults and options passed from the user 
            config = $.extend({}, defaults, options);

            if (config.engine == null) {
                alert('Error Market Rates Data Engine not defined')

                return;
            }

            // Clear the initial content of the specified container
            $input.empty();

            //append to container the table header
            buildLayout();

            config.engine.addRatesList(crossesList);
            config.engine.addCallback(handleCellUpdate);
            config.engine.start();

        }

        //call init function after the instanse objetc created
        init();

    }

    /*
    * main markets rates jquery plugin function
    * @param options - custom options object to override defaults objetc
    */
    $.fn.marketRatesTicker = function(options) {
        //loop over each selected dom elelemt and create new market status for them
        return this.each(function() {
            //create new instanse of market rates control
            var marketRatesInstance = new MarketRatesTicker(this, options);
        });
    };



})(jQuery);


