var flex$selectedCell;

function flex$init()
{
	var labels = document.getElementsByTagName( "label" );
	for( var i = 0; i < labels.length; i++ )
	{
		var label = labels[i];
		if( label.className )
		{
			continue;
		}
		label.className = "inchis";
		var div = document.createElement( "div" );
		div.className = "deselectat";
		var parent = label.parentNode;
		parent.replaceChild( div, label );
		div.appendChild( label );
		div.onclick = flex$toggle;
		div.onmouseout = flex$out;
		div.onmouseover = flex$over;
		do
		{
			div = div.nextSibling;
		} while( div && div.tagName != "DIV" );
		if( div && !div.getAttribute( "loader:src" ) && !div.getElementsByTagName( "div" ).length )
		{
			div.className = "flex leaf";
		}
	}
}

function flex$over()
{
	var div = this;
	if( div != flex$selectedCell )
	{
		div.className = "deasupra";
	}
}

function flex$out()
{
	var div = this;
	if( div != flex$selectedCell )
	{
		div.className = "deselectat";
	}
}

function flex$toggle()
{
	var label = this.firstChild;
	var selectedLabel = flex$selectedCell ? flex$selectedCell.firstChild : null;
	if( !label.htmlFor )
	{
		return; // dummy branch
	}
	var divParent;
	if( selectedLabel )
	{
		divParent = getParentOfClass( label, "flex" );
	}
	var div = document.getElementById( label.htmlFor );
	if( div.style.display == "block" )
	{
		flex$closeSelected( divParent ); // close the open labels, up to itself
	}
	else
	{
		if( selectedLabel )
		{
			if( !divParent || selectedLabel.htmlFor != divParent.id ) // Current open is not the parent
			{
				flex$closeSelected( divParent ); // close the open labels, up to the parent DIV
			}
			else
			{
				selectedLabel.parentNode.className = "deselectat"; // no longer selected
			}
		}
	}
	flex$openNode( this );
}

function flex$openNode( div ) // not of class flex
{
	var label = div.firstChild;
	label.className = "deschis";
	div.className = "selectat";
	flex$selectedCell = div;
	div = document.getElementById( label.htmlFor );
	if( div )
	{
		div.style.display = "block";
		var src = div.getAttribute( "loader:src" );
		if( src && src.length > 0 )
		{
			loadPage( src, div.id, true ); // loader.js
			div.setAttribute( "loader:src", "" );
		}
	}
}

function flex$closeNode( div ) // not of class flex
{
	var label = div.firstChild;
	label.className = "inchis";
	div.className = "deselectat";
	div = document.getElementById( label.htmlFor );
	if( div )
	{
		div.style.display = "none";
	}
}

function flex$closeSelected( untilDiv ) // of class flex
{
	var labels = document.getElementsByTagName( "label" );
	var label = flex$selectedCell.firstChild;
	while( true )
	{
		flex$closeNode( label.parentNode ); // close
		var div = getParentOfClass( label, "flex" );
		if( !div || div == untilDiv )
		{
			break;
		}
		var id = div.id;
		for( var i = 0; i < labels.length; i++ )
		{
			label = labels[i];
			if( label.htmlFor == id )
			{
				break;
			}
		}
		if( i == labels.length ) // div without label
		{
			label = null;
		}
	}
}

function flex$open( id )
{
	var stack = new Array();
	var div = document.getElementById( id );
	while( isOfClass( div, "flex" ) )
	{
		stack.push( div );
		div = div.parentNode;
	}
	while( stack.length )
	{
		div = stack.pop();
		do
		{
			div = div.previousSibling;
		} while( !div.onclick );
		div.onclick();
	}
}

