﻿// Common Namespace to be shared accross the web site; 
Type.registerNamespace('LangloWeb');

LangloWeb.SearchManager = function()
{
    // load is called on every postback (also async)
    //Sys.Application.add_load(Function.createDelegate(this, this.handleAppLoaded));
    Sys.Application.add_init(Function.createDelegate(this, this.handleAppInit));
}

LangloWeb.SearchManager.prototype =
{
    handleAppInit : function() 
    {
        this.splashPanel = $get('SearchSplashPanel');
        this.resultsPanel = $get('SearchResultsPanel');
        this.outerPanel = $get('ctl00_OuterSearchPanel');
        this.searchBox = $get('ctl00_SearchBox');
        this.searchImg = $get('ctl00_SearchImg');
        this.visPanel = $get('visPanel');
        this.pageLinksGroup = $get('pageLinksGroup');
        this.noHitsPanel = $get('NoHitsPanel');
        this.searchNavBar = $get('SearchNavBar');
        this.linksPerPage = 6;
    },

    getDivElements : function(parent)
    {
        var elements = new Array();
        if (typeof parent != 'undefined')
        {
            var len = parent.childNodes.length;
            for (var i = 0; i < len; i++)
            {
                var elem = parent.childNodes[i];
                if (elem.tagName == 'DIV')
                {
                    elements.push(elem);
                }
            }
        }
        return elements;
    },
    
    displayPage : function(pageNo, links)
    {
        var pageLinksGroup = this.pageLinksGroup;
        if (typeof links == 'undefined')
            links = this.getDivElements(this.resultsPanel);

        var linksPerPage = this.linksPerPage;
        var linkCount = links.length;
        var first = linksPerPage * pageNo;
        var last = first + linksPerPage - 1;
        for (var i = 0; i < linkCount; i++)
        {
            var div = links[i];
            div.style.display = i >= first && i <= last ? '' : 'none';
        }

        var pageCount = pageLinksGroup.childNodes.length;
                
        for (var i = 0; i < pageCount; i++)
        {
            var pageLink = pageLinksGroup.childNodes[i];
            if (i == pageNo)
            {
                Sys.UI.DomElement.addCssClass(pageLink, 'Disabled');
                $clearHandlers(pageLink);
            }
            else
            {
                Sys.UI.DomElement.removeCssClass(pageLink, 'Disabled');
                var delegate = Function.createDelegate(this, this.handlePageLinkClicked);
                $addHandler(pageLink, 'click', delegate);
            }
        }
    },
    
    handlePageLinkClicked : function(e /* Sys.UI.DomEvent */)
    {
        var link = e.target;
        var pageNo = Number(link.firstChild.nodeValue);
        this.displayPage(pageNo - 1); // 0-based
    },
    
    paginate : function()
    {
        var pageLinksGroup = this.pageLinksGroup;
        pageLinksGroup.innerHTML = '';
        var links = this.getDivElements(this.resultsPanel);
        if (links)
        {
            var linksPerPage = this.linksPerPage;
            var linkCount = links.length;
            if (linkCount > 0)
            {
                var pageCount = Math.ceil(linkCount / linksPerPage);
                for (var i = 1; i <= pageCount; i++)
                {
                    var pageLink = document.createElement('a');
                    var text = document.createTextNode(i.toString());
                    pageLink.appendChild(text);
                    pageLinksGroup.appendChild(pageLink);
                }

                this.displayPage(0, links);
            }
            this.noHitsPanel.style.display = linkCount > 0 ? 'none' : '';
            this.searchNavBar.style.display = linkCount > 0 ? '' : 'none';
        }
    },

    handleCloseBtnClick : function(sender)
    {
        var searchPopup = $find('SearchBehavior'); 
        if (searchPopup) 
            searchPopup.hide();
    },
        
    handleSearchPopulated : function(searchPopup) 
    {
        if (searchPopup) 
        {
            // Hide splash, show img
            this.splashPanel.style.display = 'none';
            this.visPanel.style.display = '';
            // padding is here to avoid popup displaying too early (if set in css)
            this.visPanel.style.padding = '20px';
            this.paginate();
            //Lay out only needs to be called if we want the results to be centered. And auto position is turned on. 
            this.setPositionAndSize(searchPopup);
            //searchPopup._layout();
            
            // remove focus from searchbox since it's under the popup bg.
            this.outerPanel.focus();
            searchPopup.remove_populated(this.searchPopupulatedDelegate);
        }
    },

    setPositionAndSize: function(searchPopup) 
    {
        this.outerPanel.style.height = ''; // reset
        var outerBounds = Sys.UI.DomElement.getBounds(this.outerPanel);
        var searchBoxBounds = Sys.UI.DomElement.getBounds(this.searchBox);
        var searchImgBounds = Sys.UI.DomElement.getBounds(this.searchImg);
        var clientBounds = $common.getClientBounds();

        var left = searchBoxBounds.x + searchBoxBounds.width + searchImgBounds.width - outerBounds.width;
        if (left < 0)
            left = 0;
        var top = searchBoxBounds.y + searchBoxBounds.height + 2;
        searchPopup.set_X(left);
        searchPopup.set_Y(top);

        var availHeight = clientBounds.height - top - 10; // 10px for shadow
        if (outerBounds.height > availHeight)
        {
            var delta = outerBounds.height - availHeight;
            var size = $common.getSize(this.resultsPanel);
            size.height = size.height - delta;
            $common.setSize(this.resultsPanel, size);
            // restore auto-width:
            this.resultsPanel.style.width = '';
        }
    },

    initSearchPopup : function()
    {
        this.visPanel.style.display = 'none'; // don't display until populated
        this.splashPanel.style.display = '';

        var searchBox = this.searchBox;
        var searchPopup = $find('SearchBehavior'); 
        if (searchPopup && searchBox) 
        {
            // work around issue in modal popup behaviour with empty strings not resetting the contextKey
            var searchVal = searchBox.value != '' ? searchBox.value : ' ';
            searchPopup.set_dynamicContextKey(searchVal);
            this.searchPopupulatedDelegate = Function.createDelegate(this, this.handleSearchPopulated);
            searchPopup.add_populated(this.searchPopupulatedDelegate);
        }
        return searchPopup;
    },
        
    handleSearchBoxKeyDown : function(e)
    {
        var event = window.event;
        if (event.keyCode == 13) 
        {
            event.returnValue = false;
            var searchPopup = this.initSearchPopup();
            if (searchPopup)
                searchPopup.show();
        }
    },
    
    handleSearchBtnClick : function(sender) 
    {
        this.initSearchPopup();
    }
}
LangloWeb.SearchManager.registerClass('LangloWeb.SearchManager'); 
 
