var Cms;
if (!Cms) Cms = {};

/**
 * @param   mTreeContainer  mixed 
 * @param   aDict           array 
 *
 * @author  BS
 * @uses    jquery, utils.js
 * @see     Cms.CollapsibleTree.applyToDocument
 */
Cms.CollapsibleTree = function(mTreeContainer, aDict)
{
  var containerSelectorRe = /\{container\}/;
  var linkSelector = '{container} > a';
  var contentSelector = '{container} > ul';
  var subtreeContainerSelector = '{container} > ul > li';

  var activeSelector = '.Current';
  var activeContainerSelector = '{container}' + activeSelector;
  var activeChildrenSelector = '{container} ' + activeSelector;

  var linkClass = "TreeLink";
  var contentClass = "TreeContent";
  var containerOpenClass = "TreeOpen";
  var containerClosedClass = "TreeClosed";

  var tabClass = "TreeTab";
  var tabHTML = ' <a href="#" class="' + tabClass + '"></a>';
  var tabSelector = linkSelector + ' + .' + tabClass;
  var tabOpenMsg = aDict.expand;
  var tabCloseMsg = aDict.collapse;

  var containerIdBase = 'tree';
  var contentShowDuration = 300;
  
  var uniqueId = 0;

  var _this = this;

  var dict = null;

  var _ = function(sMsgKey) {
    return (dict && dict[sMsgKey]) ? dict[sMsgKey] : sMsgKey;
  }

  this.setDict = function(aDict) {
    dict = aDict;
  }

  var getUniqueId = function(sBase) {
    return Cms.getUniqueId(sBase || containerIdBase);
  }

  var processSelector = function(sSel, oContainer) {
    return sSel.replace(containerSelectorRe, '#' + oContainer.attr('id'));
  }

  var applyToSubtrees = function(oParentContainer, bRecursive) {
    var subtreeSel = processSelector(subtreeContainerSelector, oParentContainer);
   // alert("Subtree:\n" + subtreeSel + " -> " + $j(subtreeSel).length);
    $j(subtreeSel).each(
      function(i, el) {
        _this.apply(el, bRecursive);
      }
    );
  }

  this.apply = function(mTreeContainer, bRecursive, iDepth) {
    var container = $j(mTreeContainer);
    if (!container) {
      return;
    }
    if (!container.attr('id')) {
      container.attr('id', getUniqueId(containerIdBase));
    }
    if (typeof bRecursive == "undefined") {
      bRecursive = true;
    }

    var id = container.attr('id');
    var contentSel = processSelector(contentSelector, container);
    var content = $j(contentSel);

    mTreeContainer.content = content;

    //alert("Content:\n" + contentSel + " -> " + content.length);

    if (content.length == 0) {
      if (bRecursive) {
        applyToSubtrees(container, false, iDepth + 1);
      }
      return;
    }
    var linkSel = processSelector(linkSelector, container);
    var link = $j(linkSel);
    //alert("Tab:\n" + linkSel + " -> " + link.length);

    content.addClass(contentClass);
    if (link.length > 0) {
      
      var activeContainerSel = processSelector(activeContainerSelector, container);
      var isActive = $j(activeContainerSel).length != 0;

      var activeChildrenSel = processSelector(activeChildrenSelector, container);
      var activeChildren = $j(activeChildrenSel);
      var activeChildrenCount = activeChildren.length;

      var close = activeChildrenCount == 0 && !isActive;

      if (close) {
        content.hide();
        container.addClass(containerClosedClass);
      }
      
      link.addClass(linkClass)
        .after(tabHTML);

      var tabSel = processSelector(tabSelector, container);
      var tab = $j(tabSel);

      tab.each(
        function(i, el) {
          this.container = container;
          this.content = content;

          this.open = function() {
            this.innerHTML =tabCloseMsg;
            this.content.show(contentShowDuration);
            this.contentOpen = true;
            $j(this.container).addClass(containerOpenClass)
              .removeClass(containerClosedClass);
          }

          this.close = function() {
            this.innerHTML = tabOpenMsg;
            this.content.hide(contentShowDuration);
            this.contentOpen = false;
            $j(this.container).removeClass(containerOpenClass)
              .addClass(containerClosedClass);
          }

          if (close) {
            this.close();
          } else {
            this.open();
          }
        }
      );
      tab.click(
        function(ev) {
          if (this.contentOpen) {
            this.close();
          } else {
            this.open();
          }
          ev.preventDefault();
        }
      );
    }
    applyToSubtrees(container, bRecursive, iDepth + 1);
  }

  this.openParents = function(oChild) {
    while (oChild) {
      if (oChild.content) {
        var content = oChild.content;
        if ( (typeof content.show) == "function"
            && content.hasClass(contentClass)
            && !content.hasClass(containerOpenClass)) {
          oChild.show();
        }
      }
      //alert("parent: " + oChild + " \nshow: " + oChild.show);
      oChild = oChild.parentNode;
    }
  }

  if (typeof aDict != "undefined") {
    this.setDict(aDict);
  }
  
  this.apply(mTreeContainer);


}

Cms.CollapsibleTree.treeSelector = '.CollapsibleTree.JS';
Cms.CollapsibleTree.applyToDocument = function()
{
  $j(Cms.CollapsibleTree.treeSelector).each(
    function(i, el) {
      var t = new Cms.CollapsibleTree(el);
    }
  );
}

$j().ready(Cms.CollapsibleTree.applyToDocument);
