Index: /trunk/grails-app/controllers/TaskDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 475)
+++ /trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 476)
@@ -2,4 +2,5 @@
 import org.codehaus.groovy.grails.commons.ConfigurationHolder
 import com.zeddware.grails.plugins.filterpane.FilterUtils
+import org.springframework.web.servlet.support.RequestContextUtils as RCU
 
 @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager'])
@@ -35,4 +36,17 @@
 
     @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
+    def setSearchCalendarParamsMax = {
+        def max = 1000
+        if(params.newMax.isInteger()) {
+            def i = params.newMax.toInteger()
+            if(i > 0 && i <= max)
+                session.taskSearchCalendarParamsMax = params.newMax
+            if(i > max)
+                session.taskSearchCalendarParamsMax = max
+        }
+        forward(action: 'searchCalendar', params: params)
+    }
+
+    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
     def search = {
 
@@ -41,45 +55,44 @@
 
         // Protect filterPane.
-        params.max = Math.min( params.max ? params.max.toInteger() : 10,  1000 )
+        params.max = Math.min( params.max ? params.max.toInteger() : 20,  1000 )
 
         def taskInstanceList = []
         def taskInstanceTotal
-        def filterParams = [:]
-        def personInstance = authService.currentUser
-
-        // Quick Search:
-        if(!FilterUtils.isFilterApplied(params)) {
-
-            if(params.quickSearch == "searchMyTodays") {
-                taskInstanceList = taskSearchService.getMyTodays(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Today's tasks for ${personInstance.firstName} ${personInstance.lastName}." }
-                else { params.message = "No tasks found for today." }
-            }
-            else if(params.quickSearch == "searchInTheLastWeek") {
-                taskInstanceList = taskSearchService.getInTheLastWeek(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Tasks with Target Start Date in the last week." }
-                else { params.message = "No tasks found for the last week." }
-            }
-            else if(params.quickSearch == "searchMyInTheLastWeek") {
-                taskInstanceList = taskSearchService.getMyInTheLastWeek(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Tasks with Target Start Date in the last week for ${personInstance.firstName} ${personInstance.lastName}." }
-                else { params.message = "No tasks found for the last week." }
-            }
-            else {
-                //Default:
-                taskInstanceList = taskSearchService.getTodays(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Today's tasks." }
-                else { params.message = "No tasks found for today." }
-                params.quickSearch = "searchTodays"
-            }
-
-            taskInstanceTotal = taskInstanceList.totalCount
-            filterParams.quickSearch = params.quickSearch
-        }
-        else {
+        def filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
+        def isFilterApplied = FilterUtils.isFilterApplied(params)
+
+        // Restore search unless a new search is being requested.
+        if(!params.quickSearch && !filterParams) {
+            if(session.taskSearchQuickSearch)
+                params.quickSearch = session.taskSearchQuickSearch
+            else if(session.taskSearchFilterParams) {
+                session.taskSearchFilterParams.each() { params[it.key] = it.value }
+                params.filter = session.taskSearchFilter
+                isFilterApplied = FilterUtils.isFilterApplied(params)
+            }
+        }
+
+        if(isFilterApplied) {
             // filterPane:
             taskInstanceList = filterService.filter( params, Task )
             taskInstanceTotal = filterService.count( params, Task )
             filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
+            // Remember search.
+            session.taskSearchFilterParams = new LinkedHashMap(filterParams)
+            session.taskSearchFilter = new LinkedHashMap(params.filter)
+            session.taskSearchQuickSearch = null
+        }
+        else {
+            // Quick Search:
+            if(!params.quickSearch) params.quickSearch = "myTodays"
+            def result = taskSearchService.getQuickSearch(params, RCU.getLocale(request))
+            taskInstanceList = result.taskInstanceList
+            taskInstanceTotal = result.taskInstanceList.totalCount
+            params.message = result.message
+            filterParams.quickSearch = result.quickSearch
+            // Remember search.
+            session.taskSearchFilterParams = null
+            session.taskSearchFilter = null
+            session.taskSearchQuickSearch = result.quickSearch
         }
 
@@ -93,5 +106,5 @@
             String title
             if(params.quickSearch)
-                title = "${params.quickSearch} tasks."
+                title = params.message
             else
                 title = "Filtered tasks."
@@ -116,118 +129,123 @@
 
         return[ taskInstanceList: taskInstanceList,
-                taskInstanceTotal: taskInstanceTotal,
-                filterParams: filterParams ]
-
-    } // end search()
+                        taskInstanceTotal: taskInstanceTotal,
+                        filterParams: filterParams,
+                        params: params ]
+
+    } // search
 
     @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
     def searchCalendar = {
 
-        if(session.taskSearchParamsMax)
-            params.max = session.taskSearchParamsMax
+        // No pagination for calendar.
+        params.offset = 0
+
+        // Restore params.max
+        if(session.taskSearchCalendarParamsMax)
+            params.max = session.taskSearchCalendarParamsMax
 
         // Protect filterPane.
-        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
-
-        // Set the month to show.
-        def showMonth = new Date()
-        if(session.taskSearchCalendarShowMonth)
-            showMonth = session.taskSearchCalendarShowMonth
-
-        if(params.nextMonth)
-            showMonth = dateUtilService.getNextMonth(showMonth)
-        else if(params.previousMonth)
-            showMonth = dateUtilService.getPreviousMonth(showMonth)
-        session.taskSearchCalendarShowMonth = showMonth
-
-        // Quick Search:
-        if(!FilterUtils.isFilterApplied(params)) {
-            def taskInstanceList = []
-            def personInstance = authService.currentUser
-
-            if(params.quickSearch == "searchMyTodays") {
-                taskInstanceList = taskSearchService.getMyTodays(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Today's tasks for ${personInstance.firstName} ${personInstance.lastName}." }
-                else { params.message = "No tasks found for today." }
-                if(taskInstanceList.totalCount > params.max) { params.message = "Too many results, only the first ${params.max} shown" }
-            }
-            else if(params.quickSearch == "searchInTheLastWeek") {
-                taskInstanceList = taskSearchService.getInTheLastWeek(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Tasks with Target Start Date in the last week." }
-                else { params.message = "No tasks found for the last week." }
-                if(taskInstanceList.totalCount > params.max) { params.message = "Too many results, only the first ${params.max} shown" }
-            }
-            else if(params.quickSearch == "searchMyInTheLastWeek") {
-                taskInstanceList = taskSearchService.getMyInTheLastWeek(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Tasks with Target Start Date in the last week for ${personInstance.firstName} ${personInstance.lastName}." }
-                else { params.message = "No tasks found for the last week." }
-                if(taskInstanceList.totalCount > params.max) { params.message = "Too many results, only the first ${params.max} shown" }
-            }
-            else {
-                //Default:
-                taskInstanceList = taskSearchService.getTodays(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Today's tasks." }
-                else { params.message = "No tasks found for today." }
-                if(taskInstanceList.totalCount > params.max) { params.message = "Too many results, only the first ${params.max} shown" }
-                params.quickSearch = "searchTodays"
-            }
-            return[taskInstanceList: taskInstanceList, taskInstanceTotal: taskInstanceList.totalCount, showMonth: showMonth, filterParams: params]
-        }
-        // filterPane:
-        def taskInstanceTotal = filterService.count( params, Task )
-        if(taskInstanceTotal > params.max) { params.message = "Too many results, only the first ${params.max} shown" }
-        return[ taskInstanceList: filterService.filter( params, Task ),
-            taskInstanceTotal: taskInstanceTotal,
-            filterParams: com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
-            showMonth: showMonth,
-            params:params ]
-    }
-
-    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
-    def budget = {
-        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100 )
-
-        // Quick Search:
-        if(!FilterUtils.isFilterApplied(params)) {
-            def taskInstanceList = []
-            def personInstance = authService.currentUser
-
-            if(params.quickSearch == "budgetUnplanned") {
-                taskInstanceList = taskSearchService.getBudgetUnplanned(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Budget unplanned tasks in the last week." }
-                else { params.message = "No tasks found." }
-            }
-            //else if(params.quickSearch == "budgetPlanned") {
-            else {
-                //Default:
-                taskInstanceList = taskSearchService.getBudgetPlanned(params)
-                if(taskInstanceList.totalCount > 0) { params.message = "Budget planned Tasks in the last week." }
-                else { params.message = "No tasks found.." }
-            }
-            // export plugin:
-            if(params?.format && params.format != "html") {
-
-                def dateFmt = { date ->
-                    formatDate(format: "EEE, dd-MMM-yyyy", date: date)
-                }
-                response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
-                response.setHeader("Content-disposition", "attachment; filename=tasks.${params.extension}")
-                List fields = ["id", "targetStartDate", "description", "leadPerson", "taskStatus", "taskType"]
-                Map labels = ["id": "ID", "targetStartDate": "Target Start Date", "description": "Description",
-                                        "leadPerson": "Lead Person", "taskStatus": "Task Status", "taskType": "Task Type"]
-                Map formatters = [ targetStartDate: dateFmt]
-                String title = "${params.quickSearch} tasks in the last week."
-                Map parameters = [title: title, separator: ","]
-
-                exportService.export(params.format, response.outputStream, taskInstanceList, fields, labels, formatters, parameters) 
-            }
-            return[taskInstanceList: taskInstanceList, taskInstanceTotal: taskInstanceList.totalCount, filterParams: params]
-        }
-        // filterPane:
-        return[ taskInstanceList: filterService.filter( params, Task ),
-            taskInstanceTotal: filterService.count( params, Task ),
-            filterParams: com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
-            params:params ]
-    }
+        params.max = Math.min( params.max ? params.max.toInteger() : 100,  1000 )
+
+        def taskInstanceList = []
+        def taskInstanceTotal
+        def filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
+        def isFilterApplied = FilterUtils.isFilterApplied(params)
+
+        // Restore search unless a new search is being requested.
+        if(!params.quickSearch && !filterParams) {
+            if(session.taskSearchCalendarQuickSearch)
+                params.quickSearch = session.taskSearchCalendarQuickSearch
+            else if(session.taskSearchCalendarFilterParams) {
+                session.taskSearchCalendarFilterParams.each() { params[it.key] = it.value }
+                params.filter = session.taskSearchCalendarFilter
+                isFilterApplied = FilterUtils.isFilterApplied(params)
+            }
+        }
+
+        // The date the calendar will use to determine the month to show.
+        // Use session, if not specified in params, otherwise use today.
+        def showDate = new Date()
+        if(params.showMonth) {
+            if(params.showYear)
+                showDate = dateUtilService.makeDate(params.showYear, params.showMonth)
+            else
+                showDate = dateUtilService.makeDate(dateUtilService.getYearFromDate(showDate), params.showMonth)
+            // Remember the showDate.
+            session.taskSearchCalendarShowDate = showDate
+        }
+        else if(session.taskSearchCalendarShowDate)
+            showDate = session.taskSearchCalendarShowDate
+
+        // Get the dates for the calendar month controls.
+        def calendarMonthControls = getCalendarMonthControls(showDate)
+
+        if(isFilterApplied) {
+            // filterPane:
+            taskInstanceList = filterService.filter( params, Task )
+            taskInstanceTotal = filterService.count( params, Task )
+            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
+            // Remember search.
+            session.taskSearchCalendarFilterParams = new LinkedHashMap(filterParams)
+            session.taskSearchCalendarFilter = new LinkedHashMap(params.filter)
+            session.taskSearchCalendarQuickSearch = null
+        }
+        else {
+            // Quick Search:
+            def result = taskSearchService.getQuickSearch(params, RCU.getLocale(request))
+            taskInstanceList = result.taskInstanceList
+            taskInstanceTotal = result.taskInstanceList.totalCount
+            params.message = result.message
+            filterParams.quickSearch = result.quickSearch
+            // Remember search.
+            session.taskSearchCalendarFilterParams = null
+            session.taskSearchCalendarFilter = null
+            session.taskSearchCalendarQuickSearch = result.quickSearch
+        }
+
+        // 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.message
+            else
+                title = "Filtered tasks."
+
+            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
+            response.setHeader("Content-disposition", "attachment; filename=Tasks.${params.extension}")
+            List fields = ["id", "targetStartDate", "description", "leadPerson", "taskPriority", "taskType", "taskStatus"]
+            Map labels = ["id": "ID", "targetStartDate": "Target Start Date", "description": "Description",
+                                    "leadPerson": "Lead Person", "taskPriority": "Task Priority",
+                                    "taskType": "Task Type", "taskStatus": "Task Status"]
+            Map formatters = [ targetStartDate: dateFmt]
+            Map parameters = [title: title, separator: ","]
+
+            exportService.export(params.format, response.outputStream, taskInstanceList, fields, labels, formatters, parameters)
+        }
+
+        if(taskInstanceTotal > params.max)
+            params.errorMessage = g.message(code:"task.search.calendar.text.too.many.results", args:[params.max])
+
+        // Add some basic params to filterParams.
+        filterParams.max = params.max
+        filterParams.offset = params.offset?.toInteger() ?: 0
+
+        return[taskInstanceList: taskInstanceList,
+                        taskInstanceTotal: taskInstanceTotal,
+                        filterParams: filterParams,
+                        params: params,
+                        showDate: showDate,
+                        today: calendarMonthControls.today,
+                        previousMonth: calendarMonthControls.previousMonth,
+                        nextMonth: calendarMonthControls.nextMonth,
+                        previousYear: calendarMonthControls.previousYear,
+                        nextYear: calendarMonthControls.nextYear]
+
+    } // searchCalendar
 
     @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
@@ -559,6 +577,9 @@
 
         // Set the targetStartDate if specified, used by searchCalendar view.
-        if(params.year && params.month && params.day)
-            taskInstance.targetStartDate = dateUtilService.makeDate(params.year, params.month, params.day)
+        if(params.year && params.month && params.day) {
+            def date = dateUtilService.makeDate(params.year, params.month, params.day)
+            taskInstance.targetStartDate = date
+            taskInstance.targetCompletionDate = date
+        }
 
         // Default leadPerson to current user, unless supplied in params.
@@ -712,3 +733,31 @@
     }
 
+    /**
+    * Get some integers for use by the month control links.
+    */
+    private getCalendarMonthControls(Date showDate) {
+        def result = [:]
+        result.today = [:]
+        result.today.date = new Date()
+        result.today.month = dateUtilService.getMonthFromDate(result.today.date)
+        result.today.year = dateUtilService.getYearFromDate(result.today.date)
+        result.nextMonth = [:]
+        result.nextMonth.date = dateUtilService.getNextMonth(showDate)
+        result.nextMonth.month = dateUtilService.getMonthFromDate(result.nextMonth.date)
+        result.nextMonth.year = dateUtilService.getYearFromDate(result.nextMonth.date)
+        result.previousMonth =  [:]
+        result.previousMonth.date = dateUtilService.getPreviousMonth(showDate)
+        result.previousMonth.month = dateUtilService.getMonthFromDate(result.previousMonth.date)
+        result.previousMonth.year = dateUtilService.getYearFromDate(result.previousMonth.date)
+        result.nextYear = [:]
+        result.nextYear.date = dateUtilService.getNextYear(showDate)
+        result.nextYear.month = dateUtilService.getMonthFromDate(result.nextYear.date)
+        result.nextYear.year = dateUtilService.getYearFromDate(result.nextYear.date)
+        result.previousYear = [:]
+        result.previousYear.date = dateUtilService.getPreviousYear(showDate)
+        result.previousYear.month = dateUtilService.getMonthFromDate(result.previousYear.date)
+        result.previousYear.year = dateUtilService.getYearFromDate(result.previousYear.date)
+        return result
+    }
+
 } // end of class.
Index: /trunk/grails-app/i18n/messages.properties
===================================================================
--- /trunk/grails-app/i18n/messages.properties	(revision 475)
+++ /trunk/grails-app/i18n/messages.properties	(revision 476)
@@ -161,8 +161,4 @@
 assignedPerson.task.not.found=Please select a task and then ''Add Assigned Person''.
 
-default.close.text=Close
-default.options.text=Options
-default.none.text=None
-
 default.list.failure=Could not generate list for class {0}.
 default.not.found={0} {1} not found, it may have been deleted.
@@ -196,5 +192,10 @@
 
 default.paginate.prev=Previous
+default.paginate.prev.abbrev=Prev
 default.paginate.next=Next
+
+default.close.text=Close
+default.options.text=Options
+default.none.text=None
 
 # Rich UI plugin - Calendar
@@ -259,2 +260,27 @@
 
 fp.property.text.inventoryItemPurchaseType.name=Type
+
+# TaskSearch Service
+task.search.text.my.todays=Today''s tasks for {0}.
+task.search.text.my.todays.none.found=No tasks found for {0} today.
+task.search.text.my.yesterdays=Yesterday''s tasks for {0}.
+task.search.text.my.yesterdays.none.found=No tasks found for {0} yesterday.
+task.search.text.my.tomorrows=Tomorrow''s tasks for {0}.
+task.search.text.my.tomorrows.none.found=No tasks found for {0} tomorrow.
+task.search.text.todays=Today's tasks.
+task.search.text.todays.none.found=No tasks found for today.
+task.search.text.yesterdays=Yesterday's tasks.
+task.search.text.yesterdays.none.found=No tasks found for yesterday.
+task.search.text.tomorrows=Tomorrow's tasks.
+task.search.text.tomorrows.none.found=No tasks found for tomorrow.
+task.search.text.past.week=Tasks with 'Target Start Date' in the past week.
+task.search.text.past.week.none.found=No tasks found with 'Target Start Date' in the past week.
+task.search.text.my.past.week=Tasks with ''Target Start Date'' in the past week for {0}.
+task.search.text.my.past.week.none.found=No tasks found with ''Target Start Date'' in the past week for {0}.
+task.search.text.budget.unplanned=Tasks with budget status of 'unplanned', in the past week.
+task.search.text.budget.unplanned.none.found=No tasks found with budget status of 'unplanned', in the past week.
+task.search.text.budget.planned=Tasks with budget status of 'planned', in the past week.
+task.search.text.budget.planned.none.found=No tasks found with budget status of 'planned', in the past week.
+task.search.text.planners.range=Planners Range - Tasks in the past week and two weeks ahead.
+task.search.text.planners.range.none.found=No tasks found in the past week or two weeks ahead.
+task.search.calendar.text.too.many.results=Too many results, only {0} are shown.
Index: /trunk/grails-app/services/DateUtilService.groovy
===================================================================
--- /trunk/grails-app/services/DateUtilService.groovy	(revision 475)
+++ /trunk/grails-app/services/DateUtilService.groovy	(revision 476)
@@ -99,4 +99,26 @@
 
     /**
+    * Get the date one year in the future.
+    * @param date The Date object to start with.
+    * @returns A Date object one year in the future.
+    */
+    public static Date getNextYear(Date date) {
+        use(TimeCategory) {
+            date + 1.years
+        }
+    }
+
+    /**
+    * Get the date one year ago.
+    * @param date The Date object to start with.
+    * @returns A Date object one year ago.
+    */
+    public static Date getPreviousYear(Date date) {
+        use(TimeCategory) {
+            date - 1.years
+        }
+    }
+
+    /**
     * Make a date object from supplied year, month, day values.
     * The Calendar.getInstance() or Calendar.instance factory returns a new calendar instance, usually
@@ -104,9 +126,9 @@
     * The time fields are set to zero and cal.getTime() or cal.time returns a java.util.Date object.
     * @param year The year as a string or integer.
-    * @param month The month as a string or integer.
-    * @param day The day as a string or integer.
+    * @param month The month as a string or integer, defaults to 1 (i.e. January).
+    * @param day The day as a string or integer, defaults to 1.
     * @returns A Date object having the given date and all time fields set to 0, so the very start of the given day.
     */
-    public static Date makeDate(year, month, day) {
+    public static Date makeDate(year, month=1, day=1) {
         Calendar cal = Calendar.instance
         cal.clear()
@@ -116,3 +138,36 @@
     }
 
+    /**
+    * Get the day of month from supplied date.
+    * @param date The date to extract the day of month from.
+    * @returns An integer representing the day of the month.
+    */
+    public static Integer getDayFromDate(Date date) {
+        Calendar cal = Calendar.instance
+        cal.setTime(date)
+        cal.get(Calendar.DAY_OF_MONTH)
+    }
+
+    /**
+    * Get the month from supplied date.
+    * @param date The date to extract the month from.
+    * @returns An integer representing the month.
+    */
+    public static Integer getMonthFromDate(Date date) {
+        Calendar cal = Calendar.instance
+        cal.setTime(date)
+        cal.get(Calendar.MONTH) + 1 // Stupid month is 0-based, grumble.
+    }
+
+    /**
+    * Get the year from supplied date.
+    * @param date The date to extract the year from.
+    * @returns An integer representing the year.
+    */
+    public static Integer getYearFromDate(Date date) {
+        Calendar cal = Calendar.instance
+        cal.setTime(date)
+        cal.get(Calendar.YEAR)
+    }
+
 }
Index: /trunk/grails-app/services/TaskSearchService.groovy
===================================================================
--- /trunk/grails-app/services/TaskSearchService.groovy	(revision 475)
+++ /trunk/grails-app/services/TaskSearchService.groovy	(revision 476)
@@ -1,86 +1,215 @@
+/**
+* Service class that encapsulates the business logic for Task searches.
+*/
 class TaskSearchService {
 
     boolean transactional = false
 
+    def authService
     def dateUtilService
-    def authenticateService
-
-    def paramsMax = 99999
-
-    def getTodays(params) {
-        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
-        params.offset = params?.offset?.toInteger() ?: 0
-        params.sort = params?.sort ?: "attentionFlag"
-        params.order = params?.order ?: "desc"
-
-        def taskInstanceList = Task.createCriteria().list(
-            max: params.max,
-            offset: params.offset,
-            sort: params.sort, 
-            order: params.order) {
-                ge("targetStartDate", dateUtilService.today)
-                lt("targetStartDate", dateUtilService.getTomorrow())
-                eq("trash", false)
-            }
-    }
-
-    def getMyTodays(params) {
-        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
-        params.offset = params?.offset?.toInteger() ?: 0
-        params.sort = params?.sort ?: "attentionFlag"
-        params.order = params?.order ?: "desc"
-
-        def taskInstanceList = Task.createCriteria().list(
-            max: params.max,
-            offset: params.offset,
-            sort: params.sort, 
-            order: params.order) {
-                eq("leadPerson", Person.get(authenticateService.userDomain().id))
-                ge("targetStartDate", dateUtilService.today)
-                lt("targetStartDate", dateUtilService.getTomorrow())
-                eq("trash", false)
-            }
-    }
-
-    def getInTheLastWeek(params) {
-        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
-        params.offset = params?.offset?.toInteger() ?: 0
-        params.sort = params?.sort ?: "attentionFlag"
-        params.order = params?.order ?: "desc"
-
-        def taskInstanceList = Task.createCriteria().list(
-            max: params.max,
-            offset: params.offset,
-            sort: params.sort, 
-            order: params.order) {
-                ge("targetStartDate", dateUtilService.oneWeekAgo)
-                lt("targetStartDate", dateUtilService.getTomorrow())
-                eq("trash", false)
-            }
-    }
-
-    def getMyInTheLastWeek(params) {
-        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
-        params.offset = params?.offset?.toInteger() ?: 0
-        params.sort = params?.sort ?: "attentionFlag"
-        params.order = params?.order ?: "desc"
-
-        def taskInstanceList = Task.createCriteria().list(
-            max: params.max,
-            offset: params.offset,
-            sort: params.sort, 
-            order: params.order) {
-                eq("leadPerson", Person.get(authenticateService.userDomain().id))
-                ge("targetStartDate", dateUtilService.oneWeekAgo)
-                lt("targetStartDate", dateUtilService.getTomorrow())
-                eq("trash", false)
-            }
-    }
+    def messageSource
+
+    def paramsMax = 100000
+
+    /**
+    * Selects and returns the correct search results based on the supplied quickSearch.
+    * @param params The request params, may contain params.quickSearch string to specify the search.
+    * @param locale The locale to use when generating result.message.
+    */
+    def getQuickSearch(params, locale) {
+        def result = [:]
+        def currentUser = authService.currentUser
+        result.quickSearch = params.quickSearch ?: "searchPlannersRange"
+
+        def getMessage = { Map m ->
+            messageSource.getMessage(m.code, m.args == null ? null : m.args.toArray(), locale)
+        }
+
+        switch (result.quickSearch) {
+            case "myTodays":
+                result.taskInstanceList = getMyTodays(params)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.my.todays", args:[currentUser])
+                else
+                    result.message = getMessage(code:"task.search.text.my.todays.none.found", args:[currentUser])
+                break
+            case "myYesterdays":
+                result.taskInstanceList = getMyTodays(params, -1)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.my.yesterdays", args:[currentUser])
+                else
+                    result.message = getMessage(code:"task.search.text.my.yesterdays.none.found", args:[currentUser])
+                break
+            case "myTomorrows":
+                result.taskInstanceList = getMyTodays(params, 1)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.my.tomorrows", args:[currentUser])
+                else
+                    result.message = getMessage(code:"task.search.text.my.tomorrows.none.found", args:[currentUser])
+                break
+            case "myPastWeek":
+                result.taskInstanceList = getMyPastWeek(params)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.my.past.week", args:[currentUser])
+                else
+                    result.message = getMessage(code:"task.search.text.my.past.week.none.found", args:[currentUser])
+                break
+            case "todays":
+                result.taskInstanceList = getTodays(params)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.todays")
+                else
+                    result.message = getMessage(code:"task.search.text.todays.none.found")
+                break
+            case "yesterdays":
+                result.taskInstanceList = getTodays(params, -1)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.yesterdays")
+                else
+                    result.message = getMessage(code:"task.search.text.yesterdays.none.found")
+                break
+            case "tomorrows":
+                result.taskInstanceList = getTodays(params, 1)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.tomorrows")
+                else
+                    result.message = getMessage(code:"task.search.text.tomorrows.none.found")
+                break
+            case "pastWeek":
+                result.taskInstanceList = getPastWeek(params)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.past.week")
+                else
+                    result.message = getMessage(code:"task.search.text.past.week.none.found")
+                break
+            case "budgetUnplanned":
+                result.taskInstanceList = getBudgetUnplanned(params)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.budget.unplanned")
+                else
+                    result.message = getMessage(code:"task.search.text.budget.unplanned.none.found")
+                break
+            case "budgetPlanned":
+                result.taskInstanceList = getBudgetPlanned(params)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.budget.planned")
+                else
+                    result.message = getMessage(code:"task.search.text.budget.planned.none.found")
+                break
+            default:
+                result.taskInstanceList = getPlannersRange(params)
+                if(result.taskInstanceList.totalCount > 0)
+                    result.message = getMessage(code:"task.search.text.planners.range")
+                else
+                    result.message = getMessage(code:"task.search.text.planners.range.none.found")
+                break
+        } // switch.
+
+        // Success.
+        return result
+
+    } // getQuickSearch
+
+    def getTodays(params, dayAdjustment=0) {
+        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
+        params.offset = params?.offset?.toInteger() ?: 0
+        params.sort = params?.sort ?: "attentionFlag"
+        params.order = params?.order ?: "desc"
+
+        def taskInstanceList = Task.createCriteria().list(
+            max: params.max,
+            offset: params.offset,
+            sort: params.sort, 
+            order: params.order) {
+                ge("targetStartDate", dateUtilService.today+dayAdjustment)
+                lt("targetStartDate", dateUtilService.tomorrow+dayAdjustment)
+                eq("trash", false)
+            }
+    }
+
+    def getMyTodays(params, dayAdjustment=0) {
+        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
+        params.offset = params?.offset?.toInteger() ?: 0
+        params.sort = params?.sort ?: "attentionFlag"
+        params.order = params?.order ?: "desc"
+
+        def currentUser = authService.currentUser
+
+        def taskInstanceList = Task.createCriteria().list(
+            max: params.max,
+            offset: params.offset,
+            sort: params.sort, 
+            order: params.order) {
+                ge("targetStartDate", dateUtilService.today+dayAdjustment)
+                lt("targetStartDate", dateUtilService.tomorrow+dayAdjustment)
+                eq("trash", false)
+                eq("approved", true)
+                or {
+                    eq("leadPerson", currentUser)
+                    assignedPersons {
+                        eq("person", currentUser)
+                    }
+                    assignedGroups {
+                        currentUser.personGroups.each() {
+                            eq("personGroup", it)
+                        }
+                    } // assignedGroups
+                } // or
+            } // criteria
+    } // getMyTodays
+
+    def getPastWeek(params) {
+        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
+        params.offset = params?.offset?.toInteger() ?: 0
+        params.sort = params?.sort ?: "attentionFlag"
+        params.order = params?.order ?: "desc"
+
+        def taskInstanceList = Task.createCriteria().list(
+            max: params.max,
+            offset: params.offset,
+            sort: params.sort, 
+            order: params.order) {
+                ge("targetStartDate", dateUtilService.oneWeekAgo)
+                lt("targetStartDate", dateUtilService.tomorrow)
+                eq("trash", false)
+            }
+    }
+
+    def getMyPastWeek(params) {
+        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
+        params.offset = params?.offset?.toInteger() ?: 0
+        params.sort = params?.sort ?: "attentionFlag"
+        params.order = params?.order ?: "desc"
+
+        def currentUser = authService.currentUser
+
+        def taskInstanceList = Task.createCriteria().list(
+            max: params.max,
+            offset: params.offset,
+            sort: params.sort, 
+            order: params.order) {
+                ge("targetStartDate", dateUtilService.oneWeekAgo)
+                lt("targetStartDate", dateUtilService.tomorrow)
+                eq("trash", false)
+                eq("approved", true)
+                or {
+                    eq("leadPerson", currentUser)
+                    assignedPersons {
+                        eq("person", currentUser)
+                    }
+                    assignedGroups {
+                        currentUser.personGroups.each() {
+                            eq("personGroup", it)
+                        }
+                    } // assignedGroups
+                } // or
+            } // criteria
+    } // getMyPastWeek
 
     def getBudgetPlanned(params) {
         params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
         params.offset = params?.offset?.toInteger() ?: 0
-        params.sort = params?.sort ?: "attentionFlag"
-        params.order = params?.order ?: "desc"
+        params.sort = params?.sort ?: "targetStartDate"
+        params.order = params?.order ?: "asc"
 
         def taskInstanceList = Task.createCriteria().list(
@@ -89,5 +218,5 @@
             sort: params.sort,
             order: params.order) {
-                eq("taskBudgetStatus", TaskBudgetStatus.get(2))
+                eq("taskBudgetStatus", TaskBudgetStatus.read(2))
                 ge("targetStartDate", dateUtilService.oneWeekAgo)
                 lt("targetStartDate", dateUtilService.tomorrow)
@@ -99,6 +228,6 @@
         params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
         params.offset = params?.offset?.toInteger() ?: 0
-        params.sort = params?.sort ?: "attentionFlag"
-        params.order = params?.order ?: "desc"
+        params.sort = params?.sort ?: "targetStartDate"
+        params.order = params?.order ?: "asc"
 
         def taskInstanceList = Task.createCriteria().list(
@@ -107,7 +236,24 @@
             sort: params.sort,
             order: params.order) {
-                eq("taskBudgetStatus", TaskBudgetStatus.get(1))
-                ge("targetStartDate", dateUtilService.oneWeekAgo)
-                lt("targetStartDate", dateUtilService.getTomorrow())
+                eq("taskBudgetStatus", TaskBudgetStatus.read(1))
+                ge("targetStartDate", dateUtilService.oneWeekAgo)
+                lt("targetStartDate", dateUtilService.tomorrow)
+                eq("trash", false)
+            }
+    }
+
+    def getPlannersRange(params) {
+        params.max = Math.min(params?.max?.toInteger() ?: 10, paramsMax)
+        params.offset = params?.offset?.toInteger() ?: 0
+        params.sort = params?.sort ?: "targetStartDate"
+        params.order = params?.order ?: "asc"
+
+        def taskInstanceList = Task.createCriteria().list(
+            max: params.max,
+            offset: params.offset,
+            sort: params.sort,
+            order: params.order) {
+                ge("targetStartDate", dateUtilService.oneWeekAgo)
+                lt("targetStartDate", dateUtilService.today + 15)
                 eq("trash", false)
             }
Index: /trunk/grails-app/views/appCore/manager.gsp
===================================================================
--- /trunk/grails-app/views/appCore/manager.gsp	(revision 475)
+++ /trunk/grails-app/views/appCore/manager.gsp	(revision 476)
@@ -33,5 +33,5 @@
                             <td valign="top" class="value">
                                 <g:link controller="taskDetailed"
-                                                action="budget"
+                                                action="search"
                                                 params="[quickSearch: 'budgetPlanned']">
                                                 Planned Tasks
@@ -39,5 +39,5 @@
                                 <br />
                                 <g:link controller="taskDetailed" 
-                                                action="budget"
+                                                action="search"
                                                 params="[quickSearch: 'budgetUnplanned']">
                                                 Unplanned Tasks
Index: /trunk/grails-app/views/appCore/start.gsp
===================================================================
--- /trunk/grails-app/views/appCore/start.gsp	(revision 475)
+++ /trunk/grails-app/views/appCore/start.gsp	(revision 476)
@@ -47,12 +47,6 @@
                                             <g:link controller="taskDetailed"
                                                             action="search"
-                                                            params="[quickSearch: 'searchMyTodays']">
-                                                            Today's
-                                            </g:link>
-                                            <br />
-                                            <g:link controller="taskDetailed" 
-                                                            action="search"
-                                                            params="[quickSearch: 'searchMyInTheLastWeek']">
-                                                            In the last week
+                                                            params="[quickSearch: 'myTodays']">
+                                                            Today
                                             </g:link>
                                         </td>
@@ -61,10 +55,16 @@
                                     <tr class="prop">
                                         <td valign="top" class="name">
-                                            <label>Tasks:</label>
+                                            <label>All Tasks:</label>
                                         </td>
                                         <td valign="top" class="value">
                                             <g:link controller="taskDetailed" 
+                                                            action="search"
+                                                            params="[quickSearch: 'pastWeek']">
+                                                            Past Week
+                                            </g:link>
+                                            <br />
+                                            <g:link controller="taskDetailed" 
                                                             action="searchCalendar"
-                                                            params="[quickSearch: 'searchInTheLastWeek']">
+                                                            params="[quickSearch: 'searchPlannersRange']">
                                                             Calendar
                                             </g:link>
Index: /trunk/grails-app/views/taskDetailed/_quickSearchPane.gsp
===================================================================
--- /trunk/grails-app/views/taskDetailed/_quickSearchPane.gsp	(revision 476)
+++ /trunk/grails-app/views/taskDetailed/_quickSearchPane.gsp	(revision 476)
@@ -0,0 +1,103 @@
+<!-- Start Search Pane -->
+<div class="overlayPane" id="searchPane" style="display:none;">
+    <h2>Quick Search</h2>
+    <g:form method="post" id="searchForm" name="searchForm" >
+        <table>
+            <tbody>
+
+                <tr class="prop">
+                    <td valign="top" class="name">
+                        <label>My Tasks:</label>
+                    </td>
+                    <td valign="top" class="value">
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'myTodays']">
+                                        Today
+                        </g:link>
+                        <br />
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'myYesterdays']">
+                                        Yesterday
+                        </g:link>
+                        <br />
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'myTomorrows']">
+                                        Tomorrow
+                        </g:link>
+                        <br />
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'myPastWeek']">
+                                        Past Week
+                        </g:link>
+                    </td>
+                </tr>
+
+                <tr class="prop">
+                    <td valign="top" class="name">
+                        <label>All Tasks:</label>
+                    </td>
+                    <td valign="top" class="value">
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'todays']">
+                                        Today
+                        </g:link>
+                        <br />
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'yesterdays']">
+                                        Yesterday
+                        </g:link>
+                        <br />
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'tomorrows']">
+                                        Tomorrow
+                        </g:link>
+                        <br />
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'pastWeek']">
+                                        Past Week
+                        </g:link>
+                        <br />
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'plannersRange']">
+                                        Planners Range
+                        </g:link>
+                    </td>
+                </tr>
+
+                <tr class="prop">
+                    <td valign="top" class="name">
+                        <label>Budget:</label>
+                    </td>
+                    <td valign="top" class="value">
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'budgetPlanned']">
+                                        Planned Tasks
+                        </g:link>
+                        <br />
+                        <g:link controller="taskDetailed"
+                                        action="${actionName}"
+                                        params="[quickSearch: 'budgetUnplanned']">
+                                        Unplanned Tasks
+                        </g:link>
+                    </td>
+                </tr>
+
+            </tbody>
+        </table>
+        <div class="buttons">
+            <span class="button">
+                <input type="button" value="${g.message(code:'fp.tag.filterPane.button.cancel.text', default:'Cancel')}" onclick="return hideElement('searchPane');" />
+            </span>
+        </div>
+    </g:form>
+</div> <!-- end search pane -->
Index: unk/grails-app/views/taskDetailed/budget.gsp
===================================================================
--- /trunk/grails-app/views/taskDetailed/budget.gsp	(revision 475)
+++ 	(revision )
@@ -1,131 +1,0 @@
-<html>
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-        <meta name="layout" content="main" />
-        <title>Task Search</title>
-        <nav:resources override="true"/>
-        <export:resource />
-    </head>
-    <body>
-        <div class="nav">
-            <nav:renderSubItems group="nav"/>
-        </div>
-
-        <div class="body">
-            <g:if test="${flash.message}">
-                <div class="message">${flash.message}</div>
-            </g:if>
-            <g:if test="${params.message}">
-                <div class="message">${params.message}</div>
-            </g:if>
-            <g:hasErrors bean="${appCore}">
-                <div class="errors">
-                    <g:renderErrors bean="${appCore}" as="list" />
-                </div>
-            </g:hasErrors>
-
-            <div class="paginateButtons">
-                <a href='' onclick="showElement('searchPane'); return false;">Quick</a>
-                Results: ${taskInstanceList.size()} / ${taskInstanceTotal}
-            </div>
-
-            <g:if test="${taskInstanceList.size() > 0}">
-                <div class="list">
-                    <table>
-                        <thead>
-                            <tr>
-
-                                <g:sortableColumn property="id" title="Id" params="${filterParams}" />
-
-                                <g:sortableColumn property="targetStartDate" title="Target Start Date" params="${filterParams}" />
-
-                                <g:sortableColumn property="description" title="Description" params="${filterParams}" />
-
-                                <g:sortableColumn  property="leadPerson" title="Lead Person" params="${filterParams}" />
-
-                                <g:sortableColumn  property="taskPriority" title="Task Priority" params="${filterParams}" />
-
-                                <g:sortableColumn  property="taskStatus" title="Task Status" params="${filterParams}" />
-
-                                <th></th>
-
-                            </tr>
-                        </thead>
-                        <tbody>
-                        <g:each in="${taskInstanceList}" status="i" var="taskInstance">
-                        <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/taskDetailed/show/${taskInstance.id}"'/>
-
-                                <td>${fieldValue(bean:taskInstance, field:'id')}</td>
-
-                                <td><g:formatDate date="${taskInstance.targetStartDate}" format="EEE, dd-MMM-yyyy"/></td>
-
-                                <td>${fieldValue(bean:taskInstance, field:'description')}</td>
-
-                                <td>${fieldValue(bean:taskInstance, field:'leadPerson')}</td>
-
-                                <td>${fieldValue(bean:taskInstance, field:'taskPriority')}</td>
-
-                                <td>${fieldValue(bean:taskInstance, field:'taskStatus')}</td>
-
-                                <td>
-                                    <g:link action="show" id="${taskInstance.id}">
-                                        <img  src="${resource(dir:'images/skin',file:'database_go.png')}" alt="Show" />
-                                    </g:link>
-                                </td>
-
-                            </tr>
-                        </g:each>
-                        </tbody>
-                    </table>
-                </div>
-            </g:if>
-            <div class="paginateButtons">
-                <g:paginate total="${taskInstanceTotal}" params="${filterParams}" />
-            </div>
-            <export:formats  params="${filterParams}" formats="['csv', 'excel', 'pdf', 'rtf']"/>
-        </div> <!-- end body  -->
-
-        <!-- Start Search Pane -->
-        <div class="overlayPane" id="searchPane" style="display:none;">
-            <h2>Quick Search</h2>
-            <g:form method="post" id="searchForm" name="searchForm" >
-                <table>
-                    <tbody>
-
-                        <tr class="prop">
-                            <td valign="top" class="name">
-                                <label>Budget:</label>
-                            </td>
-                            <td valign="top" class="value">
-                                <g:link controller="taskDetailed"
-                                                action="budget"
-                                                params="[quickSearch: 'budgetPlanned']">
-                                                Planned Tasks
-                                </g:link>
-                                <br />
-                                <g:link controller="taskDetailed" 
-                                                action="budget"
-                                                params="[quickSearch: 'budgetUnplanned']">
-                                                Unplanned Tasks
-                                </g:link>
-                            </td>
-                        </tr>
-
-                    </tbody>
-                </table>
-                <div class="buttons">
-                    <span class="button">
-                        <input type="button" value="${g.message(code:'fp.tag.filterPane.button.cancel.text', default:'Cancel')}" onclick="return hideElement('searchPane');" />
-                    </span>
-<!--                    <span class="button">
-                        <input type="button" value="${g.message(code:'fp.tag.filterPane.button.clear.text', default:'Clear')}" onclick="return clearFilterPane('searchForm');" />
-                    </span>
-                    <span class="button">
-                        <g:actionSubmit class="search" value="Search" />
-                    </span>-->
-                </div>
-            </g:form>
-        </div> <!-- end search pane -->
-
-    </body>
-</html>
Index: /trunk/grails-app/views/taskDetailed/search.gsp
===================================================================
--- /trunk/grails-app/views/taskDetailed/search.gsp	(revision 475)
+++ /trunk/grails-app/views/taskDetailed/search.gsp	(revision 476)
@@ -15,7 +15,4 @@
         <div class="body">
             <g:render template="/shared/messages" />
