/* 
   Requires: jquery (jquery.com)
   Usage:    <script type="text/javascript">var fbcollection = <s:cgi>collection</s:cgi></script>

   bugs:
    - backspace event includes character just deleted
    - cross browser support?
    - input field too big (needs to be fixed to suggestion size
    X need keypress to be "afterkeypress" last letter not be tracked
    X padre-qs should handle encoding (space = %20) -- +'s work fine, so using those.
    - prevent form submit on enter?
    - ensure fb namespace used on all js and css
    - insert <div id="suggestions"></div> using JS when jquery supports .live(blur, fn)
*/

var debug = false;

$(document).ready(function() {

	// SETUP QUERY SUGGESTER

		// Grab the query input field, and create the suggestions div.
		var queryInput = $('form input[name=query]');
		// queryInput.after('<div id="suggestions"></div>'); // needs jquery > 1.3 to be supported
		var suggestions = $('#suggestions');

		// Avoid user-agents inserting their own autocomplete.
		queryInput.attr('autocomplete', 'off');

		// Track clicking in document to hide suggestions, or to click on suggestion.
		$(document).click(function(e) {
			var suggestion = $(e.target);

			if (suggestion.attr('class') != 'fb-suggestion') {
				hideSuggestions(suggestions);
			} else {
				suggestion.parent().attr('class', 'selected');
				queryInput.attr('value', suggestion.text());
				hideSuggestions(suggestions);
			}
		});

	// END SETUP QUERY SUGGESTER

	function hideSuggestions(suggestionsContainer) {
		$(suggestionsContainer)
			.empty()
			.hide();
		queryInput.removeClass('suggestions');
	}


	// HANDLE KEYSTROKES

		queryInput.keyup(function process(e) {

			// Not up, down, left, right or return key.
			if (e.keyCode!=40 && e.keyCode!=38 && e.keyCode!=13 && e.keyCode!=27 && e.keyCode!=39) {

				if (debug) { $('body').append(e.keyCode); }

				$.ajax({
					type:     "GET",
					url:      "/fb/padre-qs.cgi?collection=" + window.fbcollection + "&partial_query=" + $(this).attr('value').replace(/ /g, "+"),
					dataType: "xml",
					success:  function(xml) {
						var suggestions = '';
						var cssCount = 0;
						var suggestionLimit = 5;
                                	 	$(xml).find('suggestion').each(function(){
                                     			if (cssCount > (suggestionLimit - 1)) { return; }
								var regex = new RegExp(queryInput.attr('value'), 'i');
								var replacement = '<b>' + queryInput.attr('value') + '</b>';
                		                   		var boldedText = $(this).text().replace(regex, replacement);
                                		     		suggestions  = suggestions + '<li><a class="fb-suggestion" href="#">' + boldedText + '</a></li>';
                                     				cssCount++;
                                 		});
		                                if (suggestions.length > 0) {
        	 	                        	$('#suggestions').html('<ul>' + suggestions + '</ul>');
                	                     		$('#suggestions').attr('class', 'l' + cssCount);
                        	             		$('#suggestions').show();
                                	     		queryInput.addClass('suggestions');
                                 		} else {
                                     			$('#suggestions').hide();
	                                     		queryInput.removeClass('suggestions');
        	                         	}
                	         	}
				});

			} else {

        	        	var currentSelection = $('#suggestions li.selected');

				switch (e.keyCode) {
                        		case 40:// down arrow
                        			// No selection, or this is the last selection in the list
                                		if (currentSelection.length == 0 || $('#suggestions li:last').attr('class') == 'selected') {
                                			currentSelection.removeAttr('class');
	                                		$('#suggestions li:first').attr('class', 'selected');
		                                } else {
							$('#suggestions li.selected + li').attr('class', 'selected');
							currentSelection.removeAttr('class');
						}
						queryInput.attr('value', $('#suggestions li.selected').text());
					break;
					case 38:// up arrow
						if (currentSelection.length != 0) {
							$('#suggestions li.selected').prev().attr('class', 'selected');
							currentSelection.removeAttr('class');
						}
						queryInput.attr('value', $('#suggestions li.selected').text());
					break;
					case 13, 39: // enter/return, right arrow
						if (currentSelection.length != 0) {
							$('#suggestions li.selected + li').attr('class', 'selected');
							$('#suggestions').empty();
							$('#suggestions').hide();
							e.preventDefault();
							e.stopPropagation(); // prevent form from being submitted
						}
					break;
					case 27: // escape
						hideSuggestions($('#suggestions'));
					break;
	                          }

                     }

		});

	$('#fb-advanced-link').click(function() {
        	$('#fb-form-advanced').toggle();
			return false;
	});


	});

