/*
requires: class.js or classList.js
 */
var dbgLvl=0;

var panelClassNames = {bio: 'bio'};

function dbgMsg(msg, lvl) {
  if (! lvl) lvl = 1;
  if (lvl <= dbgLvl) {
      if (window.console) {
	  window.console.log(msg);
	  return;
      } else if ("undefined" != typeof(Components)) {
	  try {
	      Components.utils.reportError(panel);
	  } catch (err) {
	      try {
		  var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
		      .getService(Components.interfaces.nsIConsoleService);
		  consoleService.logStringMessage(msg);
	      } catch (err) {
		  //alert(msg);
	      }
	  }
      } else {
	  //alert(msg);
      }
  }
}

function nodeName(node) {
    if (node) {
	if ("string"==typeof(node))
	    return node;
	return "#"+node.id+"."+node.className;
    }
    return "unknown";
}


function isClass(node, className) {
  return node.className && node.className.indexOf(className) > -1
}

function join(joinStr, coll) {
  if (coll && coll.length > 0) {
	var accum = coll[0];
	for (var i=0; i<coll.length; ++i) {
	  accum += joinStr + coll[i];
	}
  } else {
	return '';
  }
}

function pickPanel(panels, isThePanel) {
  if (panels) {
    //dbgMsg('bios: [' + join(', ', bios) + ']');
    for (var i=0; i<panels.length; ++i) {
	if (isThePanel(panels[i])) {
	    return panels[i];
	}
    }
  } else {
  }
}

function getPanelFromStr(str, isThePanel) {
    //dbgMsg("looking for "+str)
    if (bio = pickPanel(document.getElementsByName(str), isThePanel)) {
	//dbgMsg("bio name "+str+" picked from string", 2);
	return bio;
    }
    if (bio = document.getElementById(str)) {
	//dbgMsg("bio #"+str+" picked from string");
	return bio;
    }
    if (bio = document.getElementById(str+'_bio')) {
	//dbgMsg("bio #"+str+" picked from string");
	return bio;
    }
}

function getPanel(obj, isThePanel) {
  var panel;
  if ('string' == typeof(obj)) {
      return getPanelFromStr(obj, isThePanel);
  } else {
      for (panel=obj.nextSibling; panel; panel=panel.nextSibling) {
	  if (isThePanel(panel)) {
	      return panel;
	  }
      }
      if (obj.name) {
	  //dbgMsg("looking for "+obj.name)
	  if (panel = pickPanel(document.getElementsByName(obj.name), isThePanel))
	  {
	      //dbgMsg("bio name "+obj+" picked from obj.name");
	      return panel;
	  }
	  if (panel = document.getElementById(obj.name)) {
	      //dbgMsg("panel #"+obj+" picked from obj.name");
	      return panel;
	  }
      }
      if (obj.id) {
	  //dbgMsg("looking for "+obj.id)
	  if (panel = pickPanel(document.getElementsByName(obj.id), isThePanel)) {
	      //dbgMsg("panel name "+obj+" picked from obj.id");
	      return panel;
	  }
      }
  }
  dbgMsg("couldn't find panel from "+obj);
}

function isBioPanel(panel) {
    return isClass(panel, panelClassNames.bio);
}

/* Functional OOP */
var panelVisibility = function (isPanel) {
    if (! isPanel) {
	isPanel = isBioPanel;
    }
    var currPanel,currTab;

    function resetCurrs() {
	currPanel = {style: {display: ''}};
	currTab = {className: ''};
    }

    resetCurrs();

    function showPanel(obj, callback) {
	//dbgMsg("showing "+nodeName(obj), 2);
	var panel=getPanel(obj, isPanel);
	// hide current panel
	//dbgMsg("got "+nodeName(panel));
	hidePanel(null, callback);
	if (panel) {
	    panel.style.display='block';
	    panel.style.visibility='visible';
	    currPanel = panel;
	    currTab=panel.tab=obj;
	    addClass(currTab, "selected");
	    if (callback) {
		//dbgMsg("calling callback("+nodeName(obj)+", "+nodeName(panel)+")");
		callback(panel, obj, 'show');
	    }
	}
    };
    var hidePanel = function (obj, callback) {
	var panel;
	if (obj) {
	    panel=getPanel(obj, isPanel);
	} else {
	    panel = currPanel;
	}
	if (panel) {
	    panel.style.display='';
	    panel.style.visibility='';
	    if (panel == currPanel) {
		removeClass(currTab, "selected");
		resetCurrs();
	    } else {
		removeClass(panel.tab, "selected");
	    }
	    if (callback) {
		callback(panel, obj, 'hide');
	    }
	}
    };
    return function (pick) {
	switch (pick) {
	case "show":
	case "showPanel":
	    return showPanel;
	    
	case "hide":
	case "hidePanel":
	    return hidePanel;
	    
	case "curr":
	case "currPanel":
	    return currPanel;
	    
	default:
	    return isThePanel;
	}
    }
};
var bioVisibility = panelVisibility(isBioPanel);
var showBio = bioVisibility("show");
var hideBio = bioVisibility("hide");
