/*
	Feel free to use your custom icons for the tree. Make sure they are all of the same size.
	If you don't use some keys you can just remove them from this config
*/
var level_0 = {
	's0':'mout0',	//style for an item
	's4':'mout0',	//style for selected item
	's8':'mout0',	//style for opened item
	's12':'mout0',	//style for selected opened item
	
	's64':'mout0',	//style for an item when mouse is over it
	's68':'mout0',	//style for selected item when mouse is over it
	's72':'mout0',	//style for opened item when mouse is over it
	's76':'mout0'	//style for selected opened item when mouse is over it
};
var level_1 = {
	's0':'mout0',
	's4':'mout0',
	's8':'mout0',	
	's12':'mout0',	
	
	's64':'mout0',	
	's68':'mout0',
	's72':'mout0',
	's76':'mout0'	
};
var level_2 = {
	's0':'mout0',
	's4':'mout0',
	's8':'mout0',
	's12':'mout0',
	
	's64':'mout0',
	's68':'mout0',
	's72':'mout0',	
	's76':'mout0'
};

var TREE_TPL = {

	// general
	'target':'_blank',	// name of the frame links will be opened in
							// other possible values are:
							// _blank, _parent, _search, _self and _top
	'outerLayer':'FindLayer',
	'innerLayer': 'innerFindLayer',
	
	'multiselections':'true', //allow multiple nodes to be selected
	
	'icon_c0':'/icons/enabled_0.gif',
	'icon_c4':'/icons/enabled_1.gif',
	'icon_c64':'/icons/enabled_0.gif',
	'icon_c68':'/icons/enabled_1.gif',

	// icons - root	
	'icon_48':'/icons/base.gif',   // root icon normal
	'icon_52':'/icons/base.gif',   // root icon selected
	'icon_56':'/icons/base.gif',   // root icon opened
	'icon_60':'/icons/base.gif',   // root icon selected opened

	// icons - node	
	'icon_16':'/icons/folder.gif', // node icon normal
	'icon_20':'/icons/folderopen.gif', // node icon selected
	'icon_24':'/icons/folderopen.gif', // node icon opened
	'icon_28':'/icons/folderopen.gif', // node icon selected opened

	'icon_80':'/icons/folderopen.gif', // mouseovered node icon normal

	// icons - leaf
	'icon_0':'/icons/page.gif', // leaf icon normal
	'icon_4':'/icons/page.gif', // leaf icon selected

	// icons - junctions	
	'icon_2':'/icons/joinbottom.gif', // junction for leaf
	'icon_3':'/icons/join.gif',       // junction for last leaf
	'icon_18':'/icons/plusbottom.gif', // junction for closed node
	'icon_19':'/icons/plus.gif',       // junctioin for last closed node
	'icon_26':'/icons/minusbottom.gif',// junction for opened node
	'icon_27':'/icons/minus.gif',      // junctioin for last opended node

	// icons - misc
	'icon_e':'/icons/empty.gif', // empty image
	'icon_l':'/icons/line.gif',  // vertical line
	
	// styles - root
	'style_48':'mout0', // normal root caption style
	'style_52':'mout0', // selected root caption style
	'style_56':'mout0', // opened root caption style
	'style_60':'mout0', // selected opened root caption style
	'style_112':'mout0', // mouseovered normal root caption style
	'style_116':'mout0', // mouseovered selected root caption style
	'style_120':'mout0', // mouseovered opened root caption style
	'style_124':'mout0', // mouseovered selected opened root caption style
	
	// styles - node
	'style_16':'mout0', // normal node caption style
	'style_20':'mout0', // selected node caption style
	'style_24':'mout0', // opened node caption style
	'style_28':'mout0', // selected opened node caption style
	'style_80':'mout0', // mouseovered normal node caption style
	'style_84':'mout0', // mouseovered selected node caption style
	'style_88':'mout0', // mouseovered opened node caption style
	'style_92':'mout0', // mouseovered selected opened node caption style

	// styles - leaf
	'style_0':'mout0', // normal leaf caption style
	'style_4':'mout0', // selected leaf caption style
	'style_64':'mout0', // mouseovered normal leaf caption style
	'style_68':'mout0', // mouseovered selected leaf caption style
	'onItemSelect':'toggleOnClick',
	'onItemDeselect':'toggleOnClick',
	'onItemCheck':'checkHandler',
	'onItemUncheck':'uncheckHandler',
	'onItemAfterCheck':'onAfterSelect',
	'onItemAfterUncheck':'onAfterSelect',
	'onItemClose':'toggleHandler',
	'onItemOpen':'toggleHandler',
	'onItemAfterClose':'ResizeHandler',
	'onItemAfterOpen':'ResizeHandler'

	// make sure there is no comma after the last key-value pair
};

function toggleOnClick(o_item) {
    // if node with no link then toggle
    if (o_item.a_children && !o_item.a_config[1]) {
        o_item.o_root.toggle(o_item.n_id);
        // cancel default action
    }
       return false;
}

