
;(function($) {

$.fn.extend({
	searchCompanion: function(myData, options) {

              var scrc=  $.SearchCompanion.defaults.scResultsClass;
              var data =
		'<div id="suggestions">' +

                '<div class="sgHeading"></div>' +
                '<div class="sgBox">' +

                '<div class="'+scrc+'" idx="1" url="/search.html" method="post" field="name">' +
                '<a href="#">' +
                '<img src="/images/bg_memeber_search.gif" alt="Member Search" border="0" />' +
                '<span class="searchheading">'+'Member Directory Search'+'</span>' +
                '<span>'+'Search by member name or family'+'</span></a>' +
                '</div>' +

                '<div class="'+scrc+'" idx="2" url="/site_search.html" method="get" field="">' +
                '<a href="#">' +
                '<img src="/images/bg_site_search.gif" alt="Site Search" border="0" />' +
                '<span class="searchheading">Site Search</span>' +
                '<span>'+'Search site by a keyword'+'</span>' +
                '</a>' +
                '</div>' +

                '<div class="'+scrc+'" idx="3" url="/content_search.html" method="get" field="desc">' +
                '<a href="#">' +
                '<img src="/images/bg_content_search.gif" alt="Content Search" border="0" />' +
                '<span class="searchheading">'+'Content Search'+'</span>' +
                '<span>'+'Search content by a keyword'+'</span>' +
                '</a>' +
                '</div>' +

                '</div>' +
                '</div>';

		options = $.extend({}, $.SearchCompanion.defaults, {
			data: data
		}, options);

		return this.each(function() {
			new $.SearchCompanion(this, options);
		});
	}
});


$.SearchCompanion = function(input, options) {

    var boxVisible = false;
    var preSubmit = false;
    var selectCurrent;
    var isMEInitialized = false;

    var KEY = {
            UP: 38,
            DOWN: 40,
            DEL: 46,
            TAB: 9,
            RETURN: 13,
            ESC: 27,
            COMMA: 188,
            PAGEUP: 33,
            PAGEDOWN: 34,
            BACKSPACE: 8
    };


    var $input = $(input).attr("autocomplete", "off");

    $('#wrapper').prepend(options.data);

    $('#'+options.scFormID).append('<input type="hidden" id="kwd" name="kwd" value="">');

    if (!selectCurrent) selectCurrent = 1;
    $('.'+options.scResultsClass+'[idx="'+selectCurrent+'"] a').attr('class','selected');

    $('.'+options.scResultsClass+' a').click(function(event){
         submitSearch(event.currentTarget);
    });

    // Fade out the suggestions box when not active
    $input.blur(function(){
        $('#'+options.scWrapperClass).fadeOut();
	boxVisible = false;
    });

    $('#'+options.scFormID).submit(function() {
      if (preSubmit) {
        preSubmit = false;
        return true;
      }
      return false;
    });

    attachKeyboardEvents($input);
    attachMouseEvents($input);



    function submitSearch (search_type) {

       var item = $('.'+options.scResultsClass+'[idx="'+selectCurrent+'"]');
       var url = item.attr('url');
       var mtd = item.attr('method');
       var kwn = item.attr('field');

       $("#"+options.scFormID).attr("action", url);
       $("#"+options.scFormID).attr("method", mtd);

       if (kwn) {
         $("#kwd").attr("name", kwn);
         var inS = $input.val();
         $("#kwd").val(inS);
       }

       preSubmit = true;
       $('#'+options.scFormID).submit();

    }


    function fade(input) {

        var inS = input.val();
        
    	if(inS.length == 0) {
                // Hide the suggestions box
    		$('#'+options.scWrapperClass).fadeOut();
    		boxVisible = false;
    	} else {
                // Show the suggestions box
    		$('#'+options.scWrapperClass).fadeIn();
       	        boxVisible = true;
    	}

    }

    // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all

    function attachMouseEvents () {

      if (!isMEInitialized) {

        $("."+options.scResultsClass).bind("mouseover", function(event) {
          var evnTarget = event.currentTarget;
          if (evnTarget) {
            var idx = evnTarget.getAttribute("idx");
            if (idx != selectCurrent) {
              selectCurrent = idx;
              setSearchItem();
            }

          }
        });

        isMEInitialized = true;
      }
    }

    function doPrevSearchItem() {

         var allItems = $('.'+options.scResultsClass).length;
         if (selectCurrent > 1) {
           selectCurrent = selectCurrent - 1;
         } else {
           selectCurrent = allItems;
         }
         setSearchItem();
         return false;
    }

    function doNextSearchItem() {

         var allItems = $('.'+options.scResultsClass).length;
         if (selectCurrent < allItems) {
           selectCurrent = selectCurrent + 1;
         } else {
           selectCurrent = 1;
         }
         setSearchItem();
    }


    function setSearchItem() {

        //alert(selectCurrent);
        $('.'+options.scResultsClass+' a').attr('class','');
        $('.'+options.scResultsClass+'[idx="'+selectCurrent+'"] a').attr('class','selected');
    }

    function attachKeyboardEvents(input) {

        input.bind(($.browser.opera ? "keypress" : "keyup"), function(event) {

            // track last key pressed
            lastKeyPressCode = event.keyCode;
    
            switch(event.keyCode) {
    
                    case KEY.UP:
                            event.preventDefault();
                            if ( boxVisible ) {
                               doPrevSearchItem();
                            } else {
                               onChange(0, true);
                            }
                            break;
    
                    case KEY.DOWN:
                            event.preventDefault();
                            if ( boxVisible ) {
                               doNextSearchItem();
                            } else {
                               onChange(0, true);
                            }
                            break;
    
                    case KEY.TAB:
                            break;
    
                    case KEY.RETURN:
                            event.preventDefault();
                            if ( boxVisible ) {
                               submitSearch('');
                            }
                            break;
    
                    case KEY.ESC:
                            this.blur();
                            break;
    
                    default:
                            fade(input);
    
            }
        });
    }

}

$.SearchCompanion.defaults = {
	scFormID: "searchform",
	scWrapperClass: "suggestions",
	scResultsClass: "searchresults"
};

})(jQuery);
