// tree component starts here

var stopev = false;
function treerecover( n )
{
	var dc = document.cookie.split( '; ' );
	for( var i = 0 ; i < dc.length ; i++ )
	{
		var tmp = dc[i].split( '=' );
		if( tmp[0] == n ) return tmp[1]*1;
	}
	return 0;
}
function treesave( n, v )
{
	document.cookie = n + '=' + v;
}

function treeclick( event, o )
{
	var myclass, otherclass;

	if( stopev ) return;
	stopev = true;
	setTimeout( 'stopev = false', 1 );

	var pleft = ie ? event.offsetX : event.layerX;

	var to = o;
	while( to != document.body && to.className != 'tree' ) to = to.parentNode;

	if( o.className.match( /treeplus/ ) && pleft < 20 )
	{
		myclass = 'treeminus';
		o.className = myclass;
		treesave( o.id, 1 );
	}
	else if( o.className.match( /treeminus/ ) && pleft < 20 )
	{
		myclass = 'treeplus';
		o.className = myclass;
		treesave( o.id, 0 );
	}
	else
	{
		selectclick( o );
		return;
	}
	var myopts = o.selobj.myopts;
	var scroll = myopts.scrollTop;
	myopts.style.height = 'auto';
	if( myopts.clientHeight > selmaxh ) myopts.style.height = selmaxh;
	myopts.scrollTop = scroll;
	treesave( 'scroll' + o.id, scroll );
}


function selectout( o )
{
}


function selectover( o )
{
	if( stopev ) return;
	stopev = true;
	setTimeout( 'stopev = false', 1 );
	clearselection();
	var cnl = o.sel.lastsel.className;
	cnl = cnl.replace( /_over/, '' );
	o.sel.lastsel.className = cnl;

	var cn = o.className + '_over';
	o.className = cn;

	o.sel.lastsel = o;
	nopopup();
}


function selectclick( o )
{
	clearselection();

	if( o == null ) return;
	if( !o.sel.options.length ) return;
	o.sel.selectedIndex = o.idx;
	o.sel.lastsel = o;
	if( typeof(o.sel.onchange) == 'function' ) o.sel.onchange();
	var res = o.sel.options[o.idx].text;

	if( o.sel.getAttribute( 'tree' ) == 1 )
	{
		var maxw = o.selobj.clientWidth - 20;
		var tmp = ce( 'DIV' );
		tmp.className = 'select';
		tmp.style.position = 'absolute';
		tmp.style.left = -10000;
		document.body.appendChild( tmp );
		tmp.innerHTML = res;
		while( tmp.clientWidth > maxw )
		{
			res = '...' + res.substr( 4, 1000 );
			tmp.innerHTML = res;
		}
		document.body.removeChild( tmp );
		res = res.replace( /\|/g, ' > ' );
		var myopts = o.selobj.myopts;
		var scroll = myopts.scrollTop;
//		myopts.style.height = 'auto';
//		if( myopts.clientHeight > selmaxh ) myopts.style.height = selmaxh;
//		myopts.scrollTop = scroll;
	}
	o.selobj.innerHTML = res;
	selectclose();
}

function clearselection()
{
	if( ie )
		document.selection.empty();
	else
		window.getSelection().removeAllRanges();
}

function selectclose()
{
	if( currentselectbox != null )
	{
		currentselectbox.myopts.style.display = 'none';
		currentselectbox = null;
		document.body.onmouseup = null;
	}
}

function selectopen( event, mysel )
{
	if( mysel.myopts.style.display == 'block' )
	{
		mysel.myopts.style.display = 'none';
		return;
	}
	selectclose();
	nopopup();
	var ptop = event.clientY + document.body.scrollTop;
	var pleft = event.clientX + document.body.scrollLeft;
	ptop -= ie ? event.offsetY: event.layerY;
	pleft -= ie ? event.offsetX : event.layerX;
	mysel.myopts.style.display = 'block';
	ox = ie ? -3 : 0;
	oy = ie ? 0 : 2;
	mysel.myopts.style.top = ptop + mysel.clientHeight + oy;
	mysel.myopts.style.left = pleft + ox;
	clearselection();
	currentselectbox = mysel;
	//setTimeout( 'document.body.onmouseup = selectclose', 1000 );
	return false;
}

