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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ChartHelper.cshtml	(revision 11053)
@@ -160,82 +160,96 @@
     $.ajax({
       async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
-      if(result.length==0) {
+      if(@(userName) == null) {
         $("#@container").append(
-          '<section class="chartContainer"><h1 class="title">' + @userName + ' has no tasks for the specified filters!</h1></section>'
+          '<section class="chartContainer">' + 
+            '<h1 class="title">Please select a user!</h1>' + 
+          '</section>'
         )
       }
-      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,container,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
-      $(".errorContainer, .errorTitle, .errorTask, .errorMessage").css('display','none');
-
-      //For each result create a seperate collapsable section with a chart and info label
-      for(var i = 0; i < result.length; i++){
-        $("#" + "@container").append(
-          '<section class="chartContainer"><h1 class="title" id="' + result[i].Key + '">Task ' + result[i].Key + 
-          '</h1><button class="collapse" onclick="collapseSection(this)">+</button><div id="@(destinationTag)' + i + 
-          '"></div><label id="@(destinationTag)' + i + 'Info"></label></section>'
+      else if(result.length==0) {
+        $("#@container").append(
+          '<section class="chartContainer">' + 
+            '<h1 class="title">' + @userName + ' has no tasks for the specified filters!</h1>' + 
+          '</section>'
         )
-        //Re-enables the error display if any of the tasks on the page have Ids matching
-        //those of errors
-        $(".errorTask").each(function() { 
-          if($(this).html()==result[i].Key) {
-            $("#" + result[i].Key).css("color","red");
-            $("#" + result[i].Key).append(" - ERROR");
-            $(".errorContainer, .errorTitle, .underline").css('display','inline-block');
-            $(this).css('display','inline-block');
-            $(this).next().css('display','inline-block');
-          }
-        });
-        waitTime = [result[i].Value[0]];
-        transferTime = [result[i].Value[1]];
-        runTime = [result[i].Value[2]];
-        window["@(destinationTag)Plot" + i] = $.jqplot("@destinationTag" + i, [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
+      }
+      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,container,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
+        $("#@(container)").find(".errorContainer, .errorTitle, .errorTask, .errorMessage").css('display','none');
+
+        //For each result create a seperate collapsable section with a chart and info label
+        for(var i = 0; i < result.length; i++){
+          $("#" + "@container").append(
+            '<section class="chartContainer">' + 
+              '<h1 class="title" id="@(container)' + result[i].Key + '">Task ' + result[i].Key + '</h1>' + 
+              '<button class="collapse" onclick="CollapseSection(this)">+</button>' + 
+              '<div id="@(destinationTag)Plot' + i + '"></div>' + 
+              '<label id="@(destinationTag)PlotInfo' + i + '"></label>' + 
+            '</section>'
+          )
+          //Re-enables the error display if any of the tasks on the page have Ids matching
+          //those of errors
+          $(".errorTask").each(function() { 
+            if($(this).html()==result[i].Key) {
+              $("#@(container)" + result[i].Key).css("color","red");
+              $("#@(container)" + result[i].Key).append(" - ERROR");
+              $(".errorContainer, .errorTitle, .underline").css('display','inline-block');
+              $(this).css('display','inline-block');
+              $(this).next().css('display','inline-block');
+            }
+          });
+          waitTime = [result[i].Value[0]];
+          transferTime = [result[i].Value[1]];
+          runTime = [result[i].Value[2]];
+          window["@(destinationTag)Plot" + i] = $.jqplot("@(destinationTag)Plot" + i, [waitTime,transferTime,runTime], {
+            seriesDefaults:{
+              renderer:$.jqplot.BarRenderer,
+              shadowAngle: 135,
+              pointLabels: {show: true, formatString: '%.3f'}
             },
-            yaxis: {
-              pad: 0
+            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
             }
-          },
-          cursor: {
-            showTooltip: false
-          }
-        });
-        /* Bind a datalistener to each chart and display details of clicked
-          upon data in the label below the chart */
-        $("#" + "@(destinationTag)" + i).bind('jqplotDataClick', function (ev, seriesIndex, pointIndex, data) {
-          $("#" + $(this).attr('id') + "Info").html(seriesDescriptions[seriesIndex] + ': ' + data[1]);
-        });
-
-        collapsedByDefault(document.getElementById("@(destinationTag)" + i));
+          });
+          /* 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).siblings("label").html(seriesDescriptions[seriesIndex] + ": " + data[1]);
+          });
+
+          CollapsedByDefault(document.getElementById("@(container)" + result[i].Key));
+        }
       }
     }});
@@ -248,9 +262,11 @@
   //Resize event, resets bar width for task charts and replots them
   $(window).resize(function() {
-    for(var i = 0; i < numberTasks; i++) {
-      $.each(window[ "@(destinationTag)Plot" + i].series, function(index, series) { 
-        series.barWidth = undefined; 
-      });
-      window["@(destinationTag)Plot" + i].replot({ resetAxes: true });
+    if(typeof numberTasks !== 'undefined') {
+      for(var i = 0; i < numberTasks; i++) {
+        $.each(window[ "@(destinationTag)Plot" + i].series, function(index, series) { 
+          series.barWidth = undefined; 
+        });
+        window["@(destinationTag)Plot" + i].replot({ resetAxes: true });
+      }
     }
   });
@@ -269,5 +285,5 @@
   //Used to return a string containing the names of the series
   //to be used in plot creation
-  function getSeries(numberData,dataName){ 
+  function GetSeries(numberData,dataName){ 
     var result = "[";
     for(i=0; i < numberData; i++) {
@@ -348,10 +364,9 @@
   //Declares the jqPlot variable, evals the string of series returned
   //from getSeries which allows for any number of series
-  window[ "@(destinationTag)Plot"] = $.jqplot('@destinationTag', eval(getSeries(@(dataName)CurrentValue.length,"@(dataName)Data")), @(destinationTag)PlotOptions);
-  </text>
-}
-
-@helper UpdateStreamChart(string dataName, string destinationTag, string url, string fixedY = null)
-{
+  window[ "@(destinationTag)Plot"] = $.jqplot('@destinationTag', eval(GetSeries(@(dataName)CurrentValue.length,"@(dataName)Data")), @(destinationTag)PlotOptions);
+  </text>
+}
+
+@helper UpdateStreamChart(string dataName, string destinationTag, string url, string fixedY = null) {
   <text>
   //If the data is beyond chartSize use shift to trim one off the end
@@ -390,10 +405,9 @@
   //Re-assigns the jqPlot variable, evals the string of series returned
   //from getSeries which allows for any number of series
-  @(destinationTag)Plot = $.jqplot('@destinationTag', eval(getSeries(@(dataName)CurrentValue.length,"@(dataName)Data")), @(destinationTag)PlotOptions);
-  </text>
-}
-
-@helper SlaveInfoChart(string destinationTag, string url, string limit, string startDate, string endDate, string userName, string functionName, string pageNumber=null)
-{
+  @(destinationTag)Plot = $.jqplot('@destinationTag', eval(GetSeries(@(dataName)CurrentValue.length,"@(dataName)Data")), @(destinationTag)PlotOptions);
+  </text>
+}
+
+@helper SlaveInfoChart(string destinationTag, string url, string limit, string startDate, string endDate, string userName, string functionName, string pageNumber=null, string slaveId=null) {
   <text>
   var GetRequest = "?limit=" + @(limit);
@@ -413,26 +427,51 @@
     @:}
   }
+  @if (slaveId != null) {
+    @:if(@(slaveId)!=null) {
+      @:GetRequest += "&slaveId=" + @slaveId;
+    @:}
+  }
   $.ajax({
     async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
-    $("#@(destinationTag)").html("");
-    var time = new Date();
-
-    //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++) {
-      var coreSeries = [];
-      coreSeries[0] = [];
-      coreSeries[1] = [];
-      var memorySeries = [];
-      memorySeries[0] = [];
-      memorySeries[1] = [];
-      var cpuSeries = [];
-      cpuSeries[0] = [];
-      $("#@(destinationTag)").append('<section class="chartContainer"><h1 class="title" id="' + result[i][0].SlaveID + '">Slave ' 
-        + result[i][0].SlaveID + '</h1><button class="collapse" onclick="collapseSection(this)">+</button>' + 
-        '<div id="TotalUsedCores' + result[i][0].SlaveID + '"></div><div id="TotalUsedMemory' + result[i][0].SlaveID + '"></div>' + 
-        '<div id="CPUUtilization' + result[i][0].SlaveID + '"></div></section>');
+
+    //Set chart names for use in creation below, must be set identically in
+    //ResizeSlaves
+    var slaveChartNames = ["TotalUsedCores","TotalUsedMemory","CPUUtilization"];
+
+    if(result.length == 0) {
+      $('#' + "@(destinationTag)").append(
+        '<section class="chartContainer">' + 
+          '<h1 class="title">No slave information for the specified filters!</h1>' + 
+        '</section>'
+      )
+    }
+    else {
+      $('#' + "@(destinationTag)").html("");
+      var time = new Date();
+
+      //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["numberSlaves"] = result.length;
+
+      for(i = 0; i < result.length; i++) {
+        var coreSeries = [];
+        coreSeries[0] = [];
+        coreSeries[1] = [];
+        var memorySeries = [];
+        memorySeries[0] = [];
+        memorySeries[1] = [];
+        var cpuSeries = [];
+        cpuSeries[0] = [];
+        $('#' + "@(destinationTag)").append(
+          '<section class="chartContainer">' + 
+            '<h1 class="title" id="' + result[i][0].SlaveID + '">Slave ' + result[i][0].SlaveID + '</h1>' + 
+            '<button class="collapse" onclick="CollapseSection(this)">+</button>' + 
+            '<div id="' + slaveChartNames[0] + i + '"></div>' + 
+            '<div id="' + slaveChartNames[1] + i + '"></div>' + 
+            '<div id="' + slaveChartNames[2] + i + '"></div>' + 
+          '</section>');
         for(j = 0; j < result[i].length; j++) {
           time.setTime(result[i][j].Time.replace(/\D/g,''));
@@ -443,17 +482,18 @@
           cpuSeries[0].push([time.toUTCString(),result[i][j].CPUUtilization]);
         }
-      if(result[i].length > 1) {
-        @ChartHelper.LineChartGivenSeries("TotalUsedCores","result[i][0].SlaveID","coreSeries","Total/Used Cores")
-        @ChartHelper.LineChartGivenSeries("TotalUsedMemory","result[i][0].SlaveID","memorySeries","Total/Used Memory")
-        @ChartHelper.LineChartGivenSeries("CPUUtilization","result[i][0].SlaveID","cpuSeries","CPU Utilization",0,100,"%.1f%%")
-      }
-      else {
-        @ChartHelper.BarChartGivenSeries("TotalUsedCores","result[i][0].SlaveID","coreSeries","Total/Used Cores")
-        @ChartHelper.BarChartGivenSeries("TotalUsedMemory","result[i][0].SlaveID","memorySeries","Total/Used Memory")
-        @ChartHelper.BarChartGivenSeries("CPUUtilization","result[i][0].SlaveID","cpuSeries","CPU Utilization",0,100,"%.1f%%")
-      }
-      collapsedByDefault(document.getElementById("UsedTotalCores" + result[i][0].SlaveID));
-      collapsedByDefault(document.getElementById("UsedTotalMemory" + result[i][0].SlaveID));
-      collapsedByDefault(document.getElementById("CPUUtilization" + result[i][0].SlaveID));
+        if(result[i].length > 1) {
+          @ChartHelper.LineChartGivenSeries("slaveChartNames[0]","i","coreSeries","Total/Used Cores")
+          @ChartHelper.LineChartGivenSeries("slaveChartNames[1]","i","memorySeries","Total/Used Memory",0)
+          @ChartHelper.LineChartGivenSeries("slaveChartNames[2]","i","cpuSeries","CPU Utilization",0,100,"%.1f%%")
+        }
+        else {
+          @ChartHelper.BarChartGivenSeries("slaveChartNames[0]","i","coreSeries","Total/Used Cores")
+          @ChartHelper.BarChartGivenSeries("slaveChartNames[1]","i","memorySeries","Total/Used Memory",0)
+          @ChartHelper.BarChartGivenSeries("slaveChartNames[2]","i","cpuSeries","CPU Utilization",0,100,"%.1f%%")
+        }
+        for(k = 0; k < slaveChartNames.length; k++) {
+          CollapsedByDefault(document.getElementById(slaveChartNames[k] + i));
+        }
+      }
     }
   }});
@@ -461,8 +501,30 @@
 }
 
-@helper LineChartGivenSeries(string destinationTag, string chartId, string series, string title, double? minY = null, double? maxY = null, string axisYFormat = null)
-{
-  <text>
-  window["@(destinationTag)" + @(chartId) + "Plot"] = $.jqplot("@(destinationTag)" + @(chartId), @series, {
+@helper ResizeSlaves() {
+  <text>
+  //Resize event, resets bar width for slave charts and replots them
+  $(window).resize(function() {
+    if(typeof numberSlaves !== 'undefined') {
+
+    //Set chart names for use in creation below, must be set identically in
+    //ResizeSlaves
+    var slaveChartNames = ["TotalUsedCores","TotalUsedMemory","CPUUtilization"];
+
+      for(i = 0; i < numberSlaves; i++) {
+        for(j = 0; j < slaveChartNames.length; j++) {
+          $.each(window[slaveChartNames[j] + "Plot" + i].series, function(index, series) { 
+            series.barWidth = undefined; 
+          });
+          window[slaveChartNames[j] + "Plot" + i].replot({ resetAxes: true });
+        }
+      }
+    }
+  });
+  </text>
+}
+
+@helper LineChartGivenSeries(string destinationTag, string chartId, string series, string title, double? minY = null, double? maxY = null, string axisYFormat = null) {
+  <text>
+  window[@(destinationTag) + "Plot" + @(chartId)] = $.jqplot(@(destinationTag) + @(chartId), @series, {
     title: "@title",
     axes: {
@@ -499,15 +561,10 @@
     }
   });
-
-  $(window).resize(function() {
-    window["@(destinationTag)" + @(chartId) + "Plot"].replot({ resetAxes: true });
-  });
-  </text>
-}
-
-@helper BarChartGivenSeries(string destinationTag, string chartId, string series, string title, double? minY = null, double? maxY = null, string axisYFormat = null)
-{
-  <text>
-  window["@(destinationTag)" + @(chartId) + "Plot"] = $.jqplot("@(destinationTag)" + @(chartId), @series, {
+  </text>
+}
+
+@helper BarChartGivenSeries(string destinationTag, string chartId, string series, string title, double? minY = null, double? maxY = null, string axisYFormat = null) {
+  <text>
+  window[@(destinationTag) + "Plot" + @(chartId)] = $.jqplot(@(destinationTag) + @(chartId), @series, {
     title: "@title",
     seriesDefaults:{
@@ -549,12 +606,4 @@
     }
   });
-
-  $(window).resize(function() {
-    $.each(window["@(destinationTag)" + @(chartId) + "Plot"].series, function(index, series) { 
-      series.barWidth = undefined; 
-    });
-    window["@(destinationTag)" + @(chartId) + "Plot"].replot({ resetAxes: true });
-  });
-
-  </text>
-}
+  </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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ExceptionHelper.cshtml	(revision 11053)
@@ -18,50 +18,59 @@
  *@
 
-@helper UserExceptions(string destinationTag, string url, string userName, string limit, string startDate = null, string endDate = null, string jobId = null, string taskState = null) {
-  if(userName!="" || userName!=null) {
-    <text>
-      var GetRequest = "?userName=" + @(userName) + "&limit=" + @(limit);
-      @if(startDate!=null) {
-        @:if(@(startDate)!=null) {
-          @:GetRequest += "&start=" + @startDate;
-        @:}
+@helper UserExceptions(string destinationTag, string url, string limit, string userName = null, string startDate = null, string endDate = null, string jobId = null, string taskState = null)
+{
+  <text>
+    var GetRequest = "?limit=" + @(limit);
+    @if (userName != null) {
+      @:if(@(userName)!=null) {
+        @:GetRequest += "&userName=" + @userName;
+      @:}
+    }
+    @if(startDate!=null) {
+      @:if(@(startDate)!=null) {
+        @:GetRequest += "&start=" + @startDate;
+      @:}
+    }
+    @if(endDate!=null) {
+      @:if(@(endDate)!=null) {
+        @:GetRequest += "&end=" + @endDate;
+      @:}
+    }
+    @if(jobId!=null) {
+      @:if(@(jobId)!=null) {
+        @:GetRequest += "&jobId=" + @jobId;
+      @:}
+    }
+    @if(taskState!=null) {
+      @:if(@(taskState)==null) {
+        @:GetRequest += "&taskState=" + @taskState;
+      @:}
+    }
+    $.ajax({async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+        $("#" + "@destinationTag").html("");
+        if(result.Key.length > 0) {
+          var ErrorHTML = '<section class="errorContainer">' + 
+                            '<p class="errorTitle">Some tasks were found in error state!</p>' + 
+                            '<label class="errorTask underline">Task</label>' + 
+                            '<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 += '</section>';
+          $("#" + "@destinationTag").append(ErrorHTML);
+        }
       }
-      @if(endDate!=null) {
-        @:if(@(endDate)!=null) {
-          @:GetRequest += "&end=" + @endDate;
-        @:}
-      }
-      @if(jobId!=null) {
-        @:if(@(jobId)!=null) {
-          @:GetRequest += "&jobId=" + @jobId;
-        @:}
-      }
-      @if(taskState!=null) {
-        @:if(@(taskState)==null) {
-          @:GetRequest += "&taskState=" + @taskState;
-        @:}
-      }
-      $.ajax({async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
-          $("#" + "@destinationTag").html("");
-          if(result.Key.length > 0) {
-            var ErrorHTML = '<section class="errorContainer"><p class="errorTitle">Some tasks were found in error state!</p><label class="errorTask underline">Task</label><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 += '</section>';
-            $("#" + "@destinationTag").append(ErrorHTML);
-          }
-        }
-      });
-    </text>
-  }
+    });
+  </text>
 }
 
 @helper ScrollToException() {
   <text>
-    function scrollTo(caller) {
-      openOnError(document.getElementById($(caller).html()));
+    function ScrollTo(caller) {
+      var taskErrorId = $(caller).parent().parent().attr('id') + $(caller).html();
+      OpenOnError(document.getElementById(taskErrorId));
       $('html, body').animate({
-          scrollTop: $("#" + $(caller).html()).parent().offset().top
+          scrollTop: $("#" + taskErrorId).parent().offset().top
       }, 2000);
     }
@@ -91,2 +100,55 @@
   </text>
 }
+
+@helper ShowErrors(string destinationTag) {
+  <text>
+  $("#@(destinationTag)").children(".errorContainer, .errorTitle, .errorTask, .errorMessage").css('display','inline-block');
+  </text>
+}
+
+@helper ErrorsOnSlaves(string destinationTag, string url, string limit, string startDate = null, string endDate = null, string clientId=null) {
+  <text>
+  var GetRequest = "?limit=" + @(limit);
+  @if(startDate!=null) {
+    @:if(@(startDate)!=null) {
+      @:GetRequest += "&start=" + @startDate;
+    @:}
+  }
+  @if(endDate!=null) {
+    @:if(@(endDate)!=null) {
+      @:GetRequest += "&end=" + @endDate;
+    @:}
+  }
+  @if (clientId != null) {
+    @:if(@(clientId)!=null) {
+      @:GetRequest += "&clientId=" + @clientId;
+    @:}
+  }
+  $.ajax({
+    async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+      for(i = 0; i < result.length; i++) {
+        $("#" + "@(destinationTag)").append(
+          '<section class="chartContainer">' + 
+            '<h1 class="title" id="@(destinationTag)' + result[i][0] + '">Task ' + result[i][0] + '</h1>' + 
+            '<button class="collapse" onclick="CollapseSection(this)">+</button>' + 
+            '<label id="' + result[i][0] + 'ErrorMessage">Error Message: ' + result[i][1] + '</label>' + 
+            '<label id="' + result[i][0] + 'Client">Slave: <a onclick="ShowSlaveInfo(this)">' + result[i][2] + '</a></label>' + 
+            '<label id="' + result[i][0] + 'User">User Name: ' + result[i][3] + '</label>' + 
+            '<label id="' + result[i][0] + 'Date">Date/Time: ' + result[i][4] + '</label>' + 
+          '</section>'
+        );
+        CollapsedByDefault(document.getElementById("@(destinationTag)" + result[i][0]));
+      }
+    }
+  });
+  </text>
+}
+
+@helper ShowSlaveInfo(string url, string limit, string startDate=null, string endDate=null) {
+  <text>
+  //Opens a sub-container with slave information
+  function ShowSlaveInfo(caller) {
+    @*@ChartHelper.SlaveInfoChart("",url,limit,startDate,endDate,"null","NotApplicable","null","$(caller).html()")*@
+  }
+  </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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Content/Site.css	(revision 11053)
@@ -605,2 +605,28 @@
   margin-top: 2%;
 }
+
+/* About Page Styles */
+.aboutMain {
+  width: 96%;
+  margin: 1% 0% 1% 2%;
+}
+
+.aboutMain h2 {
+  font-size: 1.4em;
+}
+
+.aboutMain p {
+  font-size: 1.2em;
+}
+
+.aboutMain p:first-letter {
+  font-size: 1.4em;
+}
+
+#ExceptionContainer .chartContainer label {
+  margin: 1% 0 1% 1%;
+  width: 98%;
+  font-size: 1.4em;
+  color: #6B6B6B;
+  display: inline-block;
+}
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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ChartDataController.cs	(revision 11053)
@@ -192,16 +192,10 @@
         List<KeyValuePair<string, List<double>>> results = new List<KeyValuePair<string, List<double>>>();
 
-        List<string> id = new List<string>();
-        List<double> wait = new List<double>();
-        List<double> transfer = new List<double>();
-        List<double> run = new List<double>();
-        List<double> times = new List<double>();
-        data.ForEach(i => id.Add(i.TaskID.ToString()));
-        data.ForEach(w => wait.Add(w.TotalWaiting));
-        data.ForEach(t => transfer.Add(t.TotalTransfer));
-        data.ForEach(r => run.Add(r.TotalRuntime));
-
-        for (int i = 0; i < id.Count; i++) {
-          results.Add(new KeyValuePair<string, List<double>>(id[i],new List<double>{wait[i],transfer[i],run[i]}));
+        for (int i = 0; i < data.Count; i++) {
+          results.Add(
+            new KeyValuePair<string, List<double>>(
+              data[i].TaskID.ToString(),new List<double>{data[i].TotalWaiting,data[i].TotalTransfer,data[i].TotalRuntime}
+            )  
+          );
         }
 
@@ -210,5 +204,5 @@
     }
 
-    public JsonResult SlaveInfo(string limit, DateTime? start = null, DateTime? end = null, string userName = null)
+    public JsonResult SlaveInfo(string limit, DateTime? start = null, DateTime? end = null, string userName = null, string slaveId=null)
     {
       using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
@@ -220,5 +214,6 @@
            where (!start.HasValue || slaves.Time >= start) &&
            (!end.HasValue || slaves.Time < end) &&
-           (string.IsNullOrEmpty(userName) || users.Name == userName)
+           (string.IsNullOrEmpty(userName) || users.Name == userName) &&
+           (string.IsNullOrEmpty(slaveId) || slaves.ClientId.ToString() == slaveId)
            select new
            {
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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ExceptionDataController.cs	(revision 11053)
@@ -9,16 +9,15 @@
   public class ExceptionDataController : Controller {
 
-    public JsonResult TaskExceptions(string userName, string limit, DateTime? start = null, DateTime? end = null, string jobId = null, string taskState = null) {
+    public JsonResult TaskExceptions(string limit, 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);
         var data =
-        (from errors in db.StateLogs
-          join tasks in db.FactTasks
-            on errors.TaskId equals tasks.TaskId
+        (from tasks in db.FactTasks
           join jobs in db.DimJobs
             on tasks.JobId equals jobs.JobId
-          where jobs.UserName == userName &&
-          errors.Exception != null && 
-          !errors.Exception.Equals(string.Empty) &&
+          where tasks.Exception != null && 
+          !tasks.Exception.Equals(string.Empty) &&
+          (string.IsNullOrEmpty(userName) || jobs.UserName == userName) &&
           (!start.HasValue || tasks.StartTime >= start) &&
           (!end.HasValue || tasks.EndTime < end) &&
@@ -27,6 +26,6 @@
           select new
           {
-            TaskID = errors.TaskId,
-            ErrorMessage = errors.Exception,
+            TaskID = tasks.TaskId,
+            ErrorMessage = tasks.Exception,
             StartDate = tasks.StartTime
           }).OrderByDescending(s => s.StartDate).Take(Convert.ToInt32(limit)).ToList();
@@ -38,4 +37,35 @@
 
         return Json(new KeyValuePair<List<string>, List<string>>(Task, Error), JsonRequestBehavior.AllowGet);
+      }
+    }
+
+    public JsonResult SlaveExceptions(string limit, DateTime? start = null, DateTime? end = null, string clientId = null) {
+      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.Exception != null &&
+          !tasks.Exception.Equals(string.Empty) && 
+          (!start.HasValue || tasks.StartTime >= start) &&
+         (!end.HasValue || tasks.EndTime < end) &&
+         (string.IsNullOrEmpty(clientId) || tasks.LastClientId.ToString() == clientId)
+         select new {
+           TaskID = tasks.TaskId,
+           ErrorMessage = tasks.Exception,
+           ClientID = tasks.LastClientId,
+           UserName = jobs.UserName,
+           StartDate = tasks.StartTime
+         }).OrderByDescending(s => s.StartDate).Take(Convert.ToInt32(limit)).ToList();
+
+        List<List<string>> results = new List<List<string>>();
+
+        for (int i = 0; i < data.Count; i++) {
+          results.Add(
+            new List<string> { data[i].TaskID.ToString(), data[i].ErrorMessage, data[i].ClientID.ToString(), data[i].UserName,
+              data[i].StartDate.ToString("dd/MM/yyyy HH:mm")}
+          );
+        }
+        return Json(results, JsonRequestBehavior.AllowGet);
       }
     }
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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/HomeController.cs	(revision 11053)
@@ -59,10 +59,4 @@
     }
 
-    public ActionResult Contact() {
-      ViewBag.Message = "Your contact page.";
-
-      return View();
-    }
-
     public ActionResult Error() {
       throw new Exception();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/LoginRequiredController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/LoginRequiredController.cs	(revision 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/LoginRequiredController.cs	(revision 11053)
@@ -41,4 +41,7 @@
                              select task.TaskState).Distinct();
         ViewBag.TaskStates = new SelectList(TaskStateList);
+        var SlaveList = (from slave in db.FactClientInfos
+                         select slave.ClientId.ToString()).Distinct();
+        ViewBag.Slaves = new SelectList(SlaveList);
       }
 
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/HeuristicLab.Services.Hive.Statistics-3.3.csproj
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/HeuristicLab.Services.Hive.Statistics-3.3.csproj	(revision 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/HeuristicLab.Services.Hive.Statistics-3.3.csproj	(revision 11053)
@@ -292,5 +292,4 @@
     <Content Include="Views\Account\Login.cshtml" />
     <Content Include="Views\Home\About.cshtml" />
-    <Content Include="Views\Home\Contact.cshtml" />
     <Content Include="Views\Home\Index.cshtml" />
     <Content Include="Views\Shared\Error.cshtml" />
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/CollapsingSection.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/CollapsingSection.js	(revision 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/CollapsingSection.js	(revision 11053)
@@ -15,5 +15,5 @@
   was impossible. Therefore this function is hardcoded as an HTML onclick event
   for the dynamically created buttons of these sections */
-function collapseSection(caller) {
+function CollapseSection(caller) {
   var jqCaller = $(caller);
   if (jqCaller.html() == "-") {
@@ -29,10 +29,10 @@
 /* Passed the interior div this fucntion is used to create an automatically collapsed 
   section */
-function collapsedByDefault(caller) {
+function CollapsedByDefault(caller) {
   $(caller).parent().children("canvas, div, fieldset, label").css("display","none");
 }
 
 /* Used when scrolling to a task by error, opens the container before task is scrolled to */
-function openOnError(caller) {
+function OpenOnError(caller) {
   var jqCaller = $(caller);
   jqCaller.parent().children("canvas, div, fieldset, label").fadeIn();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/About.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/About.cshtml	(revision 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/About.cshtml	(revision 11053)
@@ -1,34 +1,24 @@
-﻿@{
-    ViewBag.Title = "About";
-}
+﻿@using HeuristicLab.Services.Hive.Statistics.Helper
+@{ViewBag.Title = "About";}
 
-<hgroup class="title">
-    <h1>@ViewBag.Title.</h1>
-    <h2>@ViewBag.Message</h2>
-</hgroup>
+<h1>@ViewBag.Title</h1>
 
-<article>
-    <p>
-        Use this area to provide additional information.
-    </p>
-
-    <p>
-        Use this area to provide additional information.
-    </p>
-
-    <p>
-        Use this area to provide additional information.
-    </p>
+<article class="aboutMain">
+  <h2>Welcome to the HeuristicLab Hive status monitor.</h2>
+  <p>From this monitor you can view the status of your hive in different ways.
+  </p>
+  <p>The @Html.MenuItem("Home", "Index", "Home") page offers a general overview of both current and historic hive status.
+  </p>
+  <p>The @Html.MenuItem("User", "UserTask", "LoginRequired") page, which requires logging in as a user, gives an overview of tasks 
+    belonging to the user, the Task Information tab, as well as the resources utilized by the user, the Task Overview tab.
+  </p>
+  <p>The @Html.MenuItem("Admin", "Admin", "LoginRequired") page requires logging in as a user with administrative priveleges and 
+    offers many different options. The User Overview tab allows the administrator to view tasks belonging to any user. The Task 
+    Overview tab offers a view of the resources utilized by any user. The Slave Overview tab provides a view of resource usage by on 
+    individual slaves. The Exception Overview tab offers a view of exceptions which occured and the slave on which they occured.
+  </p>
+  <p>HeuristicLab development site: <a href="http://dev.heuristiclab.com/trac/hl/core">HeuristicLab Development</a>
+  </p>
+  <p>Support is available here: <a href="http://dev.heuristiclab.com/trac/hl/core/wiki/UsersSupport">HeuristicLab Support</a>
+  </p>
 </article>
-
-<aside>
-    <h3>Aside Title</h3>
-    <p>
-        Use this area to provide additional information.
-    </p>
-    <ul>
-        <li>@Html.ActionLink("Home", "Index", "Home")</li>
-        <li>@Html.ActionLink("About", "About", "Home")</li>
-        <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
-    </ul>
-</aside>
Index: anches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/Contact.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/Contact.cshtml	(revision 11052)
+++ 	(revision )
@@ -1,50 +1,0 @@
-﻿@{
-    ViewBag.Title = "Contact";
-}
-
-<hgroup class="title">
-    <h1>@ViewBag.Title.</h1>
-    <h2>@ViewBag.Message</h2>
-</hgroup>
-
-<section class="contact">
-    <header>
-        <h3>Phone</h3>
-    </header>
-    <p>
-        <span class="label">Main:</span>
-        <span>425.555.0100</span>
-    </p>
-    <p>
-        <span class="label">After Hours:</span>
-        <span>425.555.0199</span>
-    </p>
-</section>
-
-<section class="contact">
-    <header>
-        <h3>Email</h3>
-    </header>
-    <p>
-        <span class="label">Support:</span>
-        <span><a href="mailto:Support@example.com">Support@example.com</a></span>
-    </p>
-    <p>
-        <span class="label">Marketing:</span>
-        <span><a href="mailto:Marketing@example.com">Marketing@example.com</a></span>
-    </p>
-    <p>
-        <span class="label">General:</span>
-        <span><a href="mailto:General@example.com">General@example.com</a></span>
-    </p>
-</section>
-
-<section class="contact">
-    <header>
-        <h3>Address</h3>
-    </header>
-    <p>
-        One Microsoft Way<br />
-        Redmond, WA 98052-6399
-    </p>
-</section>
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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Home/Index.cshtml	(revision 11053)
@@ -6,51 +6,7 @@
 
 <h1>Current Status</h1>
-
-@*
-Original code
-<section>
-  <table>
-    <tr>
-      <td>Overall Available Cores</td>
-      <td>@Model.OverallCurrentlyAvailableCores</td>
-    </tr>
-    <tr>
-      <td>Availabe Cores (real)</td>
-      <td>@Model.CurrentlyAvailableCores</td>
-    </tr>
-    <tr>
-      <td>Used Cores</td>
-      <td>@Model.CurrentlyUsedCores</td>
-    </tr>
-    <tr>
-      <td>System-Wide Waiting Tasks</td>
-      <td>@Model.CurrentlyJobsWaiting</td>
-    </tr>
-    <tr>
-      <td>Overall Avg. CPU Utilization</td>
-      <td>@Model.OverallCpuUtilization</td>
-    </tr>
-    <tr>
-      <td>Available Avg. CPU Utilization</td>
-      <td>@Model.AvailableCpuUtilization</td>
-    </tr>
-  </table>
-</section>*@
-
 <section class="chartContainer">
   <h1 class="title">Current Hive Status</h1>
   <button class="collapse">-</button>
-@*  <label id="lblCurrentCPUUtilization" class="smoothieLabel">Current CPU Utilization</label>
-  <div class="smoothieHolder">
-    <canvas id="CurrentCPUUtilization" class="smoothieChart"></canvas>
-  </div>
-  <label id="lblCurrentTotalUsedCores" class="smoothieLabel">Current Total and Used Cores</label>
-  <div class="smoothieHolder">
-    <canvas id="CurrentTotalUsedCores" class="smoothieChart"></canvas>
-  </div>
-  <label id="lblCurrentTotalUsedMemory" class="smoothieLabel">Current Total and Used Memory</label>
-  <div class="smoothieHolder">
-    <canvas id="CurrentTotalUsedMemory" class="smoothieChart"></canvas>
-  </div>*@
   <div id="CurrentCPUUtilization"></div>
   <div id="CurrentTotalUsedCores"></div>
@@ -118,16 +74,13 @@
       $(".date").datepicker({
         dateFormat: "yy-mm-dd",
-        onSelect: function () { refreshCharts(); }
+        onSelect: function () { RefreshCharts(); }
       });
 
       $("#Refresh").click(function () {
-        refreshCharts();
+        RefreshCharts();
       });
-
-      //resizeSmoothie();
-      //createSmoothie();
     });
 
-    function refreshCharts() {
+    function RefreshCharts() {
       var startDate = $('#Start').val();
       var endDate = $('#End').val();
@@ -138,33 +91,4 @@
     }
 
-@*    function createSmoothie() {
-      //Create new SmoothieChart(s)
-      @ChartHelper.CreateSmoothieChart("CurrentCPUUtilization","rgb(179, 179, 179)","rgb(242, 242, 242)","rgb(0, 22, 84)")
-      @ChartHelper.CreateSmoothieChart("CurrentTotalUsedCores","rgb(179, 179, 179)","rgb(242, 242, 242)","rgb(0, 22, 84)")
-      @ChartHelper.CreateSmoothieChart("CurrentTotalUsedMemory","rgb(179, 179, 179)","rgb(242, 242, 242)","rgb(0, 22, 84)")
-
-      //Second argument is delay in chart display, used to make drawing smooth,
-      //Should be matched to interval time below
-      @ChartHelper.SetSmoothieCanvas("CurrentCPUUtilization","5000")
-      @ChartHelper.SetSmoothieCanvas("CurrentTotalUsedCores","5000")
-      @ChartHelper.SetSmoothieCanvas("CurrentTotalUsedMemory","5000")
-
-      //Set interval to run ajax and get new values
-      @ChartHelper.AssignTimeSeries("averageUsage", "CurrentCPUUtilization", "rgb(0, 255, 0)", "rgba(0, 255, 0, 0.4)")
-      @ChartHelper.AssignTimeSeries("overallCore", "CurrentTotalUsedCores", "rgb(0, 255, 0)", "rgba(0, 255, 0, 0.4)")
-      @ChartHelper.AssignTimeSeries("usedCore", "CurrentTotalUsedCores", "rgb(242, 182, 70)", "rgba(255, 199, 94, 0.4)")
-      @ChartHelper.AssignTimeSeries("overallMemory", "CurrentTotalUsedMemory", "rgb(0, 255, 0)", "rgba(0, 255, 0, 0.4)")
-      @ChartHelper.AssignTimeSeries("usedMemory", "CurrentTotalUsedMemory", "rgb(242, 182, 70)", "rgba(255, 199, 94, 0.4)")
-
-      setInterval(function () { getChartUpdate() }, 5000);
-
-      //Hit by interval, jQuery ajax request to get new data from db
-      function getChartUpdate() {
-        @ChartHelper.UpdateChartData("CurrentCPUUtilization", Url.Action("CurrentCpuUtilization","ChartData"))
-        @ChartHelper.UpdateChartData("CurrentTotalUsedCores", Url.Action("CurrentCores","ChartData"))
-        @ChartHelper.UpdateChartData("CurrentTotalUsedMemory", Url.Action("CurrentMemory","ChartData"))
-      }
-    }*@
-
     $(document).ready(function () {
       @ChartHelper.SetStreamingProperties(1000,20,10)
@@ -174,12 +98,12 @@
       @ChartHelper.CreateStreamChart("CurrentMemory", "CurrentTotalUsedMemory",Url.Action("CurrentMemory","ChartData"),"Current Total vs. Used Memory")
 
-      function doUpdate() {
+      function DoUpdate() {
         @ChartHelper.UpdateStreamChart("CurrentCPU","CurrentCPUUtilization", Url.Action("CurrentCpuUtilization","ChartData"),"FixedY")
         @ChartHelper.UpdateStreamChart("CurrentCores","CurrentTotalUsedCores", Url.Action("CurrentCores","ChartData"))
         @ChartHelper.UpdateStreamChart("CurrentMemory","CurrentTotalUsedMemory", Url.Action("CurrentMemory","ChartData"))
-        setTimeout(doUpdate, refreshRate);
+        setTimeout(DoUpdate, refreshRate);
       }
 
-      doUpdate();
+      DoUpdate();
 
     });
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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/Admin.cshtml	(revision 11053)
@@ -63,5 +63,4 @@
       <button id="UserApply">Apply</button>
     </fieldset>
-    <button id="ScrollTop">^</button>
     <section id="TasksContainer" class="tabDataContainer"></section>
   </section>
@@ -113,5 +112,5 @@
     <section id="SlavesContainer" class="tabDataContainer"></section>
   </section>
-  //Slave overview
+  //Exception overview
   <section id="ExceptionOverviewTab" class="tabSection">
     <fieldset class="filterChoices">
@@ -119,6 +118,6 @@
       <label>Date</label>
       <input type="checkbox" name="filterChoice" value="ExceptionDate" checked="checked">
-      <label>Users</label>
-      <input type="checkbox" name="filterChoice" value="ExceptionUser">
+      <label>Slave</label>
+      <input type="checkbox" name="filterChoice" value="ExceptionSlave">
       <label>Limit</label>
       <select id="ExceptionLimit">
@@ -138,13 +137,13 @@
         @Html.TextBox("ExceptionEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
       </fieldset>
-      <fieldset id="FilterExceptionUser" class="filterContainer">
-        <legend>User</legend>
-        <select id="ExceptionUserList">
-        </select>
-      </fieldset>
-      <button id="ExcpetionApply">Apply</button>
+      <fieldset id="FilterExceptionSlave" class="filterContainer">
+        <legend>Slave</legend>
+        @Html.DropDownList("Slaves")
+      </fieldset>
+      <button id="ExceptionApply">Apply</button>
     </fieldset>
     <section id="ExceptionContainer" class="tabDataContainer"></section>
   </section>
+  <button id="ScrollTop">^</button>
 }
 
@@ -171,8 +170,8 @@
     var endDate;
     var selectedUser;
+    var selectedSlave;
     var limit;
     var pageNumber;
     var userId;
-    var numberTasks = 0;
 
     $(document).ready(function () {
@@ -218,4 +217,13 @@
     });
 
+    $(".tabButton").click(function () {
+      var sender = $(this).attr('id');
+      $(".tabButton").css({ 'border-bottom': '1px solid #8297F5', 'background': 'none' });
+      $(this).css({ 'border-bottom': '1px solid #E0E6FF', 'background-color': '#E0E6FF' });
+      $(".tabSection").css('display', 'none');
+      $("#" + sender.slice(0, -6) + "Tab").css('display', 'block');
+    })
+
+    //User Overview
     function RefreshUser() {
       selectedUser = $("#UserList").val();
@@ -235,5 +243,5 @@
         taskState = $('#TaskState').val();
       }
-      @ExceptionHelper.UserExceptions("TasksContainer", Url.Action("TaskExceptions", "ExceptionData"), "selectedUser", "limit", "startDate", "endDate", "jobId", "taskState")
+      @ExceptionHelper.UserExceptions("TasksContainer", Url.Action("TaskExceptions", "ExceptionData"), "limit", "selectedUser", "startDate", "endDate", "jobId", "taskState")
       @ChartHelper.TasksForUser("TasksContainer", "Task", Url.Action("UserTask", "ChartData"), "RefreshUser", "selectedUser", "limit", "startDate", "endDate", "jobId", "taskState", "pageNumber")
       pageNumber = null;
@@ -243,4 +251,5 @@
     @ExceptionHelper.ScrollToException()
 
+    //Task Overview
     $("#TaskUserList").change(function () {
       RefreshTask();
@@ -254,8 +263,5 @@
     }
 
-    $("#SlaveList").change(function () {
-      RefreshSlave();
-    });
-
+    //Slave Overview
     function RefreshSlave() {
       selectedUser = null;
@@ -270,15 +276,32 @@
         selectedUser = $('#SlaveUserList').val();
       }
-      @ChartHelper.SlaveInfoChart("SlavesContainer",Url.Action("SlaveInfo","ChartData"),"limit","startDate","endDate","selectedUser","RefreshSlave","pageNumber")
+      @ChartHelper.SlaveInfoChart("SlavesContainer", Url.Action("SlaveInfo", "ChartData"), "limit", "startDate", "endDate", "selectedUser", "RefreshSlave", "pageNumber")
       pageNumber = null;
     }
 
-    $(".tabButton").click(function () {
-      var sender = $(this).attr('id');
-      $(".tabButton").css({'border-bottom' : '1px solid #8297F5', 'background' : 'none' });
-      $(this).css({ 'border-bottom': '1px solid #E0E6FF', 'background-color': '#E0E6FF' });
-      $(".tabSection").css('display', 'none');
-      $("#" + sender.slice(0, -6) + "Tab").css('display', 'block');
-    })
+    @ChartHelper.ResizeSlaves()
+
+    //Exceptions Overview
+    $("#ExceptionSlaveList").change(function () {
+      RefreshException();
+    });
+
+    function RefreshException() {
+      selectedSlave = null;
+      limit = $("#ExceptionLimit").val();
+      startDate = null;
+      endDate = null;
+      if ($("[value='ExceptionDate']").is(":checked")) {
+        startDate = $('#ExceptionStart').val();
+        endDate = $('#ExceptionEnd').val();
+      }
+      if ($("[value='ExceptionSlave']").is(':checked')) {
+        selectedSlave = $('#Slaves').val();
+      }
+      @ExceptionHelper.UserExceptions("ExceptionContainer", Url.Action("TaskExceptions", "ExceptionData"), "limit", null, "startDate", "endDate", null, null)
+      @ExceptionHelper.ShowErrors("ExceptionContainer")
+      @ExceptionHelper.ErrorsOnSlaves("ExceptionContainer",Url.Action("SlaveExceptions", "ExceptionData"),"limit","startDate", "endDate","selectedSlave")
+    }
+    @*@ExceptionHelper.ShowSlaveInfo(Url.Action("SlaveInfo", "ChartData"),"limit","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 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/UserTask.cshtml	(revision 11053)
@@ -129,5 +129,5 @@
         taskState = $('#TaskState').val();
       }
-      @ExceptionHelper.UserExceptions("TasksContainer",Url.Action("TaskExceptions", "ExceptionData"),"userName","limit","startDate","endDate","jobId","taskState")
+      @ExceptionHelper.UserExceptions("TasksContainer",Url.Action("TaskExceptions", "ExceptionData"),"limit","userName","startDate","endDate","jobId","taskState")
       @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("UserTask", "ChartData"),"TaskInformation","userName","limit","startDate","endDate","jobId","taskState","pageNumber")
       pageNumber = null;
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Shared/_Layout.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Shared/_Layout.cshtml	(revision 11052)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/Shared/_Layout.cshtml	(revision 11053)
@@ -25,5 +25,4 @@
                 <li>@Html.MenuItem("Admin", "Admin", "LoginRequired")</li>
                 <li>@Html.MenuItem("About", "About", "Home")</li>
-                <li>@Html.MenuItem("Contact", "Contact", "Home")</li>
             </ul>
         </nav>
