'Copyright (c) 2004, Plumtree Software

'All rights reserved.

'Redistribution and use in source and binary forms, with or without modification,
'are permitted provided that the following conditions are met:

'1.  Neither the name of Plumtree Software nor the names of its contributors may
'be used to endorse or promote products derived from this software without
'specific prior written permission;

'2.  Licensee acknowledges that no license or other permission is granted herein
'with respect to any third party software and that Licensee may not use the code
'in any way that would infringe any third party right.

'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
'CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
'INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF TITLE,
'NONINFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
'PURPOSE ARE DISCLAIMED. REGARDLESS OF THE BASIS OF RECOVERY
'CLAIMED, WHETHER UNDER ANY CONTRACT, WARRANTY, TORT (INCLUDING
'NEGLIGENCE AND STRICT LIABILITY), BREACH OF STATUTORY DUTY,
'PRINCIPLES OF CONTRIBUTION OR ANY OTHER THEORY OF LIABILITY, IN NO
'EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
'DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
'DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
'GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
'INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
'WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
'OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
'EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE; AND IN NO EVENT
'WILL THE COPYRIGHT OWNER'S OR CONTRIBUTORS' EXCEED $10,000.






Imports System

Imports Plumtree.Remote.Util
Imports Plumtree.Remote.Search

Imports System.IO

Namespace Plumtree.Remote.SWS.Google
    Public Class Search
        Implements IRemoteSearch

       'Runs a search and returns search results.
       'simple basic search function
       'ISearchUser and ISearchContext are ignored
       Public Function BasicSearch(ByVal searchQuery As ISearchQuery, ByVal searchUser As ISearchUser, ByVal searchContext As ISearchContext) As ISearchResult Implements IRemoteSearch.BasicSearch

           'get the SearchInfo, which includes the key
           'SearchInfo was populated from values set in the Web Service SCI Pages.
           'If not using SCI pages, hard-code the value below.
            Dim searchInfo As NamedValueMap = searchQuery.GetSearchInfo

            'if the key has not been set, throw the appropriate exception
            If searchInfo Is Nothing Then
                Throw New SearchException(TypeSearchError.TYPE_ADMIN_PREFS_NOT_SET, "Admin Prefs not set")
            End If

            Dim key As String
            key = searchInfo.Get("KEY")
            If key Is Nothing Then
                Throw New SearchException(TypeSearchError.TYPE_ADMIN_PREFS_NOT_SET, "Admin Prefs not set")
            End If

           'get the ISearchResult from the searchQuery- this will set NumberSkipped
            Dim result As ISearchResult = searchQuery.GetSearchResult

            Dim start As Integer = searchQuery.NumberToSkip
            Dim query As String = searchQuery.SearchString
            Try

                'see the GoogleAPI docs
                Dim searchService As New com.google.api.GoogleSearchService

                Dim googleResult As com.google.api.GoogleSearchResult
                googleResult = searchService.doGoogleSearch(key, query, start, 10, False, "", False, "", "", "")
                Dim totalHits = googleResult.estimatedTotalResultsCount
                Dim startIndex As Integer = googleResult.startIndex
                Dim endIndex As Integer = googleResult.endIndex
                Dim count As Integer = (endIndex - startIndex) + 1

                'set total hits
                result.TotalNumberOfHits = totalHits

                'turn their array of search records into our search records
                Dim googleElements() As com.google.api.ResultElement
                ReDim googleElements(count)
                googleElements = googleResult.resultElements
                Dim len As Integer = googleElements.GetUpperBound(0)
                Dim records(len) As ISearchRecord
                Dim i As Integer

                Dim record As RemoteSearchRecord
                Dim element As com.google.api.ResultElement

                For i = 0 To len
                    record = New RemoteSearchRecord
                    element = googleElements(i)
                    record.Title = element.title
                    record.Description = element.summary
                    record.OpenDocumentURL = element.URL
                    'include four different colors for the search results
                    'subsitute your logic here, e.g. set the image in an sci page
                    Select Case i Mod 4
                        Case 0
                            record.ImageURL = "http://labs.google.com/images/green.gif"
                        Case 1
                            record.ImageURL = "http://labs.google.com/images/yellow.gif"
                        Case 2
                            record.ImageURL = "http://labs.google.com/images/red.gif"
                        Case Else
                            record.ImageURL = "http://labs.google.com/images/blue.gif"
                    End Select

                    records(i) = record
                Next
                result.SetSearchResultList(records)

           'if there is an exception, return the message to the user
            Catch ex As Exception
                Throw New SearchException(TypeSearchError.TYPE_OTHER_ERROR, ex.Message)

            End Try

            Return result

        End Function

    End Class
End Namespace