// Various jquery supported functionality for the leasing mall list drop down.

$(document).ready(function() {
    
    var selectedIndex;
    var txtSearchHasFocus = false;
    
    $("li.MallListItem").mouseover(
        function() {
            var index = $(".MallList li").index(this);
            highlightItem(index);
            handleScroll($(".MallList"), index);
        });
        
    $("li.MallListItem").click(
        function() {
            location.href = $(this).attr("href");
        });
        
    $("input.show_malls").click(
        function() {
            abortPostback();
            $(this).blur();
            
            if ($(".MallList").css("display") == "block")
            {
                CloseMallList();
                return false;
            }
            
            $("ul[id$='completionListElem']").hide();
            var txtSearch = $("input[id$='txtSearch']");
            var offset = txtSearch.offset();
            var top = offset.top + txtSearch.height() + 6;
            var left = offset.left;
            $(".MallList").css("top", top);
            $(".MallList").css("left", left);
            $(".MallList").slideDown("fast");
            highlightItem(0);
            $(".MallList").get(0).scrollTop = 0;
            
            $("#searchbox span").append("<input id='dropdownSearch' type='text' name='dropdownSearch' class='input-search-text'/>");
            //$("#dropdownSearch").focus();
            $("#dropdownSearch").css("top", top - txtSearch.height() - 6);
            $("#dropdownSearch").css("left", left);
            $("#dropdownSearch").css("z-index", 6000);
            $("#dropdownSearch").css("position", "absolute");
            $("#dropdownSearch").focus(function() { txtSearchHasFocus = true; });
            $("#dropdownSearch").blur(function() { txtSearchHasFocus = false; });
            
            $("#dropdownSearch").select();
            
            if (!txtSearch.hasClass('tbweStyle'))
            {
                var search = txtSearch.val();
                $("#dropdownSearch").val(search);
                highlightItemByString(search);
            }
            
            $(document).keydown(mallListKeyDown);
            
            CreateBodyOverlay(CloseMallList);
            
            return false;
        }
    );
    
    function mallListKeyDown(ev)
    {
        var k = ev.keyCode ? ev.keyCode : ev.rawEvent.keyCode;
        var index = selectedIndex;
        if (k === Sys.UI.Key.esc) {
            CloseMallList();
            ev.preventDefault();
        }
        else if (k === Sys.UI.Key.up) {
            if (index > 0) {
                index--;
                highlightItem(index);
                handleScroll($(".MallList"), index);
                ev.stopPropagation();
                ev.preventDefault();
            }
        }
        else if (k === Sys.UI.Key.down) {
            if (index < $(".MallList li").length - 1) {
                index++;
                highlightItem(index);
                handleScroll($(".MallList"), index);
                ev.stopPropagation();
                ev.preventDefault();
            }
        }
        else if (k >= 65 && k <= 90) {
            var search = $("#dropdownSearch").val() + String.fromCharCode(k);
            highlightItemByString(search);
            ev.stopPropagation();
            //ev.preventDefault();
            if (!txtSearchHasFocus)
            {
                $("#dropdownSearch").val(search.toLowerCase());
                $("#dropdownSearch").focus();
            }
        }
        else if (k === Sys.UI.Key.enter) {
            ev.stopPropagation();
            ev.preventDefault();
            selectItem();
        }
    }
    
    // Highlight the first item starting with a particular letter.
    // If the highlighted item already starts with that letter, move to the next one.
    function highlightItemByString(search)
    {
        var maxIndex = $(".MallList li").length - 1;
        var index = findMallIndex(search.toUpperCase(), 0, maxIndex);
        if (index >= 0)
        {
            highlightItem(index);
            handleScroll($(".MallList"), selectedIndex);
        }
    }
    
    function getFirstLettersByIndex(index, length)
    {
        return $(".MallList li:eq(" + index + ")").text().substring(0, length).toUpperCase();
    }
    
    // Binary search for the index of the first mall that starts with a substring.
    function findMallIndex(search, start, end)
    {
        var substr = getFirstLettersByIndex(start, search.length);
        
        if (substr === search)
            return start;
            
        if (substr > search || start == end)
            return -1;
            
        var mid = Math.ceil((start + end) / 2);
        if (search <= getFirstLettersByIndex(mid - 1, search.length))
            return findMallIndex(search, start, mid - 1);
        else
            return findMallIndex(search, mid, end);
    }        
    
    function highlightItem(index)
    {
        $(".MallList li:eq(" + selectedIndex + ")").css('background-color', '#ffffff');
        $(".MallList li:eq(" + index + ")").css('background-color', '#ccecff');
        selectedIndex = index;
    }
    
    function selectItem()
    {
        location.href = $(".MallList li").eq(selectedIndex).attr("href");
    }
    
    function handleScroll(obj, index)
    {
        var flyout = obj.get(0);
        var height = obj.children("li").eq(index).height() + 2;
        var top = obj.children("li").eq(index).offset().top - obj.offset().top;
        
        if (top + height >= flyout.clientHeight) {
            // you need to scroll down
            flyout.scrollTop += top + height - flyout.clientHeight;
        }
       
        if (top < 0) {
            // you need to scroll up
            flyout.scrollTop += top; 
        }
    }
    
    function CloseMallList()
    {
        $(document).unbind("keydown", mallListKeyDown);
        $(".MallList").slideUp("fast");
        $("#dropdownSearch").remove();
        $("#popup_overlay").remove();
    }
});

function CreateBodyOverlay(onClickFunction, tagName){
	tagName = tagName || 'popup_overlay';
	
	$("body").append('<div id="' + tagName + '"/>');
	$("#" + tagName).click(onClickFunction);
	
	// This handles if the page extends below the window.
        if (window.innerHeight && window.scrollMaxY) {  
          yScroll = window.innerHeight + window.scrollMaxY;
        } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
          yScroll = document.body.scrollHeight;
        } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
          yScroll = document.body.offsetHeight;
          }    
        $("#" + tagName).css("height",yScroll +"px");
        var width = $(document).width() || window.innerWidth;
        if (width)
            $("#" + tagName).css("width", width + "px");
}
