Index: /trunk/grails-app/conf/Config.groovy
===================================================================
--- /trunk/grails-app/conf/Config.groovy	(revision 432)
+++ /trunk/grails-app/conf/Config.groovy	(revision 433)
@@ -148,7 +148,8 @@
             [order:11, controller:'taskDetailed', title:'Calendar', action:'searchCalendar', isVisible: { true }],
             [order:20, controller:'taskDetailed', title:'+Scheduled', action:'create', isVisible: { true }],
-            [order:30, controller:'taskDetailed', title:'+Callout', action:'createImmediateCallout', isVisible: { true }],
-            [order:90, controller:'taskDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
-            [order:91, controller:'taskDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
+            [order:30, controller:'taskDetailed', title:'+Unsheduled', action:'createUnscheduled', isVisible: { true }],
+            [order:40, controller:'taskDetailed', title:'+Callout', action:'createImmediateCallout', isVisible: { true }],
+            [order:90, controller:'taskDetailed', title:'Show', action:'show', id:'nav', isVisible: { params.action == 'show' }],
+            [order:91, controller:'taskDetailed', title:'Edit', action:'edit', id:'nav', isVisible: { params.action == 'edit' }]
         ]
     ],
Index: /trunk/grails-app/controllers/TaskDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 432)
+++ /trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 433)
@@ -219,4 +219,11 @@
         if(params._action_Show)
             params.action='show'
+
+        // Used by navigation.
+        if(params.id == 'nav') {
+            params.id = session.currentTaskId ?: null
+            redirect(action: show, id: params.id)
+            return
+        }
 
         def showTab = [:]
@@ -245,4 +252,7 @@
         }
         else {
+            // Remember the current task id for use with navigation.
+            session.currentTaskId = params.id
+
             params.max = 10
             params.order = "desc"
@@ -477,4 +487,11 @@
             params.action='edit'
 
+        // Used by navigation.
+        if(params.id == 'nav') {
+            params.id = session.currentTaskId ?: null
+            redirect(action: edit, id: params.id)
+            return
+        }
+
         def taskInstance = Task.get( params.id )
 
@@ -484,4 +501,7 @@
         }
         else {
+            // Remember the current task id for use with navigation.
+            session.currentTaskId = params.id
+
             if(taskInstance.trash) {
                 flash.message = "You may not edit tasks that are in the trash."
@@ -524,5 +544,11 @@
         taskInstance.leadPerson = authService.currentUser
         taskInstance.properties = params
-        return ['taskInstance': taskInstance]
+
+        def scheduledTaskTypes = taskService.scheduledTaskTypes
+        def scheduledTaskPriorities = taskService.scheduledTaskPriorities
+        taskInstance.taskPriority = scheduledTaskPriorities.default
+        return ['taskInstance': taskInstance,
+                    'scheduledTaskTypes': scheduledTaskTypes,
+                    'scheduledTaskPriorities': scheduledTaskPriorities.list]
     }
 
@@ -540,5 +566,10 @@
             flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
 
-        render(view:'create', model:[taskInstance:result.taskInstance])
+
+        def scheduledTaskTypes = taskService.scheduledTaskTypes
+        def scheduledTaskPriorities = taskService.scheduledTaskPriorities
+        render(view:'create', model:[taskInstance:result.taskInstance,
+                                                    'scheduledTaskTypes': scheduledTaskTypes,
+                                                    'scheduledTaskPriorities': scheduledTaskPriorities.list])
     }
 
@@ -591,4 +622,39 @@
 
     @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
