const YQL_BASE_URL = "http://query.yahooapis.com/v1/public/yql?diagnostics=false&";
const FILTER_TIMING = 300;


var gPendingRequests = 0;
var gRawData = [];
var gProjects = [];
var gPeople = [
  // manually define anyone not listed on https://wiki.mozilla.org/Firefox/Team/whois
  { nick: "sdwilsh", name: "Shawn Wilsher", team: "Platform" },
  { nick: "mconnor", name: "Mike Connor", team: "Labs" },
  { nick: "Tony", name: "Tony Chung", team: "QA" },
  { nick: "ashughes", name: "Anthony Hughes", team: "QA" },
  { nick: "ragavan", name: "Ragavan Srinivasan", team: "Labs" },
  { nick: "thunder", name: "Dan Mills", team: "Labs" },
  { nick: "osunick", name: "Nick Nguyen", team: "AMO" },
  { nick: "fligtar", name: "Justin Scott", team: "AMO" }
];

gAliases = {
  "rflint": "Ryan",
  "robc": "robcee",
  "nick": "osunick"
};

$(document).ready(function() {
  queryYQL("SELECT * FROM html WHERE url='https://wiki.mozilla.org/Firefox/Team/whois' AND xpath='//div[@id=\"mainContent\"]//table[@class=\"fullwidth-table sortable\"][1]/tr[position() > 1]'",
           "xml", "people", loadPeople);
  queryYQL("SELECT * FROM xml WHERE url='http://planet.firefox.com/foafroll.xml'",
           "json" , "planet", loadPlanet);
  queryYQL("SELECT * FROM html WHERE url='https://wiki.mozilla.org/Firefox/Projects' AND xpath='//div[@id=\"mainContent\"]//table[@class=\"fullwidth-table sortable\"][1]/tr[position() > 1]'",
           "xml", "projects", loadProjects);
});

function initialize() {
  for (let i = 0; i < gRawData.length; i++) {
    if (gRawData[i].handled)
      continue;
    gRawData[i].handler($(gRawData[i].data));
    gRawData[i].handled = true;
  }
  
  $("#loading").remove();
  mjt.run();
  
  $("#search").bind("input", updateFilter);
  
  $("#search-clear").click(function() {
    $("#search").val("");
    updateFilter();
  });
  
  $(".person").hover(function() {
    $(this).find(".tooltip")
           .css({left: $(this).position().left})
           .fadeIn(600);
  }, function() {
    $(this).find(".tooltip").fadeOut(200);
  });
}

function updateFilter() {
  var query = $("#search").val().trim().toLowerCase();
  if (query == "") {
    $(".status-block").slideDown(FILTER_TIMING);
  } else {
    $(".status-block").each(function(aIndex, aElement) {
      var searchable = $(aElement).find(".searchable").text().toLowerCase();
      if (searchable.indexOf(query) == -1)
        $(aElement).slideUp(FILTER_TIMING);
      else
        $(aElement).slideDown(FILTER_TIMING);
    });
  }
}

function loadRemoteData(aURL, aName, aHandler) {
  gPendingRequests++;
  var dataDesc = {
    name: aName,
    url: aURL,
    data: null,
    handler: aHandler,
    handled: false
  };
  gRawData.push(dataDesc);
  
  function callback(aData) {
    dataDesc.data = aData;
    gPendingRequests--;
    if (gPendingRequests == 0)
      initialize();
  }
  
  $.get(aURL, callback);
}

function queryYQL(aQuery, aFormat, aName, aHandler) {
  loadRemoteData(YQL_BASE_URL + "format=" + aFormat + "&q=" + encodeURIComponent(aQuery),
                 aName, aHandler);
}


function loadPeople(aData) {
  var rows = aData.find("query > results > tr");
  rows.each(function(aIndex, aRow) {
    aRow = $(aRow);
    let person = {};
    
    let photo = aRow.find("td:nth-child(1) > img[src]").first();
    if (photo.length > 0)
      person.photo = photo.attr("src");
    
    let name = aRow.find("td:nth-child(2)");
    person.name = name.text().trim();
    
    let nick = aRow.find("td:nth-child(3)");
    person.nick = nick.text().trim();
    
    let team = aRow.find("td:nth-child(4)");
    person.team = "Firefox: " + team.text().trim();
    
    gPeople.push(person);
  });
}

function loadPlanet(aData) {
  var members = aData[0].query.results.RDF.Group.member;
  for (let i = 0; i < members.length; i++) {
    let fullName = members[i].Agent.name;
    let blog = members[i].Agent.weblog.Document.about;
    let [,name, nick] = /([^\(]+)\s+\((.*)\)/.exec(fullName);
    let person = findPerson(nick);
    if (person.name)
      person.blog = blog;
  }
}

function loadProjects(aData) {
  var rows = aData.find("query > results > tr");
  rows.each(function(aIndex, aRow) {
    aRow = $(aRow);
    let project = {
      name: "",
      url: "",
      leaders: [],
      participants: [],
      description: "",
      eta: "",
      target: "",
      status: "",
      progress: 0
    };
    
    let link = aRow.find("td:nth-child(1) > a[href]").first();
    if (link.length) {
      project.name = link.text().trim();
      project.url = link.attr("href");
      if (/^\//.test(project.url))
        project.url = "https://wiki.mozilla.org" + project.url;
    } else {
      project.name = aRow.find("td:nth-child(1)").text().trim();
    }
    
    let leaders = aRow.find("td:nth-child(2)").text().trim();
    if (leaders)
      project.leaders = leaders.split(",").map(findPerson);
    
    let participants = aRow.find("td:nth-child(3)").text().trim();
    if (participants)
      project.participants = participants.split(",").map(findPerson);
    
    project.description = aRow.find("td:nth-child(4)").text().trim();
    
    project.eta = aRow.find("td:nth-child(5)").text().trim();
    
    project.target = aRow.find("td:nth-child(6)").text().trim().split(/\s+/).pop();
    
    let status = aRow.find("td:nth-child(7) > *").get(0);
    if (status) {
      var serializer = new XMLSerializer();
      project.status = serializer.serializeToString(status);
    }
    
    gProjects.push(project);
  });
}

function findPerson(aSearch) {
  if (!aSearch || typeof aSearch != "string")
    return null;
  var search = aSearch.trim().toLowerCase();
  search = search.split(/\W+/)[0];
  
  if (search in gAliases)
    search = gAliases[search].toLowerCase();
  
  for each (let person in gPeople) {
    if (person.nick.toLowerCase() == search)
      return person;
    if (person.name.toLowerCase() == search)
      return person;
  }
  return {nick: aSearch};
}

