/*
 * Async Treeview 0.1 - Lazy-loading extension for Treeview
 * 
 * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
 *
 * Copyright (c) 2007 Jörn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id$
 *
 */

;(function($) {

function load(settings, root, child, container) {
  $.getJSON(settings.url, {root: root}, function(response) {
    function createNode(parent) {
      var divMargin = '-' + 21 * this.level + 'px';
      var liClassLevel = 'level' + this.level;
      
      $('.bannerRefresh')
        .unbind('click', bannerRefresh)
        .click(bannerRefresh);
      if(this.marked && this.marked != '') {
        this.text = this.marked; 
      }
      this.liClass += ' bannerRefresh';
      var nid = this.nid;
      var image = '';
      var clearDiv = $('<div></div>').
        attr({'class': 'clear'});
      var link = $('<a></a>').
        attr({'class': 'nomenklToggle ' + this.liClass}).
          bind('mouseover', function() {$(this).parent().addClass('liHighlight')}).
          bind('mouseout', function() {$(this).parent().removeClass('liHighlight')});
      if(this.liClass == 'grey') {
        link = $('<span></span>').
          attr({'class': 'nomenklToggle ' + this.liClass});
      }
      var numberWidth = parseInt(this.pkz.length * 7);
      if(this.art == "list") {
        numberWidth = 50;
      }
      number = $('<div></div>').
        attr({'class': 'number'}).
        css({'width': numberWidth + 'px'}).
        text(this.pkz + ' ');
      if(settings.hierarchie) {
        number.addClass('width-auto');
      }  
      number.appendTo(link);
      text = $('<span></span>').
        attr({'class': this.liClass}).
        attr({'title': this.title}).
        html(this.text).
        appendTo(link);
        
      if(this.link) {
        image = $('<div></div>').
          attr({'class': 'nomenklToggle ' + this.liClass}).
          css('border', 'none').
          click(function() {ajaxGetExibToNomenkl(nid); return false;}).
          appendTo(link);
        if(this.hasChildren == false || this.art == 'list') {
          link.click(function() {ajaxGetExibToNomenkl(nid); return false;});
        }
      }
      var current = $("<li/>").
        attr({'id': this.id || ""}).
        attr('class', this.liClass + ' ' + liClassLevel).
        append(link).
        append(clearDiv).
        appendTo(parent);
        if (this.classes) {
          current.children("span").addClass(this.classes);
        }
        if (this.expanded) {
          var openClass = "open"; // this.art == "tree"
          if(this.art == "list") {
            openClass = "opened";
          }
          current.addClass(openClass);
        }
        var ehibitors = $("<div id='div" + this.nid + "' class='hidden' style='margin-left: " +
          divMargin + "; margin-top: 3px;'></div>").appendTo(current);
          if (this.hasChildren || this.children && this.children.length) {
            var branch = $("<ul/>").appendTo(current);
            if (this.hasChildren) {
              current.addClass("hasChildren");
            }
            if(this.children && this.children.length) {
              $.each(this.children, createNode, [branch])
            }
          }
    }
    $.each(response, createNode, [child]);
    $(container).treeview({add: child});
  });
}

var proxied = $.fn.treeview;
$.fn.treeview = function(settings) {
	if (!settings.url) {
		return proxied.apply(this, arguments);
	}
	var container = this;
	load(settings, "_", this, container);
	var userToggle = settings.toggle;
	return proxied.call(this, $.extend({}, settings, {
		collapsed: true,
		toggle: function() {
			var $this = $(this);
			if ($this.hasClass("hasChildren")) {
				var childList = $this.removeClass("hasChildren").find("ul");
				childList.empty();
				load(settings, this.id, childList, container);
			}
			if (userToggle) {
				userToggle.apply(this, arguments);
			}
		}
	}));
};

})(jQuery);
