/* * CTOCWidget.js * $Revision: 1.3 $ $Date: 2003/07/14 06:02:50 $ */ /* ***** 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 * * ***** 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; }