Index: trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy	(revision 465)
+++ trunk/grails-app/controllers/InventoryItemPurchaseDetailedController.groovy	(revision 468)
@@ -1,3 +1,5 @@
 import org.codehaus.groovy.grails.plugins.springsecurity.Secured
+import org.codehaus.groovy.grails.commons.ConfigurationHolder
+import com.zeddware.grails.plugins.filterpane.FilterUtils
 
 @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_InventoryManager'])
@@ -5,12 +7,122 @@
 
     def authService
+    def filterService
+    def exportService
+    def dateUtilService
     def inventoryPurchaseService
 
     def index = {
-        redirect(controller: 'inventoryItemDetailed', action:'search', params:params)
+        redirect(action:'search', params:params)
     }
 
     // the delete, save and update actions only accept POST requests
     static allowedMethods = [delete:'POST', save:'POST', update:'POST']
+
+    def setSearchParamsMax = {
+        def max = 1000
+        if(params.newMax.isInteger()) {
+            def i = params.newMax.toInteger()
+            if(i > 0 && i <= max)
+                session.inventoryItemPurchaseSearchParamsMax = params.newMax
+            if(i > max)
+                session.inventoryItemPurchaseSearchParamsMax = max
+        }
+        forward(action: 'search', params: params)
+    }
+
+    def search = {
+
+        if(session.inventoryItemPurchaseSearchParamsMax)
+            params.max = session.inventoryItemPurchaseSearchParamsMax
+
+        // Protect filterPane.
+        params.max = Math.min( params.max ? params.max.toInteger() : 10,  1000 )
+        params.offset = params.offset?.toInteger() ?: 0
+        params.sort = params.sort ?: "purchaseOrderNumber"
+        params.order = params.order ?: "desc"
+
+        def inventoryItemPurchaseList = []
+        def inventoryItemPurchaseTotal
+        def filterParams = [:]
+
+        // Quick Search:
+        if(!FilterUtils.isFilterApplied(params)) {
+
+            if(params.quickSearch == "searchAllOrders") {
+                inventoryItemPurchaseList = InventoryItemPurchase.findAllByInventoryItemPurchaseType(InventoryItemPurchaseType.read(1),
+                                                                                                                                                                        [max:params.max,
+                                                                                                                                                                        offset:params.offset,
+                                                                                                                                                                        sort:params.sort,
+                                                                                                                                                                        order:params.order])
+                if(inventoryItemPurchaseList.size() > 0) { params.message = "All Orders." }
+                else { params.message = "No orders found." }
+            }
+            else if(params.quickSearch == "searchAllReceived") {
+                inventoryItemPurchaseList = InventoryItemPurchase.findAllByInventoryItemPurchaseTypeOrInventoryItemPurchaseType(InventoryItemPurchaseType.read(2),
+                                                                                                                                                                                                                            InventoryItemPurchaseType.read(3),
+                                                                                                                                                                                                                            [max:params.max,
+                                                                                                                                                                                                                            offset:params.offset,
+                                                                                                                                                                                                                            sort:params.sort,
+                                                                                                                                                                                                                            order:params.order])
+                if(inventoryItemPurchaseList.size() > 0) { params.message = "All Received Complete." }
+                else { params.message = "No orders found." }
+            }
+            else {
+                //Default:
+                inventoryItemPurchaseList = InventoryItemPurchase.list(max:params.max,
+                                                                                                                offset:params.offset,
+                                                                                                                sort:params.sort,
+                                                                                                                order:params.order)
+                if(inventoryItemPurchaseList.size() > 0) { params.message = "All Purchases." }
+                else { params.message = "No orders found." }
+            }
+
+            inventoryItemPurchaseTotal = inventoryItemPurchaseList.size()
+            filterParams.quickSearch = params.quickSearch
+        }
+        else {
+            // filterPane:
+            inventoryItemPurchaseList = filterService.filter( params, InventoryItemPurchase )
+            inventoryItemPurchaseTotal = filterService.count( params, InventoryItemPurchase )
+            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
+        }
+
+        // export plugin:
+        if(params?.format && params.format != "html") {
+
+            def dateFmt = { date ->
+                formatDate(format: "EEE, dd-MMM-yyyy", date: date)
+            }
+
+            String title
+            if(params.quickSearch)
+                title = "${params.quickSearch} inventory purchases."
+            else
+                title = "Filtered inventory purchases."
+
+            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
+            response.setHeader("Content-disposition", "attachment; filename=Purchases.${params.extension}")
+            List fields = ["purchaseOrderNumber", "dateEntered", "costCode", "quantity", "orderValueAmount", "invoiceNumber",
+                                    "inventoryItemPurchaseType"]
+            Map labels = ["purchaseOrderNumber": "Order Number", "dateEntered": "Date", "costCode": "Cost Code",
+                                    "quantity": "Quantity", "orderValueAmount": "Order \$", "invoiceNumber": "Invoice Number",
+                                    "inventoryItemPurchaseType": "Type"]
+            Map formatters = [ dateEntered: dateFmt]
+            Map parameters = [title: title, separator: ","]
+
+            exportService.export(params.format, response.outputStream, inventoryItemPurchaseList, fields, labels, formatters, parameters)
+        }
+
+        // Add some basic params to filterParams.
+        filterParams.max = params.max
+        filterParams.offset = params.offset?.toInteger() ?: 0
+        filterParams.sort = params.sort ?: "purchaseOrderNumber"
+        filterParams.order = params.order ?: "desc"
+
+        return[ inventoryItemPurchaseList: inventoryItemPurchaseList,
+                inventoryItemPurchaseTotal: inventoryItemPurchaseTotal,
+                filterParams: filterParams ]
+
+    } // end search()
 
     def show = {
Index: trunk/grails-app/controllers/TaskDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 465)
+++ trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 468)
@@ -40,5 +40,5 @@
             params.max = session.taskSearchParamsMax
 
-        // TaskSearchService protects itself but filterPane does not.
+        // Protect filterPane.
         params.max = Math.min( params.max ? params.max.toInteger() : 10,  1000 )
 
