﻿/*
* Search As You Type / QuickSearch 
* Created by Jan Tielens
* Modified by Ravikumar Kempaiah for SurfRay 2009 A/S
*/

//{
//    delay: 300,             // delay in ms before executing the query 
//    minCharacters: 3,       // minimum nr of characters to enter before search
//    numberOfResults: 10,    // number of results to display
//    resultsAnimation: 50,  //  search results animation time in ms
//    resultAnimation: 100   // selected result animation time in ms
//};

var quickSearchConfig = GetSearchAsYouTypeConfiguration();

var quickSearchTimer;
var quickSearchSelectedDivIndex = -1;
var searchBox = null;

jQuery.event.add(window, "resize", resizeWindow);
jQuery.event.add(document, "click", hideResultsDiv);

$(document).ready(function() {

    searchBox = $("#OSB_Keywords");
    searchBox.Watermark($("#searchBoxWaterMarkHiddenElement").attr("value"));
    searchBox.after("<div id=\"quickSearchResults\" style=\"display: none; z-index:1000\"></div>");

    searchBox.keyup(function(event) {
        var previousSelected = quickSearchSelectedDivIndex;

        // catch some keys
        switch (event.keyCode) {
            case 13:    // enter
                var selectedDiv = $("#quickSearchResults>div:eq(" + quickSearchSelectedDivIndex + ") a");
                if (selectedDiv.length == 1)
                    window.location = selectedDiv.attr("href");
                break;
            case 38:    // key up
                quickSearchSelectedDivIndex--;
                break;
            case 40:    // key down
                quickSearchSelectedDivIndex++;
                break;
        }

        if (quickSearchSelectedDivIndex != previousSelected) {
            if (quickSearchSelectedDivIndex < 0)
                quickSearchSelectedDivIndex = 0;
            if (quickSearchSelectedDivIndex >= $("#quickSearchResults>div").length - 1)
                quickSearchSelectedDivIndex = $("#quickSearchResults>div").length - 2;
        }

        if (quickSearchSelectedDivIndex > -1) {
            if (quickSearchSelectedDivIndex != previousSelected) {
                unSelectDiv($("#quickSearchResults>div:eq(" + previousSelected + ")"));
                selectDiv($("#quickSearchResults>div:eq(" + quickSearchSelectedDivIndex + ")"));
            }
        }

        if ($(searchBox).data("query") != $(searchBox).val()) {
            if (quickSearchTimer != null)
                clearTimeout(quickSearchTimer);
            quickSearchTimer = setTimeout(function() {
                $("#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 divCss = {
        "left": searchParent.offset().left,
        "top": searchParent.offset().top + searchParent.height() + 1,
        "width": searchParent.width() - 5,
        "max-width": searchParent.width() - 5
    };

    div.css(divCss);
    div.addClass('searchAsYouTypeDiv');
    $("#quickSearchResults>div:odd").addClass('oddResults');
    // $("#quickSearchResults>div:last-child").addClass('otherSearchProvidersDiv');
}

function unSelectDiv(div) {
    $("#quickSearchResults>div>div").stop(true, true);

    var quicksearchResultDivSelected

    div.removeClass("quickSearchResultDivSelected").addClass("quickSearchResultDivUnselected");
    $("#details", div).hide();
}

function selectDiv(div) {
    div.addClass("quickSearchResultDivSelected");
    $("#details", div).slideDown(quickSearchConfig.resultAnimation);
}

function initSearch() {
    $(searchBox).data("query", $(searchBox).val());

    $("#quickSearchResults").empty();

    var query = rightTrim($(searchBox).val());
    if (query.length >= quickSearchConfig.minCharacters) {
        showResultsDiv($("#searchingForHiddenElement").attr("value") + " " + query + " ....");
        search(query);
    }
}

function rightTrim(sString) {
    while (sString.substring(sString.length - 1, sString.length) == ' ') {
        sString = sString.substring(0, sString.length - 1);
    }
    return sString;
}

function search(query) {
    quickSearchSelectedDivIndex = -1;


    var scopeValue = $("#OSB_Scopes option:selected").attr("value").split(";");
    var contextScope = "";
    var scope;

    if (scopeValue) {
        if (scopeValue[0] != "TargetOnly") {
            contextScope = " OR CONTAINS('" + query + "* ')) AND ((\"" + scopeValue[0] + "\" = '" + scopeValue[3] + "'))";
        }
        else if (scopeValue[2] == "All Sites") {
            contextScope = " ) ";
        }
        else if (scopeValue[2] == "People") {
            //query = rightTrim(query);
            var splitQuery = query.split(" ");
            contextScope = " OR CONTAINS('" + splitQuery[0] + "* ')) AND ((\"SCOPE\" = '" + scopeValue[2] + "'))";
            scope = "people";
        }
        else {
            contextScope = ") AND ((\"SCOPE\" = '" + scopeValue[2] + "'))";

        };
    }


    var userLang = (navigator.language) ? navigator.language : navigator.userLanguage;

    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='" + userLang + "' type='MSSQLFT'><![CDATA[ SELECT Title,ContentClass,FileExtension,HitHighlightedSummary,ContentType,WorkEmail,Author,ModifiedBy,Size,WorkId,Rank,Path,Description,Created,Write,Filename,SiteName,SiteTitle,CollapsingStatus,HitHighlightedProperties,IsDocument,objectid,PictureURL,CreatedBy,ContentSource FROM SCOPE() WHERE (FREETEXT(defaultproperties,'" + query + "') " + contextScope + " ORDER BY Rank DESC]]>\
                   </QueryText>\
                </Context>\
                <Range><StartAt>1</StartAt><Count>" + quickSearchConfig.numberOfResults + "</Count></Range>\
                <EnableStemming>true</EnableStemming>\
                <TrimDuplicates>true</TrimDuplicates>\
                <KeywordInclusion>0</KeywordInclusion>\
                <IgnoreAllNoiseQuery>false</IgnoreAllNoiseQuery>\
                <ImplicitAndBehavior>false</ImplicitAndBehavior>\
                <IncludeRelevanceResults>true</IncludeRelevanceResults>\
                <IncludeSpecialTermResults>false</IncludeSpecialTermResults>\
                <IncludeHighConfidenceResults>false</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 = "";
        var title;
        var summary;
        var email = "";
        var workemail = "";
        var imageURL;

        $(xData.responseXML).find("QueryResult").each(function() {
            var divWidth = $(searchBox).parent().width() + 20;

            var x = $("<xml>" + $(this).text() + "</xml>");
            x.find("Document").each(function() {
                var url = $("Action>LinkUrl", $(this)).text();
                imageURL = "";
                for (var count = 0; count < 15; count = count + 1) {

                    switch ($("Property>Name:eq(" + count + ")", $(this)).text()) {
                        case "TITLE":
                            title = $("Property>Value:eq(" + count + ")", $(this)).text();
                            break;
                        case "FILEEXTENSION":
                            if (imageURL == "")
                                imageURL = GetImageURL($("Property>Value:eq(" + count + ")", $(this)).text());
                            break;
                        case "HITHIGHLIGHTEDSUMMARY":
                            summary = $("Property>Value:eq(" + count + ")", $(this)).text();
                            break;
                        case "CONTENTTYPE":
                            if (imageURL == "")
                                imageURL = GetImageURLbyContnetType($("Property>Value:eq(" + count + ")", $(this)).text());
                            break;
                        case "CONTENTCLASS":
                            if (imageURL = "");
                            imageURL = GetImageUrlByContentClass($("Property>Value:eq(" + count + ")", $(this)).text());
                            break;
                        case "WORKEMAIL":
                            email = "E-mail: " + $("Property>Value:eq(" + count + ")", $(this)).text();
                            break;
                        default:
                            break;
                    }
                }

                if (scope == "people") {
                    workemail = email;
                    imageURL = "<img src=\'/_layouts/Images/urn-content-classes-spspeople16.gif\'>";
                }
                else {
                    workemail = "";
                }

                html +=
                        "<div class='quickSearchResultDivUnselected' style='width:" + divWidth +
                              "px;max-width:" + divWidth + "px'>" + imageURL +
                             "&nbsp;<a style ='width:" + divWidth + "px;max-width:" + divWidth + "px' href=\"" + url + "\"> " + title + "</a> \
                            <div id='details' class = 'searchResultsDetailsDiv'>"
                                + summary +
                                "<br/>" + workemail + " \
                            </div>\
                        </div>";
            });
            
            var totalAvailable = x.find("TotalAvailable").text();
            var displayString = $("#resultsTopCountHiddenElement").attr("value").replace("total", totalAvailable);
            var searchBoxValue = $(searchBox).val();
            
            if (totalAvailable != "") {
                if (totalAvailable < quickSearchConfig.numberOfResults)
                    displayString = displayString.replace(quickSearchConfig.numberOfResults, totalAvailable);

                html += "<div class = 'totalResultsDisplay' style='width:" + divWidth +
                            "px'>" + displayString + "</div>";
            }
            else
                html += "<div class ='totalResultsDisplay' style='width:" + divWidth +
                            "px'>" + $("#resultsCountHiddenElement").attr("value") + " : 0</div>";

            var googleLink = "http://www.google.com/search?q=" + searchBoxValue;
            var bingLink = "http://www.bing.com/search?q=" + searchBoxValue;
            var yahooLink = "http://www.search.yahoo.com/search?p=" + searchBoxValue;

            if (quickSearchConfig.enableOtherSearchProvidersOption != "False") {
                html += "<div class = 'otherSearchProvidersDiv' style= 'width:" + divWidth +
                            "px; '><a target =\"_blank\" href = \"" + googleLink + "\">\
                            <img src=\"/_layouts/Ontolica/google.png\" alt='Google' class = 'otherSearchProvidersIcon'></a>\
                            <a target =\"_blank\"  href = \"" + bingLink + "\">\
                            <img src=\"/_layouts/Ontolica/bing.png\" alt='Bing' title='Bing' class = 'otherSearchProvidersIcon'></a>\
                            <a target =\"_blank\"  href = \"" + yahooLink + "\">\
                            <img src=\"/_layouts/Ontolica/yahoo.png\" alt='Yahoo Search' title='Yahoo Search' class = 'otherSearchProvidersIcon'></a>\
                            </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;');
}

function GetImageURL(fileExtension) {
    var filename = "";
    switch (fileExtension) {
        case "txt":
            filename = "ictxt.gif";
            break;
        case "htm":
        case "html":
        case "aspx":
            filename = "ichtm.gif";
            break;
        case "pdf":
            filename = "pdf16.gif";
            break;
        case "xml":
            filename = "xml16.gif";
            break;
        case "doc":
        case "docx":
        case "docm":
            filename = "icdoc.gif";
            break;
        case "xls":
        case "xlsx":
            filename = "icxls.gif";
            break;
        case "ppt":
        case "pptx":
        case "pptm":
            filename = "icppt.gif";
            break;
        default:
            filename = "";
            break;
    }
    if (filename == "")
        return filename;
    else
        return "<img src=\'/_layouts/Images/" + filename + "\'>";
}


function GetImageURLbyContnetType(contentType) {
    var filename2 = "";

    switch (contentType) {
        case "text/plain":
            filename2 = "ictxt.gif";
            break;
        case "text/html":
        case "text/html; charset=utf-8":
            filename2 = "ichtm.gif";
            break;
        case "application/pdf":
            filename2 = "pdf16.gif";
            break;
        case "text/xml":
            filename2 = "xml16.gif";
            break;
        case "application/msword":
            filename2 = "icdoc.gif";
            break;
        case "application/vnd.ms-excel":
            filename2 = "icxls.gif";
            break;
        case "application/vnd.ms-powerpoint":
            filename2 = "icppt.gif";
            break;
        case "folder":
        case "Mappe":
        case "Ordner":
        case "Carpeta":
        case "Kansio":
        case "Dossier":
        case "Cartella":
        case "Map":
        case "Mapp":
            filename2 = "folder.gif";
            break;
        default:
            filename2 = "";
            break;
    }
    if (filename2 == "")
        return filename2;
    else
        return "<img src=\'/_layouts/Images/" + filename2 + "\'>";
}

function GetImageUrlByContentClass(conentClass) {
    var filename3 = "";
    switch (conentClass) {
        case "urn:content-class:SPSPeople":
        case "Person":
            filename3 = "urn-content-classes-spspeople16.gif";
            break;
        case "STS_Site":
            filename3 = "sts_site16.gif";
            break;
        case "STS_Web":
            filename3 = "sts_web16.gif";
            break;
        case "SPSPersonalSite":
            filename3 = "perssite.gif";
            break;
        case "STS_List":
        case "STS_List_IssueTracking":
            filename3 = "sts_list16.gif";
            break;
        case "STS_List_Announcements":
            filename3 = "sts_list_announcements16.gif";
            break;
        case "STS_List_Contacts":
            filename3 = "sts_list_contacts16.gif";
            break;
        case "STS_List_DiscussionBoard":
            filename3 = "sts_list_discussionboard16.gif";
            break;
        case "STS_List_DocumentLibrary":
            filename3 = "sts_list_documentlibrary16.gif";
            break;
        case "STS_List_Events":
            filename3 = "sts_list_events16.gif";
            break;
        case "STS_List_GenericList":
            filename3 = "sts_list_genericlist16.gif";
            break;
        case "STS_List_Links":
            filename3 = "sts_list_links16.gif";
            break;
        case "STS_List_PictureLibrary":
            filename3 = "sts_list_picturelibrary16.gif";
            break;
        case "STS_List_Survey":
            filename3 = "sts_list_survery16.gif";
            break;
        case "STS_List_Tasks":
            filename3 = "sts_list_tasks16.gif";
            break;
        case "STS_List_XMLForm":
            filename3 = "sts_list_xmlform16.gif";
            break;
        case "STS_ListItem":
        case "STS_ListItem_300":
            filename3 = "STS_ListItem16.gif";
            break;
        case "STS_ListItem_432":
            filename3 = "STS_ListItem_43216.gif";
            break;
        default:
            filename3 = "";
            break;
    }

    if (filename3 == "")
        return filename3;
    else
        return "<img src=\'/_layouts/Images/" + filename3 + "\'>";
}
