window.collapsibleListRef = []; window.imageCache = []; window.autoCloseRef = [];
//iCab can change display, but does not say so, and does notunderstand '' so I use a browser detect
var is_Icab = window.ScriptEngine && ScriptEngine().indexOf( 'InScript' ) + 1;
function collapsibleList() {
//hold tree information about the list and the images used
this.treeImg = arguments[0];
this.expdImg = arguments[1];
this.isAutoClose = arguments[2];
this.subClass = arguments[3];
this.sub = [];
}
function sub() {
//hold information about the list item
this.text = arguments[0];
this.expanded = arguments[1];
this.sub = [];
}
//done because WebTV does not understand inline object syntax
function ColLexPdOb(plI,miI,oSv,oAc) { this.plI = plI; this.miI = miI; this.subs = []; this.saveName = oSv; this.autoCol = oAc; }
function ColLexPdIT(name,expanded) { this.name = name; this.expanded = expanded; }
function createList(listObject,currentExt,imgExt,oLev,oBase) {
if( !currentExt || !currentExt.match(/^treeList_\d+(_\d+)+$/) ) {
//create the list, start by defining aditional stuff that is required, counting the lists etc.
window.collapsibleListRef[window.collapsibleListRef.length] = new ColLexPdOb( listObject.expdImg[4], listObject.expdImg[5], currentExt, listObject.isAutoClose );
currentExt = 'treeList_'+( window.collapsibleListRef.length - 1 ); imgExt = ''; oLev = 0; oBase = listObject;
document.write( '' );
oBase.menuUniqueNum = window.collapsibleListRef.length - 1; window.autoCloseRef[oBase.menuUniqueNum] = [];
}
document.write( '' );
for( var x = 0; x < listObject.sub.length; x++ ) {
//for every child object, create their line
document.write(
//the line break on all except the very first line
( ( oLev || x ) ? '\n
' : '' ) +
//what may or may not remain of the trunk
( ( oBase.subClass && oBase.subClass[oLev] && oBase.subClass[oLev][listObject.sub[x].sub.length?1:0] && !( document.layers && navigator.mimeTypes['*'] ) ) ? ( '' ) : '' ) + imgExt +
//this branch
( oLev ? '
' : '' ) +
//the expand / collapse link or not as the case may be
( listObject.sub[x].sub.length ? '
' : '
' ) +
//the text of the branch
listObject.sub[x].text + ( ( oBase.subClass && oBase.subClass[oLev] && oBase.subClass[oLev][listObject.sub[x].sub.length?1:0] && !( document.layers && navigator.mimeTypes['*'] ) ) ? '' : '' )
);
if( listObject.sub[x].sub.length ) {
//add the span id to a list so we can easily find it and collapse it later
window.collapsibleListRef[window.collapsibleListRef.length - 1].subs[window.collapsibleListRef[window.collapsibleListRef.length - 1].subs.length] = new ColLexPdIT( currentExt + '_' + x, listObject.sub[x].expanded && !oBase.isAutoClose );
//create children
createList( listObject.sub[x], currentExt + '_' + x, oLev ? ( imgExt + ( ( x < listObject.sub.length - 1 ) ? '
' : '
' ) ) : '', oLev + 1, oBase );
}
}
document.write( '' );
if( !oLev ) {
//end the list and prepare to collapse as soon as the browser lays it out
document.write( '
\n' );
if( document.all || document.getElementById ) { window.setTimeout('prepareForUse('+(window.collapsibleListRef.length-1)+')',100); }
}
}
function expandList(spanName,imgName,plsImg,minImg,oMenu,oLevel,oAutoClose) {
var theSpan = document.getElementById ? document.getElementById(spanName) : document.all ? document.all[spanName] : (new Object());
if( !theSpan ) { return; } if( theSpan.style ) { theSpan = theSpan.style; }
if( typeof( theSpan.display ) == 'undefined' && !is_Icab ) {
//if we could not access the span element or if its display style cannot be changed, say so
window.alert( 'Sorry, your browser cannot collapse or expand these lists\nso the lists will remain constantly expanded.' );
} else {
//if required, collapse back down again
for( var y = window.autoCloseRef[oMenu].length - 1; y >= oLevel; y-- ) {
if( window.autoCloseRef[oMenu][y] && oAutoClose && window.autoCloseRef[oMenu][y][0] != spanName ) {
var theSpan2 = document.getElementById ? document.getElementById(window.autoCloseRef[oMenu][y][0]) : document.all ? document.all[window.autoCloseRef[oMenu][y][0]] : (new Object());
if( theSpan2.style ) { theSpan2 = theSpan2.style; } theSpan2.display = 'none';
document.images[window.autoCloseRef[oMenu][y][1]].src = window.autoCloseRef[oMenu][y][2];
window.autoCloseRef[oMenu][y] = null;
}
}
if( theSpan.display == 'none' ) { window.autoCloseRef[oMenu][oLevel] = [spanName,imgName,plsImg]; }
//expand / collapse the list and change the image
theSpan.display = ( theSpan.display == 'none' ) ? ( is_Icab ? 'inline' : '' ) : 'none';
document.images[imgName].src = theSpan.display ? plsImg : minImg;
}
}
function prepareForUse(listNum) {
if( !window.collapsibleListRef[listNum].subs.length ) { return; } //no branches to collapse
var lastPart = window.collapsibleListRef[listNum].subs[window.collapsibleListRef[listNum].subs.length - 1].name;
lastPart = document.getElementById ? document.getElementById(lastPart) : document.all[lastPart];
//if the page has not loaded enough, try again later
if( !lastPart ) { window.setTimeout('prepareForUse('+listNum+')',100); } else {
//if their browser cannot change the display style, don't try
if( lastPart.style ) { lastPart = lastPart.style; }
if( typeof( lastPart.display ) == 'undefined' && !is_Icab ) { return; }
//cache images for faster changes
window.imageCache[listNum] = [(new Image()),(new Image())];
window.imageCache[listNum][0].src = window.collapsibleListRef[listNum].plI;
window.imageCache[listNum][1].src = window.collapsibleListRef[listNum].miI;
var svNm; if( svNm = window.collapsibleListRef[listNum].saveName ) { svNm = retrieveCookie(svNm); }
if( typeof( svNm ) == 'string' ) { svNm = svNm.split(','); }
for( var x = 0; x < window.collapsibleListRef[listNum].subs.length; x++ ) {
var lastPart = window.collapsibleListRef[listNum].subs[x];
if( svNm ) { var thisArray = mwjInArray(lastPart.name,svNm); }
if( ( svNm && thisArray ) || ( !svNm && lastPart.expanded ) ) {
//if they want it expanded by default, just change the image
document.images[lastPart.name + '_img'].src = window.imageCache[listNum][1].src;
} else {
//collapse the branch and change the image
document.images[lastPart.name + '_img'].src = window.imageCache[listNum][0].src;
lastPart = document.getElementById ? document.getElementById(lastPart.name) : document.all[lastPart.name];
if( lastPart.style ) { lastPart = lastPart.style; }
lastPart.display = 'none';
}
}
}
}
function mwjInArray(oNeed,oHay) { for( var i = 0; i < oHay.length; i++ ) { if( oNeed == oHay[i] ) { return true; } } return false; }
function saveCollapseState(oLife) {
var allSpans = document.getElementsByTagName ? document.getElementsByTagName('span') : ( document.all ? document.all.tags('SPAN') : [] );
if( !allSpans.length ) { return; } //nothing to save
//try to minimise the number of comparisons, to save processor time
for( var x = 0, saveNums = ''; window.collapsibleListRef[x]; x++ ) {
if( !window.collapsibleListRef[x].autoCol && window.collapsibleListRef[x].saveName ) { saveNums += ( saveNums ? '|' : '' ) + x; } }
if( !saveNums ) { return; } //nothing to save
for( var x = 0, brnch = [], frNm, rgxp = new RegExp('^treeList_('+saveNums+')_.*$',''); x < allSpans.length; x++ ) {
if( allSpans[x].id && allSpans[x].id.match(rgxp) && allSpans[x].style.display != 'none' ) {
frNm = allSpans[x].id.replace(rgxp,'$1');
brnch[frNm] = ( brnch[frNm] ? ( brnch[frNm] + ',' ) : '' ) + allSpans[x].id;
}
}
for( var x = 0, saveNums = ''; window.collapsibleListRef[x]; x++ ) {
if( window.collapsibleListRef[x].saveName ) { setCookie(window.collapsibleListRef[x].saveName,brnch[x],oLife,'/'); } }
}