$(document).ready(function(){
var SearchBoxHandler = function() {
    function registerEventHandlers(){
        self.$elSearchField = $("#search-searchfield")
            .change(searchTerm)
            .keyup(searchTerm)
            .keypress(cancelEnter)

            .blur(blur)
            .focus(focus)
        ;

        $("#search-submit")
            .focus(focus)
            .mousemove(hoverOver)
            .mousedown(hoverOver)
            .mouseup(hoverOver)
            .click(function(){
                searchTerm();
                self.$elSearchField.focus();
                return false;
            })
        ;

        self.sDefaultSearchText = self.$elSearchField.attr('value');
    }

    function searchTerm() {
        var sTerm = self.$elSearchField.val();

        if(sTerm == self.sDefaultSearchText){
            return;
        }

        if(sTerm != self.sLastSearchTerm){
            self.sLastSearchTerm = sTerm;
            clearTimeout(idSearchTimeout);
            idSearchTimeout = setTimeout(queryTerm, 500);
        }
    };

    function queryTerm(){
        var $elSearchResultBox = $('.search-results');
	if($elSearchResultBox.length == 0){
            $('#search-container form').append('<div class="search-results"></div>');
            $elSearchResultBox = $('.search-results');
            alignBelow($elSearchResultBox, $('#search-searchfield'), 25);
            $('.search-results').hover(
                hoverOver,
                hoverOut
            ).focus(focusResults)
             .blur(blurResults)
             .mousemove(hoverOver)
             .mousedown(hoverOver)
             .mouseup(hoverOver);

            $("#content-search-results-close").live('click', hideBox);
	}

	$elSearchResultBox
            .load('/search div.content-search-results>*', self.sLastSearchTerm)
            .show()
        ;
    }

    function alignBelow($elToAlign, $elRelativeTo, nPixelsInBetween){
        var pt = $elRelativeTo.offset();
        var nPadding = $elToAlign.outerWidth() - $elToAlign.innerWidth();
        nPadding = 20;
        var nWidth = $elRelativeTo.outerWidth() - nPadding;
       
        $elToAlign.css({
            left: pt.left,
            top: $elRelativeTo.outerHeight() + nPixelsInBetween,
            width: nWidth,
            position: 'absolute',
            zIndex: 10000
        });
    }

    function hoverOver(){
        dd('hoverOver');
        if (self.nTimerId !== false) {
            clearInterval( self.nTimerId );
        }
    }

    function hoverOut(){
        dd('hoverOut');

        if(self.$elSearchField.val() == ""){
            self.$elSearchField.val(self.sDefaultSearchText);
        }

        if ((!self.bSearchFieldHasFocus) && (!self.bSearchResultsHasFocus)) {
            self.nTimerId = window.setTimeout(hideBox, 1000);
        }
    }

    function blur(){
        dd('blur');
        
        self.bSearchFieldHasFocus = false;
        hoverOut();
        dd('blur-hoverOut');
    }

    function blurResults(){
        dd('blurResults');
        
        self.bSearchResultsHasFocus = false;
        hoverOut();
        dd('blurResults-hoverOut');
    }

    function focus(){
        dd('focus');

        if(self.$elSearchField.val() == self.sDefaultSearchText){
            self.$elSearchField.val("");
        }

        self.bSearchFieldHasFocus = true;
        showBox();
    }

    function focusResults(){
        dd('focusResults');

        if(self.$elSearchField.val() == self.sDefaultSearchText){
            self.$elSearchField.val("");
        }

        self.bSearchResultsHasFocus = true;
        showBox();
    }

    function hideBox(){
        dd('hide');
        $('.search-results').hide();
    }

    function showBox(){
        dd('show');
        $('.search-results').show();
    }

    function cancelEnter(ev){
        var key;
        if(window.event){
            key = window.event.keyCode; //FF
        } else {
            key = ev.which; // FF
        }

        if(key == 13) {
            return false;
        } else {
            return true;
        }
    }

    function dd(sMsg){
//        document.title = sMsg;
    }

    var bSearchFieldHasFocus = false;
    var bSearchResultsHasFocus = false;
    var nTimerId = false;
    
    var idSearchTimeout = -1;
    var sLastSearchTerm = '';

    var sDefaultSearchText = '';
    var $elSearchField;
    
    var self = this;
    registerEventHandlers();
}
new SearchBoxHandler();
});
