// Required includes: yui/event/event.js, yui/treeview/treeview.js, yui/connection/connection.js
// Required css: js/yui/treeview/assets/tree.css
lists = {}; // namespace object

/**
 * Initialize the yui tree.
 * @param div where to display the yui tree
 * @param data: array of data for the lists.
 * @param nodeHtml: function to format list name.
 *  Typically one of lists.nodeHtmlUser or lists.nodeHtmlPublic
 * Each data element (as returned from JsHelper::lists() etc) contains:
 * id, name, what.
 */
lists.setup = function(div, data, nodeHtml) {
  lists._tree = new YAHOO.widget.TreeView(div);
  var root = lists._tree.getRoot();
  var list;
  for (var i = 0; i < data.length; i++) {
    oneList = new YAHOO.widget.TextNode(
        { label: nodeHtml(data[i]), myData: data[i] },
        root,
        false); // expanded: no
    // top level nodes only dynamically loaded
    oneList.setDynamicLoad(lists._loadDataForNode);
  }
//  lists._tree.subscribe('labelClick', lists._labelClick);
  lists._tree.draw();
};

// ZAT_TODO: decent formatting for public/private indication
lists.nodeHtmlUser = function(nodeData) {
  var visibility;
  switch (parseInt(nodeData.groupId, 10)) {
  case 0: visibility = '(private)'; break;
  case 1: visibility = '(public)'; break;
  default: visibility = '(unknown)'; break; // shouldn't happen
  }
  return '<span title="' + nodeData.what + '">'
      + nodeData.name
      + '<\/span> ' + visibility;
};

lists.nodeHtmlPublic = function(nodeData) {
  return '<span title="' + nodeData.what + '">'
      + nodeData.name
      + '<\/span> (' + nodeData.owner + ')';
};

lists._loadDataForNode = function(parentNode, onCompleteCallback) {
  var listId = parentNode.data.myData.id;
  var params = "id="+listId;
  var callback = {
    success: lists._addNodes,
    // ZAT_TODO: handle failures better
    failure: function(response) { alert('lists._addNodes failed: ' + response.status); },
    argument: {
        listId: listId, parentNode: parentNode, onCompleteCallback: onCompleteCallback
    }
  }
  YAHOO.util.Connect.asyncRequest('POST', 'lib/ajax/get_list_elems.php', callback, params);
};

lists._linkHtml = function(listElem) {
  var note = listElem.note ? ': ' + listElem.note : '';
  return '<a href="pid-'+listElem.place_id+'">'
      + listElem.place_name + '<\/a>'
      + note;
}

lists._addNodes = function(xhr) {
  var data = eval('(' + xhr.responseText + ')');
  var node;
  for (var i = 0; i < data.length; i++) {
    node = data[i];
    new YAHOO.widget.TextNode(
        { label: lists._linkHtml(node), myData: node },
        xhr.argument.parentNode,
        false);
  }
  lists._tree.draw();
  xhr.argument.onCompleteCallback();
};
