// CollapsibleLists - unobtrusively convert multiple <dl class="collapsible">...</dl>'s
//
// NOTE: EXACTLY *ONE* DD PER DT!!
//
// example css...
//
// dl.collapsible            { list-style:none; }
// dl.collapsible dt         { padding-left:32px; font-weight:bolder; cursor:pointer; }
// dl.collapsible dt.hidden  { background:url(bullet_right.png) no-repeat 0 50%; }
// dl.collapsible dt.visible { background:url(bullet_down.png)  no-repeat 0 50%; }
// dl.collapsible dd         { margin-left:32px; }
//
function CollapsibleLists(not_xor, not_show_first) {

 this.xor       = !not_xor;        // only 1 [nested] item in a list ever visible
 this.showfirst = !not_show_first; // make 1st item in document visible
 this.lists     = [];

 this._swapClass = function(e, from, to) { // util
  var a = e.className.split(/\s+/), b = [];
  for (var i = 0, j = 0, n = a.length; i < n; i++)
   if (a[i] && a[i] != from && a[i] != to) b[j++] = a[i]; // opera9 bug pre-appends empty element!
  b[j] = to;
  e.className = b.join(' ');
 };

 this._hideAll = function() {
  for (var i = 0, t = 1, n = this.lists.length; i < n; i++)
   for (var j = 0, m = this.lists[i].length; j < m; j++)
    ///this._showItem(i, j);
    setTimeout('window.cListObject._hideItem(' + i + ',' + j + ');', 1000 / 6 * t++);
 };

 this._showAll = function() {
  for (var i = 0, t = 1, n = this.lists.length; i < n; i++)
   for (var j = 0, m = this.lists[i].length; j < m; j++)
    ///this._showItem(i, j);
    setTimeout('window.cListObject._showItem(' + i + ',' + j + ');', 1000 / 6 * t++);
  this._expandAll.innerHTML = 'Collapse All';
  this._expandAll.href = 'javascript:window.cListObject._hideAll();';

 };

 this._hideList = function(list_index, item_index) {
  for (var i = 0, t = 1, n = this.lists[list_index].length; i < n; i++)
   if (i !== item_index && !this.lists[list_index][i].className.match(/\bhidden\b/))
    ///this._hideItem(list_index, i);
    setTimeout('window.cListObject._hideItem(' + list_index + ',' + i + ');', 1000 / 12 * t++);
 };

 this._hideItem = function(list_index, item_index) {
  var dt = this.lists[list_index][item_index];
  dt.clistDd.style.display = 'none';
  this._swapClass(dt, 'visible', 'hidden');
  dt.title = 'Click to expand';
  this._expandAll.innerHTML = 'Expand All';
  this._expandAll.href = 'javascript:window.cListObject._showAll();';
 };

 this._showItem = function(list_index, item_index) { //alert([list_index, item_index])
  var dt = this.lists[list_index][item_index];
  dt.clistDd.style.display = 'block';
  this._swapClass(dt, 'hidden', 'visible');
  dt.title = 'Click to collapse';
 };

 this._click = function(dt) {
  if (dt.className == 'visible') {
   dt.cListObject._hideItem(dt.cListIndex, dt.clistItemIndex);
  }
  else {
   dt.cListObject._showItem(dt.cListIndex, dt.clistItemIndex);
   if (dt.cListObject.xor)
    dt.cListObject._hideList(dt.cListIndex, dt.clistItemIndex);
  }
 };

 var dls = document.getElementsByTagName('dl');
 for (var i = 0, n = dls.length; i < n; i++) {
  if (!dls[i].className.match(/\bcollapsible\b/)) continue;
  var dts = dls[i].getElementsByTagName('dt');
  var dds = dls[i].getElementsByTagName('dd');
  this.lists[i] = [];
  for (var j = 0, m = dts.length; j < m; j++) {
   var dt = dts[j]; //alert(dt.innerHTML)

   var name = dt.innerHTML.replace(/<a name=.*?a>/, '');// kludge - remove <a name="..."></a>

   dt.innerHTML = '<a href="javascript:void(0);">' + name + '</a>';

   dt.cListObject     = this;
   dt.cListIndex      = i;
   dt.clistItemIndex  = j;
   dt.clistDd         = dds[j]; // assuming dts.length == dds.length !
   dt.onclick = function() { this.cListObject._click(this); };
   dt.style.cursor = 'pointer'; // safari needs this

   //dt.style.backgroundColor = 'transparent'; // ie7 needs this

   this.lists[i][j] = dt;
  }
  if (i == 0) { // <-- crude FIXME
   var d = document.createElement('dd');
   var p = document.createElement('p');
   var a = document.createElement('a');
   a.href = 'javascript:window.cListObject._showAll();';
   this._expandAll = a;
   var t = document.createTextNode('Expand All');
   a.appendChild(t);
   p.appendChild(a);
   d.appendChild(p);
   dls[0].appendChild(d); // after last
   //dls[0].insertBefore(d, dts[0]); // before first
  }
 }
 for (var i = 0, n = this.lists.length; i < n; i++)
  this._hideList(i, this.showfirst && !i ? 0 : null);
  ///this._hideList(i, null);
 if (this.showfirst && n) this._showItem(0, 0);

 ///
 window.cListObject = this;  // ?

} // usage: new CollapsibleLists( [args] ); // anonymous class - all members private

function cl_init() {
 new CollapsibleLists(true, true);

 var e = document.getElementById('subnav');
 if (e) e.style.display = 'none';
}
if (!iemac && document.getElementsByTagName) // crudely test browser capability
 window.addEventListener ? window.addEventListener('load', cl_init, false) : window.attachEvent ? window.attachEvent('onload', cl_init) : null;