-            <g:if test="${params.message}">
-                <div class="message">${params.message}</div>
-            </g:if>
             <g:hasErrors bean="${appCore}">
                 <div class="errors">
@@ -142,5 +139,5 @@
             </g:if>
             <div class="paginateButtons">
-                <g:paginate total="${taskInstanceTotal}" params="${filterParams}" />
+                <g:paginate  action="search" total="${taskInstanceTotal}" params="${filterParams}" />
             </div>
 
@@ -169,61 +166,8 @@
                                                                                 targetStartDate:[years:2020..2000,precision:'day']
                                                                                 ]}"/>
+
+            <g:render template="quickSearchPane" />
+
         </div> <!-- end body  -->
-
-        <!-- Start Search Pane -->
-        <div class="overlayPane" id="searchPane" style="display:none;">
-            <h2>Quick Search</h2>
-            <g:form method="post" id="searchForm" name="searchForm" >
-                <table>
-                    <tbody>
-
-                        <tr class="prop">
-                            <td valign="top" class="name">
-                                <label>My Tasks:</label>
-                            </td>
-                            <td valign="top" class="value">
-                                <g:link controller="taskDetailed"
-                                                action="search"
-                                                params="[quickSearch: 'searchMyTodays']">
-                                                Today's
-                                </g:link>
-                                <br />
-                                <g:link controller="taskDetailed" 
-                                                action="search"
-                                                params="[quickSearch: 'searchMyInTheLastWeek']">
-                                                In the last week
-                                </g:link>
-                            </td>
-                        </tr>
-
-                        <tr class="prop">
-                            <td valign="top" class="name">
-                                <label>Tasks:</label>
-                            </td>
-                            <td valign="top" class="value">
-                                <g:link controller="taskDetailed"
-                                                action="search"
-                                                params="[quickSearch: 'searchTodays']">
-                                                Today's
-                                </g:link>
-                                <br />
-                                <g:link controller="taskDetailed" 
-                                                action="search"
-                                                params="[quickSearch: 'searchInTheLastWeek']">
-                                                In the last week
-                                </g:link>
-                            </td>
-                        </tr>
-
-                    </tbody>
-                </table>
-                <div class="buttons">
-                    <span class="button">
-                        <input type="button" value="${g.message(code:'fp.tag.filterPane.button.cancel.text', default:'Cancel')}" onclick="return hideElement('searchPane');" />
-                    </span>
-                </div>
-            </g:form>
-        </div> <!-- end search pane -->
-
     </body>
 </html>
