"Nospam" <no****@home.co mwrote in message
news:YU******** ***********@new sfe6-gui.ntli.net...
I am trying to have an expandable menu each time it's clicked expands, and
if it's clicked again, if it is already expanded contracts, and if
contracted expands, following this example
http://www.dynamicdrive.com/dynamicindex1/navigate1.htm, I notice the
example works in each sub folder and folder, it contracts and expands if
it
is already contracted/expanded, what do I add to this: <a
href="javascrip t:ddtreemenu.fl atten('treemenu 1services', 'expand') ?
ddtreemenu.flat ten('treemenu1s ervices', 'contact')" to cause the same
effect?
The javascript in simpletreemenu is:
var persisteduls=ne w Object()
var ddtreemenu=new Object()
ddtreemenu.clos efolder="/includes/closed.gif" //set image path to "closed"
folder image
ddtreemenu.open folder="/includes/open.gif" //set image path to "open" folder
image
//////////No need to edit beyond here///////////////////////////
ddtreemenu.crea teTree=function (treeid, enablepersist, persistdays){
var ultags=document .getElementById (treeid).getEle mentsByTagName( "ul")
if (typeof persisteduls[treeid]=="undefined" )
persisteduls[treeid]=(enablepersist ==true &&
ddtreemenu.getC ookie(treeid)!= "")? ddtreemenu.getC ookie(treeid).s plit(",") :
""
for (var i=0; i<ultags.length ; i++)
ddtreemenu.buil dSubTree(treeid , ultags[i], i)
if (enablepersist= =true){ //if enable persist feature
var durationdays=(t ypeof persistdays=="u ndefined")? 1 :
parseInt(persis tdays)
ddtreemenu.dota sk(window, function(){ddtr eemenu.remember state(treeid,
durationdays)}, "unload") //save opened UL indexes on body unload
}
}
ddtreemenu.buil dSubTree=functi on(treeid, ulelement, index){
ulelement.paren tNode.className ="submenu"
if (typeof persisteduls[treeid]=="object"){ //if cookie exists
(persisteduls[treeid] is an array versus "" string)
if (ddtreemenu.sea rcharray(persis teduls[treeid], index)){
ulelement.setAt tribute("rel", "open")
ulelement.style .display="block "
ulelement.paren tNode.style.bac kgroundImage="u rl("+ddtreemenu .openfolder+")"
}
else
ulelement.setAt tribute("rel", "closed")
} //end cookie persist code
else if (ulelement.getA ttribute("rel") ==null ||
ulelement.getAt tribute("rel")= =false) //if no cookie and UL has NO rel
attribute explicted added by user
ulelement.setAt tribute("rel", "closed")
else if (ulelement.getA ttribute("rel") =="open") //else if no cookie and this
UL has an explicit rel value of "open"
ddtreemenu.expa ndSubTree(treei d, ulelement) //expand this UL plus all parent
ULs (so the most inner UL is revealed!)
ulelement.paren tNode.onclick=f unction(e){
var submenu=this.ge tElementsByTagN ame("ul")[0]
if (submenu.getAtt ribute("rel")== "closed"){
submenu.style.d isplay="block"
submenu.setAttr ibute("rel", "open")
ulelement.paren tNode.style.bac kgroundImage="u rl("+ddtreemenu .openfolder+")"
}
else if (submenu.getAtt ribute("rel")== "open"){
submenu.style.d isplay="none"
submenu.setAttr ibute("rel", "closed")
ulelement.paren tNode.style.bac kgroundImage="u rl("+ddtreemenu .closefolder+") "
}
ddtreemenu.prev entpropagate(e)
}
ulelement.oncli ck=function(e){
ddtreemenu.prev entpropagate(e)
}
}
ddtreemenu.expa ndSubTree=funct ion(treeid, ulelement){ //expand a UL element
and any of its parent ULs
var rootnode=docume nt.getElementBy Id(treeid)
var currentnode=ule lement
currentnode.sty le.display="blo ck"
currentnode.par entNode.style.b ackgroundImage= "url("+ddtreeme nu.openfolder+" )
"
while (currentnode!=r ootnode){
if (currentnode.ta gName=="UL"){ //if parent node is a UL, expand it too
currentnode.sty le.display="blo ck"
currentnode.set Attribute("rel" , "open") //indicate it's open
currentnode.par entNode.style.b ackgroundImage= "url("+ddtreeme nu.openfolder+" )
"
}
currentnode=cur rentnode.parent Node
}
}
ddtreemenu.flat ten=function(tr eeid, action){ //expand or contract all UL
elements
var ultags=document .getElementById (treeid).getEle mentsByTagName( "ul")
for (var i=0; i<ultags.length ; i++){
ultags[i].style.display= (action=="expan d")? "block" : "none"
var relvalue=(actio n=="expand")? "open" : "closed"
ultags[i].setAttribute(" rel", relvalue)
ultags[i].parentNode.sty le.backgroundIm age=(action=="e xpand")?
"url("+ddtreeme nu.openfolder+" )" : "url("+ddtreeme nu.closefolder+ ")"
}
}
ddtreemenu.reme mberstate=funct ion(treeid, durationdays){ //store index of
opened ULs relative to other ULs in Tree into cookie
var ultags=document .getElementById (treeid).getEle mentsByTagName( "ul")
var openuls=new Array()
for (var i=0; i<ultags.length ; i++){
if (ultags[i].getAttribute(" rel")=="open")
openuls[openuls.length]=i //save the index of the opened UL (relative to the
entire list of ULs) as an array element
}
if (openuls.length ==0) //if there are no opened ULs to save/persist
openuls[0]="none open" //set array value to string to simply indicate all
ULs should persist with state being closed
ddtreemenu.setC ookie(treeid, openuls.join(", "), durationdays) //populate
cookie with value treeid=1,2,3 etc (where 1,2... are the indexes of the
opened ULs)
}
////A few utility functions below//////////////////////
ddtreemenu.getC ookie=function( Name){ //get cookie value
var re=new RegExp(Name+"=[^;]+", "i"); //construct RE to search for target
name/value pair
if (document.cooki e.match(re)) //if cookie found
return document.cookie .match(re)[0].split("=")[1] //return its value
return ""
}
ddtreemenu.setC ookie=function( name, value, days){ //set cookei value
var expireDate = new Date()
//set "expstring" to either future or past date, to set or delete cookie,
respectively
var expstring=expir eDate.setDate(e xpireDate.getDa te()+parseInt(d ays))
document.cookie = name+"="+value+ "; expires="+expir eDate.toGMTStri ng()+";
path=/";
}
ddtreemenu.sear charray=functio n(thearray, value){ //searches an array for
the entered value. If found, delete value from array
var isfound=false
for (var i=0; i<thearray.leng th; i++){
if (thearray[i]==value){
isfound=true
thearray.shift( ) //delete this element from array for efficiency sake
break
}
}
return isfound
}
ddtreemenu.prev entpropagate=fu nction(e){ //prevent action from bubbling
upwards
if (typeof e!="undefined" )
e.stopPropagati on()
else
event.cancelBub ble=true
}
ddtreemenu.dota sk=function(tar get, functionref, tasktype){ //assign a
function to execute to an event handler (ie: onunload)
var tasktype=(windo w.addEventListe ner)? tasktype : "on"+taskty pe
if (target.addEven tListener)
target.addEvent Listener(taskty pe, functionref, false)
else if (target.attachE vent)
target.attachEv ent(tasktype, functionref)
}