/* xbCollapsibleLists.js 2001-02-26 Contributor(s): Michael Bostock, Netscape Communications, Copyright 1997 Bob Clary, Netscape Communications, Copyright 2001 Seth Dillingham, Macrobyte Resources, Copyright 2001 Mark Filanowicz, Amdahl IT Services, Copyright 2002 Netscape grants you a royalty free license to use, modify or distribute this software provided that this copyright notice appears on all copies. This software is provided "AS IS," without a warranty of any kind. See xbCollapsibleLists.js.changelog.html for details of changes. */ var xbcl__id = 0; var xbcl_item_id = 0; var xbcl_mLists = new Array(); var xbcl_parentElement = null; document.lists = xbcl_mLists; function List(visible, width, height, bgColor, collapsedImageURL, expandedImageURL) { this.lists = new Array(); // sublists this.items = new Array(); // layers this.types = new Array(); // type this.strs = new Array(); // content this.visible = visible; this.id = xbcl__id; this.width = width || 350; this.height = height || 22; this.collapsedImageURL = collapsedImageURL || 'false.gif'; this.expandedImageURL = expandedImageURL || 'true.gif'; if (bgColor) this.bgColor = bgColor; xbcl_mLists[xbcl__id++] = this; } function xbcl_SetFont(i,j) { this.fontIntro = i; this.fontOutro = j; } function xbcl_GetFont() { return [this.fontIntro, this.fontOutro]; } function xbcl_setIndent(indent) { this.i = indent; if (this.i < 0) { this.i = 0; this.space = false; } else this.space = true; } function xbcl_getIndent(indent) { return this.i; } function xbcl_writeItemDOMHTML( obj, s, flList, listObj ) { var styleObj; var outerDiv, innerLeft, innerRight; var str; var leftEdge = 0; styleObj = new xbStyle(obj); styleObj.setVisibility('hidden'); outerDiv = document.createElement( "DIV" ); outerDiv.id = "DIV_" + obj.id; styleObj = new xbStyle( outerDiv ); styleObj.setWidth( this.width ); if ( flList ) { innerLeft = document.createElement( "DIV" ); innerLeft.style.position = "absolute"; innerLeft.style.valign = "middle"; leftEdge = 15; styleObj = new xbStyle( innerLeft ); styleObj.setWidth( 15 ); styleObj.setBackgroundColor( "transparent" ); if ( listObj.visible ) str = ''; else str = ''; innerLeft.innerHTML = str; outerDiv.appendChild( innerLeft ); } else if ( this.space ) leftEdge = 15; innerRight = document.createElement( "DIV" ); innerRight.noWrap = true; innerRight.style.position = "absolute"; styleObj = new xbStyle( innerRight ); styleObj.setLeft( leftEdge + ( this.l * this.i ) ); styleObj.setWidth( this.width - 15 - this.l * this.i ); styleObj.setBackgroundColor( "transparent" ); // start of change by Mark Filanowicz 02-22-2002 if ( flList ) { s = this.fontIntro + '' + s + this.fontOutro; } else { s = this.fontIntro + s + this.fontOutro; } // end of change by Mark Filanowicz 02-22-2002 innerRight.innerHTML = s; outerDiv.appendChild( innerRight ); obj.appendChild( outerDiv ); return; } function xbcl_writeItem( obj, s, flList, listObj ) { var cellStyle = ''; var str = ''; var styleObj = new xbStyle( obj ); styleObj.setVisibility( 'hidden' ); if ( document.body && document.body.style ) cellStyle = ' style="background-color: transparent;"'; str += ''; if ( flList ) { str += ''; } else if (this.space) str += ''; if (this.l>0 && this.i>0) str += ''; str += '
'; str += ''; if ( listObj.visible ) str += ''; else str += ''; str += '  '; // start of change by Mark Filanowicz 02-22-2002 if ( flList ) { str += this.fontIntro + '' + s + this.fontOutro; } else { str += this.fontIntro + s + this.fontOutro; } // end of change by Mark Filanowicz 02-22-2002 str += '
'; styleObj.setInnerHTML( str ); return; } function xbcl_writeList() { var item; var i; var flList; for ( i = 0; i < this.types.length; i++ ) { item = this.items[ i ]; flList = ( this.types[ i ] == 'list' ); this._writeItem( item, this.strs[ i ], flList, this.lists[ i ] ); if ( flList && this.lists[ i ].visible ) this.lists[ i ]._writeList(); } this.built = true; this.needsRewrite = false; self.status = ''; } function xbcl_showList() { var item; var styleObj; var i; for (i = 0; i < this.types.length; i++) { item = this.items[i]; styleObj = new xbStyle(item); styleObj.setClipLeft(0); styleObj.setClipRight(this.width); styleObj.setClipTop(0); if (item.height) { styleObj.setClipBottom(item.height); styleObj.setHeight(item.height); } else { styleObj.setClipBottom(this.height); styleObj.setHeight(this.height); } if ( this.visible ) styleObj.setVisibility( 'visible' ); var bg = item.oBgColor || this.bgColor; if ((bg == null) || (bg == 'null')) bg = ''; styleObj.setBackgroundColor(bg); if (this.types[i] == 'list' && this.lists[i].visible) this.lists[i]._showList(); } this.shown = true; this.needsUpdate = false; } function xbcl_setImage(list, item, file) { var id = '_img' + list.id; var img = null; // for DOMHTML or IE4 use cross browser getElementById from xbStyle // can't use it for NN4 since it only works for layers in NN4 if (document.layers) img = item.document.images[0]; else img = xbGetElementById(id); if (img) img.src = file; } function xbcl_getHeight() { var totalHeight = 0; var i; if (!this.visible) return 0; for (i = 0; i < this.types.length; i++) { if (this.items[i].height) totalHeight += this.items[i].height; else totalHeight += this.height; if ((this.types[i] == 'list') && this.lists[i].visible) { totalHeight += this.lists[i].getHeight(); } } return totalHeight; } function xbcl_updateList(pVis, x, y) { var currTop = y; var item; var styleObj; var i; for (i = 0; i < this.types.length; i++) { item = this.items[i]; styleObj = new xbStyle(item); if (this.visible && pVis) { styleObj.moveTo(x, currTop); if (item.height) // allow custom heights for each item currTop += item.height; else currTop += this.height; styleObj.setVisibility('visible'); } else { styleObj.setVisibility('hidden'); } if (this.types[i] == 'list') { if (this.lists[i].visible) { if (!this.lists[i].built || this.lists[i].needsRewrite) this.lists[i]._writeList(); if (!this.lists[i].shown || this.lists[i].needsUpdate) this.lists[i]._showList(); xbcl_setImage(this.lists[i], item, this.expandedImageURL ); } else xbcl_setImage(this.lists[i], item, this.collapsedImageURL ); if (this.lists[i].built) currTop = this.lists[i]._updateList(this.visible && pVis, x, currTop); } } return currTop; } function xbcl_updateParent( pid, l ) { var i; if ( !l ) l = 0; this.pid = pid; this.l = l; for ( i = 0; i < this.types.length; i++ ) { if ( this.types[ i ] == 'list' ) { this.lists[ i ]._updateParent( pid, l + 1 ); } } } function xbcl_expand(i) { xbcl_mLists[i].visible = !xbcl_mLists[i].visible; if (xbcl_mLists[i].onexpand != null) xbcl_mLists[i].onexpand(xbcl_mLists[i].id); xbcl_mLists[xbcl_mLists[i].pid].rebuild(); if (xbcl_mLists[i].postexpand != null) xbcl_mLists[i].postexpand(xbcl_mLists[i].id); } function xbcl_build(x, y) { this._updateParent(this.id); this._writeList(); this._showList(); this._updateList(true, x, y); this.x = x; this.y = y; } function xbcl_rebuild() { this._updateList(true, this.x, this.y); } function xbcl_getNewItem() { var newItem = null; newItem = xbGetElementById('lItem' + xbcl_item_id); if (!newItem) { if (document.all && !document.getElementById) { var parentElement = this.parentElement; if (!parentElement) parentElement = document.body; parentElement.insertAdjacentHTML('beforeEnd', '
'); newItem = xbGetElementById('lItem' + xbcl_item_id); } else if (document.layers) { if (this.parentElement) newItem = new Layer(this.width, this.parentElement); else newItem = new Layer(this.width); } else if (document.createElement) { newItem = document.createElement('div'); newItem.id= 'lItem' + xbcl_item_id; newItem.style.position = 'absolute'; if (this.parentElement) this.parentElement.appendChild(newItem); else document.body.appendChild(newItem); } } return newItem; } function xbcl_addItem(str, bgColor, item) { if (!item) item = this._getNewItem(); if (!item) return; if (bgColor) item.oBgColor = bgColor; this.items[this.items.length] = item; this.types[this.types.length] = 'item'; this.strs[this.strs.length] = str; ++xbcl_item_id; if ( this.built ) { this._writeItem( item, str, false ); xbcl_mLists[this.pid].rebuild(); if ( this.visible ) this._showList(); else this.needsUpdate = true; } return item; } function xbcl_addList(list, str, bgColor, item) { if (!item) item = this._getNewItem(); if (!item) return; if (bgColor) item.oBgColor = bgColor; this.lists[this.items.length] = list; this.items[this.items.length] = item; this.types[this.types.length] = 'list'; this.strs[this.strs.length] = str; ++xbcl_item_id; list.parentList = this; list.pid = this.pid; list.l = this.l + 1; if ( this.built ) { this._writeItem( item, str, true, list ); xbcl_mLists[ this.pid ].rebuild(); if ( this.visible ) this._showList(); else this.needsUpdate = true; } return item; } List.prototype.setIndent = xbcl_setIndent; List.prototype.getIndent = xbcl_getIndent; List.prototype.addItem = xbcl_addItem; List.prototype.addList = xbcl_addList; List.prototype.build = xbcl_build; List.prototype.rebuild = xbcl_rebuild; List.prototype.setFont = xbcl_SetFont; List.prototype.getFont = xbcl_GetFont; List.prototype.getHeight = xbcl_getHeight; List.prototype._writeList = xbcl_writeList; List.prototype._getNewItem = xbcl_getNewItem; if ( document.getElementById && document.createElement ) List.prototype._writeItem = xbcl_writeItemDOMHTML; else List.prototype._writeItem = xbcl_writeItem; List.prototype._showList = xbcl_showList; List.prototype._updateList = xbcl_updateList; List.prototype._updateParent = xbcl_updateParent; List.prototype.onexpand = null; List.prototype.postexpand = null; List.prototype.lists = null; // sublists List.prototype.items = null; // layers List.prototype.types = null; // type List.prototype.strs = null; // content List.prototype.x = 0; List.prototype.y = 0; List.prototype.visible = false; List.prototype.id = -1; List.prototype.i = 18; List.prototype.space = true; List.prototype.pid = 0; List.prototype.fontIntro = ''; List.prototype.fontOutro = ''; List.prototype.width = 350; List.prototype.height = 22; List.prototype.built = false; List.prototype.shown = false; List.prototype.needsUpdate = false; List.prototype.needsRewrite = false; List.prototype.l = 0; List.prototype.bgColor = null; List.prototype.parentList = null; List.prototype.parentElement = null;