| /* |
| 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 = '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');"><IMG BORDER="0" SRC="' + this.expandedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '"></A>'; |
| else |
| 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>'; |
| |
| 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 + '<A TARGET="_self" STYLE="text-decoration: none;" HREF="javascript:xbcl_expand(' + listObj.id + ');">' + 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 += '<TABLE WIDTH='+this.width+' NOWRAP BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR>'; |
| |
| if ( flList ) |
| { |
| str += '<TD WIDTH="15" NOWRAP VALIGN="MIDDLE"' + cellStyle + '>'; |
| str += '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');">'; |
| |
| if ( listObj.visible ) |
| str += '<IMG BORDER="0" SRC="' + this.expandedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '">'; |
| else |
| str += '<IMG BORDER="0" SRC="' + this.collapsedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '">'; |
| |
| str += '</A></TD>'; |
| } |
| else if (this.space) |
| str += '<TD WIDTH="15" NOWRAP' + cellStyle + '> </TD>'; |
| |
| if (this.l>0 && this.i>0) |
| str += '<TD WIDTH="' + this.l*this.i+ '" NOWRAP' + cellStyle + '> </TD>'; |
| |
| str += '<TD HEIGHT="' + ( this.height - 3) + '" WIDTH="' + ( this.width - 15 - this.l * this.i ) + '" VALIGN="MIDDLE" ALIGN="LEFT"' + cellStyle + '>'; |
| |
| // start of change by Mark Filanowicz 02-22-2002 |
| if ( flList ) |
| { |
| str += this.fontIntro + '<A TARGET="_self" STYLE="text-decoration: none;" HREF="javascript:xbcl_expand(' + listObj.id + ');">' + s + this.fontOutro; |
| } |
| else |
| { |
| str += this.fontIntro + s + this.fontOutro; |
| } |
| // end of change by Mark Filanowicz 02-22-2002 |
| |
| str += '</TD></TR></TABLE>'; |
| |
| 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', '<div id="lItem' + xbcl_item_id + '" style="position:absolute;"></div>'); |
| 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; |