var currentselectbox = null;

function selectbox( selectsource )
{
	var sel = selectsource;
	var id = 'sbox' + sel.name;
	var oid = 'sboxopt' + sel.name;
	var hang = sel.parentNode;

	//se hang for um p tem que colocar depois do p. Inserir divs dentro de Ps da problema no IE...
	if( hang.tagName == 'P' )
	{
		hang.removeChild( sel );
		insertAfter( sel, hang );
		hang = sel.parentNode;
	}

	var mysel = ce( 'DIV' );
	if( $(oid) != null ) document.body.removeChild( $(oid) );
	var myopts = ce( 'DIV' );
	var i;

	mysel.sel = sel;
	sel.mysel = mysel;
	mysel.id = id;
	myopts.id = oid;
	mysel.className = 'select';
	var sidx = sel.selectedIndex;
	if( sidx < 0 ) sidx = 0;
	if( sel.options.length ) mysel.innerHTML = sel.options[sidx].text + '';

	myopts.className = 'selectcontent';
	myopts.optflag = 1;
	mysel.onmouseover = function() 
	{
		if( isdefined( myopts.tim ) ) clearTimeout( myopts.tim );
	}
	mysel.onmouseout = function() 
	{
		if( isdefined( myopts.tim ) ) clearTimeout( myopts.tim );
		myopts.tim = setTimeout( function() { myopts.style.display = 'none' }, 1000 );
	}
	myopts.onmouseover = function() 
	{
		if( isdefined( myopts.tim ) ) clearTimeout( myopts.tim );
	}
	myopts.onmouseout = function() 
	{
		if( isdefined( myopts.tim ) ) clearTimeout( myopts.tim );
		myopts.tim = setTimeout( function() { myopts.style.display = 'none' }, 1000 );
	}

	var br = ce( 'BR' );
	br.clear = 'all';

	hang.insertBefore( br, sel );
	hang.insertBefore( mysel, br );
	document.body.appendChild( myopts );
	mysel.myopts = myopts;
	//mysel.onscroll = function() { myselsave( mysel.id + '_scroll', mysel.scrollTop ); };
	
	sel.style.display = 'none';
	mysel.opts = new Array;
	mysel.onmousedown = function(ev) { e = ie ? event : ev; selectopen( e, this ); };
	mysel.onmousemove = clearselection;
	var olist = '';

	if( sel.getAttribute( 'width' )*1 > 0 )
		sel.wd = sel.getAttribute( 'width' )*1;

	selopt( sel );
	if( sel.getAttribute( 'load' ) != null )
	{
//		window.open( sel.getAttribute( 'load' ) );
//		ajaxrequest( nocache( sel.getAttribute( 'load' ) ), 'resultselect', sel, 1 );
		ajaxrequest( sel.getAttribute( 'load' ), 'resultselect', sel, 1 );
	}
}


function resultselect( xml, obj, txt )
{
	var olist = ntag( xml, 'option' );

	if( olist == null || olist.length == 0 )
	{
		globalerror( 'bad content on ajax select: objid = ' + obj.id + '\nreturned value=' + txt );
	}
	for( var i = 0 ; i < olist.length ; i++ )
	{
		var eid = vtag( olist[i], 'value' );
		var ename = vtag( olist[i], 'txt' );
		var selected = vtag( olist[i], 'selected' ) * 1;
		var opt = ce( 'OPTION' );
		opt.value = eid;
		opt.text = ename;
		obj.options.add( opt );
		if( selected == 1 )
		{
			obj.selectedIndex = i;
			opt.selected = true;
		}
//		debug( 'opt', opt.text );
	}
//	obj.mysel.style.display = 'none';
//	obj.style.display = 'block';
	obj.mysel.myopts.innerHTML = '';
	obj.mysel.myopts.style.display = 'block';
	selopt( obj );
}

