Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/AdminHelper.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/AdminHelper.cshtml	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/AdminHelper.cshtml	(revision 11246)
@@ -50,7 +50,24 @@
             url: "@(new HtmlString(url))?start=" + @start + "&end=" + @end + "&userName=" + @userName, datatype: "json", success: function (userResult) {
               $("#" + "@destinationTag").html("");
+              var appendUnits;
               for (var i = 0; i < userResult.length; i++) {
+                if(userResult[i].Key == "Total Waiting Time" || userResult[i].Key == "Total Transfer Time" || userResult[i].Key == "Total Runtime") {
+                  appendUnits = " seconds";
+                }
+                else if (userResult[i].Key == "Memory Required") {
+                  appendUnits = " KB";
+                }
+                else {
+                  appendUnits = "";
+                }
                 $("#" + "@destinationTag").append('<label class="barLabel">' + userResult[i].Key + '</label>');
-                $("#" + "@destinationTag").append('<div class="outerBar"><div class="innerBar" id="InnerBar' + i + '"><label class="innerBarText">' + +userResult[i].Value.toFixed(4) + '</label></div></div><label class="outerBarText" id="OuterText' + i + '">' + +overallResult[i].Value.toFixed(4) + '</label>');
+                $("#" + "@destinationTag").append(
+                  '<div class="outerBar">' +
+                    '<div class="innerBar" id="InnerBar' + i + '">' +
+                      '<label class="innerBarText">' + +userResult[i].Value.toFixed(2) + appendUnits + '</label>' +
+                    '</div>' +
+                  '</div>' +
+                  '<label class="outerBarText" id="OuterText' + i + '">' + +overallResult[i].Value.toFixed(2) + appendUnits + '</label>'
+                );
                 $("#InnerBar" + i).css('width',((userResult[i].Value/overallResult[i].Value)*100).toFixed(2) + '%');
               }
@@ -71,11 +88,18 @@
         $.ajax({
           url: "@(new HtmlString(url))?taskId=" + taskId, datatype: "json", success: function (result) {
+            var appendUnits;
             var appendString = '<table class="moreInfoTable"><tr>';
             for (var i = 0; i < result.length; i++) {
+              if (result[i].Key == "Memory Required") {
+                appendUnits = " KB";
+              }
+              else {
+                appendUnits = "";
+              }
               if(i % 2 == 0 && i != 0) {
                 appendString += '</tr><tr>';
               }
               appendString += '<td class="taskInfoCell"><label class="taskInfoKey">' + result[i].Key + '</label>';
-              appendString += '<label class="taskInfoValue">' + +result[i].Value.toFixed(4) + '</label></td>';
+              appendString += '<label class="taskInfoValue">' + +result[i].Value.toFixed(2) + appendUnits + '</label></td>';
             }
             appendString += '</tr></table>'
@@ -93,12 +117,24 @@
 }
 
-@helper MoreSlaveInfo(string url)
+@helper MoreSlaveInfo(string url, string startDate, string endDate)
 {
   <text>
     function MoreSlaveInfo(caller) {
+      CheckFilters();
       if($(caller).siblings('.moreInfoTable').length == 0) {
         var slaveId = $(caller).attr('id');
+        var GetRequest = "?slaveId=" + slaveId;
+        @if (startDate != null) {
+          @:if(@(startDate)!=null) {
+            @:GetRequest += "&start=" + @startDate;
+          @:}
+        }
+        @if (endDate != null) {
+          @:if(@(endDate)!=null) {
+            @:GetRequest += "&end=" + @endDate;
+          @:}
+        }
         $.ajax({
-          url: "@(new HtmlString(url))?slaveId=" + slaveId, datatype: "json", success: function (result) {
+          url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function (result) {
             var appendString = '<table class="moreInfoTable"><tr>';
             for (var i = 0; i < result[0].length; i++) {
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ChartHelper.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ChartHelper.cshtml	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ChartHelper.cshtml	(revision 11246)
@@ -36,5 +36,6 @@
 }
 
-@helper LineChartTime(string destinationTag, string url, string title = "", double? minY = null, double? maxY = null, string axisYFormat = null) {
+@helper LineChartTime(string destinationTag, string url, string title = "", double? minY = null, double? maxY = null, string axisYFormat = null)
+{
   <script>
     var @(destinationTag)Plot = $.jqplot("@destinationTag", "@url", {
@@ -89,5 +90,6 @@
 }
 
-@helper RefreshChart(string destinationTag, string url, string startDate, string endDate, double? minY=null, double? maxY=null) {
+@helper RefreshChart(string destinationTag, string url, string startDate, string endDate, double? minY = null, double? maxY = null)
+{
   <text>
   $.ajax({url: "@(new HtmlString(url))?start=" + @startDate + "&end=" + @endDate, datatype: "json", success: function(result) {
@@ -97,9 +99,11 @@
     //Resets only the xaxis, still need to resize y with given min/max
     @(destinationTag)Plot.replot({resetAxes:true});
-    @if(minY != null) {
+    @if (minY != null)
+    {
       //If min Y was provided set the plot's min Y value
       @:@(destinationTag)Plot.axes.yaxis.min = @minY;
     }
-    @if(maxY != null) {
+    @if (maxY != null)
+    {
       //If max Y was provided set the plot's max Y value
       @:@(destinationTag)Plot.axes.yaxis.max = @maxY;
@@ -162,9 +166,11 @@
   <text>
     if(@(records).length > @limit) {
-      $("#@container").append('<label class="pageTitle">Page: </label>')
+      var appendPages = '<section class="pageContainer"><label class="pageTitle">Page: </label>';
       var pages = Math.floor(@(records).length/@(limit)) + 1;
       for(var i=0; i < pages; i++) {
-        $("#" + "@container").append('<a id="@(container)Page' + (i + 1) + '" class="page">' + (i + 1) + '</a>')
-      }
+        appendPages += '<a id="@(container)Page' + (i + 1) + '" class="page">' + (i + 1) + '</a>';
+      }
+      appendPages += '</section>';
+      $("#@container").append(appendPages);
       if(@currentPage != null) {
         $("#@(container)Page" + @currentPage).css('color','#F7921D');
@@ -190,5 +196,5 @@
 }
 
-@helper TasksForUser(string destinationTag, string url, string functionName, string userName, string limit, string startDate = null, string endDate = null, string jobId = null, string taskState = null, string pageNumber = null)
+@helper TaskContainers(string destinationTag, string url, string functionName, string userName, string limit, string startDate = null, string endDate = null, string jobId = null, string taskState = null, string pageNumber = null)
 {
   <text>
@@ -235,16 +241,8 @@
       }
       else {
-        var waitTime;
-        var transferTime;
-        var runTime;
-        var seriesDescriptions = ["Time waiting","Time transferring","Time calculating"];
-
         //Checks if multipage display, if it is then trims results to
         //the results for the page to be displayed
         @ChartHelper.NumberPages("result", limit, destinationTag, functionName, pageNumber)
 
-        //Globally accesible, for use when resizing, eliminates extra DB request
-        window["numberTasks"] = result.length;
-
         //Set display of all errors to none, errors matching the tasks will be reset below
         $("#@(destinationTag)").find(".errorContainer, .errorTitle, .errorTask, .errorMessage").css('display','none');
@@ -252,10 +250,20 @@
         //Set variable for tracking jobId and open first job grouping
         var currentJob = result[0].JobId;
-        $("#@(destinationTag)").append('<section class="jobTaskGroup" id="' + result[0].JobId + '"><h1>' + result[0].JobName + '</h1></section>');
 
         //For each result create a seperate collapsable section with a chart and info label
         for(var i = 0; i < result.length; i++){
-          if(currentJob != result[i].JobId) {
-            $("#@(destinationTag)").append('<section class="jobTaskGroup" id="' + result[i].JobId + '"><h1>' + result[i].JobName + '</h1></section>');
+          if(currentJob != result[i].JobId || i == 0) {
+            $("#@(destinationTag)").append(
+              '<section class="jobTaskGroup" id="' + result[i].JobId + '">' +
+                '<h1>' + result[i].JobName + '</h1>' +
+                '<section class="chartContainer">' + 
+                  '<h1 class="title" id="@(destinationTag)' + result[i].JobId + 'PlotTitle">Job Overview - ' + result[i].JobName + '</h1>' + 
+                  '<button class="collapse" onclick="LoadJob(this)">+</button>' + 
+                  '<div id="@(destinationTag)JobOverviewPlot' + i + '"></div>' +
+                  '<label id="@(destinationTag)JobOverviewPlotInfo' + i + '"></label>' + 
+                '</section>' +
+              '</section>'
+            );
+            CollapsedByDefault(document.getElementById("@(destinationTag)JobOverviewPlot" + i));
             currentJob = result[i].JobId;
           }
@@ -263,10 +271,10 @@
             '<section class="chartContainer">' + 
               '<h1 class="title" id="@(destinationTag)' + result[i].TaskId + 'PlotTitle">Task ' + result[i].TaskId + '</h1>' + 
-              '<button class="collapse" onclick="CollapseSection(this)">+</button>' + 
+              '<button class="collapse" onclick="LoadTask(this)">+</button>' + 
               '<div id="@(destinationTag)Plot' + i + '"></div>' + 
               '<label id="@(destinationTag)PlotInfo' + i + '"></label>' + 
               '<a id="' + result[i].TaskId + '" class="moreInfo" onclick="MoreTaskInfo(this)">More Info</a>' +
             '</section>'
-          )
+          );
           //Re-enables the error display if any of the tasks on the page have Ids matching
           //those of errors
@@ -280,17 +288,37 @@
             }
           });
-          waitTime = [result[i].TotalWaiting];
-          transferTime = [result[i].TotalTransfer];
-          runTime = [result[i].TotalRuntime];
-          window["@(destinationTag)Plot" + i] = $.jqplot("@(destinationTag)Plot" + i, [waitTime,transferTime,runTime], {
+          CollapsedByDefault(document.getElementById("@(destinationTag)Plot" + i));
+        }
+      }
+    }});
+  </text>
+}
+
+@helper LoadJob(string url)
+{
+  <text>
+    function LoadJob(caller) {
+      CheckFilters();
+      if($(caller).next().html()=="") {
+        var plotName = $(caller).next().attr('id');
+        //Set current job id
+        var jobId = $(caller).parent().parent().attr('id');
+        var GetRequest = "?jobId=" + jobId;
+
+        $.ajax({ async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+          CollapseSection(caller);
+          var seriesDescription = ['Waiting','Transferring','Calculating','Finished','Error'];
+          window[plotName] = $.jqplot(plotName, [[result.Wait],[result.Transfer],[result.Calculate],[result.Finish],[result.Error]], {
             seriesDefaults:{
               renderer:$.jqplot.BarRenderer,
               shadowAngle: 135,
-              pointLabels: {show: true, formatString: '%.3f'}
+              pointLabels: {show: true, formatString: '%.0f'}
             },
             series:[
-              {label:'Waiting'},
-              {label:'Transferring'},
-              {label:'Calculating'}
+              {label:seriesDescription[0]},
+              {label:seriesDescription[1]},
+              {label:seriesDescription[2]},
+              {label:seriesDescription[3]},
+              {label:seriesDescription[4]}
             ],
             legend: {
@@ -306,5 +334,5 @@
               },
               yaxis: {
-                pad: 0
+                padMax: 1.5
               }
             },
@@ -315,12 +343,79 @@
           /* Bind a datalistener to each chart and display details of clicked
             upon data in the label below the chart */
-          $("#" + "@(destinationTag)Plot" + i).bind('jqplotDataClick', function (ev, seriesIndex, pointIndex, data) {
-            $(this).next("label").html(seriesDescriptions[seriesIndex] + ": " + data[1]);
+          $("#" + plotName).bind('jqplotDataClick', function (ev, seriesIndex, pointIndex, data) {
+            $(this).next("label").html("Tasks " + seriesDescription[seriesIndex] + ": " + data[1]);
           });
-
-          CollapsedByDefault(document.getElementById("@(destinationTag)Plot" + i));
-        }
-      }
-    }});
+        }});
+      }
+      else {
+        CollapseSection(caller);
+      }
+    }
+  </text>
+}
+
+@helper LoadTask(string url)
+{
+  <text>
+    function LoadTask(caller) {
+      CheckFilters();
+      if($(caller).next().html()=="") {
+        var plotName = $(caller).next().attr('id');
+        //Set current slave id
+        var currentTask = $(caller).siblings('a.moreInfo').attr('id');
+        var GetRequest = "?taskId=" + currentTask;
+
+        $.ajax({ async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+          var waitTime;
+          var transferTime;
+          var runTime;
+          var seriesDescriptions = ["Time waiting","Time transferring","Time calculating"];
+          CollapseSection(caller);
+          for(i = 0; i < result.length; i++) {
+            waitTime = [result[i].TotalWaiting];
+            transferTime = [result[i].TotalTransfer];
+            runTime = [result[i].TotalRuntime];
+            window[plotName] = $.jqplot(plotName, [waitTime,transferTime,runTime], {
+              seriesDefaults:{
+                renderer:$.jqplot.BarRenderer,
+                shadowAngle: 135,
+                pointLabels: {show: true, formatString: '%.3f'}
+              },
+              series:[
+                {label:'Waiting'},
+                {label:'Transferring'},
+                {label:'Calculating'}
+              ],
+              legend: {
+                show: true,
+                location: 'e',
+                placement: 'outside'
+              },
+              axes: {
+                xaxis: {
+                  renderer: $.jqplot.CategoryAxisRenderer,
+                  showLabel: false,
+                  pad: 0
+                },
+                yaxis: {
+                  pad: 0
+                }
+              },
+              cursor: {
+                showTooltip: false
+              }
+            });
+            /* Bind a datalistener to each chart and display details of clicked
+              upon data in the label below the chart */
+            $("#" + plotName).bind('jqplotDataClick', function (ev, seriesIndex, pointIndex, data) {
+              $(this).next("label").html(seriesDescriptions[seriesIndex] + ": " + data[1].toFixed(4) + " seconds");
+            });
+          }
+        }});
+      }
+      else {
+        CollapseSection(caller);
+      }
+    }
   </text>
 }
@@ -467,5 +562,5 @@
 }
 
-@helper SlaveInfoChart(string destinationTag, string url, string limit, bool singleSlave, string startDate = null, string endDate = null, string userName = null, string functionName = null, string pageNumber = null, string slaveId = null)
+@helper SlaveContainers(string destinationTag, string url, string limit, bool singleSlave, string startDate = null, string endDate = null, string userName = null, string functionName = null, string pageNumber = null, string slaveId = null)
 {
   <text>
@@ -515,18 +610,25 @@
     @:}
   }
-  $.ajax({
-    async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
-
-    //Set chart names for use in creation below, must be set identically in
-    //ResizeSlaves
+  $.ajax({ async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+    //Set chart names for use in creation below, must be set identically in LoadSlave and ResizeSlaves
     var slaveChartNames = ["TotalUsedCores","TotalUsedMemory","CPUUtilization"];
 
-    var destTag = eval("@(destinationTag)");
-    if(typeof eval("@(destinationTag)") != "string") {
-      destTag = "@(destinationTag)";
+    @if (!singleSlave) {
+      @:$('#@(destinationTag)').html("");
+
+      //Checks if multipage display, if it is then trims results to
+      //the results for the page to be displayed
+      @ChartHelper.NumberPages("result", limit, destinationTag, functionName, pageNumber)
+
+      
+      @:var destTag = "@(destinationTag)";
+    }
+    else {
+      @:var destTag = @(destinationTag);
     }
 
     if(result.length == 0) {
-      @if (!singleSlave) {
+      @if (!singleSlave)
+      {
         @:$('#' + destTag).html("");
       }
@@ -537,17 +639,55 @@
       )
     }
-    else {
-      var time = new Date();
-
-      @if (!singleSlave)
+
+    for(i = 0; i < result.length; i++) {
+      $('#' + destTag).append(
+        '<section class="chartContainer">' + 
+          '<h1 class="title" id="' + destTag + result[i][0].SlaveID + 'PlotTitle">Slave ' + result[i][0].ClientName + '</h1>' + 
+          '<button class="collapse" onclick="LoadSlave(this)">+</button>' + 
+          '<div id="' + destTag + slaveChartNames[0] + 'Plot' + result[i][0].SlaveID + '"></div>' + 
+          '<div id="' + destTag + slaveChartNames[1] + 'Plot' + result[i][0].SlaveID + '"></div>' + 
+          '<div id="' + destTag + slaveChartNames[2] + 'Plot' + result[i][0].SlaveID + '"></div>' + 
+          '<a id="' + result[i][0].SlaveID + '" class="moreInfo" onclick="MoreSlaveInfo(this)">More Info</a>' +
+        '</section>');
+      for(k = 0; k < slaveChartNames.length; k++) {
+        CollapsedByDefault(document.getElementById(destTag + slaveChartNames[k] + "Plot" + result[i][0].SlaveID));
+      }
+    }
+  }});
+  </text>
+}
+
+@helper LoadSlave(string url, string limit, string startDate = null, string endDate = null, string userName = null, string pageNumber = null) {
+  <text>
+  function LoadSlave(caller) {
+    CheckFilters();
+    if($(caller).next().html()=="") {
+      var destTag = $(caller).parent().parent().attr('id');
+      //Set current slave id
+      var currentSlave = $(caller).siblings('a.moreInfo').attr('id');
+      var GetRequest = "?slaveId=" + currentSlave;
+      @if (startDate != null)
       {
-        @:$('#' + destTag).html("");
-
-        //Checks if multipage display, if it is then trims results to
-        //the results for the page to be displayed
-        @ChartHelper.NumberPages("result", limit, destinationTag, functionName, pageNumber)
-      }
-
-      for(i = 0; i < result.length; i++) {
+        @:if(@(startDate)!=null) {
+          @:GetRequest += "&start=" + @startDate;
+        @:}
+      }
+      @if (endDate != null)
+      {
+        @:if(@(endDate)!=null) {
+          @:GetRequest += "&end=" + @endDate;
+        @:}
+      }
+      @if (userName != null)
+      {
+        @:if(@(userName)!=null) {
+          @:GetRequest += "&userName=" + @userName;
+        @:}
+      }
+      $.ajax({ async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+        //Set chart names for use in creation below, must be set identically in SlaveContainers and ResizeSlaves
+        var slaveChartNames = ["TotalUsedCores","TotalUsedMemory","CPUUtilization"];
+        CollapseSection(caller);
+        var time = new Date();
         var coreSeries = [];
         coreSeries[0] = [];
@@ -558,37 +698,28 @@
         var cpuSeries = [];
         cpuSeries[0] = [];
-        $('#' + destTag).append(
-          '<section class="chartContainer">' + 
-            '<h1 class="title" id="' + destTag + result[i][0].SlaveID + 'PlotTitle">Slave ' + result[i][0].ClientName + '</h1>' + 
-            '<button class="collapse" onclick="CollapseSection(this)">+</button>' + 
-            '<div id="' + destTag + slaveChartNames[0] + 'Plot' + i + '"></div>' + 
-            '<div id="' + destTag + slaveChartNames[1] + 'Plot' + i + '"></div>' + 
-            '<div id="' + destTag + slaveChartNames[2] + 'Plot' + i + '"></div>' + 
-            '<a id="' + result[i][0].SlaveID + '" class="moreInfo" onclick="MoreSlaveInfo(this)">More Info</a>' +
-          '</section>');
-        for(j = 0; j < result[i].length; j++) {
-          time.setTime(result[i][j].Time.replace(/\D/g,''));
-          coreSeries[0].push([time.toUTCString(),result[i][j].TotalCores]);
-          coreSeries[1].push([time.toUTCString(),result[i][j].UsedCores]);
-          memorySeries[0].push([time.toUTCString(),(result[i][j].TotalMemory / 1000)]);
-          memorySeries[1].push([time.toUTCString(),(result[i][j].UsedMemory / 1000)]);
-          cpuSeries[0].push([time.toUTCString(),result[i][j].CPUUtilization]);
-        }
-        if(result[i].length > 1) {
-          @ChartHelper.LineChartGivenSeries("destTag + slaveChartNames[0]", "i", "coreSeries", "Total/Used Cores")
-          @ChartHelper.LineChartGivenSeries("destTag + slaveChartNames[1]", "i", "memorySeries", "Total/Used Memory", 0)
-          @ChartHelper.LineChartGivenSeries("destTag + slaveChartNames[2]", "i", "cpuSeries", "CPU Utilization", 0, 100, "%.1f%%")
+        for(i = 0; i < result.length; i++) {
+          time.setTime(result[i].Time.replace(/\D/g,''));
+          coreSeries[0].push([time.toUTCString(),result[i].TotalCores]);
+          coreSeries[1].push([time.toUTCString(),result[i].UsedCores]);
+          memorySeries[0].push([time.toUTCString(),(result[i].TotalMemory / 1000)]);
+          memorySeries[1].push([time.toUTCString(),(result[i].UsedMemory / 1000)]);
+          cpuSeries[0].push([time.toUTCString(),result[i].CPUUtilization]);
+        }
+        if(result.length > 1) {
+          @ChartHelper.LineChartGivenSeries("destTag + slaveChartNames[0]", "currentSlave", "coreSeries", "Total/Used Cores")
+          @ChartHelper.LineChartGivenSeries("destTag + slaveChartNames[1]", "currentSlave", "memorySeries", "Total/Used Memory", 0)
+          @ChartHelper.LineChartGivenSeries("destTag + slaveChartNames[2]", "currentSlave", "cpuSeries", "CPU Utilization", 0, 100, "%.1f%%")
         }
         else {
-          @ChartHelper.BarChartGivenSeries("destTag + slaveChartNames[0]", "i", "coreSeries", "Total/Used Cores")
-          @ChartHelper.BarChartGivenSeries("destTag + slaveChartNames[1]", "i", "memorySeries", "Total/Used Memory", 0)
-          @ChartHelper.BarChartGivenSeries("destTag + slaveChartNames[2]", "i", "cpuSeries", "CPU Utilization", 0, 100, "%.1f%%")
-        }
-        for(k = 0; k < slaveChartNames.length; k++) {
-          CollapsedByDefault(document.getElementById(destTag + slaveChartNames[k] + "Plot" + i));
-        }
-      }
-    }
-  }});
+          @ChartHelper.BarChartGivenSeries("destTag + slaveChartNames[0]", "currentSlave", "coreSeries", "Total/Used Cores")
+          @ChartHelper.BarChartGivenSeries("destTag + slaveChartNames[1]", "currentSlave", "memorySeries", "Total/Used Memory", 0)
+          @ChartHelper.BarChartGivenSeries("destTag + slaveChartNames[2]", "currentSlave", "cpuSeries", "CPU Utilization", 0, 100, "%.1f%%")
+        }
+      }});
+    }
+    else {
+      CollapseSection(caller);
+    }
+  }
   </text>
 }
@@ -686,2 +817,60 @@
   </text>
 }
+
+@helper UserTasks(string url, string insertAfter, string taskState) {
+  <text>
+    var GetRequest = "?taskState=@(taskState)";
+
+    $.ajax({ async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+      if(result.length==0) {
+        $("@(insertAfter)").after(
+          '<section class="chartContainer">' + 
+            '<h1 class="title">No users currently have any tasks ' + @(taskState) + '!</h1>' + 
+          '</section>'
+        )
+      }
+      else {
+        $("@(insertAfter)").after(
+          '<section class="chartContainer">' + 
+            '<h1 class="title" id="UserTask@(taskState)PlotTitle">@(taskState) Tasks</h1>' + 
+            '<button class="collapse" onclick="CollapseSection(this)">-</button>' + 
+            '<div id="UserTask@(taskState)Plot" class="noXTicks"></div>' +
+          '</section>'
+        );
+      }
+      var userTasks = [];
+      var userNames = [];
+      for (i=0; i < result.length; i++) {
+        userTasks[i] = [result[i].Value];
+        userNames[i] = { label: result[i].Key };
+      }
+      window["UserTask@(taskState)Plot"] = $.jqplot("UserTask@(taskState)Plot", userTasks, {
+        title: "Users with @(taskState) Tasks",
+        seriesDefaults:{
+          renderer:$.jqplot.BarRenderer,
+          shadowAngle: 135,
+          pointLabels: {show: true, formatString: '%.3f'}
+        },
+        series: userNames,
+        legend: {
+          show: true,
+          location: 'e',
+          placement: 'outside'
+        },
+        axes: {
+          xaxis: {
+            renderer: $.jqplot.CategoryAxisRenderer,
+            showTicks: false,
+            pad: 0
+          },
+          yaxis: {
+            padMax: 1.5
+          }
+        },
+        cursor: {
+          showTooltip: false
+        }
+      });
+    }});
+  </text>
+}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ExceptionHelper.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ExceptionHelper.cshtml	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ExceptionHelper.cshtml	(revision 11246)
@@ -18,5 +18,5 @@
  *@
 
-@helper UserExceptions(string destinationTag, string url, string limit, string userName = null, string startDate = null, string endDate = null, string jobId = null, string taskState = null, string slaveId=null)
+@helper UserExceptions(string destinationTag, string url, string userName = null, string startDate = null, string endDate = null, string jobId = null, string taskState = null, string slaveId=null)
 {
   <text>
@@ -88,5 +88,10 @@
   }
 
-  $.ajax({async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+  $.ajax({async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json",
+    error: function(xhr,err) {
+      alert("readyState: "+xhr.readyState+"\nstatus: "+xhr.status);
+      alert("responseText: "+xhr.responseText);
+    },
+    success: function(result) {
       $("#" + "@destinationTag").html("");
       if(result.Key.length > 0) {
@@ -96,6 +101,12 @@
                           '<label class="errorMessage underline">Error</label>';
         for (var i = 0; i < result.Key.length; i++) {
-          ErrorHTML += '<a class="errorTask" onclick="ScrollTo(this)">' + result.Key[i] + '</a>' + 
-                        '<label class="errorMessage">' + result.Value[i] + '</label>';
+          ErrorHTML += '<a class="errorTask" onclick="ScrollTo(this)">' + result.Key[i] + '</a>';
+          if(result.Value[i].length > 100) {
+            ErrorHTML += '<a class="errorMessage shortVerison" onclick="ShowFullError(this)">Click to show full message</a>';
+            ErrorHTML += '<label class="errorMessage longVersion">' + result.Value[i] + '</label>';
+          }
+          else {
+            ErrorHTML += '<label class="errorMessage">' + result.Value[i] + '</label>';
+          }
         }
         ErrorHTML += '</section>';
@@ -118,5 +129,5 @@
     function ScrollTo(caller) {
       var taskErrorId = $(caller).parent().parent().attr('id') + $(caller).html() + "PlotTitle";
-      OpenOnError(document.getElementById(taskErrorId));
+      $("#" + taskErrorId).parent().find("button").click();
       $('html, body').animate({
           scrollTop: $("#" + taskErrorId).parent().offset().top
@@ -238,6 +249,8 @@
   function ShowSlaveInfo(caller) {
     var taskSlaveId = $(caller).attr('id');
+    CheckFilters();
     if($(caller).parent().parent().children(".chartContainer").length == 0) {
-      @ChartHelper.SlaveInfoChart("caller.parentNode.parentNode.id",url,limit,true,startDate,endDate,null,null,null,"taskSlaveId")
+      var destinationTag = $(caller).parent().parent().attr('id');
+      @ChartHelper.SlaveContainers("destinationTag",url,limit,true,startDate,endDate,null,null,null,"taskSlaveId")
     }
     else {
@@ -247,2 +260,11 @@
   </text>
 }
+
+@helper ShowFullError() {
+  <text>
+  function ShowFullError(caller) {
+    $(caller).css('display','none');
+    $(caller).next().css('display','inline-block');
+  }
+  </text>
+}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Content/Site.css
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Content/Site.css	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Content/Site.css	(revision 11246)
@@ -94,8 +94,13 @@
 .errorTask {
   margin-left: 2%;
-}
-
-a.errorTask {
+  vertical-align: top;
+}
+
+a.errorTask, .shortVerison {
   cursor: pointer;
+}
+
+.shortVerison {
+  text-decoration: underline;
 }
 
@@ -294,4 +299,9 @@
 
 /* Multi-page Task Styles */
+.pageContainer {
+  width: 100%;
+  padding-left: 2%;
+}
+
 .pageTitle, .page {
   margin-right: 1%;
@@ -300,11 +310,8 @@
 }
 
-.pageTitle {
-  margin-left: 2%;
-}
-
 .page {
   text-decoration: underline;
   cursor: pointer;
+  display: inline-block;
 }
 
@@ -516,4 +523,36 @@
   background-color: rgba(247,146,29,0.42);
 }
+
+.noXTicks .jqplot-xaxis {
+  display: none;
+}
+
+.currentStats table {
+  width: 66%;
+  margin: 2% 0% 0% 17%;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  border: 1px solid #8297F5;
+}
+
+.currentStats td:first-of-type, .currentStats td:nth-of-type(3) {
+  width: 35%;
+  padding-top: 1%;
+  padding-left: 1%;
+}
+
+.currentStats td:nth-of-type(2), .currentStats td:nth-of-type(4) {
+  width: 15%;
+}
+
+.currentStats tr:last-of-type td {
+  padding-bottom: 1%;
+}
+
+.currentStats tr td:nth-of-type(2) {
+  border-right: 1px solid #8297F5;
+}
+
 /* User Page Styles*/
 #TasksContainer div[id^="Task"] {
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/AdminDataController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/AdminDataController.cs	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/AdminDataController.cs	(revision 11246)
@@ -73,9 +73,11 @@
     }
 
-    public JsonResult MoreSlaveInfo(string slaveId) {
+    public JsonResult MoreSlaveInfo(string slaveId, DateTime? start = null, DateTime? end = null) {
       using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
       {
         var moreInfo = (from slaves in db.FactClientInfos
-                        where slaves.ClientId.ToString() == slaveId
+                        where slaves.ClientId.ToString() == slaveId &&
+                        (!start.HasValue || slaves.Time >= start) &&
+                        (!end.HasValue || slaves.Time < end)
                         select new
                         {
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ChartDataController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ChartDataController.cs	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ChartDataController.cs	(revision 11246)
@@ -139,6 +139,8 @@
     }
 
-    public JsonResult UserTask(string userName, DateTime? start = null, DateTime? end = null, string jobId = null, string taskState=null) {
-      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString)) {
+    public JsonResult GetTasks(string userName, DateTime? start = null, DateTime? end = null, string jobId = null, string taskState = null)
+    {
+      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
+      {
         TaskState? state = GetTaskState(taskState);
 
@@ -157,4 +159,24 @@
              JobId = jobs.JobId,
              TaskId = tasks.TaskId,
+             StartDate = tasks.StartTime
+           }).OrderByDescending(s => s.StartDate).ToList();
+
+        //Was overflowing default MaxJsonLength
+        //return Json(data, JsonRequestBehavior.AllowGet);
+        return new JsonResult() { Data = data, JsonRequestBehavior = JsonRequestBehavior.AllowGet, MaxJsonLength = Int32.MaxValue };
+      }
+    }
+
+    public JsonResult TaskInfo(string taskId)
+    {
+      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
+      {
+        var data =
+          (from tasks in db.FactTasks
+           join jobs in db.DimJobs
+             on tasks.JobId equals jobs.JobId
+           where tasks.TaskId.ToString() == taskId
+           select new
+           {
              TotalWaiting = tasks.TotalWaitingTime,
              TotalTransfer = tasks.TotalTransferTime,
@@ -167,5 +189,5 @@
     }
 
-    public JsonResult SlaveInfo(DateTime? start = null, DateTime? end = null, string userName = null, string slaveId=null)
+    public JsonResult GetSlaves(DateTime? start = null, DateTime? end = null, string userName = null, string slaveId = null)
     {
       using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
@@ -185,4 +207,28 @@
              ClientName = clients.Name,
              SlaveID = slaves.ClientId,
+           }).GroupBy(s => s.SlaveID).ToList();
+        //Was overflowing default MaxJsonLength
+        //return Json(data, JsonRequestBehavior.AllowGet);
+        return new JsonResult() { Data = data, JsonRequestBehavior = JsonRequestBehavior.AllowGet, MaxJsonLength = Int32.MaxValue };
+      }
+    }
+
+    public JsonResult SlaveInfo(string slaveId, DateTime? start = null, DateTime? end = null, string userName = null) {
+      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
+      {
+        var data =
+          (from slaves in db.FactClientInfos
+           join users in db.DimUsers
+            on slaves.UserId equals users.UserId
+           join clients in db.DimClients
+            on slaves.ClientId equals clients.Id
+           where  slaves.ClientId.ToString() == slaveId && 
+           (!start.HasValue || slaves.Time >= start) &&
+           (!end.HasValue || slaves.Time < end) &&
+           (string.IsNullOrEmpty(userName) || users.Name == userName)
+           select new
+           {
+             ClientName = clients.Name,
+             SlaveID = slaves.ClientId,
              Time = slaves.Time,
              UsedCores = slaves.NumUsedCores,
@@ -191,7 +237,71 @@
              TotalMemory = slaves.TotalMemory,
              CPUUtilization = slaves.CpuUtilization
-           }).OrderByDescending(s => s.Time).GroupBy(s => s.SlaveID).ToList();
+           }).OrderByDescending(s => s.Time).ToList();
 
         return Json(data, JsonRequestBehavior.AllowGet);
+      }
+    }
+
+    public JsonResult JobProgress(string jobId) {
+      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString)) {
+        var data =
+          (from tasks in db.FactTasks
+           where tasks.JobId.ToString() == jobId
+           select new
+           {
+             State = tasks.TaskState
+           }).ToList();
+
+        Dictionary<string, int> JobTasks = new Dictionary<string,int>();
+        JobTasks.Add("Wait",0);
+        JobTasks.Add("Transfer", 0);
+        JobTasks.Add("Calculate", 0);
+        JobTasks.Add("Finish", 0);
+        JobTasks.Add("Error", 0);
+
+        foreach(var record in data) {
+          switch (record.State) {
+            case TaskState.Waiting:
+              JobTasks["Wait"] += 1;
+              break;
+            case TaskState.Transferring:
+              JobTasks["Transfer"] += 1;
+              break;
+            case TaskState.Calculating:
+              JobTasks["Calculate"] += 1;
+              break;
+            case TaskState.Finished:
+              JobTasks["Finish"] += 1;
+              break;
+            case TaskState.Aborted:
+            case TaskState.Failed:
+              JobTasks["Error"] += 1;
+              break;
+          }
+        }
+
+        return Json(JobTasks, JsonRequestBehavior.AllowGet);
+      }
+    }
+
+    public JsonResult UserTasks(string taskState) {
+      TaskState? state = GetTaskState(taskState);
+      List<KeyValuePair<string, int>> numberTasksByUser = new List<KeyValuePair<string,int>>();
+      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString)) {
+        var userTasks = (from tasks in db.FactTasks
+                         join jobs in db.DimJobs
+                           on tasks.JobId equals jobs.JobId
+                         where tasks.TaskState == state
+                         select new
+                         {
+                           UserID = jobs.UserId,
+                           UserName = jobs.UserName,
+                           State = tasks.TaskState
+                         }).GroupBy(j => j.UserID).ToList();
+
+        foreach (var user in userTasks) {
+          numberTasksByUser.Add(new KeyValuePair<string, int>(user.First().UserName, user.Count()));
+        }
+        return Json(numberTasksByUser, JsonRequestBehavior.AllowGet);
       }
     }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ExceptionDataController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ExceptionDataController.cs	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ExceptionDataController.cs	(revision 11246)
@@ -36,10 +36,12 @@
         data.ForEach(t => Task.Add(t.TaskID.ToString()));
         data.ForEach(e => Error.Add(e.ErrorMessage));
-
-        return Json(new KeyValuePair<List<string>, List<string>>(Task, Error), JsonRequestBehavior.AllowGet);
+        
+        //Was overflowing default MaxJsonLength
+        //return Json(new KeyValuePair<List<string>, List<string>>(Task, Error), JsonRequestBehavior.AllowGet);
+        return new JsonResult() { Data = new KeyValuePair<List<string>, List<string>>(Task, Error), JsonRequestBehavior = JsonRequestBehavior.AllowGet, MaxJsonLength = Int32.MaxValue };
       }
     }
 
-    public JsonResult SlaveExceptions(string limit, DateTime? start = null, DateTime? end = null, string clientId = null) {
+    public JsonResult SlaveExceptions(DateTime? start = null, DateTime? end = null, string clientId = null) {
       using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString)) {
         var data =
@@ -73,5 +75,7 @@
           );
         }
-        return Json(results, JsonRequestBehavior.AllowGet);
+        //Was overflowing default MaxJsonLength
+        //return Json(results, JsonRequestBehavior.AllowGet);
+        return new JsonResult() { Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet, MaxJsonLength = Int32.MaxValue };
       }
     }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/HomeController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/HomeController.cs	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/HomeController.cs	(revision 11246)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using System.Web.Mvc;
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Models/OverallStatistics.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Models/OverallStatistics.cs	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Models/OverallStatistics.cs	(revision 11246)
@@ -1,3 +1,5 @@
-﻿namespace HeuristicLab.Services.Hive.Statistics.Models {
+﻿using System;
+using System.Collections.Generic;
+namespace HeuristicLab.Services.Hive.Statistics.Models {
   public class OverallStatus {
     public int OverallCurrentlyAvailableCores { get; set; }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/Index.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/Index.cshtml	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/Index.cshtml	(revision 11246)
@@ -6,4 +6,26 @@
 
 <h1>Current Status</h1>
+<section class="currentStats">
+  <table>
+    <tr>
+      <td>Overall Available Cores</td>
+      <td>@Model.OverallCurrentlyAvailableCores</td>
+      <td>System-wide Waiting Tasks</td>
+      <td>@Model.CurrentlyJobsWaiting</td>
+    </tr>
+    <tr>
+      <td>Real Available Cores</td>
+      <td>@Model.CurrentlyAvailableCores</td>
+      <td>Overall Average CPU Utilization</td>
+      <td>@Model.OverallCpuUtilization</td>
+    </tr>
+    <tr>
+      <td>Used Cores</td>
+      <td>@Model.CurrentlyUsedCores</td>
+      <td>Real Average CPU Utilization</td>
+      <td>@Model.AvailableCpuUtilization</td>
+    </tr>
+  </table>
+</section>
 <section class="chartContainer">
   <h1 class="title">Current Hive Status</h1>
@@ -13,5 +35,4 @@
   <div id="CurrentTotalUsedMemory"></div>
 </section>
-
 <section class="chartContainer">
   <h1 class="title">Historic Hive Status</h1>
@@ -49,4 +70,7 @@
 
   @Scripts.Render("~/Scripts/jqPlot/jquery.jqplot")
+  @Scripts.Render("~/Scripts/jqPlot/plugins/jqplot.barRenderer.min.js")
+  @Scripts.Render("~/Scripts/jqPlot/plugins/jqplot.categoryAxisRenderer.min.js")
+  @Scripts.Render("~/Scripts/jqPlot/plugins/jqplot.pointLabels.min.js")
   @ChartHelper.AjaxDataRenderer()
 
@@ -80,4 +104,7 @@
         RefreshCharts();
       });
+
+      @ChartHelper.UserTasks(Url.Action("UserTasks", "ChartData"), "section.currentStats", "Calculating");
+      @ChartHelper.UserTasks(Url.Action("UserTasks", "ChartData"), "section.currentStats", "Waiting");
     });
 
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/Admin.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/Admin.cshtml	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/Admin.cshtml	(revision 11246)
@@ -2,11 +2,13 @@
 
 @{
-    ViewBag.Title = "Admin";
-}
-
-@if(!Model.IsAdmin) {
+  ViewBag.Title = "Admin";
+}
+
+@if (!Model.IsAdmin)
+{
   <h1>The user you are logged in as: @Model.UserName, is not an administrator.</h1>
 }
-else {
+else
+{
     <!--[if gte IE 9]>
     <style type="text/css">
@@ -227,7 +229,7 @@
     //User Overview
     function RefreshUser() {
-      CheckFilters("User");
-      @ExceptionHelper.UserExceptions("TasksContainer", Url.Action("TaskExceptions", "ExceptionData"), "limit", "selectedUser", "startDate", "endDate", "jobId", "taskState")
-      @ChartHelper.TasksForUser("TasksContainer",Url.Action("UserTask", "ChartData"), "RefreshUser", "selectedUser", "limit", "startDate", "endDate", "jobId", "taskState", "pageNumber")
+      CheckFilters();
+      @ExceptionHelper.UserExceptions("TasksContainer", Url.Action("TaskExceptions", "ExceptionData"), "selectedUser", "startDate", "endDate", "jobId", "taskState")
+      @ChartHelper.TaskContainers("TasksContainer", Url.Action("GetTasks", "ChartData"), "RefreshUser", "selectedUser", "limit", "startDate", "endDate", "jobId", "taskState", "pageNumber")
       pageNumber = null;
     }
@@ -235,9 +237,10 @@
     //Task Overview
     $("#TaskUserList").change(function () {
+      CheckFilters();
       RefreshTask();
     });
 
     function RefreshTask() {
-      CheckFilters("Task");
+      CheckFilters();
       @AdminHelper.UserTaskStats("TaskStatsContainer", Url.Action("TaskStats", "AdminData"), "selectedUser", "startDate", "endDate")
     }
@@ -245,6 +248,6 @@
     //Slave Overview
     function RefreshSlave() {
-      CheckFilters("Slave");
-      @ChartHelper.SlaveInfoChart("SlavesContainer", Url.Action("SlaveInfo", "ChartData"), "limit", false, "startDate", "endDate", "selectedUser", "RefreshSlave", "pageNumber")
+      CheckFilters();
+      @ChartHelper.SlaveContainers("SlavesContainer", Url.Action("GetSlaves", "ChartData"), "limit", false, "startDate", "endDate", "selectedUser", "RefreshSlave", "pageNumber")
       pageNumber = null;
     }
@@ -256,16 +259,15 @@
 
     function RefreshException() {
-      CheckFilters("Exception");
-      @ExceptionHelper.UserExceptions("ExceptionContainer",Url.Action("TaskExceptions","ExceptionData"),"limit",null,"startDate","endDate",null,null,"selectedSlave")
-      @ExceptionHelper.ErrorsOnSlaves("ExceptionContainer",Url.Action("SlaveExceptions","ExceptionData"),"limit","startDate","endDate","selectedSlave","RefreshException","pageNumber")
-    }
-    @ExceptionHelper.ShowSlaveInfo(Url.Action("SlaveInfo","ChartData"),"limit","startDate","endDate")
+      CheckFilters();
+      @ExceptionHelper.UserExceptions("ExceptionContainer", Url.Action("TaskExceptions", "ExceptionData"), null, "startDate", "endDate", null, null, "selectedSlave")
+      @ExceptionHelper.ErrorsOnSlaves("ExceptionContainer", Url.Action("SlaveExceptions", "ExceptionData"), "limit", "startDate", "endDate", "selectedSlave", "RefreshException", "pageNumber")
+    }
 
     //General Chart Methods
-    function CheckFilters(currentTab) {
+    function CheckFilters() {
       startDate = null;
       endDate = null;
-      switch(currentTab) {
-        case "User":
+      switch($('.tabSection:visible').attr('id')) {
+        case "UserOverviewTab":
           selectedUser = $("#UserList").val();
           jobId = null;
@@ -283,10 +285,10 @@
           }
           break;
-        case "Task":
+        case "TaskOverviewTab":
           selectedUser = $("#TaskUserList").val();
           startDate = $('#TaskStart').val();
           endDate = $('#TaskEnd').val();
           break;
-        case "Slave":
+        case "SlaveOverviewTab":
           selectedUser = null;
           limit = $("#SlaveLimit").val();
@@ -299,6 +301,7 @@
           }
           break;
-        case "Exception":
+        case "ExceptionOverviewTab":
           selectedSlave = null;
+          selectedUser = null;
           limit = $("#ExceptionLimit").val();
           if ($("[value='ExceptionDate']").is(":checked")) {
@@ -313,7 +316,12 @@
 
     @ChartHelper.ResizeCharts()
+    @ChartHelper.LoadTask(Url.Action("TaskInfo", "ChartData"))
+    @ChartHelper.LoadJob(Url.Action("JobProgress", "ChartData"))
+    @ChartHelper.LoadSlave(Url.Action("SlaveInfo", "ChartData"), "limit", "startDate", "endDate", "selectedUser", "pageNumber")
     @ExceptionHelper.ScrollToException()
-    @AdminHelper.MoreTaskInfo(Url.Action("MoreTaskInfo","AdminData"))
-    @AdminHelper.MoreSlaveInfo(Url.Action("MoreSlaveInfo","AdminData"))
+    @ExceptionHelper.ShowFullError()
+    @ExceptionHelper.ShowSlaveInfo(Url.Action("GetSlaves", "ChartData"), "limit", "startDate", "endDate")
+    @AdminHelper.MoreTaskInfo(Url.Action("MoreTaskInfo", "AdminData"))
+    @AdminHelper.MoreSlaveInfo(Url.Action("MoreSlaveInfo", "AdminData"), "startDate", "endDate")
   </script>
 }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/UserTask.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/UserTask.cshtml	(revision 11245)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/UserTask.cshtml	(revision 11246)
@@ -114,27 +114,12 @@
 
     function TaskInformation() {
-      limit = $('#Limit').val();
-      startDate = null;
-      endDate = null;
-      jobId = null;
-      taskState = null;
-      if ($("[value='Date']").is(":checked")) {
-        startDate = $('#InfoStart').val();
-        endDate = $('#InfoEnd').val();
-      }
-      if ($("[value='JobName']").is(':checked')) {
-        jobId = $('#JobNames').val();
-      }
-      if ($("[value='TaskState']").is(':checked')) {
-        taskState = $('#TaskStates').val();
-      }
-      @ExceptionHelper.UserExceptions("TasksContainer",Url.Action("TaskExceptions", "ExceptionData"),"limit","userName","startDate","endDate","jobId","taskState")
-      @ChartHelper.TasksForUser("TasksContainer",Url.Action("UserTask", "ChartData"),"TaskInformation","userName","limit","startDate","endDate","jobId","taskState","pageNumber")
+      CheckFilters();
+      @ExceptionHelper.UserExceptions("TasksContainer",Url.Action("TaskExceptions", "ExceptionData"),"userName","startDate","endDate","jobId","taskState")
+      @ChartHelper.TaskContainers("TasksContainer",Url.Action("GetTasks", "ChartData"),"TaskInformation","userName","limit","startDate","endDate","jobId","taskState","pageNumber")
       pageNumber = null;
     }
 
     function TaskOverview() {
-      startDate = $('#OverviewStart').val();
-      endDate = $('#OverviewEnd').val();
+      CheckFilters();
       @AdminHelper.UserTaskStats("TaskStatsContainer",Url.Action("TaskStats", "AdminData"),"userName","startDate","endDate")
     }
@@ -148,7 +133,36 @@
     })
 
+    //General Chart Methods
+    function CheckFilters() {
+      startDate = null;
+      endDate = null;
+      switch ($('.tabSection:visible').attr('id')) {
+        case "TaskInformationTab":
+          limit = $('#Limit').val();
+          jobId = null;
+          taskState = null;
+          if ($("[value='Date']").is(":checked")) {
+            startDate = $('#InfoStart').val();
+            endDate = $('#InfoEnd').val();
+          }
+          if ($("[value='JobName']").is(':checked')) {
+            jobId = $('#JobNames').val();
+          }
+          if ($("[value='TaskState']").is(':checked')) {
+            taskState = $('#TaskStates').val();
+          }
+          break;
+        case "TaskOverviewTab":
+          startDate = $('#OverviewStart').val();
+          endDate = $('#OverviewEnd').val();
+          break;
+      }
+    }
     TaskInformation();
     @ChartHelper.ResizeCharts()
+    @ChartHelper.LoadTask(Url.Action("TaskInfo", "ChartData"))
+    @ChartHelper.LoadJob(Url.Action("JobProgress", "ChartData"))
     @ExceptionHelper.ScrollToException()
+    @ExceptionHelper.ShowFullError()
     @AdminHelper.MoreTaskInfo(Url.Action("MoreTaskInfo","AdminData"))
   </script>