function toggleHandler(o_item){
	// get current block
	if(!o_item.n_depth) return false;
	var b_open = !(o_item.n_state & 8);
	o_item.o_root.b_toggle = 0;
	var a_curblock = o_item.o_parent.a_children;
	// close all nodes except current
	for (var i = 0; i < a_curblock.length; i++) {
		if (a_curblock[i].n_state & 48 && a_curblock[i] != o_item && !checkNodes(a_curblock[i],1)) {
			continue;
		}
	}
	// proceed to default handler
	return true;
}


function checkHandler(o_item){
	var b_select = !(o_item.n_state & 4);
	var a_children = findChildren(o_item, []);
	for(var i=0; i < a_children.length; i++) 
		if(!(a_children[i].n_state & 4)) {
			if(a_children[i].check) a_children[i].check(0,1)
			else {
				if(!a_children[i].selsave) a_children[i].selsave = o_item.selsave;
				a_children[i].n_state |= 4;
				a_children[i].selsave();
			}
		}
	var a_parents = findParents(o_item);
	for(var i=0; i < a_parents.length; i++) {
		if(b_select) {if(checkChilds(a_parents[i]) && a_parents[i].n_state & ~4) a_parents[i].check(0,1)}
		else {if(!checkChilds(a_parents[i],-1) && a_parents[i].n_state & 4) a_parents[i].check(1,1)}
	}
	var a_branch = [];
	if(o_item.a_children) o_item.open();
	collect_branch(o_item, a_branch, 0);
	if(!(o_item.n_state & 8) || (!o_item.n_depth && a_branch.length)) 
		for(i=0; i<a_branch.length; i++) a_branch[i].open(0,1,1);
	Resize(o_item)
	return true;
}

function toggleAll(o_tree, n_level) {
	var a_branch = [];
	if(o_tree.b_toggle) {
		createView(o_tree)
	}
	else {
		collect_branch1(o_tree, a_branch, n_level);
		for(var i=1; i < a_branch.length; i++)
			if(a_branch[i].n_depth) a_branch[i].open(o_tree.b_toggle,1,1);
		Resize(o_tree, 1);
	}
	o_tree.b_toggle = !o_tree.b_toggle;
	return false;
}

function collect_branch1(o_item, a_collection, n_level){
	if(o_item.n_depth < n_level) {
		if(o_item.a_children) {
			a_collection[a_collection.length] = o_item;
			for(var i=0; i < o_item.a_children.length; i++) collect_branch1(o_item.a_children[i], a_collection, n_level);
		}
	}
}

function collect_branch(o_item, a_collection, n_level) {
	if(n_level<2) {
		if(o_item.a_children) {
			if(!(o_item.n_state & 8)) a_collection[a_collection.length] = o_item;
			for(var i=0; i < o_item.a_children.length; i++) collect_branch(o_item.a_children[i], a_collection, n_level+1)
		}
	}
	return a_collection;
}

function uncheckHandler(o_item) {
	var a_parents = findParents(o_item);
	for(var j = a_parents.length-1; j >= 0; j--){
		if(a_parents[j].n_state & 4) a_parents[j].check(1,1);
	}
	var a_children = findChildren(o_item, []);
	for(var i=0; i < a_children.length; i++){
		if(a_children[i].n_state & 4) {
			if(a_children[i].check) a_children[i].check(1,1)
			else {
				if(!a_children[i].selsave) a_children[i].selsave = o_item.selsave;
				a_children[i].n_state &= ~4;
				a_children[i].selsave();
			}
		}
	}
	return 1;
}

function selectHandler(o_item) {
	if(o_item.a_children && o_item.a_children.length) {
		for(var i=0; i < o_item.a_children.length; i++){
			if(o_item.a_children[i].select) o_item.a_children[i].select();
			else {
				if(!o_item.a_children[i].selsave) o_item.a_children[i].selsave = o_item.selsave;
				o_item.a_children[i].n_state |= 4;
				o_item.a_children[i].selsave();
				selectHandler(o_item.a_children[i])
			}
		}
		o_item.open(o_item.n_state & 8);
	}
	o_item.n_state |= 4;

	var a_parents = findParents(o_item);
	for(var i=0; i < a_parents.length; i++) {
		if(checkChilds(a_parents[i]) && a_parents[i].n_state & ~4) a_parents[i].select(0,1);
	}
	return 1;
}

function findParents(o_item){
	var o_cur = o_item;
	var a_parents = [];
	while(o_cur.n_depth>=0) {
		a_parents[a_parents.length] = o_cur;
		o_cur = o_cur.o_parent;	
	}
	return a_parents;
}

function findChildren(o_item, a_children) {
	for(var i=0; o_item && o_item.a_children && i<o_item.a_children.length; i++){
		a_children[a_children.length] = o_item.a_children[i];
		findChildren(o_item.a_children[i], a_children);
	}
	return a_children;
}
function checkChilds(o_node, n_shift) {
	var n_selected = n_shift?n_shift:0;
	if(!o_node.a_children) return 1;
	for(var	i=0; i < o_node.a_children.length; i++){
		if(o_node.a_children[i].n_state & 4) n_selected++;
	}
	if(n_selected == o_node.a_children.length) return 1;
	return 0;
}