function selopt( sel )
{
	var mysel = sel.mysel;
	var myopts = mysel.myopts;
	var sidx = sel.selectedIndex;
	var id = mysel.id;

	if( sel.getAttribute( 'tree' ) == 1 )
	{
		var llist = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
		var level = 0;
		olist = '';
		for( var i = sel.options.length - 1 ; i >= 0 ; i-- )
		{
			var txt = sel.options[i].text;
			var nlist = txt.split( '|' );
			var mylevel = nlist.length - 1;
			var nodename = nlist[mylevel];
			var ident = id + '_' + i;
			
			if( mylevel > level )
			{
				for( var j = mylevel ; j > level ; j-- )
					olist = '</div></div>' + olist;
				level = mylevel;
			}
			if( mylevel < level )
			{
				var tclass =  i > 0 && !treerecover( ident )  ? 'treeplus' : 'treeminus';
				olist = '<div onmouseover="selectover(this)" onmouseout="selectout(this)" class=' + tclass + ' id="' + ident + '" onclick="treeclick( event, this )"><nobr>' + nodename + '</nobr><div class=treesub>\n' + olist;
				level = mylevel;
			}
			else
			{
				var tclass =  sel.options[i].selected ? (sel.multiple ? 'treenodeck':'treenode_over') : 'treenode';
				olist = '<div onmouseover="selectover(this)" onmouseout="selectout(this)" class=' + tclass + ' id="' + ident + '" index="' + i + '" select="' + sel.id + '" onclick="treeclick( event, this )"><nobr>' + nodename + '</nobr></div>\n' + olist;
			}
		}
		myopts.innerHTML = olist;
		myopts.style.width = 200;
		var owid = sel.wd ? sel.wd : myopts.clientWidth + 20;
		for( var i = 0 ; i < sel.options.length ; i++ )
		{
			opt = $(id + '_' + i);
			opt.idx = i;
			opt.sel = sel;
			opt.selobj = mysel;
		}
		myopts.style.height = 'auto';
		if( myopts.clientHeight > selmaxh ) myopts.style.height = selmaxh;
		if( treerecover( 'scroll' + ident ) )
			myopts.scrollTop = treerecover( 'scroll' + ident );
	}
	else
	{
		var olist = new Array();
		myopts.style.height = 'auto';
		for( var i = 0 ; i < sel.options.length ; i++ )
		{
			var txt = sel.options[i].text;
			opt = ce( 'DIV' );
			var ic = i == sidx ? 'selectoption_over' : 'selectoption';
			opt.onmouseover = function() { selectover(this); };
			opt.onmouseout = function() { selectout(this); };
			opt.onmouseup = function() { selectclick(this); };
			opt.className = id;
			opt.idx = i;
			opt.id = id + '_' + i;
			opt.innerHTML = txt;
			opt.sel = sel;
			opt.selobj = mysel;
			olist[i] = opt;
			myopts.appendChild( opt );
		}
		if( myopts.clientHeight > selmaxh ) myopts.style.height = selmaxh;
		var owid = sel.wd ? sel.wd : myopts.clientWidth + 20;
		for( var i = 0 ; i < sel.options.length ; i++ )
		{
			opt = olist[i];
			opt.style.width = owid;
			var ic = i == sidx ? 'selectoption_over' : 'selectoption';
			opt.className = ic;
		}
	}
	myopts.style.width = owid  - (!ie ? 55 : 15);
	mysel.style.width = myopts.clientWidth;
//	mysel.style.width = owid;
	mysel.style.paddingTop = ie? 4 : 4;
	mysel.style.height = ie ? 22 : 16;
	mysel.style.marginTop = ie ? 1 : 0;
	myopts.scrollTop = sidx * 20;
	myopts.style.display = 'none';
	selectclick( $(id + '_' + sidx) );
}

var selmaxh = 200;
var selmaxw = 40;