var XElement = {
  hasClassName: function(element, className) {
    if (!element) return false;
    var elementClassName = element.className;
    if (elementClassName.length == 0) return false;
    if (elementClassName == className ||
        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
      return true;
    return false;
  },

  addClassName: function(element, className) {
    if (!element) return;
    var classNames = element.className.split(/\s+/);
    for (var i=0; i<classNames.length; i++)
      if (className==classNames[i]) return;
    classNames.splice(0,0,className);
    element.className = classNames.join(' ');
    return element;
  },

  toggleClassName: function(element, className) {
    if (!element) return;
    var classNames = element.className.split(/\s+/);
    for (var i=0; i<classNames.length; i++)
      if (classNames[i]==className) break;
    if (i==classNames.length)
      classNames.splice(0,0,className);
    else
      classNames.splice(i, 1);
    element.className = classNames.join(' ');
    return element;
  }
}

var RVTree =
{
	options :
	{
		nodeClosedClass: "liClosed",
		nodeOpenClass: "liOpen",
		nodeBulletClass: "liBullet",
		nodeLinkClass: "bullet"
	},

	convertTree: function (root)
	{
		if (!document.createElement) return; // Without createElement, we can't do anything
		RVTree._processList(root, true);
	},

	_processList: function(ul, isRoot)
	{
		if (!ul.childNodes || ul.childNodes.length==0) return;

		for (var i=0; i<ul.childNodes.length; i++)
		{ //Iterate LIs
      var item = ul.childNodes[i];
      if (item.nodeName != "LI")
        continue;

      // Iterate things in this LI
		  var subLists = false;
		  for (var sitemi=0;sitemi<item.childNodes.length;sitemi++)
      {
        var sitem = item.childNodes[sitemi];
        if (sitem.nodeName=="UL")
        {
          subLists = true;
          RVTree._processList(sitem, false);
        }
			}

			var s= document.createElement("SPAN");
			var t= '\u00A0'; // &nbsp;
			s.className = RVTree.options.nodeLinkClass;
			if (subLists)
      {
				// This LI has UL's in it, so it's a +/- node
				if ( !XElement.hasClassName(item, RVTree.options.nodeOpenClass) )
					XElement.addClassName(item, RVTree.options.nodeClosedClass);

				// If it's just text, make the text work as the link also
				if (item.firstChild.nodeName=="#text")
        {
					t = t+item.firstChild.nodeValue;
					item.removeChild(item.firstChild);
				}
				s.onclick = function ()
        {
          XElement.toggleClassName( this.parentNode, RVTree.options.nodeOpenClass );
          XElement.toggleClassName( this.parentNode, RVTree.options.nodeClosedClass );
					return false;
				}
			}
			else
      {// No sublists
        if ( XElement.hasClassName(item, RVTree.options.nodeClosedClass) )
        {
          s.onclick = function()
          {
            var nodes = this.parentNode.getElementsByTagName("A");
            if (nodes.length)
              document.location = nodes[0].href;
          }
        }
        else
          XElement.addClassName(item, RVTree.options.nodeBulletClass);
			}

			item.style.listStyleType='none';
			if (isRoot && /*IE*/ (!!(window.attachEvent && !window.opera)) )
        item.style.marginLeft="-16px"; // thats IE6 what about IE7 ?
			if (s)
			{
				s.appendChild(document.createTextNode(t));
				item.insertBefore(s,item.firstChild);
			}
		}
		ul.style.marginLeft = 0;
		ul.style.paddingLeft = isRoot ? 0 : "8px";
	}
}
