﻿/// <reference name="MicrosoftAjax.js" />
/// <reference path="BaseUI.js"        />

var SearchUI = 
{
    Mask:             '',
    SearchString:     '',
    NoResultsString:  '',
    SearchPanel:      null,
    GlobalSearchTB:   null,
    GlobalSearchBTN:  null,
    ResultCountLBL:   null,
    DidYouMeanLBL:    null,
    SearchTB:         null,
    SearchBTN:        null,
    ResultsPanel:     null,
    Pager1:           null,
    Pager2:           null,
    Initialize:       function()
    {
        SearchUI.GlobalSearchTB  = $get('globalsearchtb')
        SearchUI.GlobalSearchBTN = $get('globalsearchbtn')
        
        $addHandler(SearchUI.GlobalSearchBTN, 'click', function(e)
        {
            e.preventDefault()
            SearchUI.GlobalSearchBTN_Click()
            return false
        })
        
        BaseUI.AddMask(SearchUI.GlobalSearchTB, SearchUI.Mask, 'searchtb', 'searchtbmask')
        
        $addHandler(SearchUI.GlobalSearchTB, 'keydown', function(e)
        {
            switch (e.keyCode) 
            {
                case Sys.UI.Key.enter:
                    e.preventDefault()
                    SearchUI.GlobalSearchBTN_Click()
                    return false
            }
            return true
        })
    },
    InitializeSearch: function()
    {
        SearchUI.SearchPanel    = $get('searchpanel')
        SearchUI.ResultCountLBL = $get('resultcountlbl')
        SearchUI.DidYouMeanLBL  = $get('didyoumean')
        SearchUI.SearchTB       = $get('searchtb')
        SearchUI.SearchBTN      = $get('searchbtn')
        SearchUI.ResultsPanel   = $get('resultspnl')
        SearchUI.Pager1         = $get('ajaxpager1')
        SearchUI.Pager2         = $get('ajaxpager2')

        SearchUI.SearchTB.value = SearchUI.SearchString
        
        $addHandler(SearchUI.SearchBTN, 'click', function(e)
        {
            e.preventDefault()
            SearchUI.SearchBTN_Click()
            return false
        })
        
        BaseUI.AddMask(SearchUI.SearchTB, SearchUI.Mask, 'sleek', 'sleekmask')
        
        $addHandler(SearchUI.SearchTB, 'keydown', function(e)
        {
            switch (e.keyCode) 
            {
                case Sys.UI.Key.enter:
                    e.preventDefault()
                    SearchUI.SearchBTN_Click()
                    return false
            }
            return true
        })
        
        if (SearchUI.SearchString.trim() != '')
        {
            SearchUI.PerformSearch()
        }
        
        SearchUI.SetMinimumHeight()
    },
    GlobalSearchBTN_Click: function()
    {
        document.location.href = '/search/?q=' + encodeURIComponent(SearchUI.GlobalSearchTB.GetValue())
    },
    SearchBTN_Click: function()
    {
        SearchUI.PerformSearch()
    },
    PerformSearch: function(page)
    {
        SearchUI.SearchPanel.style.height = '600px'
        
        if (SearchUI.SearchTB.value.trim() != '')
        {
            SearchUI.Pager1.innerHTML = ''
            SearchUI.Pager2.innerHTML = ''
            
            SearchUI.ShowLoading()
            
            var theSearchRequest = new Object()
            
            theSearchRequest.Query        = SearchUI.SearchTB.value
            theSearchRequest.SubSites     = new Array()
            theSearchRequest.ItemTypes    = new Array()
            theSearchRequest.Page         = page == null ? 1 : page
            theSearchRequest.ItemTaxonomy = null
            theSearchRequest.SubSites.push("Main")

            PageMethods.Search(Sys.Serialization.JavaScriptSerializer.serialize(theSearchRequest), SearchUI.SearchSuccess, SearchUI.SearchFailure);
        }
    },
    ShowLoading: function()
    {
        BaseUI.Collapse(SearchUI.ResultCountLBL)
        
        SearchUI.ResultsPanel.innerHTML = ''
        
        var theCenter = document.createElement('center')
        var theTable  = document.createElement('table')
        var theRow    = theTable.insertRow(-1)
        var theCol1   = theRow.insertCell(-1)
        var theCol2   = theRow.insertCell(-1)
        
        theTable.style.margin = '30px'
        
        theCol1.innerHTML = '<img src="/images/loading.gif" />'
        theCol2.innerHTML = '<h1 style="padding: 4px 0px 0px 5px;">Searching . . .</h1>'
        theCenter.appendChild(theTable)
        
        SearchUI.ResultsPanel.appendChild(theCenter)
    },
    SearchSuccess: function(value, ctx, methodName)
    {
        SearchUI.ResultsPanel.innerHTML = ""
        
        var theTable   = document.createElement('table')
        var theResults = eval(Sys.Serialization.JavaScriptSerializer.deserialize(value))

        SearchUI.DidYouMeanLBL.innerHTML = ''

        if (theResults.Suggestion.trim() != "")
        {
            var TheNewQuery = document.createElement('a')
            
            TheNewQuery.Suggestion   = theResults.Suggestion.replace(/<b><i>/g, '').replace(/<\/i><\/b>/g, '')
            TheNewQuery.innerHTML    = "Did you mean " + theResults.Suggestion + "?";
            TheNewQuery.style.cursor = "pointer"

            $addHandler(TheNewQuery, "click", function()
            {
                SearchUI.SearchTB.value = this.Suggestion
                SearchUI.PerformSearch()
            })
            
            SearchUI.DidYouMeanLBL.appendChild(TheNewQuery)
        }
        
        BaseUI.Expand(SearchUI.ResultCountLBL)
        
        if (theResults.Results.length == 0)
        {
            SearchUI.ResultCountLBL.innerHTML = ''
            
            var rdiv = document.createElement('div')
            
            rdiv.style.margin = '10px 0px 10px 0px'
            rdiv.innerHTML    = SearchUI.NoResultsString
            
            SearchUI.ResultsPanel.appendChild(rdiv)
        }
        else
        {
            SearchUI.ResultCountLBL.innerHTML = 'Results <b>' + theResults.First + ' - ' + theResults.Last + '</b> of about <b>' + theResults.Total + '</b>'
        }
        
        theTable.cellspacing = "0"
        theTable.cellpadding = "0"
        theTable.border      = "0"
        theTable.style.borderCollapse = "collapse"
        
        for (var i = 0; i < theResults.Results.length; i++)
        {
            var theResult = theResults.Results[i]
            var theRow    = theTable.insertRow (-1)
            var theColumn = theRow  .insertCell(-1)
            var theItem   = ''

            theItem = $get('templatepnl').innerHTML.replace(/\[Url\]/g,         theResult.Url)
                                                   .replace(/\[Title\]/g,       SearchUI.FindField(theResult.Fields, "ItemTitle"))
                                                   .replace(/\[Description\]/g, theResult.Description.replace(/<br>/g, ''))
            theColumn.innerHTML = theItem
        }
        
        SearchUI.Pager1.innerHTML = ''
        SearchUI.Pager2.innerHTML = ''
        
        SearchUI.ResultsPanel.appendChild(theTable)

        if (theResults.Results.length > 0) 
        {
            SearchUI.CreatePager(SearchUI.Pager1, theResults)
            SearchUI.CreatePager(SearchUI.Pager2, theResults)
        }
        
        SearchUI.SetMinimumHeight()
    },
    SetMinimumHeight: function()
    {
        SearchUI.SearchPanel.style.height = 'auto'
        
        var theBounds = Sys.UI.DomElement.getBounds(SearchUI.SearchPanel)
        
        if (theBounds.height < 600)
        {
            SearchUI.SearchPanel.style.height = '600px'
        }
    },
    SearchFailure: function(ex, ctx, methodName)
    {
        SearchUI.ResultsPanel.innerHTML = ""
        SearchUI.ResultsPanel.innerHTML = ex.get_message()
    },
    FindField: function(array, fieldname)
    {
        if (array)
        {
            for (var i = 0; i < array.length; i++)
            {
                if (array[i].Name.toLowerCase() == fieldname.toLowerCase())
                {
                    return array[i].Value
                }
            }
        }
        return ""
    },
    CreatePager: function(pager, results)
    {
        var theHyperLinks  = new Array()

        theHyperLinks.push(document.createElement('a'))
        theHyperLinks.push(document.createElement('a'))
        theHyperLinks.push(document.createElement('a'))
        theHyperLinks.push(document.createElement('a'))
        theHyperLinks.push(document.createElement('a'))
        theHyperLinks.push(document.createElement('a'))
        theHyperLinks.push(document.createElement('a'))
        
        theHyperLinks[0].innerHTML = 'Previous'
        theHyperLinks[6].innerHTML = 'Next'
        
        theHyperLinks[0].Page = results.Page - 1 >= 1             ? results.Page - 1 : 0
        theHyperLinks[6].Page = results.Page + 1 <= results.Pages ? results.Page + 1 : 0
        
        var thePageLBL = document.createElement('span')
        
        if (results.Results.length > 0) 
        {
            BaseUI.SetClass(thePageLBL, 'pager-page-label')
            
            thePageLBL.innerHTML = 'Page ' + results.Page 
            
            if (results.Pages > 1) 
            {
                thePageLBL.innerHTML = thePageLBL.innerHTML + '&nbsp;&nbsp;&nbsp;&nbsp;'
                
                theHyperLinks[0].style.visibility = 'visible'
                theHyperLinks[0].style.display    = 'inline'
                theHyperLinks[6].style.visibility = 'visible'
                theHyperLinks[6].style.display    = 'inline'

                if (results.Pages > 5)
                {
                    var theStartPage = 1

                    if      (results.Page - 2 <= 0)             theStartPage = 1
                    else if (results.Page + 2 >= results.Pages) theStartPage = results.Pages - 4
                    else                                        theStartPage = results.Page  - 2

                    for (var i = 1; i <= 5; i++)
                    {
                        theHyperLinks[i].innerHTML = theStartPage.toString()
                        theHyperLinks[i].Page      = results.Page == theStartPage ? 0 : theStartPage
                        theHyperLinks[i].style.visibility = 'visible'
                        theHyperLinks[i].style.display    = 'inline'
                        theStartPage++
                    }
                }
                else
                {
                    for (var i = 1; i <= 5; i++)
                    {
                        theHyperLinks[i].style.visibility = 'hidden'
                        theHyperLinks[i].style.display    = 'none'
                    }
                    
                    for (var i = 1; i < results.Pages + 1; i++)
                    {
                        theHyperLinks[i].innerHTML = i.toString()
                        theHyperLinks[i].Page      = results.Page == i ? 0 : i
                        theHyperLinks[i].style.visibility = 'visible'
                        theHyperLinks[i].style.display    = 'inline'
                    }
                }
            }
        }

        pager.appendChild(thePageLBL)

        for (var i = 0; i < 7; i++)
        {
            if (theHyperLinks[i].style.visibility == 'visible')
            {
                theHyperLinks[i].href = "#"
                
                var el = document.createElement('span')
                
                el.innerHTML = '&nbsp;&nbsp;&nbsp;&nbsp;'
                
                if (i != 0) 
                {
                    pager.appendChild(el)
                }
                
                pager.appendChild(theHyperLinks[i])
                
                $addHandler(theHyperLinks[i], "click", function() 
                { 
                    if (this.Page > 0) SearchUI.PerformSearch(this.Page); 
                    
                    return true; 
                })
            }
            
            if (theHyperLinks[i].Page == 0) 
            {
                BaseUI.SetClass(theHyperLinks[i], 'pager-disabled')
            }
            else
            {
                theHyperLinks[i].style.cursor = 'pointer'
                
                BaseUI.SetClass(theHyperLinks[i], 'pager-page')
            }
        }
    }
}

Sys.Application.add_load(SearchUI.Initialize)
