Array.prototype.contains = function(elem) { for (i in this) if (this[i] == elem) return true; return false; } Array.prototype.add = function(elem) { if (!this.contains(elem)) this.push(elem); } Array.prototype.remove = function(elem) { for (i in this) { if (this[i] == elem) { this.splice(i, 1); i--; } } } function toggleCssClasses(parentNode, childNode, activeCssClass, inactiveCssClass, matchCssClass) { if (!parentNode) return; var items = 0; for (i in parentNode.childNodes) { obj = parentNode.childNodes[i]; // none-element node if (obj.nodeType != 1) continue; classes = obj.className.split(" "); if (matchCssClass && !classes.contains(matchCssClass)) { continue; } items++; // if childNode is null (i.e. not given), // activate the first one by default if (childNode == null && items == 1) { childNode = obj; } if (obj == childNode) { classes.remove(inactiveCssClass); classes.add(activeCssClass); } else { classes.remove(activeCssClass); classes.add(inactiveCssClass); } obj.className = classes.join(" "); } } function elementHasClassesSet(obj, neededClasses) { if (!obj.className) return false; classes = obj.className.split(" "); for (i in neededClasses) { if (!classes.contains(neededClasses[i])) return false; } return true; } function initToggleCssClasses(containerClasses, activeCssClass, inactiveCssClass, matchCssClass) { var elements = document.getElementsByTagName('div'); for (var i in elements) { obj = elements[i]; if (!elementHasClassesSet(obj, containerClasses)) continue; toggleCssClasses(obj, null, activeCssClass, inactiveCssClass, matchCssClass); } } function pageInit() { initToggleCssClasses(['related', 'contacts'], 'visible', 'hidden', 'entry'); }