+    def createUnscheduled = {
+        def taskInstance = new Task()
+
+        // Default leadPerson to current user, unless supplied in params.
+        taskInstance.leadPerson = authService.currentUser
+        taskInstance.properties = params
+
+        // Always for Unscheduled task.
+        taskInstance.taskType = TaskType.get(2) // Unscheduled Breakin.
+        def unscheduledTaskPriorities = taskService.unscheduledTaskPriorities
+        taskInstance.taskPriority = unscheduledTaskPriorities.default
+
+        return ['taskInstance': taskInstance, 'unscheduledTaskPriorities': unscheduledTaskPriorities.list]
+    }
+
+    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
+    def saveUnscheduled = {
+        def result = taskService.saveUnscheduled(params)
+
+        if(!result.error) {
+            flash.message = "Task ${result.taskInstance.id} created."
+            redirect(action: 'show', id: result.taskInstance.id)
+            return
+        }
+
+        if(result.error.code == "task.modifications.failedToSave")
+            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
+
+        def unscheduledTaskPriorities = taskService.unscheduledTaskPriorities
+
+        render(view:'createUnscheduled',
+                    model: ['taskInstance': result.taskInstance, 'unscheduledTaskPriorities': unscheduledTaskPriorities.list])
+    }
+
+    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
     def createImmediateCallout = {
         def taskInstance = new Task()
Index: /trunk/grails-app/services/CreateDataService.groovy
===================================================================
--- /trunk/grails-app/services/CreateDataService.groovy	(revision 432)
+++ /trunk/grails-app/services/CreateDataService.groovy	(revision 433)
@@ -702,14 +702,20 @@
         def taskPriorityInstance
 
-        taskPriorityInstance = new TaskPriority(name:"Normal") // #1
+        taskPriorityInstance = new TaskPriority(name:"0 - Immediate") // #1
         saveAndTest(taskPriorityInstance)
 
-        taskPriorityInstance = new TaskPriority(name:"Low") // #2
+        taskPriorityInstance = new TaskPriority(name:"1 - Very High") // #2
         saveAndTest(taskPriorityInstance)
 
-        taskPriorityInstance = new TaskPriority(name:"High") // #3
+        taskPriorityInstance = new TaskPriority(name:"2 - High") // #3
         saveAndTest(taskPriorityInstance)
 
-        taskPriorityInstance = new TaskPriority(name:"Immediate") // #4
+        taskPriorityInstance = new TaskPriority(name:"3 - Normal") // #4
+        saveAndTest(taskPriorityInstance)
+
+        taskPriorityInstance = new TaskPriority(name:"4 - Low") // #5
+        saveAndTest(taskPriorityInstance)
+
+        taskPriorityInstance = new TaskPriority(name:"5 - Minor") //  #6
         saveAndTest(taskPriorityInstance)
     }