Index: /trunk/grails-app/views/taskDetailed/searchCalendar.gsp
===================================================================
--- /trunk/grails-app/views/taskDetailed/searchCalendar.gsp	(revision 475)
+++ /trunk/grails-app/views/taskDetailed/searchCalendar.gsp	(revision 476)
@@ -3,8 +3,9 @@
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
         <meta name="layout" content="main" />
-        <title>Task Search</title>
+        <title>Task Search Calendar</title>
         <filterpane:includes />
         <nav:resources override="true"/>
-        <resource:calendarMonthView />
+        <resource:calendarMonthView  skin="calendarmonthviewCustom"/>
+        <export:resource />
     </head>
     <body>
@@ -14,13 +15,6 @@
 
         <div class="body">
-            <g:if test="${params.message}">
-                <div class="message">${params.message}</div>
-            </g:if>
             <g:render template="/shared/messages" />
-            <g:hasErrors bean="${appCore}">
-                <div class="errors">
-                    <g:renderErrors bean="${appCore}" as="list" />
-                </div>
-            </g:hasErrors>
+
             <filterpane:currentCriteria domainBean="Task"
                                     action="searchCalendar"
@@ -41,22 +35,74 @@
             </div>
 
-            <br />
-            <g:link action="searchCalendar" params="[previousMonth:'true']">
-                < Previous
-            </g:link>
-            <span style="font-size: 17px; font-weight: bold;">
-                <g:formatDate date="${showMonth}" format="MMMM"/>
-            </span>
-            <g:link action="searchCalendar" params="[nextMonth:'true']">
-                Next >
-            </g:link>
-            <br />
+            <jsUtil:toggleControl toggleId="options"
+                                                    imageId="optionsImg"
+                                                    closedImgUrl="${resource(dir:'images/skin',file:'bullet_arrow_right.png')}"
+                                                    openImgUrl="${resource(dir:'images/skin',file:'bullet_arrow_down.png')}"
+                                                    text="${g.message(code: 'default.options.text')}"
+                                                    />
+
+            <div id="options" style="display:none;">
+                <g:form method="post" >
+                    <g:hiddenField name="params" value="${filterParams}" />
+                    <div class="dialog">
+                        <table>
+                            <tbody>
+
+                                <tr class="prop">
+                                    <td valign="top" class="name">
+                                        <label for="max">Results per page:</label>
+                                    </td>
+                                    <td valign="top" class="value">
+                                        <input type="text" maxlength="4" id="description" name="newMax" value="${params.max}"/>
+
+                                        <span class="buttons">
+                                            <g:actionSubmit action="setSearchCalendarParamsMax" class="go" value="Update" />
+                                        </span>
+                                    </td>
+                                </tr>
+
+                            </tbody>
+                        </table>
+                    </div>
+                <export:formats  params="${filterParams}" formats="['csv', 'excel', 'pdf', 'rtf']"/>
+                </g:form>
+            </div>
+
             <br />
 
             <g:if test="${taskInstanceList.size() > 0}">