function bPartlySelected(o_node) {
	var n_selected = 0;
	if(!o_node.a_children) return (o_node.n_state & 4?1:0);
	for(var	i=0; i < o_node.a_children.length; i++){
		if(o_node.a_children[i].n_state & 4) n_selected++;
	}
	if(!n_selected || n_selected == o_node.a_children.length) return 0;
	return 1;
}

function bPartlySelected_1(o_node) {
	var n_selected = 0;
	if(!o_node.a_children) return (o_node.n_state & 4?1:0);
	for(var	i=0; i < o_node.a_children.length; i++){
		if(o_node.a_children[i].n_state & 4) n_selected++;
	}
	if(n_selected == o_node.a_children.length) return -1; //fully
	return n_selected; //N - partly or 0 - not selected
}


function checkNodes(o_node, b_close){
	var b_return = bPartlySelected_1(o_node);
	if(b_return>=0) {
		for(var	i=0; b_return>=0 && o_node.a_children && i < o_node.a_children.length; i++){
			b_return |= checkNodes(o_node.a_children[i], b_close)
		}
	} else b_return=0;
	if(b_close && !b_return && o_node.open) o_node.open(1,1,1);
	return b_return;
}

function createView(o_tree){
	for(var i = 0; i < o_tree.a_nodes.length; i++){
		if(!o_tree.a_nodes[i].n_depth && !(o_tree.a_nodes[i].n_state & 8)) o_tree.a_nodes[i].open(0,1,1);
		if(o_tree.a_nodes[i].a_config[2] && typeof(o_tree.a_nodes[i].a_config[2]['st'])=='number') continue;
		if(o_tree.a_nodes[i].n_depth && checkNodes(o_tree.a_nodes[i],1)) o_tree.a_nodes[i].open();
	}
	Resize(o_tree);
	onAfterSelect();
	var o_div = get_element(o_tree.s_ol);
	if(o_div) o_div.scrollTop = 0;

}

function Resize(o_item, b_nofocus){
	var n_offset = 15;
 	var o_div = get_element(o_item.o_root.s_ol);
 	var o_idiv = get_element(o_item.o_root.s_il);
	if((o_idiv.offsetHeight + o_div.offsetTop+n_offset) > document.body.clientHeight) {
		 if(!o_item.o_root.overflow) {
			o_div.style.height = document.body.clientHeight-o_div.offsetTop-n_offset;
			o_div.style.overflow = 'auto';
			o_div.style.overflowX = 'hidden';
			o_item.o_root.overflow = 1;
		}
	}
	else {
		o_div.style.height = o_idiv.style.height;
		o_div.style.overflow = '';
		o_item.o_root.overflow = 0;
	}
	if(!b_nofocus && o_item.a_children) {
		var o_last = o_item.a_children[o_item.a_children.length-1];
		o_last.focus();
	}
}

function ResizeHandler(o_item){
	Resize(o_item);
	return true;
}

function clearAll(o_tree){
	var a_selected = o_tree.find_item_by_state(4);
	for(var i = 0; i < a_selected.length; i++) {
		if(a_selected[i].select) a_selected[i].select(1,1);
		else {
			if(!a_selected[i].selsave) a_selected[i].selsave = o_tree.a_index[0].selsave;
			a_selected[i].n_state &= ~4;
			a_selected[i].selsave();
		}
	}
	createView(o_tree);
}
function onAfterSelect(o_item){
	var a_selected = [],
		a_display = [],
		o_div = get_element('selectionsdisplay');
	if(o_div) {
		for(var s_tree in TREES) {
			var o_tree = TREES[s_tree],
				b_initial = o_tree.get_rewind_status(),
				s_selected = getSelections(o_tree).join(', '),
				o_display = get_element('select'+s_tree+'display'),
				o_items = get_element(s_tree+'_items'),
				o_style = get_element(s_tree+'_style'),
				o_button = get_element(s_tree+'_button')
				s_style = 'SelStyle'+s_tree+(b_initial?'':'Change');
			if(s_selected) a_selected[s_tree] = s_selected;
			o_style.className = s_style;
			o_button.style.display= b_initial?'none':'block';
			if(!b_initial || s_selected) {
				o_display.style.display= 'block';
				o_items.innerHTML = s_selected?s_selected:'&nbsp';
			}
			else o_display.style.display= 'none';
		}
		//if(o_div) o_div.innerHTML = s_selected? s_selected : '&nbsp;';
		a_display = [];
		for(var s_tree in a_selected) {
			a_display[a_display.length] = s_tree + ': '+ a_selected[s_tree];
		}
		document.forms.trees.elements.trees_selections.value = a_display?a_display.join(', '):'';
	}
	if(o_item) Resize(o_item, 1);
}

function getSelections(o_tree){
	var a_value = [];
	var a_selected = o_tree.find_item_by_state(4);
	for(var i = 0; i < a_selected.length; i++) {
		if(!(a_selected[i].o_parent.n_state & 4))
			a_value[a_value.length] = a_selected[i].a_config[0].replace(/<\/?[^>]+>|&nbsp;/gi, '');
	}
	return a_value;
}