DomainTree = new Class({
  
  initialize: function(tree, info) {
    var treeObject = this;

    this.tree      = $(tree);
    this.info      = $(info);
    this.nodes     = this.tree.getElements('li');
    this.headers   = this.tree.getElements('ul').getParent('li');
    this.checked   = {};
    this.infofade  = new Fx.Tween($(info), { property: 'opacity', duration: 300, link: 'chain', fps: 20 });

    this.nodes.each(function(node) {
      node.getElement('a').addEvent('click', function() { treeObject.mark(node.get('title')); });
      node.getElement('input').addEvent('click', function() {
        var title = this.getParent('li').get('title');
        var newstatus = this.get('checked');
        if (newstatus) treeObject.check(title); else treeObject.uncheck(title); 
      });
    });

    this.headers.each(function(header) { 
      header.store('open', false);
      header.getElement('ul').hide();
      header.addClass('header');
      header.getElement('img').set('src', 'pictures/plus.gif');
      header.getElement('img').addEvent('click', function() {
        if (header.retrieve('open')) treeObject.close(header); else treeObject.open(header);
      });
    });
    
  },

  check: function(title) {
    this.tree.getElements('li[title="'+title+'"] > input[type="checkbox"]').set('checked', true);
    this.checked[title] = true;
    return this;
  },

  uncheck: function(title) {
    this.tree.getElements('li[title="'+title+'"] > input[type="checkbox"]').set('checked', false);
    this.checked[title] = false;
    return this;
  },

  uncheckAll: function() {
    this.tree.getElements('input[type="checkbox"]').set('checked', false);
    this.checked = {};
    return this;
  },

  collapse: function() {
    var treeObject = this;
    var openHeaders = this.headers.filter(function(header) { return header.retrieve('open'); });
    openHeaders.each(function(header) { treeObject.close(header) })
    return this;
  },

  mark: function(title) {
    var treeObject = this;
    new Request.HTML({
      method: 'get',
      url: 'ajax/domaininfo.php?suffix=' + title + '&shop=true',
      update: treeObject.info,
      onRequest: function() { treeObject.infofade.start(0); },
      onComplete: function(response) { treeObject.infofade.start(1); } 
    }).send(); 
    return this;
  },

  open: function(header) {
    var header = $(header);
    var title = header.get('title');
    var slide = this.getslide(header);
    slide.slideIn();
    header.getElement('img').set('src', 'pictures/minus.gif');
    header.store('open', true);
    return this;
  },

  close: function(header) {
    var header = $(header);
    var title = header.get('title');
    var slide = this.getslide(header);
    slide.slideOut();
    header.getElement('img').set('src', 'pictures/plus.gif');
    header.store('open', false);
    return this;
  },

  makeVisible: function(title) {
    var treeObject = this;
    var parentNodes = this.tree.getElements('li[title="'+title+'"]').getParents('li').flatten();
    var topParentNodes = parentNodes.filter(function (li) { return li.getParent() == treeObject.tree; });
    var subParentNodes = parentNodes.filter(function (li) { return li.getParent() != treeObject.tree; });

    // Nur das erste sinnvolle Hauptmenü ausklappen
    var topParent = topParentNodes.filter(function(li) { return li.title != 'Alle'; })[0];
    this.open(topParent);

    // Alle inneren Untermenüs aufklappen
    subParentNodes.each(function(node) { treeObject.open(node); });  

    return this;
  },

  getslide: function(header) {
    // Display block und hide() sind ein Workaround, da Fx.Slide sonst nicht
    // checkt, dass der Div eingeblendet werden muss
    var subtree = $(header).getElement('ul');
    if (!header.retrieve('slide')) {
      subtree.setStyle('display', 'block');
      header.store('slide', new Fx.Slide(subtree).hide());
    }
    return header.retrieve('slide');
  },

  getchecked: function() {
    var result = new Array();
    for (key in this.checked) {
      if (this.checked[key])
        result.push(key);
    }
    return result;
  }

});
