(function()
{
	var src		= '';
	var loaded	= {lavadoc:false, demo:false, source:false};
	var mode		= 0;
	var uid		= 0;
	var ids		= [];

	function resize()
	{
		var client	= lava.css.client(mode);
		var top		= lava('#tabs').coordinates();
		var tree		= lava('#tree').coordinates();

		lava(['#' + mode + '_iframe']).style({height:lava.css.client(mode).outer.height});
		lava(['#' + mode + '_iframe']).style({height:lava.css.client(mode).outer.height});
	}

	function load(js)
	{
		src		= js;
		loaded	= {lavadoc:false, demo:false, source:false};

		lava('#title').clear().append(lava.make.html(src));
		lava('#tabSourceLink').attr({href:'/documentation/source?highlight&script=' + src});
		lava('#tabDemoLink').attr({href:'/documentation/demo?&script=' + src});
		lava('#tabDocumentationLink').attr({href:'/documentation?&script=' + src});

		switch(mode)
		{
			case 'demo': loadDemo(); break;
			case 'source': loadSource(); break;
			default: 
				mode='lavadoc';
				loadDoc();
				break;
		}

		lava.cookie.set('script', src);
	}

	function loadSource()
	{
		lava('#tabSource').addClass('tabs_hl');
		lava('#tabSourceLink').addClass('tabs_link_hl');

		if(!loaded.source)
		{
			globals.messages.add('source', {message:'loading source for ' + src});

			function done()
			{
				globals.messages.remove('source');
				lava('#source_iframe').show();
				resize();
			}

			lava('#source_iframe').attr({src:'/documentation/source?highlight&script=' + src}).on('load', done).on('resize', resize);
			loaded.source = true;
		}
		else
			lava('#source_iframe').show();
	}

	function loadDoc()
	{
		lava('#tabDocumentation').addClass('tabs_hl');
		lava('#tabDocumentationLink').addClass('tabs_link_hl');

		if(!loaded.lavadoc)
		{
			globals.messages.add('source', {message:'loading docs for ' + src});

			function done()
			{
				globals.messages.remove('source');
				lava('#lavadoc_iframe').show();
				resize();
			}

			lava('#lavadoc_iframe').attr({src:'/documentation?script=' + src}).on('load', done).on('resize', resize);

			loaded.lavadoc = true;
		}
		else
			lava('#lavadoc_iframe').show();
	}

	function loadDemo()
	{
		lava('#tabDemo').addClass('tabs_hl');
		lava('#tabDemoLink').addClass('tabs_link_hl');

		if(!loaded.demo)
		{
			globals.messages.add('demo', {message:'loading demo for ' + src});
			function done()
			{
				globals.messages.remove('demo');
				lava('#demo_iframe').show();
				resize();
			}

			lava('#demo_iframe').attr({src:'/documentation/demo?script=' + src}).on('load', done).on('resize', resize);
			loaded.demo = true;
		}
		else
			lava('#demo_iframe').show();
	}

	function changeMode(e)
	{
		e.preventDefault();

		var id = e.currentTarget.id;
		lava(['#lavadoc_iframe', '#demo_iframe', '#source_iframe']).hide();
		lava('.tabs').removeClass('tabs_hl');
		lava('.tabs_link').removeClass('tabs_link_hl');

		lava('#' + id).addClass('tabs_hl');
		lava('#' + id + 'Link').addClass('tabs_link_hl');

		switch(id)
		{
			case 'tabSource':
				mode = 'source';
				loadSource();
				break;

			case 'tabDocumentation':
				mode = 'lavadoc';
				loadDoc();
				break;

			case 'tabDemo':
				mode = 'demo';
				loadDemo();
				break;
		}

		resize();

		lava.cookie.set('mode', mode);
	}

	function highlight(e, n)
	{
		if(e.type == 'mouseout')
			lava(n.get()).removeClass('tree_highlight_node');
		else
			lava(n.get()).addClass('tree_highlight_node');
	}

	function tree(a)
	{
		var ltree 	= lava.tree('#tree', {cookie:{name:'lava_docs_tree'}});

		tree_init(ltree, a.recv('js'));

		ltree.on('click', function(e, n) { load(n.attr('path'));}, 'item');
		ltree.on('mouseover', highlight, null, [2,3]);
		ltree.on('mouseout', highlight, null, [2,3]);
	}

	function tree_init(ltree, scripts)
	{
		var pid = 0;

		ltree.add(pid = ++uid + '', {type:lava.tree.FOLDER, label:'core'});
		tree_build(ltree, scripts.core, pid);

		ltree.add(pid = ++uid + '', {type:lava.tree.FOLDER, label:'pkgs'});
		for(script in scripts.pkgs)
		{
			ltree.add(++uid + '', {type:lava.tree.FOLDER, label:script, parent:pid + ''});
			tree_build(ltree, scripts.pkgs[script], uid);
		}

		ltree.add(pid = ++uid + '', {type:lava.tree.FOLDER, label:'plugs'});
		for(script in scripts.plugs)
		{
			ltree.add(++uid + '', {type:lava.tree.FOLDER, label:script, parent:pid + ''});
			tree_build(ltree, scripts.plugs[script], uid);
		}
	}

	function tree_build(tree, scripts, pid)
	{
		for(var script in scripts)
			tree.add(++uid + '', {label:script, parent:pid + '', attributes:{path:scripts[script] + script}});
	}

	function init()
	{
		lava(window).on('resize', resize);
		lava('.tabs').on('click', changeMode);

		var params = lava.url.parse().params;

		mode	= params.mode || lava.cookie.get('mode');
		js		= params.script || lava.cookie.get('script') || '/core/lava.js';

		globals.ajax.on('complete', tree).send('/packages',  {params:{output:'js'}});

		load(js);
	}

	init();

})();