+                    <div class="paginateButtons">
+                        <g:link action="searchCalendar"
+                                        params="[showMonth: previousYear.month, showYear: previousYear.year]">
+                            &lt;&lt;
+                        </g:link>
+                        <g:link action="searchCalendar"
+                                        params="[showMonth: previousMonth.month, showYear: previousMonth.year]">
+                            &lt;
+                        </g:link>
+                        <span class="calendarMonthControlTitle">
+                            <g:formatDate date="${showDate}" format="MMMM, yyyy"/>
+                        </span>
+                        <g:link action="searchCalendar"
+                                        params="[showMonth: nextMonth.month, showYear: nextMonth.year]">
+                            &gt;
+                        </g:link>
+                        <g:link action="searchCalendar"
+                                        params="[showMonth: nextYear.month, showYear: nextYear.year]">
+                            &gt;&gt;
+                        </g:link>
+                    </div>
+                    <div>
+                        <g:link action="searchCalendar"
+                                        params="[showMonth: today.month, showYear: today.year]">
+                            Today: <g:formatDate date="${today.date}" format="MMMM, yyyy"/>
+                        </g:link>
+                    </div>
+                    <br />
+
                 <richui:calendarMonthView items="${taskInstanceList}"
                                                                         createLink="true"
                                                                         constraintDateFields="['targetStartDate']"
