(function()
{
	var step		= {count:0, current:null};
	var scripts = null;
	var form		= null;
	var ajax		= lava.ajax();

	function build()
	{
		var selected	= form.value(['package', 'script', 'options', 'version']);
		var params		= {};
		var packages	= selected['package'];
		var scripts		= selected.script;

		if(selected.version)
			params.version = selected.version;

		if(selected.options)
		{
			if(lava.is.array(selected.options))
			{
				if(lava.util.find(selected.options, 'nocomments') != -1)
					params.nocomments = '';

				if(lava.util.find(selected.options, 'compress') != -1)
					params.compress = '';

				if(lava.util.find(selected.options, 'dependencies') != -1)
					params.dependencies = '';
			}
			else if(lava.is.string(selected.options))
				params[selected.options] = '';
		}

		packages = packages ? lava.is.array(packages) ? packages : [packages] : [];
		scripts	= scripts ? lava.is.array(scripts) ? scripts : [scripts] : [];

		for(var j = 0; j < packages.length; j++)
		{
			for(var i = scripts.length - 1; i >= 0; i--)
			{
				if(scripts[i].indexOf(packages[j]) == 0)
				{
					scripts.splice(i, 1)	
				}
			}
		}

		if(scripts.length)
			params.script	= scripts;

		if(packages.length)
			params.pkg		= packages;

		return packages.length || scripts.length ? lava.url.build({path:'/', params:params}).source : null;
	}

	function next()
	{
		if(lava.DOM.next(step.current.get(0)))
		{
			step.current.hide().next().show();
			lava('#download_back').show();
		}


		if(!lava.DOM.next(step.current.get(0)))
		{
			var url = build();
			lava('#download_next').hide();

			if(url == null)
			{
				lava('#download_section_build').hide();
				lava('#download_section_warn').show();	
			}
			else
			{
				lava('#download_section_build').show();
				lava('#download_section_warn').hide();	
				lava('#download_build').attr({href:build()});
			}
		}
	}

	function back()
	{
		if(lava.DOM.prev(step.current.get(0)))
		{
			step.current.hide().prev().show();
			lava('#download_next').show();
		}

		if(!lava.DOM.prev(step.current.get(0)))
			lava('#download_back').hide();
	}

	function package_toggle(e)
	{
		var curr			= e.currentTarget;
		var tr			= curr;

		while(lava.DOM.nodeName(tr) != 'TR')
			tr = lava.DOM.parent(tr);

		var checkbox	= lava(tr).find('input');
		var checkboxes	= lava(tr).parent().find('input');
		var checked		= lava.DOM.nodeName(curr) == 'INPUT' ? lava.form.value(curr) : !lava.form.value(checkbox.get(0));

		if(checked)
			checkboxes.each(lava.form.check);
		else
			checkboxes.each(lava.form.uncheck);
	}

	function script_toggle(e)
	{
		var curr			= e.currentTarget;
		var tr			= curr;

		while(lava.DOM.nodeName(tr) != 'TR')
			tr = lava.DOM.parent(tr);

		var checkbox	= lava(tr).find('input');
		var checkboxp	= lava(tr).parent().firstChild().find('input');
		var checked		= lava.DOM.nodeName(curr) == 'INPUT' ? lava.form.value(curr) : !lava.form.value(checkbox.get(0));

		if(!checked)
		{
			checkbox.each(lava.form.uncheck);
			checkboxp.each(lava.form.uncheck);
		}
		else
			checkbox.each(lava.form.check);
	}

	function version_toggle(e)
	{
		var curr		= e.currentTarget;

		if(curr.checked)
			form.value({version: lava.form.value(curr) == 'latest'? 'latest' : '3.0'});
	}

	function load(a)
	{
		load_sections(a.recv('js'));

		form				= lava.form('download');
		box 				= lava.box('#download', {style:'cover'});
		step.current	= lava('#download_steps').firstChild();

		lava('#download_next').on('click', next);
		lava('#download_back').on('click', back);
		lava('#download_build').on('click', build);
		lava('#download_wizard').on('click', function() { box.show(); });

		lava(['.package_description', form.get('package')]).on('click', package_toggle);
		lava(['.script', form.get('script')]).on('click', script_toggle);
		form.get('version').on('click', version_toggle);
	}

	function load_sections(scripts)
	{
		load_section_head(lava('#download_section_core'), 'core', '/core', scripts.core);

		for(script in scripts.pkgs)
			load_section_head(lava('#download_section_pkgs'), script, '/pkgs/' + script, scripts.pkgs[script]);

		for(script in scripts.plugs)
			load_section_head(lava('#download_section_plugs'), script, '/plugs/' + script, scripts.plugs[script]);
	}

	function load_section_head(div, title, section, scripts)
	{
		var table	= lava('<table>').addClass('package_table');
		var tbody	= lava('<tbody>');
		var tr		= lava('<tr>').addClass('package_header');
		var td1		= lava('<td>').addClass('col_checkbox');
		var td2		= lava('<td>').addClass('col_description').addClass('package_description');
		var td3		= lava('<td>').addClass('col_help');
		var check	= lava.form.create.checkbox({value:section, name:'package'});
		var desc		= lava.make.html(title);

		div.append(table.append(tbody.append(tr)));
		tr.append(td1).append(td2).append(td3);
		td1.append(check);
		td2.append(desc);

		load_section(tbody, scripts);
	}

	function load_section(tbody, scripts)
	{
		for(script in scripts)
		{
			var path	= scripts[script] + script;
			var tr	= lava('<tr>');
			var td1	= lava('<td>').addClass('col_checkbox');
			var td2	= lava('<td>').addClass('col_description').addClass('script');
			var td3	= lava('<td>').addClass('col_help');
			var check= lava.form.create.checkbox({value:path, name:'script'});
			var help	= lava('<a>').append(lava.make.html('?')).attr({href:'/docs?script=' + path + '&mode=docs', target:'lavadocs', title:'view documentation for this script'}).addClass('help');

			tbody.append(tr.append(td1).append(td2).append(td3));
			td1.append(check);
			td2.append(lava.make.html(script));
			td3.append(help);
		}
	}

	function init()
	{
		ajax.on('complete', load).send('/packages', {params:{output:'js'}});	
	}

	init();

})();
