/*
 * 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, callback) {
      var n = {
         parentid: root,
         value: settings.id
         };
      var params = $.extend({}, settings.params, n);

      $.ajax({
         url: settings.url,
         dataType: 'jsonp',
         data: params,
         success: function(response) {

            function createNode(parent) {
               var current = $("<li/>").attr("id", this.id || "").html("<span class='treenode'>" + this.text + "</span>").appendTo(parent);

               current.children("span").addClass('ui-corner-all');

               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:"placeholder",
                        id:"placeholder",
                        children:[]
                     }, branch);
                  }
                  if (this.children && this.children.length) {
                     $.each(this.children, createNode, [branch])
                  }
               }

            }
            $.each(response.results, createNode, [child]);
            $(container).treeview({
               add: child
            });

            $(container).find('.hitarea').removeClass('loading');

            if(root == "source"){
               $(container).triggerHandler('treeinit');
            }

            if(callback){
               $.each( callback, [response] );
            }
         }
      });
   }

   var proxied = $.fn.treeview;
   $.fn.treeview = function(settings) {
      if (!settings.url) {
         return proxied.apply(this, arguments);
      }
      var container = this;
      load(settings, "source", this, container);
      var userToggle = settings.toggle;
      return proxied.call(this, $.extend({}, settings, {
         collapsed: true,
         toggle: function() {
            var $this = $(this);
            if ($this.hasClass("hasChildren")) {
               $this.find('.hitarea').addClass('loading');
               var childList = $this.removeClass("hasChildren").find("ul");
               childList.empty();
               load(settings, this.id, childList, container);
            }
            if (userToggle) {
               userToggle.apply(this, arguments);
            }
         }
      }));
   };

})(jQuery);