-                                                                        month="${showMonth}"
+                                                                        month="${showDate}"
                                                                         controller="taskDetailed"
                                                                         action="show"
@@ -70,66 +116,13 @@
                                     additionalProperties="id"
                                     excludeProperties="trash, comment, targetCompletionDate"
-                                    associatedProperties="leadPerson.lastName, taskPriority.name"
+                                    associatedProperties="leadPerson.lastName, leadPerson.firstName, taskPriority.name"
                                     filterPropertyValues="${['taskPriority.name':[values:TaskPriority.list()],
                                                                                 'leadPerson.lastName':[values:Person.executeQuery('select t.lastName from Person t')],
+                                                                                'leadPerson.firstName':[values:Person.executeQuery('select distinct t.firstName from Person t')],
                                                                                 targetStartDate:[years:2020..2000,precision:'day']]}"/>
 
+            <g:render template="quickSearchPane" />
+
         </div> <!-- end body div -->
-
-        <!-- Start Search Pane -->
-        <div class="overlayPane" id="searchPane" style="display:none;">
-            <h2>Quick Search</h2>
-            <g:form method="post" id="searchForm" name="searchForm" >
-                <table>
-                    <tbody>
-
-                        <tr class="prop">
-                            <td valign="top" class="name">
-                                <label>My Tasks:</label>
-                            </td>
-                            <td valign="top" class="value">
-                                <g:link controller="taskDetailed"
-                                                action="searchCalendar"
-                                                params="[quickSearch: 'searchMyTodays']">
-                                                Today's
-                                </g:link>
-                                <br />
-                                <g:link controller="taskDetailed" 
-                                                action="searchCalendar"
-                                                params="[quickSearch: 'searchMyInTheLastWeek']">
-                                                In the last week
-                                </g:link>
-                            </td>
-                        </tr>
-
-                        <tr class="prop">
-                            <td valign="top" class="name">
-                                <label>Tasks:</label>
-                            </td>
-                            <td valign="top" class="value">
-                                <g:link controller="taskDetailed"
-                                                action="searchCalendar"
-                                                params="[quickSearch: 'searchTodays']">
-                                                Today's
-                                </g:link>
-                                <br />
-                                <g:link controller="taskDetailed" 
-                                                action="searchCalendar"
-                                                params="[quickSearch: 'searchInTheLastWeek']">
-                                                In the last week
-                                </g:link>
-                            </td>
-                        </tr>
-
-                    </tbody>
-                </table>
-                <div class="buttons">
-                    <span class="button">
-                        <input type="button" value="${g.message(code:'fp.tag.filterPane.button.cancel.text', default:'Cancel')}" onclick="return hideElement('searchPane');" />
-                    </span>
-                </div>
-            </g:form>
-        </div> <!-- end search pane -->
-
     </body>
 </html>
