(function(){ function isExpanded(ul){ return ul.className==''; } function toggleDir(ul, useInitValue){ if( !useInitValue ){ expandMap[ul.id] = !isExpanded(ul); history.replaceState(expandMap, ''); } ul.className = expandMap[ul.id] ? '' : 'collapsed'; } function toggleAll(tree, useInitValue){ var lists = tree.querySelectorAll('.subdir > ul > li ul'); if( !useInitValue ){ var expand = true; for( var i=0; lists[i]; i++ ){ if( isExpanded(lists[i]) ){ expand = false; break; } } expandMap = {'*': expand}; history.replaceState(expandMap, ''); } var className = expandMap['*'] ? '' : 'collapsed'; for( var i=0; lists[i]; i++ ){ lists[i].className = className; } } function checkState(){ expandMap = history.state || {}; if( '*' in expandMap ) toggleAll(outer_ul, true); for( var id in expandMap ){ if( id!=='*' ) toggleDir(document.getElementById(id), true); } } function belowSubdir(node){ do{ node = node.parentNode; if( node==subdir ) return true; } while( node && node!=outer_ul ); return false; } var history = window.history || {}; if( !history.replaceState ) history.replaceState = function(){}; var outer_ul = document.querySelector('.filetree > ul'); var subdir = outer_ul.querySelector('.subdir'); var expandMap = {}; checkState(); outer_ul.onclick = function(e){ e = e || window.event; var a = e.target || e.srcElement; if( a.nodeName!='A' ) return true; if( a.parentNode.parentNode==subdir ){ toggleAll(outer_ul); return false; } if( !belowSubdir(a) ) return true; var ul = a.parentNode.nextSibling; while( ul && ul.nodeName!='UL' ) ul = ul.nextSibling; if( !ul ) return true; toggleDir(ul); return false; } }())