]> git.stg.codes - stg.git/blob - doc/xslt/slides/browser/CTOCWidget.js
User parser refactoring.
[stg.git] / doc / xslt / slides / browser / CTOCWidget.js
1 /*
2  * CTOCWidget.js
3  * $Revision: 1.3 $ $Date: 2003/07/14 06:02:50 $
4  */
5
6 /* ***** BEGIN LICENSE BLOCK *****
7  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
8  *
9  * The contents of this file are subject to the Mozilla Public License Version
10  * 1.1 (the "License"); you may not use this file except in compliance with
11  * the License. You may obtain a copy of the License at
12  * http://www.mozilla.org/MPL/
13  *
14  * Software distributed under the License is distributed on an "AS IS" basis,
15  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
16  * for the specific language governing rights and limitations under the
17  * License.
18  *
19  * The Original Code is Netscape code.
20  *
21  * The Initial Developer of the Original Code is
22  * Netscape Corporation.
23  * Portions created by the Initial Developer are Copyright (C) 2003
24  * the Initial Developer. All Rights Reserved.
25  *
26  * Contributor(s): Bob Clary <bclary@netscape.com>
27  *
28  * ***** END LICENSE BLOCK ***** */
29
30 function CTOCWidget(domTOCModel, target)
31 {
32   if (domTOCModel.documentElement.nodeName != 'toc')
33   {
34     throw 'CTOCWidget called on non toc Document: ' + domTOCModel.nodeName;
35   }
36
37   this.model = domTOCModel;
38   this.target = target;
39   this.view = document.createElement('div');
40   this.view.setAttribute('class', CTOCWidget._classprefix + '_view');
41
42   var modelItems = domTOCModel.documentElement.childNodes;
43   for (var i = 0; i < modelItems.length; i++)
44   {
45     var modelItem = modelItems.item(i);
46     if (modelItem.nodeType == Node.ELEMENT_NODE)
47     {
48       var viewItem  = CTOCWidget.createItemView(modelItem, target);
49       this.view.appendChild(viewItem);
50     }
51   }
52 }
53
54 CTOCWidget._handleImages  = { open: '/toolbox/examples/2003/CTOCWidget/minus.gif', closed: '/toolbox/examples/2003/CTOCWidget/plus.gif', height: '12px', width: '16px'};
55 CTOCWidget._classprefix  = 'CTOCWidget';
56
57 CTOCWidget.createItemView = function (modelItem, target)
58 {
59   if (modelItem.nodeType != Node.ELEMENT_NODE)
60   {
61     throw 'CTOCWidget.createItemView called on non-Element: ' + modelItem.nodeName;
62   }
63
64   var i;
65
66   var viewItem = document.createElement('div');
67   viewItem.setAttribute('class', CTOCWidget._classprefix + '_item');
68
69   var viewItemHandle = document.createElement('div');
70   viewItemHandle.setAttribute('class', CTOCWidget._classprefix + '_itemhandle');
71   viewItemHandle.style.cursor = 'pointer';
72
73   var viewItemHandleImg = document.createElement('img');
74   viewItemHandleImg.style.height = CTOCWidget._handleImages.height;
75   viewItemHandleImg.style.width = CTOCWidget._handleImages.width;
76   viewItemHandleImg.addEventListener('click', CTOCWidget.toggleHandle, false);
77
78   var viewItemHandleLink;
79   if (!modelItem.getAttribute('url'))
80   {
81     viewItemHandleLink = document.createElement('span');
82   }
83   else 
84   {
85     viewItemHandleLink = document.createElement('a');
86     viewItemHandleLink.setAttribute('href', modelItem.getAttribute('url'));
87     viewItemHandleLink.setAttribute('target', target);
88   }
89   viewItemHandleLink.appendChild(document.createTextNode(modelItem.getAttribute('title')));
90
91   viewItemHandle.appendChild(viewItemHandleImg);
92   viewItemHandle.appendChild(viewItemHandleLink);
93   viewItem.appendChild(viewItemHandle);
94
95   if (modelItem.childNodes.length == 0)
96   {
97     viewItemHandleImg.setAttribute('src', CTOCWidget._handleImages.open);
98   }
99   else
100   {
101     viewItemHandleImg.setAttribute('src', CTOCWidget._handleImages.closed);
102
103     var viewItemChildren = document.createElement('div');
104     viewItemChildren.setAttribute('class', CTOCWidget._classprefix + '_itemchildren');
105     viewItemChildren.style.display = 'none';
106     viewItemChildren.style.position = 'relative';
107     viewItemChildren.style.left = '1em';
108
109     for (i = 0; i < modelItem.childNodes.length; i++)
110     {
111       var modelItemChild = modelItem.childNodes.item(i);
112       if (modelItemChild.nodeType == Node.ELEMENT_NODE)
113       {
114         viewItemChildren.appendChild(CTOCWidget.createItemView(modelItemChild, target));
115       }
116     }
117
118     viewItem.appendChild(viewItemChildren);
119   }
120
121   return viewItem;
122 };
123
124 // fires on img part of the handle
125 CTOCWidget.toggleHandle = function(e)
126 {
127   switch (e.eventPhase)
128   {
129     case Event.CAPTURING_PHASE:
130     case Event.BUBBLING_PHASE:
131       return true;
132     
133     case Event.AT_TARGET:
134      
135       e.preventBubble();
136
137       var domHandle   = e.target.parentNode;
138       var domChildren = domHandle.nextSibling;
139
140       if (!domChildren)
141       {
142         return true;
143       }
144
145       switch(domChildren.style.display)
146       {
147         case '':
148         case 'block':
149           domChildren.style.display = 'none';
150           e.target.setAttribute('src', CTOCWidget._handleImages.closed);
151           break;
152         case 'none':
153           domChildren.style.display = 'block';
154           e.target.setAttribute('src', CTOCWidget._handleImages.open);
155           break;
156         default:
157           return false;
158        }
159
160        return true;
161
162     default:
163       dump('Unknown Event Phase ' + e.eventPhase);
164       break;
165   }
166
167   return true;
168 }
169