Index: /trunk/web-app/css/calendarmonthviewCustom.css
===================================================================
--- /trunk/web-app/css/calendarmonthviewCustom.css	(revision 476)
+++ /trunk/web-app/css/calendarmonthviewCustom.css	(revision 476)
@@ -0,0 +1,78 @@
+/* Calendar */
+
+/* Link size and color */
+.calendar a {
+    font-weight: normal;
+    font-size: 12px;
+    color: #000000;
+    text-decoration: none;
+}
+
+.calendar li:hover a{
+    color: red;
+}
+
+.calendar li:hover {
+    color: red;
+}
+
+/* Table  */
+table.calendar td.dayWithItems {
+    background: #ffed8c;
+    border: 1px solid #ffde33;
+}
+table.calendar td.outsideOfMonth {
+    background: #BBBBBB;
+}
+
+table.calendar td.today {
+    background: #B2D1FF;
+}
+
+table.calendar .oddDay {
+    background: #efefef;
+}
+
+table.calendar .evenDay {
+    background: #f7f7f7;
+}
+
+table.calendar td.day {
+    /*
+    height: 12.5%;
+    width: 12.5%;
+    */
+    height: 7em;
+    width: 7em;
+}
+
+table.calendar td.weekOfYear {
+    height: 5%;
+    width: 5%;
+}
+
+/* Day title */
+table.calendar h1 {
+    color:#5C5C5C;
+}
+table.calendar h1:hover {
+    color: red;
+}
+
+table.calendar th:hover, table.calendar td:hover {
+
+}
+
+table.calendar {
+    border-collapse: collapse;
+}
+
+table.calendar th, table.calendar td {
+    border-left:1px solid #DDDDDD;
+}
+
+/* Month Control Title*/
+span.calendarMonthControlTitle {
+    font-size: 17px;
+    font-weight: bold;
+}
