﻿    // QuickSearch v0.2
    // Created by Jan Tielens, http://weblogs.asp.net/jan
    // Modified to integrate with standard Seachbox by www.muhimbi.com
    // This sample code is provided on an “as is” basis and without warranty of any kind.
  
    var quickSearchTimer;
    var quickSearchSelectedDivIndex = -1;
    var searchBox = null;
 
    // ** Hook up the various events 
    jQuery.event.add(window, "resize", resizeWindow);
    jQuery.event.add(document, "click", hideResultsDiv);
 
    $(document).ready(function() {
    	$("#goSearch").click(function(){
    		window.location = "/Pages/search.aspx?k=" + $(searchBox).val() + "&s=" + quickSearchConfig.scope;
    	});
    	
    	$("#quickSearchTextBox").bind("keydown", function(e){
    		if(e.keyCode == 13){
    			window.location = "/Pages/search.aspx?k=" + $(searchBox).val() + "&s=" + quickSearchConfig.scope;
    			return false;
    		}
    	});
    	
        // ** The searchbox uses a dynamic ID so select it by class     
        searchBox = $('.ms-sbplain');
 
        // Muhimbi, insert the results box after te search area
        searchBox.after("<div id=\"quickSearchResults\" style=\"display: none; z-index:1000\"></div>");
 
        searchBox.keyup(function(event) {
        	var previousSelected = quickSearchSelectedDivIndex;
            
            // if the query is different from the previous one, search again
            if($(searchBox).data("query") != $(searchBox).val()) {
                if (quickSearchTimer != null) // cancel the delayed event
                    clearTimeout(quickSearchTimer);
                quickSearchTimer = setTimeout(function() { // delay the searching
                        $("#quickSearchResults").fadeOut(200, initSearch);
                    } , quickSearchConfig.delay);
            }
        });            
    });
    
    function showResultsDiv(text) {
        var div = $("#quickSearchResults");
        resizeWindow();
        div.append(text).slideDown(quickSearchConfig.resultsAnimation);
    }
 
    function hideResultsDiv() {
        var div = $("#quickSearchResults");
        div.slideUp(quickSearchConfig.resultsAnimation);
        div.empty()
    }
 
    function resizeWindow()
    {
        var div = $("#quickSearchResults");
        var searchParent = $(searchBox).parent();
        var left = $(searchBox).offset().left - $("#content").offset().left;
        var top = ($(searchBox).offset().top - $("#content").offset().top)+$(searchBox).height()+5;

        var divCss = {
            "left": left,
            "padding": 0,
            "position": "absolute",
			"top": top,
            "border": "1px solid #7f9db9",
            "background": "white",
            "font-size": "10px",
            "z-index": 1000
            };
 
        div.css(divCss);
    }
 
    function unSelectDiv(div) {
        // first stop all animations still in progress
        $("#quickSearchResults>div>div").stop(true,true);
 
        div.removeClass("quickSearchResultDivSelected").addClass("quickSearchResultDivUnselected"); 
        $("#details", div).hide();
    }
 
    function selectDiv(div) {
        div.addClass("quickSearchResultDivSelected");
        $("#details", div).slideDown(quickSearchConfig.resultAnimation);
    }
 
    function initSearch() {
        // first store query in data
        $(searchBox).data("query", $(searchBox).val());
 
        // clear the results
        $("#quickSearchResults").empty();
 
        // start the search
        var query = $(searchBox).val();
        if(query.length >= quickSearchConfig.minCharacters) {
            showResultsDiv("Searching ..."); // display status
            search(query);
        }
    }
 
    function search(query) {
        quickSearchSelectedDivIndex = -1;
        var queryXML =
            "<QueryPacket xmlns='urn:Microsoft.Search.Query' Revision='1000'> \
            <Query domain='QDomain'> \
             <SupportedFormats> \
                <Format>urn:Microsoft.Search.Response.Document.Document</Format> \
             </SupportedFormats> \
             <Context> \
              <QueryText language='en-US' type='STRING' >SCOPE:\"" +
                 quickSearchConfig.scope + "\"" + query + "</QueryText> \
             </Context> \
             <SortByProperties> \
               <SortByProperty name='Rank' direction='Descending' order='1'/> \
             </SortByProperties> \
             <Range><StartAt>1</StartAt><Count>" + quickSearchConfig.numberOfResults + "</Count></Range> \
             <EnableStemming>false</EnableStemming> \
             <TrimDuplicates>true</TrimDuplicates> \
             <IgnoreAllNoiseQuery>true</IgnoreAllNoiseQuery> \
             <ImplicitAndBehavior>true</ImplicitAndBehavior> \
             <IncludeRelevanceResults>true</IncludeRelevanceResults> \
             <IncludeSpecialTermResults>true</IncludeSpecialTermResults> \
             <IncludeHighConfidenceResults>true</IncludeHighConfidenceResults> \
            </Query></QueryPacket>";
 
        var soapEnv =
            "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" +
            " xmlns:xsd='http://www.w3.org/2001/XMLSchema' \
              xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> \
              <soap:Body> \
                <Query xmlns='urn:Microsoft.Search'> \
                  <queryXml>" + escapeHTML(queryXML) + "</queryXml> \
                </Query> \
              </soap:Body> \
            </soap:Envelope>";
 
        $.ajax({
            url: L_Menu_BaseUrl + "/_vti_bin/search.asmx",
            type: "POST",
            dataType: "xml",
            data: soapEnv,
            complete: processResult,
            contentType: "text/xml; charset=\"utf-8\""
        });
 
        function processResult(xData, status) {
            var html = "";
            $(xData.responseXML).find("QueryResult").each(function() {
                var divWidth = $(searchBox).parent().width();
 
                var x = $("<xml>" + $(this).text() + "</xml>");
                x.find("Document").each(function() {
                    var title = $("Title", $(this)).text();
                    var url = $("Action>LinkUrl", $(this)).text();
                    var description = $("Description", $(this)).text()
 
                    html +=
                        "<div class='quickSearchResultDivUnselected'> \
                            <a href='" + url + "'>" + $("Title", $(this)).text() + "</a> \
                            <div style='display:none' id='details' style='margin-left:10px'>"
                                + description +
                                "<br/>" + url + " \
                            </div> \
                        </div>";
                });
                if(x.find("TotalAvailable").text() != "")
                    html += "<div style='text-align:center; width:" + divWidth +
                            "px'>Total results: " + x.find("TotalAvailable").text() + "</div>";
                else                       
                    html += "<div style='text-align:center; width:" + divWidth +
                            "px'>Total results: 0</div>";
            });
 
            $("#quickSearchResults").empty().append(html);
            $("#quickSearchResults>div>a").hover(
                function() { selectDiv($(this).parent()); },
                function() { unSelectDiv($(this).parent());  }
            );                   
            showResultsDiv();
        }           
    }
 
    function escapeHTML (str) {
       return str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
    }