/*
 * 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 current = $("<li/>").attr("id", this.id || "").html(
              "<span>" + this.text + "</span>").appendTo(parent);
            if(this.classes){
              current.children("span").addClass(this.classes);
            }
            if(this.expanded){
              current.addClass("open");
            }
            if(this.hasChildren || this.children
              && this.children.length){
              var branch = $("<ul/>").appendTo(current);
              if(this.hasChildren){
                current.addClass("hasChildren");
                createNode
                  .call(
                    {
                      text : "<img src=\"/img/throbber.gif\" alt=\"\"/>Çàãðóçêà...",
                      id : "placeholder", children : []
                    }, branch);
              }
              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, "source", this, container);
    $("#treeLoader").hide();
    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);