2 xbCollapsibleLists.js 2001-02-26
\r
4 Contributor(s): Michael Bostock, Netscape Communications, Copyright 1997
\r
5 Bob Clary, Netscape Communications, Copyright 2001
\r
6 Seth Dillingham, Macrobyte Resources, Copyright 2001
\r
7 Mark Filanowicz, Amdahl IT Services, Copyright 2002
\r
9 Netscape grants you a royalty free license to use, modify or
\r
10 distribute this software provided that this copyright notice
\r
11 appears on all copies. This software is provided "AS IS,"
\r
12 without a warranty of any kind.
\r
14 See xbCollapsibleLists.js.changelog.html for details of changes.
\r
19 var xbcl_item_id = 0;
\r
20 var xbcl_mLists = new Array();
\r
21 var xbcl_parentElement = null;
\r
23 document.lists = xbcl_mLists;
\r
25 function List(visible, width, height, bgColor, collapsedImageURL, expandedImageURL)
\r
27 this.lists = new Array(); // sublists
\r
28 this.items = new Array(); // layers
\r
29 this.types = new Array(); // type
\r
30 this.strs = new Array(); // content
\r
31 this.visible = visible;
\r
33 this.width = width || 350;
\r
34 this.height = height || 22;
\r
36 this.collapsedImageURL = collapsedImageURL || 'false.gif';
\r
37 this.expandedImageURL = expandedImageURL || 'true.gif';
\r
40 this.bgColor = bgColor;
\r
42 xbcl_mLists[xbcl__id++] = this;
\r
45 function xbcl_SetFont(i,j)
\r
51 function xbcl_GetFont()
\r
53 return [this.fontIntro, this.fontOutro];
\r
56 function xbcl_setIndent(indent)
\r
62 this.space = false;
\r
68 function xbcl_getIndent(indent)
\r
73 function xbcl_writeItemDOMHTML( obj, s, flList, listObj )
\r
76 var outerDiv, innerLeft, innerRight;
\r
80 styleObj = new xbStyle(obj);
\r
81 styleObj.setVisibility('hidden');
\r
82 outerDiv = document.createElement( "DIV" );
\r
83 outerDiv.id = "DIV_" + obj.id;
\r
84 styleObj = new xbStyle( outerDiv );
\r
85 styleObj.setWidth( this.width );
\r
89 innerLeft = document.createElement( "DIV" );
\r
90 innerLeft.style.position = "absolute";
\r
91 innerLeft.style.valign = "middle";
\r
94 styleObj = new xbStyle( innerLeft );
\r
95 styleObj.setWidth( 15 );
\r
96 styleObj.setBackgroundColor( "transparent" );
\r
98 if ( listObj.visible )
\r
99 str = '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');"><IMG BORDER="0" SRC="' + this.expandedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '"></A>';
\r
101 str = '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');"><IMG BORDER="0" SRC="' + this.collapsedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '"></A>';
\r
103 innerLeft.innerHTML = str;
\r
104 outerDiv.appendChild( innerLeft );
\r
106 else if ( this.space )
\r
109 innerRight = document.createElement( "DIV" );
\r
110 innerRight.noWrap = true;
\r
111 innerRight.style.position = "absolute";
\r
113 styleObj = new xbStyle( innerRight );
\r
114 styleObj.setLeft( leftEdge + ( this.l * this.i ) );
\r
115 styleObj.setWidth( this.width - 15 - this.l * this.i );
\r
116 styleObj.setBackgroundColor( "transparent" );
\r
118 // start of change by Mark Filanowicz 02-22-2002
\r
121 s = this.fontIntro + '<A TARGET="_self" STYLE="text-decoration: none;" HREF="javascript:xbcl_expand(' + listObj.id + ');">' + s + this.fontOutro;
\r
125 s = this.fontIntro + s + this.fontOutro;
\r
127 // end of change by Mark Filanowicz 02-22-2002
\r
130 innerRight.innerHTML = s;
\r
131 outerDiv.appendChild( innerRight );
\r
133 obj.appendChild( outerDiv );
\r
138 function xbcl_writeItem( obj, s, flList, listObj )
\r
140 var cellStyle = '';
\r
142 var styleObj = new xbStyle( obj );
\r
144 styleObj.setVisibility( 'hidden' );
\r
146 if ( document.body && document.body.style )
\r
147 cellStyle = ' style="background-color: transparent;"';
\r
149 str += '<TABLE WIDTH='+this.width+' NOWRAP BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR>';
\r
153 str += '<TD WIDTH="15" NOWRAP VALIGN="MIDDLE"' + cellStyle + '>';
\r
154 str += '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');">';
\r
156 if ( listObj.visible )
\r
157 str += '<IMG BORDER="0" SRC="' + this.expandedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '">';
\r
159 str += '<IMG BORDER="0" SRC="' + this.collapsedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '">';
\r
161 str += '</A></TD>';
\r
163 else if (this.space)
\r
164 str += '<TD WIDTH="15" NOWRAP' + cellStyle + '> </TD>';
\r
166 if (this.l>0 && this.i>0)
\r
167 str += '<TD WIDTH="' + this.l*this.i+ '" NOWRAP' + cellStyle + '> </TD>';
\r
169 str += '<TD HEIGHT="' + ( this.height - 3) + '" WIDTH="' + ( this.width - 15 - this.l * this.i ) + '" VALIGN="MIDDLE" ALIGN="LEFT"' + cellStyle + '>';
\r
171 // start of change by Mark Filanowicz 02-22-2002
\r
174 str += this.fontIntro + '<A TARGET="_self" STYLE="text-decoration: none;" HREF="javascript:xbcl_expand(' + listObj.id + ');">' + s + this.fontOutro;
\r
178 str += this.fontIntro + s + this.fontOutro;
\r
180 // end of change by Mark Filanowicz 02-22-2002
\r
182 str += '</TD></TR></TABLE>';
\r
184 styleObj.setInnerHTML( str );
\r
189 function xbcl_writeList()
\r
195 for ( i = 0; i < this.types.length; i++ )
\r
197 item = this.items[ i ];
\r
198 flList = ( this.types[ i ] == 'list' );
\r
200 this._writeItem( item, this.strs[ i ], flList, this.lists[ i ] );
\r
202 if ( flList && this.lists[ i ].visible )
\r
203 this.lists[ i ]._writeList();
\r
207 this.needsRewrite = false;
\r
211 function xbcl_showList()
\r
217 for (i = 0; i < this.types.length; i++)
\r
219 item = this.items[i];
\r
220 styleObj = new xbStyle(item);
\r
221 styleObj.setClipLeft(0);
\r
222 styleObj.setClipRight(this.width);
\r
223 styleObj.setClipTop(0);
\r
226 styleObj.setClipBottom(item.height);
\r
227 styleObj.setHeight(item.height);
\r
231 styleObj.setClipBottom(this.height);
\r
232 styleObj.setHeight(this.height);
\r
235 if ( this.visible )
\r
236 styleObj.setVisibility( 'visible' );
\r
238 var bg = item.oBgColor || this.bgColor;
\r
239 if ((bg == null) || (bg == 'null'))
\r
242 styleObj.setBackgroundColor(bg);
\r
244 if (this.types[i] == 'list' && this.lists[i].visible)
\r
245 this.lists[i]._showList();
\r
248 this.needsUpdate = false;
\r
251 function xbcl_setImage(list, item, file)
\r
253 var id = '_img' + list.id;
\r
256 // for DOMHTML or IE4 use cross browser getElementById from xbStyle
\r
257 // can't use it for NN4 since it only works for layers in NN4
\r
258 if (document.layers)
\r
259 img = item.document.images[0];
\r
261 img = xbGetElementById(id);
\r
267 function xbcl_getHeight()
\r
269 var totalHeight = 0;
\r
275 for (i = 0; i < this.types.length; i++)
\r
277 if (this.items[i].height)
\r
278 totalHeight += this.items[i].height;
\r
280 totalHeight += this.height;
\r
282 if ((this.types[i] == 'list') && this.lists[i].visible)
\r
284 totalHeight += this.lists[i].getHeight();
\r
288 return totalHeight;
\r
291 function xbcl_updateList(pVis, x, y)
\r
298 for (i = 0; i < this.types.length; i++)
\r
300 item = this.items[i];
\r
301 styleObj = new xbStyle(item);
\r
303 if (this.visible && pVis)
\r
305 styleObj.moveTo(x, currTop);
\r
306 if (item.height) // allow custom heights for each item
\r
307 currTop += item.height;
\r
309 currTop += this.height;
\r
311 styleObj.setVisibility('visible');
\r
315 styleObj.setVisibility('hidden');
\r
318 if (this.types[i] == 'list')
\r
320 if (this.lists[i].visible)
\r
322 if (!this.lists[i].built || this.lists[i].needsRewrite)
\r
323 this.lists[i]._writeList();
\r
325 if (!this.lists[i].shown || this.lists[i].needsUpdate)
\r
326 this.lists[i]._showList();
\r
328 xbcl_setImage(this.lists[i], item, this.expandedImageURL );
\r
331 xbcl_setImage(this.lists[i], item, this.collapsedImageURL );
\r
333 if (this.lists[i].built)
\r
334 currTop = this.lists[i]._updateList(this.visible && pVis, x, currTop);
\r
340 function xbcl_updateParent( pid, l )
\r
350 for ( i = 0; i < this.types.length; i++ )
\r
352 if ( this.types[ i ] == 'list' )
\r
354 this.lists[ i ]._updateParent( pid, l + 1 );
\r
359 function xbcl_expand(i)
\r
361 xbcl_mLists[i].visible = !xbcl_mLists[i].visible;
\r
363 if (xbcl_mLists[i].onexpand != null)
\r
364 xbcl_mLists[i].onexpand(xbcl_mLists[i].id);
\r
366 xbcl_mLists[xbcl_mLists[i].pid].rebuild();
\r
368 if (xbcl_mLists[i].postexpand != null)
\r
369 xbcl_mLists[i].postexpand(xbcl_mLists[i].id);
\r
372 function xbcl_build(x, y)
\r
374 this._updateParent(this.id);
\r
377 this._updateList(true, x, y);
\r
382 function xbcl_rebuild()
\r
384 this._updateList(true, this.x, this.y);
\r
387 function xbcl_getNewItem()
\r
389 var newItem = null;
\r
391 newItem = xbGetElementById('lItem' + xbcl_item_id);
\r
395 if (document.all && !document.getElementById)
\r
397 var parentElement = this.parentElement;
\r
398 if (!parentElement)
\r
399 parentElement = document.body;
\r
401 parentElement.insertAdjacentHTML('beforeEnd', '<div id="lItem' + xbcl_item_id + '" style="position:absolute;"></div>');
\r
402 newItem = xbGetElementById('lItem' + xbcl_item_id);
\r
404 else if (document.layers)
\r
406 if (this.parentElement)
\r
407 newItem = new Layer(this.width, this.parentElement);
\r
409 newItem = new Layer(this.width);
\r
411 else if (document.createElement)
\r
413 newItem = document.createElement('div');
\r
414 newItem.id= 'lItem' + xbcl_item_id;
\r
415 newItem.style.position = 'absolute';
\r
417 if (this.parentElement)
\r
418 this.parentElement.appendChild(newItem);
\r
420 document.body.appendChild(newItem);
\r
427 function xbcl_addItem(str, bgColor, item)
\r
430 item = this._getNewItem();
\r
436 item.oBgColor = bgColor;
\r
438 this.items[this.items.length] = item;
\r
439 this.types[this.types.length] = 'item';
\r
440 this.strs[this.strs.length] = str;
\r
445 this._writeItem( item, str, false );
\r
446 xbcl_mLists[this.pid].rebuild();
\r
447 if ( this.visible )
\r
450 this.needsUpdate = true;
\r
456 function xbcl_addList(list, str, bgColor, item)
\r
459 item = this._getNewItem();
\r
465 item.oBgColor = bgColor;
\r
467 this.lists[this.items.length] = list;
\r
468 this.items[this.items.length] = item;
\r
469 this.types[this.types.length] = 'list';
\r
470 this.strs[this.strs.length] = str;
\r
473 list.parentList = this;
\r
475 list.pid = this.pid;
\r
476 list.l = this.l + 1;
\r
480 this._writeItem( item, str, true, list );
\r
481 xbcl_mLists[ this.pid ].rebuild();
\r
482 if ( this.visible )
\r
485 this.needsUpdate = true;
\r
491 List.prototype.setIndent = xbcl_setIndent;
\r
492 List.prototype.getIndent = xbcl_getIndent;
\r
493 List.prototype.addItem = xbcl_addItem;
\r
494 List.prototype.addList = xbcl_addList;
\r
495 List.prototype.build = xbcl_build;
\r
496 List.prototype.rebuild = xbcl_rebuild;
\r
497 List.prototype.setFont = xbcl_SetFont;
\r
498 List.prototype.getFont = xbcl_GetFont;
\r
499 List.prototype.getHeight = xbcl_getHeight;
\r
501 List.prototype._writeList = xbcl_writeList;
\r
502 List.prototype._getNewItem = xbcl_getNewItem;
\r
504 if ( document.getElementById && document.createElement )
\r
505 List.prototype._writeItem = xbcl_writeItemDOMHTML;
\r
507 List.prototype._writeItem = xbcl_writeItem;
\r
509 List.prototype._showList = xbcl_showList;
\r
510 List.prototype._updateList = xbcl_updateList;
\r
511 List.prototype._updateParent = xbcl_updateParent;
\r
513 List.prototype.onexpand = null;
\r
514 List.prototype.postexpand = null;
\r
515 List.prototype.lists = null; // sublists
\r
516 List.prototype.items = null; // layers
\r
517 List.prototype.types = null; // type
\r
518 List.prototype.strs = null; // content
\r
519 List.prototype.x = 0;
\r
520 List.prototype.y = 0;
\r
521 List.prototype.visible = false;
\r
522 List.prototype.id = -1;
\r
523 List.prototype.i = 18;
\r
524 List.prototype.space = true;
\r
525 List.prototype.pid = 0;
\r
526 List.prototype.fontIntro = '';
\r
527 List.prototype.fontOutro = '';
\r
528 List.prototype.width = 350;
\r
529 List.prototype.height = 22;
\r
530 List.prototype.built = false;
\r
531 List.prototype.shown = false;
\r
532 List.prototype.needsUpdate = false;
\r
533 List.prototype.needsRewrite = false;
\r
534 List.prototype.l = 0;
\r
535 List.prototype.bgColor = null;
\r
536 List.prototype.parentList = null;
\r
537 List.prototype.parentElement = null;
\r