anchor.diff:          {"sTitle":"First","sClass":"error-first"},
           {"sTitle":"Last","sClass":"error-last"},
           {"sTitle":"Count","sClass":"error-count"},
  -        {"sTitle":"Message","sClass":"error-message"}]
  +        {"sTitle":"Env","sClass":"error-env"},
  +        {"sTitle":"Message","sClass":"error-message"}
  +        ]
       });
  +
  +    $.fn.dataTableExt.afnFiltering.push(function(oSettings, aData, iDataIndex) {
  +      switch (aData[5]) {
  +        case "M": return $('#master').prop('checked');
  +        case "S": return $('#staging').prop('checked');
  +        case "P": return $('#production').prop('checked');
  +      }
  +      return true;
  +    });
  +    $('.env_selector').on('change', function() { exception_table.fnDraw(); });
   
       project_select.on('change', function() {
         update_status.text("-");
  
positive.code:           var e = project.errors[i];
            var details = '<span class="details">\u25B6</span><input type="hidden" name="group" value="'+e.id+'">';
            var message = '<a href="https://<%= params[:subdomain] %>.airbrake.io/projects/'+project_id+'/groups/'+e.id+'/notices/'+e.notices[0].uuid+'" target="_blank">'+e.error_message+'</a>';
            exception_table.fnAddData([ details, e.frequency.toFixed(2), e.created_at, e.most_recent_notice_at, e.notices_count, message ]);
          }
        }).always(function(data){
          update_status.text("-");
  
negative.code:   <style>
      .error-details { width: 20px; cursor: pointer;}
      .error-frequency { width: 50px; }
      .error-first { width: 100px; white-space: nowrap; }
      .error-last { width: 100px; white-space: nowrap; }
      .error-count { text-align:right; width: 50px; }
      .error-env { width: 20px; }
      .error-message { }
      .notice-at { white-space: nowrap; }
    </style>
  
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
  