/*
    EGR jQuery Selectbox
*/

(function( $, window, undefined ) {

    $.fn.selectbox = function( o ) {

        return this.each( function() {
            
            var $sb = null,
                $nsb = null,
                $nsb_title = null,
                $nsb_title_text = null,
                $nsb_title_arrow = null,
                $nsb_options = null,
                $nsb_options_div = null,
                searchText = "",
                searchTextClear = null,
                searchTimeout = null,
                selectOption = null,
                activateSelected = null,
                selectMatchingOption = null,
                selectNextMatchingOption = null,
                docKeyup = null,
                docKeydown = null,
                docClick = null,
                sbOpen = null,
                sbClose = null,
                sbClick = null,
                sbMouseup = null,
                sbClickItem = null,
                sbHoverItemOver = null,
                sbHoverItemOut = null,
                position = '';
            
            activateSelected = function() {
                $nsb_options_div.children()
                    .removeClass('selected')
                    .eq( $sb[0].selectedIndex )
                        .addClass('selected');
            };
            
            searchTextClear = function() {
                searchText = "";
            };
            
            selectMatchingOption = function(text) {
                for( i = 0; i < $sb.children().size(); i++ ) {
                    if( $sb.children().eq(i).text().toLowerCase().indexOf( text.toLowerCase() ) == 0 && $nsb_options_div.children().filter('.selected').index() != i ) {
                        $nsb_options_div.children().eq(i).trigger('mouseover');
                        return true;
                    }
                }
                return false;
            };
            
            selectNextMatchingOption = function(text) {
                //alert( $nsb_options_div.children().filter('.selected').index() );
                
                for( i = ( $nsb_options_div.children().filter('.selected').index() + 1 ); i < $sb.children().size(); i++ ) {
                    if( $sb.children().eq(i).text().toLowerCase().indexOf( text.toLowerCase() ) == 0 ) {
                        $nsb_options_div.children().eq(i).trigger('mouseover');
                        return true;
                    }
                }
                return false;
            };
            
            selectOption = function() {
                $sb[0].selectedIndex = $(this).data('data').index;
                $nsb_title_text.text( $(this).data('data').text );
                $sb.change();
                $nsb.triggerHandler('close');
            };
            
            sbOpen = function(){
                $(document)
                    .keyup(docKeyup)
                    .keydown(docKeydown)
                    .click(docClick);
                
                $('.sb.open.').not($nsb[0]).each(function() {
                    $(this).triggerHandler('close');
                });
                
                $nsb.addClass('open');
                activateSelected();

                if( $nsb_options_div.outerHeight() < ( $(window).scrollTop() + $(window).height() - $nsb.offset().top - $nsb.outerHeight() ) ) {
                    $nsb.removeClass('up').addClass('down');
                    $nsb_options.css({top:$nsb.outerHeight(),bottom:'auto',height:0,display:'block'});
                    $nsb_options.animate({height:$nsb_options_div.outerHeight()});
                } else if( $nsb_options_div.outerHeight() < ( $nsb.offset().top - $(window).scrollTop() ) ) {
                    $nsb.removeClass('down').addClass('up');
                    $nsb_options.css({top:'auto',bottom:$nsb.outerHeight(),height:0,display:'block'});
                    $nsb_options.animate({height:$nsb_options_div.outerHeight()});
                } else {
                    $nsb.removeClass('up').addClass('down');
                    $nsb_options.css({top:$nsb.outerHeight(),bottom:'auto',height:0,display:'block'});
                    $nsb_options.animate({height:$nsb_options_div.outerHeight()});
                }
            };

            sbClose = function(){
                $nsb_options.animate( {height:0}, function(){ $nsb.removeClass('open'); } );
                $(document)
                    .unbind('keyup', docKeyup)
                    .unbind('keydown', docKeydown)
                    .unbind('click', docClick);
            };
            
            sbMouseup = function(){
                if( $(this).is('.open') ) {
                    sbClose();
                } else {
                    sbOpen();
                }
            };
            
            sbClick = function(){
                return false;
            };
            
            sbHoverItemOver = function(){
                $nsb_options_div.children().removeClass('selected');
                $(this).addClass('selected');
                
            };
            
            sbHoverItemOut = function(){};
            
            sbClickItem = function(){
                selectOption.call(this);
            };
            
            docKeyup = function(e) {
                searchText += String.fromCharCode(e.keyCode);
                if( selectMatchingOption( searchText ) ) {
                    clearTimeout( searchTimeout );
                    searchTimeout = setTimeout(searchTextClear, 800);
                } else if( selectNextMatchingOption( String.fromCharCode(e.keyCode) ) ) {
                    clearTimeout( searchTimeout );
                    searchTimeout = setTimeout(searchTextClear, 800);
                } else {
                    searchTextClear();
                    clearTimeout( searchTimeout );
                }
            };

            docKeydown = function( e ) {
                var $selected = $nsb_options_div.children().filter('.selected'),
                    $enabled = $nsb_options_div.children();
                switch(e.which) {
                    case 37: // left
                    case 38: // up
                        if($selected.size() > 0) {
                            if($enabled.filter(":first")[0] !== $selected[0]) {
                                $enabled.eq($enabled.index($selected)-1).trigger('mouseover');
                            }
                        }
                        return false;
                        break;
                    case 39: // right
                    case 40: // down
                        if($selected.size() > 0) {
                            if($enabled.filter(":last")[0] !== $selected[0]) {
                                $enabled.eq($enabled.index($selected)+1).trigger('mouseover');
                            }
                        }
                        return false;
                        break;
                    case 33: // page up
                    case 36: // home
                        $enabled.filter(":first").trigger('mouseover');
                        return false;
                        break;
                    case 34: // page down
                    case 35: // end
                        $enabled.filter(":last").trigger('mouseover');
                        return false;
                        break;
                    case 13: // enter
                        selectOption.call( $enabled.filter('.selected') );
                        return false;
                        break;
                    case 27: // esc
                        $nsb.triggerHandler('close');
                        return false;
                        break;
                    default:
                        break;
                }
            };
            
            docClick = function(){
                $('.sb.open').each(function() {
                    $(this).triggerHandler('close');
                });
            };

            $sb = $(this).hide();
            $nsb = $('<div></div>').addClass('sb').mouseup(sbMouseup).click(sbClick);
            $nsb_title = $('<div></div>').addClass('sb-title');
            $nsb_title_text = $('<div></div>').text($sb.children(':selected').text()).addClass('sb-title-text');
            $nsb_title.append($nsb_title_text);
            $nsb_title_arrow = $('<div></div>').addClass('sb-title-arrow');
            $nsb_title.append($nsb_title_arrow);
            $nsb.append($nsb_title);
            $nsb_options = $('<div></div>').addClass('sb-options');
            $nsb_options_div = $('<div></div>').addClass('sb-options-div');
            $sb.children().each(function( i ) {
                $item = $('<div></div>')
                        .text($(this).text())
                        .data('data', {
                            index:i,
                            value:$(this).val(),
                            text:$(this).text()
                        })
                        .click(sbClickItem)
                        .hover(sbHoverItemOver,sbHoverItemOut);
                if( i == $sb[0].selectedIndex ) {
                    $item.addClass('selected');
                }
                $nsb_options_div.append($item);
            });
            $nsb_options_div.children(':first').addClass('first');
            $nsb_options_div.children(':last').addClass('last');
            $nsb_options.append($nsb_options_div);
            $nsb.append($nsb_options);
            $nsb.insertAfter(this);
            
            $nsb.bind("close.sb", sbClose);
        });
    };
}(jQuery, window));

