Index: /trunk/grails-app/services/InventoryItemSearchService.groovy
===================================================================
--- /trunk/grails-app/services/InventoryItemSearchService.groovy	(revision 628)
+++ /trunk/grails-app/services/InventoryItemSearchService.groovy	(revision 629)
@@ -146,5 +146,6 @@
     def getTextSearch(params, locale) {
         def result = [:]
-        result.searchText = params.searchText.trim() ?: ""
+        result.searchText = params.searchText.trim() ?: "" // User supplied text.
+        result.queryString = "" // Modified string that will be passed to searchable query.
 
         def getMessage = { Map m ->
@@ -183,10 +184,53 @@
             searchableParams.properties = properitesList
 
-        // Require isActive and isObsolete.
-        def queryString = '( '+result.searchText+' )'+ ' AND isActive:"true" AND isObsolete:"false"'
+        // Check searchText for key words and modifiers.
+        def hasIsActive = result.searchText.contains('isActive')
+        def hasIsObsolete = result.searchText.contains('isObsolete')
+        def hasBracket = result.searchText.contains('(') || result.searchText.contains(')')
+        def containsModifier = { s ->
+            s.contains('"') ||
+            s.contains('~') ||
+            s.contains('*') ||
+            s.contains('(') ||
+            s.contains(')') ||
+            s.contains('+') ||
+            s.contains('-') ||
+            s.contains('^') ||
+            s.contains('OR') ||
+            s.contains('AND') ||
+            s.contains('NOT') ||
+            s.contains('TO') ||
+            s.contains('isObsolete') ||
+            s.contains('isActive')
+        }
+
+        // Expand search with wildcards.
+        def addWildcards = { text ->
+            text = text.tokenize().collect { token ->
+                if(!containsModifier(token))
+                    '*'+token+'*'
+                else
+                    token
+            }.join(' ')
+            return text
+        }
+
+        // Default isActive and isObsolete.
+        def addDefaultFlags = { text ->
+            if(!hasBracket)
+                text = '( '+text+' )'
+            if(!hasIsActive)
+                text = text + ' AND isActive:"true" '
+            if(!hasIsObsolete)
+                text = text + ' AND isObsolete:"false" '
+            return text
+        }
+
+        result.queryString = addWildcards(result.searchText)
+        result.queryString = addDefaultFlags(result.queryString)
 
         // Perform the searchable query.
         try {
-            result.inventoryItemList = InventoryItem.search(queryString, searchableParams)
+            result.inventoryItemList = InventoryItem.search(result.queryString, searchableParams)
 
             // Would be nice if this worked.
@@ -234,7 +278,7 @@
         // Get the result message.
         if(result.inventoryItemList.totalCount > 0)
-            result.message = getMessage(code:"inventoryItem.search.text.found", args: [result.searchText])
+            result.message = getMessage(code:"inventoryItem.search.text.found", args: [result.queryString])
         else
-            result.message = getMessage(code:"inventoryItem.search.text.none.found", args: [result.searchText])
+            result.message = getMessage(code:"inventoryItem.search.text.none.found", args: [result.queryString])
 
         // Success.
Index: /trunk/grails-app/views/inventoryItemDetailed/search.gsp
===================================================================
--- /trunk/grails-app/views/inventoryItemDetailed/search.gsp	(revision 628)
+++ /trunk/grails-app/views/inventoryItemDetailed/search.gsp	(revision 629)
@@ -38,5 +38,5 @@
 
                                 <span> <!--Prevent IE inheriting margin-->
-                                    <input type="text" style="width:450px;" maxlength="75" id="searchText" name="searchText" value="${filterParams.searchText}"/>
+                                    <g:textField style="width:450px;" maxlength="75" id="searchText" name="searchText" value="${filterParams.searchText}" />
                                     <g:helpBalloon code="inventoryItem.search.searchText" />
 
