/* Collapsible list (need not be actual ul or ol)

Requires glow.dom, glow.events, glow.anim

Markup:	
	.collapse-container - contains everything to do with the collapse, both the collapse-expand link, plus the actual element to expand/collapse.
	.collapse-heading - marking the heading for the which will be converted to a collapse/expand link by the script 
	.collapse-block - the block to collapse

Styles:
	CSS must set block to be initally hidden if Glow is supported.
	No padding should be used on collapsible block

Function adds an object to the library 'g_project_lib_name' which can be used as follows: 
	collapse.init(opt);
	where 'opt' has the fields (see global variables below for the default values):

		'container' - selector for blocks containing headings + collapsible block
		'heading' - selector (within container) for heading which will become link
		'collapsible' - selector (within container) for block which will collapse
		'start-open' - list of selectors for containers which should open after loading

Note: Safari 2 gives some problems with Safari 2, so we degrade to a simpler open/close

*/

// allow CSS to distinguish whether glow is supported AND this file is included
if (document.documentElement && glow.isSupported) {
	document.documentElement.className += " js-collapse";
}


if (!window['g_project_lib_name']) {
	window['g_project_lib_name'] = '_test_dummy';
}

(function() { // returns an object, or can be called automatically within

// CODE TO EXECUTE
	glow.ready(function() { 

		g_collapse.init({});

	});


// MAINTAINED VARIABLES

	var g_collapse = null // object returned from this function, used to collapse things
		, g_container_select = ".collapse-container" // contains a link and a block to select
		, g_heading_select = ".collapse-heading" // selects heading within container
		, g_collapsible_select = ".collapse-block" // selects collapsible block(s) within container
		, g_a_start_open_select = [] // list of selectors for containers which should be opened after loading
		, g_acc_anim_time = 0.5 // expand/collapse time (seconds)
		, g_func_close = (glow.env.webkit < 500) ? close_item_simple : close_item
		, g_func_open = (glow.env.webkit < 500) ? open_item_simple : open_item
		;

// FUNCTIONS

	function close_item(ns_container) {

		var ns_collapsible = ns_container.get(g_collapsible_select),
			current_height = ns_collapsible.height();

		var close_anim = glow.anim.css(ns_collapsible, g_acc_anim_time, {
		  "height": {from:current_height, to:0}
		}, {
		  tween: glow.tweens.easeBoth()
		});

		glow.events.addListener(close_anim, "complete", function() { on_close_complete(ns_container); });

		ns_container.removeClass("open");
		close_anim.start();
	}
	//-----

	function close_item_simple(ns_container) {
		ns_container.get(g_collapsible_select).css("display", "none").css("height", "0");
		ns_container.removeClass("open");
	}
	//-----

	function open_item(ns_container) {

		var ns_collapsible = ns_container.get(g_collapsible_select),
			expanded_height = 0;

		expanded_height = ns_collapsible
			.css("display", "block")
			.css("position", "absolute")
			.css("visibility", "hidden")
			.css("height", "auto")
			.height();

		ns_collapsible
			.css("position", "")
			.css("visibility", "")
			.css("height", "");

		var open_anim = glow.anim.css(ns_collapsible, g_acc_anim_time, {
		  "height": {from:0, to:expanded_height}
		}, {
		  tween: glow.tweens.easeBoth()
		});

		glow.events.addListener(open_anim, "complete", function() { on_open_complete(ns_container); });

		open_anim.start();
	}
	//-----

	function open_item_simple(ns_container) {
		ns_container.get(g_collapsible_select).css("display", "block").css("height", "auto");
		ns_container.addClass("open");
	}
	//-----

	function on_click(glow_evt) {

		var ns_container = this
			;

		if (ns_container.hasClass("open"))
			g_func_close(ns_container);
		else
			g_func_open(ns_container);

		return false;
	}
	//-----

	function on_close_complete(ns_container) {
	}
	//-----

	function on_open_complete(ns_container) {

		var ns_collapsible = ns_container.get(g_collapsible_select)
			;

//		ns_collapsible.css("height", "auto");
		ns_container.addClass("open");
	}
	//-----

// RETURNED OBJECTS

	g_collapse = {

		// show video, then re-display error message text if not replaced
		init: function (opt) {

			var ns_containers = []
				, i = 0 // loop counter
				, start_open_select = '' // loop variable
				;

			if (opt) {
				g_container_select = opt['container'] || g_container_select;
				g_heading_select = opt['heading'] || g_heading_select;
				g_collapsible_select = opt['collapsible'] || g_collapsible_select;
				g_a_start_open_select = opt['start-open'] || g_a_start_open_select;
			}

			ns_containers = glow.dom.get(g_container_select);

//			alert('containers:' + g_container_select + ' (' + ns_containers.length + ')');
//			alert('headings: ' + g_heading_select + ' (' + ns_containers.get(g_heading_select).length + ')');

			ns_containers.each(function(i) {

				var ns_container = ns_containers.slice(i,i+1)
					ns_block = ns_container.get(g_collapsible_select)
					ns_heading = ns_container.get(g_heading_select)				
					, s_heading_text = ns_heading.text()
					, o_anchor = document.createElement("a")
					, ns_anchor = glow.dom.get(o_anchor).text(s_heading_text)
					;
				
				ns_block.css('overflow', 'hidden');

				ns_anchor.attr("href", "#").attr('title', 'Click to display content');
				ns_heading.text("");
				ns_heading.append(glow.dom.get(o_anchor));

				glow.events.addListener(ns_anchor, "click", on_click, ns_heading.parent(), ns_container);

			});

			for (i = 0, start_open_select = g_a_start_open_select[i]; start_open_select; ++i)
			{
				g_func_open(glow.dom.get(start_open_select));
			}

		},
		//-----

		dummy_field: null // so all other field values can end in ","

	};

	window[g_project_lib_name] = g_collapse;

})();

/* end of script */