/*
 * CTOCWidget.js
 * $Revision$ $Date$
 */

/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Netscape code.
 *
 * The Initial Developer of the Original Code is
 * Netscape Corporation.
 * Portions created by the Initial Developer are Copyright (C) 2003
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s): Bob Clary <bclary@netscape.com>
 *
 * ***** END LICENSE BLOCK ***** */

function CTOCWidget(domTOCModel, target)
{
  if (domTOCModel.documentElement.nodeName != 'toc')
  {
    throw 'CTOCWidget called on non toc Document: ' + domTOCModel.nodeName;
  }

  this.model = domTOCModel;
  this.target = target;
  this.view = document.createElement('div');
  this.view.setAttribute('class', CTOCWidget._classprefix + '_view');

  var modelItems = domTOCModel.documentElement.childNodes;
  for (var i = 0; i < modelItems.length; i++)
  {
    var modelItem = modelItems.item(i);
    if (modelItem.nodeType == Node.ELEMENT_NODE)
    {
      var viewItem  = CTOCWidget.createItemView(modelItem, target);
      this.view.appendChild(viewItem);
    }
  }
}

CTOCWidget._handleImages  = { open: '/toolbox/examples/2003/CTOCWidget/minus.gif', closed: '/toolbox/examples/2003/CTOCWidget/plus.gif', height: '12px', width: '16px'};
CTOCWidget._classprefix  = 'CTOCWidget';

CTOCWidget.createItemView = function (modelItem, target)
{
  if (modelItem.nodeType != Node.ELEMENT_NODE)
  {
    throw 'CTOCWidget.createItemView called on non-Element: ' + modelItem.nodeName;
  }

  var i;

  var viewItem = document.createElement('div');
  viewItem.setAttribute('class', CTOCWidget._classprefix + '_item');

  var viewItemHandle = document.createElement('div');
  viewItemHandle.setAttribute('class', CTOCWidget._classprefix + '_itemhandle');
  viewItemHandle.style.cursor = 'pointer';

  var viewItemHandleImg = document.createElement('img');
  viewItemHandleImg.style.height = CTOCWidget._handleImages.height;
  viewItemHandleImg.style.width = CTOCWidget._handleImages.width;
  viewItemHandleImg.addEventListener('click', CTOCWidget.toggleHandle, false);

  var viewItemHandleLink;
  if (!modelItem.getAttribute('url'))
  {
    viewItemHandleLink = document.createElement('span');
  }
  else 
  {
    viewItemHandleLink = document.createElement('a');
    viewItemHandleLink.setAttribute('href', modelItem.getAttribute('url'));
    viewItemHandleLink.setAttribute('target', target);
  }
  viewItemHandleLink.appendChild(document.createTextNode(modelItem.getAttribute('title')));

  viewItemHandle.appendChild(viewItemHandleImg);
  viewItemHandle.appendChild(viewItemHandleLink);
  viewItem.appendChild(viewItemHandle);

  if (modelItem.childNodes.length == 0)
  {
    viewItemHandleImg.setAttribute('src', CTOCWidget._handleImages.open);
  }
  else
  {
    viewItemHandleImg.setAttribute('src', CTOCWidget._handleImages.closed);

    var viewItemChildren = document.createElement('div');
    viewItemChildren.setAttribute('class', CTOCWidget._classprefix + '_itemchildren');
    viewItemChildren.style.display = 'none';
    viewItemChildren.style.position = 'relative';
    viewItemChildren.style.left = '1em';

    for (i = 0; i < modelItem.childNodes.length; i++)
    {
      var modelItemChild = modelItem.childNodes.item(i);
      if (modelItemChild.nodeType == Node.ELEMENT_NODE)
      {
        viewItemChildren.appendChild(CTOCWidget.createItemView(modelItemChild, target));
      }
    }

    viewItem.appendChild(viewItemChildren);
  }

  return viewItem;
};

// fires on img part of the handle
CTOCWidget.toggleHandle = function(e)
{
  switch (e.eventPhase)
  {
    case Event.CAPTURING_PHASE:
    case Event.BUBBLING_PHASE:
      return true;
    
    case Event.AT_TARGET:
     
      e.preventBubble();

      var domHandle   = e.target.parentNode;
      var domChildren = domHandle.nextSibling;

      if (!domChildren)
      {
        return true;
      }

      switch(domChildren.style.display)
      {
        case '':
        case 'block':
          domChildren.style.display = 'none';
          e.target.setAttribute('src', CTOCWidget._handleImages.closed);
          break;
        case 'none':
          domChildren.style.display = 'block';
          e.target.setAttribute('src', CTOCWidget._handleImages.open);
          break;
        default:
          return false;
       }

       return true;

    default:
      dump('Unknown Event Phase ' + e.eventPhase);
      break;
  }

  return true;
}

