
// this comes from using ctype=csv
var columns = ["priority","changeddate","keywords","assigned_to","qa_contact",
               "bug_severity","opendate","resolution","classification",
               "qa_contact_realname","alias","op_sys",
               "assigned_to_realname","reporter","rep_platform",
               "short_short_desc","status_whiteboard","votes","bug_status",
               "version","component","reporter_realname","product",
               "target_milestone","patches"];

/**
 * Split a string, returning only non-empty values.
 *
 * Examples using /[[\]]+/:
 * "" => []
 * "[foo][bar]" => ["foo", "bar"]
 * "[foo bar]" => ["foo bar"]
 */
function splitIgnoreEmpty(bstr, pat) {
  if (!bstr)
    return [];

  var bits = bstr.split(pat);
  var result = [];
  // filter out empty entries
  for (var i = 0; i < bits.length; i++) {
    if (bits[i])
      result.push(bits[i].replace(/^\s+|\s+$/g, ''));
  }
  return result;
}

function getP12nType(desc) {
    if (desc.search(/search/i) != -1)
        return "Search engines";
    if (desc.search(/getting/i) != -1)
        return "Getting Started page";
    if (desc.search(/protocol/i) != -1)
        return "Protocol handlers";
    if (desc.search(/reader/i) != -1)
        return "Feed readers";
    if (desc.search(/(feed|live bookmark)/i) != -1)
        return "Live bookmark";
}

function bugzillaConverter() {
  var data = {items: [],
              properties: {
                patchCount: {valueType: "number"},
                votes: {valueType: "number"},
                opendate: {valueType: "date"},
                changeddate: {valueType: "date"}
                }
              };
  var items = data.items;
  var rawBug, goodBug, iCol;

  for (var key in bugs) {
    if (parseInt(key) == NaN)
      continue;
    rawBug = bugs[key];
    goodBug = {num: key, type: "Bug"};
    items.push(goodBug);

    for (iCol = 0; iCol < rawBug.length; iCol++) {
      goodBug[columns[iCol]] = rawBug[iCol];
    }

    goodBug.label = key + ": " + goodBug.short_short_desc;
    goodBug.p12n = getP12nType(goodBug.short_short_desc);
    goodBug.whiteboard_bits =
      splitIgnoreEmpty(goodBug.status_whiteboard, /[[\]]+/);
    goodBug.keyword_bits = splitIgnoreEmpty(goodBug.keywords, /[, ]+/);
    goodBug.keywords = goodBug.keywords || [];
    goodBug.patchCount = splitIgnoreEmpty(goodBug.patches, ",").length;
    goodBug.resolution = goodBug.resolution || "--";
  }

  return data;
}

var buglistCallbackToCall = null;
function buglistCallback() {
  buglistCallbackToCall();
}

function bugzillaQuickSearch(aQueryString) {
  var url = "https://bugzilla.mozilla.org/buglist.cgi?quicksearch=";
  url += encodeURI(aQueryString);
  url += "&ctype=js&columnlist=priority,changeddate,keywords,assigned_to, \
          qa_contact,bug_severity,opendate,resolution,classification, \
          qa_contact_realname,alias,op_sys,assigned_to_realname,reporter, \
          rep_platform,short_short_desc,status_whiteboard,votes,bug_status, \
          version,component,reporter_realname,product,target_milestone,patches";

  Exhibit.JSONPImporter.load(url, window.database, setupExhibit,
                             bugzillaConverter, "buglistCallbackToCall");
}

function pageLoaded() {
  var params = SimileAjax.parseURLParameters();

  window.database = Exhibit.Database.create();

  if (params.qs)
    bugzillaQuickSearch(params.qs);
  else
    $("#manual").show();
}

function setupExhibit() {
  window.exhibit = Exhibit.create();
  window.exhibit.configureFromDOM();
  exhibitLoaded();
}

/**
 *
 */
function exhibitLoaded() {
  $(".exhibit-facet-header").click(
    function() {
      $(this).toggleClass("collapsed").next().toggle("fast");
      return false;
    }).toggleClass("collapsed").next().hide();
  $(".exhibit-facet[defaultExpanded=true]").children()
    .removeClass("collapsed").next().show();
}


comments = {}

function showLastComment(bugid) {
  var block = '#comments_block-' + bugid;
  var showlast = block + ' .showlast';
  var toggleall = block + ' .toggleall';
  var comms = block + ' .comments';
  if (!comments[bugid]) {
    $(showlast).after('<img src="throbber.gif"/>');
    $.get("proxy.php", { id: bugid }, function(d, s) { 
        comments[bugid] = d; 
        showLastComment(bugid);
        $(showlast).after('<div class="toggleall">(or hide all)</div>')
        $(showlast).text('Show previous comment')
        $(toggleall).click(
          function(){
            $(comms).slideToggle('normal');
            if ($(this).text() == 'show all')
              $(this).text('hide all');
            else
              $(this).text('show all');
          });
          $(block + ' img').remove();
    }, "xml");
    return;
  }
  var last = $('long_desc:last',comments[bugid]);
  var text = last.find('thetext').text().replace(/&/g, "&amp;")
                                        .replace(/</g, "&lt;")
                                        .replace(/>/g, "&gt;");
  var commenter = last.find('who').attr('name');
  var when = last.find('bug_when').text();
  if ($(toggleall))
    $(toggleall).text('hide all');
  $(comms).slideDown('normal');
  $('<div></div>').html('<em>' + commenter + ' on ' + when + '</em><br/><pre>' + text + '</pre>')
                  .prependTo(comms)
                  .slideDown('normal');
  last.remove();
}

throbber= new Image(32,32); 
throbber.src="throbber.gif"; 

