var Aui = Ael.namespace();
Aui.package_("tools").class_("APIViewer", {
	//prototype defaults : object
	"prototype defaults": {
		name: "Ael",
		root: Ael,
		element: "apiviewer_tree",
		hrefBase: "http://www.aquilegia.info/ael/wiki/",
		hrefTarget: "apiviewer_detail"
	},
	
	//prototype initialize(object options) : void
	"prototype initialize": function(options){
		var o = Ael().apply({}, this.defaults, options),
			tree = this.tree = new YAHOO.widget.TreeView(o.element),
			rootNode = new YAHOO.widget.TextNode({
					label: o.name,
					labelStyle: "apiviewer-icon apiviewer-icon-class",
					href: o.hrefBase + o.name + "?embed",
					target: o.hrefTarget
				}, tree.getRoot(), false),
			loader = function(node, oncomplete) {
				if( ! node.isLeaf){
					tree.removeChildren(node);
					var val = node.val;
					Ael(val)._keys().$sort()._filter(function(key){
							var v = val[key];
							return key !== "constructor"
									&& key !== "prototype"
									&& (Ael.instanceOf(v, Ael.lang.Package) || Ael.instanceOf(v, Ael.lang.Class));
						})
						.each(function(key){
							var isPackage = Ael.instanceOf(val[key], Ael.lang.Package),
								name = node.path + "." + key,
								child = new YAHOO.widget.TextNode({
										label: key,
										labelStyle: "apiviewer-icon apiviewer-icon-" + (isPackage?"package":"class"),
										href: o.hrefBase + name + "?embed",
										target: o.hrefTarget
									}, node, false);
							child.path = name;
							child.val = val[key];
							child.setDynamicLoad(loader);
						});
					if(Ael.instanceOf(val, Ael.lang.Class)){
						var props = Ael(val)
							.copy()
							._properties()
							._toArray();
						Ael(["ael", "prototype", "instance", "static"]).each(function(mod){
							props.copy()
								._filter(function(v){
									return v.hasKeyword(mod);
								})
								.each(function(prop){
									var name = mod + "-" + prop.name();
									new YAHOO.widget.TextNode({
											label: name,
											labelStyle: "apiviewer-icon apiviewer-icon-" + mod,
											href: o.hrefBase + node.path + "?embed#" + prop.name(),
											target: o.hrefTarget
										}, node, false);
								});
						});
					}
				}
				oncomplete();
			};
		tree.subscribe("collapse", function(node) {
				if( ! node.isLeaf())
					tree.removeChildren(node);
			});
		tree.subscribe("clickEvent", function(node){
				return false;
			});
		rootNode.val = o.root;
		rootNode.path = o.name;
		rootNode.setDynamicLoad(loader);
	},
	
	"prototype render": function(){
		this.tree.draw();
	}
});