LangloWeb.MasterPageManager = function()
{
    // load is called on every postback (also async)
    //Sys.Application.add_load(Function.createDelegate(this, this.handleAppLoaded));
    Sys.Application.add_init(Function.createDelegate(this, this.handleAppInit));
} 
 
LangloWeb.MasterPageManager.prototype = 
{ 
    movePanelContents : function(fromPanelId, toPanelId)
    {
        var fromPanel = $get(fromPanelId);
        var toPanel = $get(toPanelId);
        if (typeof fromPanel != 'undefined' && typeof toPanel != 'undefined' && 
            fromPanel != null && toPanel != null)
        {
            var contents = fromPanel.innerHTML;
            fromPanel.innerHTML = '';
            toPanel.innerHTML = contents;
        }
    },
    
    findFirstSibling : function(element, nodeName)
    {
        var sibling = element.nextSibling;
        while (sibling != null)
        {
            if (sibling.nodeType == '1' && sibling.nodeName == nodeName)
            {
                return sibling;
            }
            sibling = sibling.nextSibling;
        }
        return null;
    },

    // Helper function which finds the sibling span (tooltip) right after the menu item (anchor),
    // and calls a callback passing the tooltip as a parameter.
    workOnMenuItem : function(sender, actionCallback)
    {
        if (sender != null && typeof sender.target != 'undefined')
        {
            var menuItem = sender.target;
            if (menuItem != null && menuItem.nodeName == 'A')
            {
                // Find the sibling span
                var tooltip = this.findFirstSibling(menuItem, 'SPAN');
                if (tooltip != null)
                {
                    //Sys.UI.DomElement.addCssClass(tooltip, "Active");
                    actionCallback(this, menuItem, tooltip);
                }
            }
        }
    },

    clearPreviousTimeout : function()
    {
        if (this._tooltipTimerId > -1)
        {
            this._tooltip = null;
            clearTimeout(this._tooltipTimerId);
            this._tooltipTimerId = -1;
        }
    },
    
    handleToolTipTimer : function()
    {
        if (this._tooltip != null)
        {
            Sys.UI.DomElement.addCssClass(this._tooltip, "Active");
        }
    },
         
    handleMenuMouseOver : function(sender)
    {
        this.workOnMenuItem(sender,
            function(thisRef, menuItem, tooltip)
            {
                thisRef.clearPreviousTimeout();
                thisRef._tooltip = tooltip;
                //var bounds = Sys.UI.DomElement.getBounds(menuItem);
                //var loc = Sys.UI.DomElement.getLocation(tooltip);
                //tooltip.style.left = sender.offsetX;
                tooltip.style.left = menuItem.offsetLeft + "px"; 
                //Sys.UI.DomElement.setLocation(tooltip, sender.offsetX, loc.y);
                thisRef._tooltipTimerId = setTimeout(thisRef._tooltipTimerDelegate, 1000);
            });
    },

    handleMenuMouseOut : function(sender)
    {
        this.workOnMenuItem(sender,
            function(thisRef, menuItem, tooltip)
            {
                thisRef.clearPreviousTimeout();
                Sys.UI.DomElement.removeCssClass(tooltip, "Active");
            });
    },
    
    // Add timer based display of tooltips on main menu.
    initializeMainMenu : function()
    {
        var menu = $get('MainMenu');
        if (menu)
        {
            var mouseOverDel = Function.createDelegate(this, this.handleMenuMouseOver);
            var mouseOutDel = Function.createDelegate(this, this.handleMenuMouseOut);
            $addHandler(menu, 'mouseover', mouseOverDel);
            $addHandler(menu, 'mouseout', mouseOutDel);
        }
    },

    handleAppInit : function() 
    {
        this._tooltipTimerDelegate = Function.createDelegate(this, this.handleToolTipTimer);
        this._tooltipTimerId = -1;
        this._tooltip = null;
        // Move script dependent panels to top of page (orig. at bottom)
        this.movePanelContents('SearchGroupContents', 'SearchGroup');
        this.movePanelContents('LoginGroupContents', 'LoginGroup');       
        this.initializeMainMenu();
    }
    
}
LangloWeb.MasterPageManager.registerClass('LangloWeb.MasterPageManager'); 

// Bootstrap, but only on modern browsers
if (typeof document.getElementById != 'undefined')
{
    masterPageMgr = new LangloWeb.MasterPageManager();
    searchMgr = new LangloWeb.SearchManager();
}

if (typeof(Sys) !== "undefined")
    Sys.Application.notifyScriptLoaded();
