﻿/// <reference path="../API/Agility.js
/// <reference path="../External/date.format.js

Agility.RegisterNamespace("BNN.Controls.Header");

(function(Header) {

    var _isOverStockSearchMenu = false;

    Header.Init = function(searchDefault, breakingNewsRotation, symbolList, EST, txtClientTemplateMarketData) {

        timeUpdater(EST);

        updateBreakingNews(breakingNewsRotation);

        updateStockTicker(symbolList, txtClientTemplateMarketData);


        var showsLink = $("#Header_Links a").filter(function() { return $(this).html().toLowerCase().indexOf("shows") != -1; });
        var showsMenu = $("#Header_ShowsDropDown");

        var specialCoverageLink = $("#Header_Links a").filter(function() { return $(this).html().toLowerCase().indexOf("special coverage") != -1; });
        var specialCoverageMenu = $("#Header_SpecialCoverageDropdown");

        showsLink.bind("mouseenter", function() {

            _updateShowsMenuPosition(showsLink, showsMenu);
            showsMenu.show();
        });

        showsLink.bind("mouseleave", function() {

            showsMenu.hide();
        });

        showsMenu.bind("mouseenter", function() {

            showsLink.addClass("Highlighted");
            _updateShowsMenuPosition(showsLink, showsMenu);
            showsMenu.show();
        });

        showsMenu.bind("mouseleave", function() {

            showsLink.removeClass("Highlighted");
            showsMenu.hide();
        });

        // new begins
	  specialCoverageLink .bind("mouseenter", function() {

            _updateSpecialCoverageMenuPosition(specialCoverageLink, specialCoverageMenu);
            specialCoverageMenu .show();
        });

        specialCoverageLink .bind("mouseleave", function() {

            specialCoverageMenu .hide();
        });

        specialCoverageMenu .bind("mouseenter", function() {

            specialCoverageLink .addClass("Highlighted");
            _updateSpecialCoverageMenuPosition(specialCoverageLink, specialCoverageMenu);
            specialCoverageMenu .show();
        });

        specialCoverageMenu .bind("mouseleave", function() {

            specialCoverageLink .removeClass("Highlighted");
            specialCoverageMenu .hide();
        });
        // new ends

        var searchBox = $("#txtHeaderSearch");
        var stockSearchMenu = $("#Header_StockSearch");

        stockSearchMenu.bind("mouseenter", function() {
            _isOverStockSearchMenu = true;
        });

        stockSearchMenu.bind("mouseleave", function() {
            _isOverStockSearchMenu = false;
        });

        searchBox.bind("focus", function() {
            if (searchBox.val() == searchDefault) {
                searchBox.val("");
            }
        })
        .bind("keyup", function() {
            if (searchBox.val() == "") {
                stockSearchMenu.hide();
                return;
            }


            $.getJSON(MarketDataServiceUrl + "/GetTopNStocks?symbolBeginsWith=" + searchBox.val() + "&n=5", function(result) {
                if (result != undefined && result.length > 0) {
                    var templateUrl = Agility.ResolveUrl("~/ClientTemplates/StockSearchResults.htm");
                    var container = $("#Header_StockSearch .Results");
                    container.setTemplateURL(templateUrl);
                    container.processTemplate(result);

                    _updateStockSearchPosition(searchBox, stockSearchMenu);
                    stockSearchMenu.show();

                    var moreUrl = $(".MoreResults a", stockSearchMenu).attr("href");
                    var newMoreUrl = moreUrl.substring(0, moreUrl.indexOf("Search.aspx") + 11) + "?query=" + searchBox.val();
                    $(".MoreResults a", stockSearchMenu).attr("href", newMoreUrl);

                    container.children(".DataItem").bind("mouseenter", function() {
                        $(this).addClass("Hover");
                    });

                    container.children(".DataItem").bind("mouseleave", function() {
                        $(this).removeClass("Hover");
                    });
                } else {
                    stockSearchMenu.hide();
                }
            });
        })

        .bind("blur", function() {
            if (searchBox.val() == "") {
                searchBox.val(searchDefault);
            }

            if (!_isOverStockSearchMenu) {
                stockSearchMenu.hide();
            } else {
                stockSearchMenu.bind("mouseleave", function() {
                    stockSearchMenu.hide();
                });
            }
        })
        .bind("keydown", function(event) {
            if (event.which || event.keyCode) {
                if ((event.which == 13) || (event.keyCode == 13)) {
                    $(this).next().trigger("click");
                }
            }
        });
        
        $("#btnHeaderSearch").bind("click", function() {
            var query = searchBox.val();
            if ((query != "") && (query != searchDefault)) {
                window.location = Agility.ResolveUrl("~/Search.aspx") + "?query=" + escape(query);
            }
            return false;
        });
    };

    _updateShowsMenuPosition = function(linkElement, menuElement) {

        if ((linkElement.length > 0) && (menuElement.length > 0)) {

            var x = linkElement.offset().left + (linkElement.width() / 2) - (menuElement.width() / 2);
            var y = linkElement.offset().top + linkElement.height() + 8;

            menuElement.css("left", x + "px");
            menuElement.css("top", y + "px");
        }
    };


   _updateSpecialCoverageMenuPosition = function(linkElement, menuElement) {

        if ((linkElement.length > 0) && (menuElement.length > 0)) {

            var x = linkElement.offset().left + (linkElement.width() / 2) - (menuElement.width() / 2);
            var y = linkElement.offset().top + linkElement.height() + 8;

            menuElement.css("left", x + "px");
            menuElement.css("top", y + "px");
        }
    };
    _updateStockSearchPosition = function(searchBoxElement, stockSearchMenuElement) {

        if ((searchBoxElement.length > 0) && (stockSearchMenuElement.length > 0)) {

            var x = searchBoxElement.offset().left - 3;
            var y = searchBoxElement.offset().top + searchBoxElement.height();

            stockSearchMenuElement.css("left", x + "px");
            stockSearchMenuElement.css("top", y + "px");
        }
    };

    function timeUpdater(EST) {

        var updateTime = function() {
            var now = new Date();
            var nowMilis = now.getTime();
            nowMilis = nowMilis - now.getTimezoneOffset() * 60000;
            nowMilis = nowMilis - EST * 60000;
            var est = new Date(nowMilis);

            //alert(now + "\n" + est.toUTCString() + "\n" + est.toString());
            $("div.ETDateTime span").html(dateFormat(est, "mmmm d, yyyy hh:MM TT"));

            setTimeout(function() { updateTime() }, 60000);
        };
        updateTime();
    };

    function updateBreakingNews(breakingNewsRotation) {

        $.getJSON(Agility.ResolveUrl("~/Handlers/Header.ashx") + "?get=BreakingNews", function(result) {

            var breakingNews = result.Header;
            if (breakingNews != undefined && breakingNews != null && breakingNews.length > 0) {

                var news = $("#BreakingNews .News");
                var rotateBreakingNews = function(idx) {
                    news.fadeOut("fast", function() {
                        news.html("<a href=\"" + breakingNews[idx].URL + "\">" + breakingNews[idx].Title + "</a>");
                        news.fadeIn("fast", function() {
                            setTimeout(function() {
                                rotateBreakingNews((idx + 1) % breakingNews.length)
                            }, breakingNewsRotation);
                        });
                    });
                };
                rotateBreakingNews(0);
            }
			else {
				$('#BreakingNews').hide();
			}
        });
    };

    function updateStockTicker(data, txtClientTemplateMarketData) {

        $.getJSON(MarketDataServiceUrl + "/GetStockTickers?symbols=" + data + "", function(result) {

            if (result != undefined && result.length > 0) {

                var marketData = [];

                for (var i = 0; i < result.length; i++) {
                    var ticker = result[i];
                    var positive = ticker.NetChange.indexOf("-") != 0;
                    var cssClass = (ticker.NetChange == "0" || ticker.NetChange == "") ? "Neutral" : (positive ? "Positive" : "Negative");
                    var url = StockPageUrl + ticker.Ticker;
                    var change = ticker.NetChange.indexOf("-") == 0 ? "-$" + ticker.NetChange.substring(1) : "+$" + ticker.NetChange;
                    if (change.indexOf(".") == 2) {
                        change = change.substring(0, 2) + "0" + change.substring(2);
                    }

                    marketData.push({ "Symbol": ticker.Ticker, "Price": ticker.Last, "Change": change, "CssClass": cssClass, "Url": url });
                }

                var container = $("div.StockTicker div.Scroll");
                if (txtClientTemplateMarketData == undefined || txtClientTemplateMarketData == null || txtClientTemplateMarketData == "") {
                    templateUrl = Agility.ResolveUrl("~/ClientTemplates/MarketData.htm");
                    container.setTemplateURL(templateUrl);
                }
                else {
                    container.setTemplate($("#" + txtClientTemplateMarketData).val());
                }
                container.processTemplate(marketData);

                startScrolling(container);
            }
        });
    };

    function startScrolling(container) {

        var divWidth = 156; //156px width of a div

        var scroll = container;
        var divs = scroll.find("div");
        var count = divs.size() * divWidth;
        scroll.width(count);

        var left = 0;
        var width5 = 5 * divWidth;
        var scrollFunction = function() {
            scroll.css("left", --left + "px");
            if (-left == count - width5) {
                left += divWidth;
                scroll.css("left", left + "px");
                scroll.append(divs.eq(0));
                divs = scroll.find("div");
            }
        };
        var interval = setInterval(function() { scrollFunction() }, 20);

        container.parent().hover(function(eventObject) {
            clearInterval(interval);
        }, function(eventObject) {
            interval = setInterval(function() { scrollFunction() }, 20);
        });
    };

})(BNN.Controls.Header);

