function expand( aElement ) {

   // Hide this element.

   aElement.style.display = "none";

   // Find parent div with class "more_less", then find all its children
   // divs with class "more_text".

   parentNode = getParentByNameAndClass( aElement, "div", "more_less" );
   divs = getTagsByNameAndClass( parentNode, [ "div" ], "more_text" );

   // Make each visible.

   for ( var i in divs ) {
      divs[i].style.display = "block";
   }
}


function contract( aElement ) {

   // Find parent divs with class "more_less", then find all its children
   // divs with class "more_text".

   parentNode = getParentByNameAndClass( aElement, "div", "more_less" );
   divs = getTagsByNameAndClass( parentNode, [ "div" ], "more_text" );

   // Hide each.

   for ( var i in divs ) {
      divs[i].style.display = "none";
   }

   // Find child anchor with class "more_link" and display.

   anchors = getTagsByNameAndClass( parentNode, [ "a" ], "more_link" );
   for ( var i in anchors ) {
      anchors[i].style.display = "inline";
   }
}


function getParentByNameAndClass( currentNode, tagName, searchPat ) {
   var regex = new RegExp( searchPat );

   while ( currentNode = currentNode.parentNode ) {
      if ( currentNode.nodeName.toLowerCase() == tagName ) {
         if ( regex.test( currentNode.className ) ) {
            break;
         }
      }
   }
   return currentNode;
}


function getTagsByNameAndClass( node, tagNames, searchPat ) {
   var regex = new RegExp( searchPat );

   var classTags = [];
   for ( var i = 0; i<tagNames.length; i++ ) {
      var tags = node.getElementsByTagName( tagNames[i] );
      for ( var j=0; j<tags.length; j++ ) {
         if ( regex.test( tags[j].className ) ) {
            classTags.push( tags[j] );
         }
      }
   }
   return classTags;
}


