/*
 * 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) {
		var loading = $("<li/>").attr("id", "aaaa").html('<img src="' + settings.loadimg + '" />').appendTo(child);
		$.getJSON(settings.url, {
			root :root
		}, function(response) {
			loading.remove();
			function createNode(parent) {
				if ($.trim(this.text) == '') {
					return;
				}
				var current = $("<li/>").attr("id", this.id || "").html(
						this.text).appendTo(parent);
				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, createNode, [ child ]);
			$(container).treeview( {
				add :child
			});
			if (settings.autoExpand) {
				$(child).find("li.expandable").each( function() {
					if (settings.autoExpand.apply(this, [settings.expand])) {
						$(this).children('div.hitarea').click();
					}
				});
			}
      
			if (settings.callbacks && settings.callbacks.load) {
				settings.callbacks.load();
			}
		});
	}

	var proxied = $.fn.treeview;
	$.fn.treeview = function(settings) {
		if (!settings.url) {
			return proxied.apply(this, arguments);
		}
		var container = this;
		load(settings, settings.root, 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);