Index: /trunk/grails-app/services/TaskService.groovy
===================================================================
--- /trunk/grails-app/services/TaskService.groovy	(revision 432)
+++ /trunk/grails-app/services/TaskService.groovy	(revision 433)
@@ -29,4 +29,53 @@
 
     /**
+    * Determines and returns a list of possible task types for scheduled tasks.
+    * @returns A list of the possible task types.
+    */
+    def getScheduledTaskTypes() {
+        def criteria = TaskType.createCriteria()
+        def scheduledTaskTypes = criteria {
+            and {
+                eq('isActive', true)
+                gt('id', 2L)
+                }
+        }
+    }
+
+    /**
+    * Determines and returns a list of possible task priorites for Scheduled tasks.
+    * @returns A list of the possible task priorites.
+    */
+    def getScheduledTaskPriorities() {
+        def criteria = TaskPriority.createCriteria()
+        def scheduledTaskPriorities = [:]
+        scheduledTaskPriorities.list = criteria {
+            and {
+                eq('isActive', true)
+                gt('id', 1L)
+                }
+        }
+        scheduledTaskPriorities.default = scheduledTaskPriorities.list.find { it.id == 4L } //  1-Normal.
+        return scheduledTaskPriorities
+    }
+
+    /**
+    * Determines and returns a list of possible task priorites for Unscheduled tasks.
+    * @returns A map containing a list of the possible task priorites and the default priority.
+    */
+    def getUnscheduledTaskPriorities() {
+        def criteria = TaskPriority.createCriteria()
+        def unscheduledTaskPriorities = [:]
+        unscheduledTaskPriorities.list = criteria {
+            and {
+                eq('isActive', true)
+                lt('id', 5L)
+                ne('id', 1L)
+            }
+        }
+        unscheduledTaskPriorities.default = unscheduledTaskPriorities.list.find { it.id == 3L } // 2-High.
+        return unscheduledTaskPriorities
+    }
+
+    /**
     * Creates a new task with the given params.
     * @param params The params to use when creating the new task.
@@ -646,4 +695,49 @@
 
     /**
+    * Creates a new unscheduled breakin task with the given params.
+    * @param params The params to use when creating the new task.
+    * @returns A map containing result.error (if any error) and result.taskInstance.
+    */
+    def saveUnscheduled(params) {
+        Task.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.taskInstance && m.field)
+                    result.taskInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["Task", params.id] ]
+                return result
+            }
+
+            // If not supplied.
+            if(!params.taskStatus)
+                params.taskStatus = TaskStatus.get(1) // Not Started.
+
+            result.taskInstance = new Task(params)
+
+            // Always for an unscheduled breakin..
+            result.taskInstance.taskType = TaskType.get(2) // Unscheduled Breakin.
+            result.taskInstance.taskBudgetStatus = TaskBudgetStatus.get(1) // Unplanned.
+
+            if(result.taskInstance.hasErrors() || !result.taskInstance.save())
+                fail(code:"default.create.failure")
+
+            if(!result.error) {
+                def taskModification = new TaskModification(person: authService.currentUser,
+                                                                taskModificationType: TaskModificationType.get(1), // Created.
+                                                                task: result.taskInstance)
+
+                if(taskModification.hasErrors() || !taskModification.save())
+                    fail(field:"taskModifications", code:"task.modifications.failedToSave")
+            }
+
+            // Success.
+            return result
+
+        } //end withTransaction
+    } // end saveUnscheduled()
+
+    /**
     * Creates a new immediate callout task with the given params.
     * @param params The params to use when creating the new task.
@@ -671,5 +765,5 @@
             result.taskInstance.taskType = TaskType.get(1) // Immediate Callout.
             result.taskInstance.taskBudgetStatus = TaskBudgetStatus.get(1) // Unplanned.
-            result.taskInstance.taskPriority = TaskPriority.get(4) // Immediate.
+            result.taskInstance.taskPriority = TaskPriority.get(1) // Immediate.
             result.taskInstance.taskGroup = TaskGroup.get(1) // Engineering Activites.
             result.taskInstance.approved = true
Index: /trunk/grails-app/views/taskDetailed/create.gsp
===================================================================
--- /trunk/grails-app/views/taskDetailed/create.gsp	(revision 432)
+++ /trunk/grails-app/views/taskDetailed/create.gsp	(revision 433)
@@ -104,5 +104,5 @@
                                 </td>
                                 <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'taskPriority','errors')}">
-                                    <g:select optionKey="id" from="${TaskPriority.list()}" name="taskPriority.id" value="${taskInstance?.taskPriority?.id}" ></g:select>
+                                    <g:select optionKey="id" from="${scheduledTaskPriorities}" name="taskPriority.id" value="${taskInstance?.taskPriority?.id}" ></g:select>
                                 </td>
                             </tr>
@@ -140,5 +140,5 @@
                                 </td>
                                 <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'taskType','errors')}">
-                                    <g:select optionKey="id" from="${TaskType.list()}" name="taskType.id" value="${taskInstance?.taskType?.id}" ></g:select>
+                                    <g:select optionKey="id" from="${scheduledTaskTypes}" name="taskType.id" value="${taskInstance?.taskType?.id}" ></g:select>
                                 </td>
                             </tr> 
Index: /trunk/grails-app/views/taskDetailed/createUnscheduled.gsp
===================================================================
--- /trunk/grails-app/views/taskDetailed/createUnscheduled.gsp	(revision 433)
+++ /trunk/grails-app/views/taskDetailed/createUnscheduled.gsp	(revision 433)
@@ -0,0 +1,155 @@
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Create Task</title>
+        <nav:resources override="true"/>
+        <resource:dateChooser />
+    </head>
+    <body onload="document.createTaskForm.description.focus();">
+        <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:hasErrors bean="${taskInstance}">
+            <div class="errors">
+                <g:renderErrors bean="${taskInstance}" as="list" />
+            </div>
+            </g:hasErrors>
+
+            <g:form action="saveUnscheduled" method="post" name="createTaskForm">
+                <div class="dialog">
+                    <table>
+                        <tbody>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="description">Description:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'description','errors')}">
+                                    <input type="text"  class="description" maxlength="75" id="description" name="description" value="${fieldValue(bean:taskInstance,field:'description')}"/>
+                                    <g:helpBalloon class="helpballoon" code="task.description" />
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="comment">Comment:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'comment','errors')}">
+                                    <textarea  rows="5" cols="40" name="comment">${fieldValue(bean:taskInstance, field:'comment')}</textarea>
+                                    <g:helpBalloon class="helpballoon" code="task.comment" />
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="targetStartDate">Target Start Date:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'targetStartDate','errors')}">
+                                    <richui:dateChooser name="targetStartDate" format="dd-MM-yyyy" value="${taskInstance.targetStartDate}" />
+                                    <g:helpBalloon class="helpballoon" code="task.targetStartDate" />
+                                </td>
+                            </tr> 
+
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="targetCompletionDate">Target Completion Date:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'targetCompletionDate','errors')}">
+                                    <richui:dateChooser name="targetCompletionDate" format="dd-MM-yyyy" value="${taskInstance.targetCompletionDate}" />
+                                    <g:helpBalloon class="helpballoon" code="task.targetCompletionDate" />
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="leadPerson">Lead Person:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'leadPerson','errors')}">
+                                    <g:select optionKey="id" from="${Person.list()}" name="leadPerson.id" value="${taskInstance?.leadPerson?.id}" ></g:select>
+                                    <g:helpBalloon code="task.leadPerson" />
+                                </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="primaryAsset">Asset:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'primaryAsset','errors')}">
+                                    <g:select optionKey="id" from="${Asset.list()}" name="primaryAsset.id" value="${taskInstance?.primaryAsset?.id}" noSelection="['null':'--None--']"></g:select>
+                                    <g:helpBalloon code="task.primaryAsset" />
+                                </td>
+                            </tr>
+
+<!--                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="associatedAssets">Associated Assets:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'associatedAssets','errors')}">
+                                    <g:select id="associatedAssets" name="associatedAssets"
+                                                    from="${Asset.list()}"
+                                                    size="5" multiple="yes" optionKey="id"
+                                                    value="${taskInstance?.associatedAssets?.id}"  noSelection="['':'--None--']"/>
+                                    <g:helpBalloon code="task.associatedAssets" />
+                                </td>
+                            </tr>-->
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="taskPriority">Task Priority:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'taskPriority','errors')}">
+                                    <g:select optionKey="id" from="${unscheduledTaskPriorities}" name="taskPriority.id" value="${taskInstance?.taskPriority?.id}" ></g:select>
+                                </td>
+                            </tr>
+                        
+<!--                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="scheduled">Scheduled:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'scheduled','errors')}">
+                                    <g:checkBox name="scheduled" value="${taskInstance?.scheduled}" ></g:checkBox>
+                                </td>
+                            </tr>-->
+
+<!--                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="parentTask">Parent Task:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'parentTask','errors')}">
+                                    <g:select optionKey="id" from="${Task.findAllByTrash(false)}" name="parentTask.id" value="${taskInstance?.parentTask?.id}" noSelection="['null':'--None--']"></g:select>
+                                </td>
+                            </tr> -->
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="taskGroup">Task Group:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'taskGroup','errors')}">
+                                    <g:select optionKey="id" from="${TaskGroup.list()}" name="taskGroup.id" value="${taskInstance?.taskGroup?.id}" ></g:select>
+                                </td>
+                            </tr> 
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="taskType">Task Type:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'taskType','errors')}">
+                                    ${taskInstance.taskType.encodeAsHTML()}
+                                </td>
+                            </tr> 
+                        
+                        </tbody>
+                    </table>
+                </div>
+                <div class="buttons">
+                    <span class="button"><input class="save" type="submit" value="Create" /></span>
+                </div>
+            </g:form>
+        </div>
+    </body>
+</html>
