// Product title: Gurt JavaScript Tree Menu
// Product version details: 1.1.1, 02-17-2006 (mm-dd-yyyy)
// Product URL: http://gurtom.com/products/trees/js
// Contact info: feedback@gurtom.com (specify product title in the subject)
// Notes: This script is free. Feel free to copy, use and change this script as 
// long as this head part remains unchanged.  Visit official site for details.
// Copyright: (c) 2005 by Gurtom.Com

var gTrees = [];

function gTree(sId, oCfg){
	var i, aItems = oCfg.items;

	this.aTpl = oCfg.tpl;	
	for (i in this.aTpl)
		if (i.charAt(0)=='i' && this.aTpl[i]) {
			this.aTpl['o'+i] = new Image();
			this.aTpl['o'+i].src = this.aTpl[i];
		}
	
	this.level = -1;
	this.id = sId;
	this.tree = gTrees[sId] = this;
	this.all = [];
	for(i=0; i< aItems.length;i++) gAssignItem(this, aItems[i]);
		
	document.write(gDescHtml(this).join(''));
	
	for(i=0; i< this.aDesc.length;i++) gOpenItem(this.aDesc[i]);

	this.toggle = function (nId) {var oItem = this.all[nId]; gOpenItem(oItem, oItem.bOpened) };
	this.rollover = function (nId, bC) {gStatusbarItem(this.all[nId],bC)};
	this.select = function (nId) {return gSelectItem(this.all[nId])};
}

function gAssignItem(_, aCfg, nOrd){
	if(!aCfg) return; 
	var oPrev, oItem, i;
	if(!_.aDesc) _.aDesc = [];
	if(nOrd == undefined || nOrd > _.aDesc.length) nOrd = _.aDesc.length;
	oItem = new gInitItem(_, aCfg[0], aCfg[1], aCfg[2]);
	if(aCfg[3]) for(i=3; i< aCfg.length;i++) gAssignItem(oItem, aCfg[i],i-3);
	i = nOrd;
	while(oItem) {
		oPrev = _.aDesc[i];
		_.aDesc[i] = oItem;
		oItem = oPrev;
		i++;
	}
	return _.aDesc[nOrd];
}

function gAddItem(_, aCfg, nOrd){
	var oItem = gAssignItem(_, aCfg, nOrd);
	gRerenderItem(_);
	return oItem;
}

function gRemoveDesc(_, oItem){
	var n = 0 ,i = 0, oNdesc = [];
	if(_.tree.oSel == oItem) _.tree.oSel = 0;
	for(i in _.aDesc) 
		if(_.aDesc[i]!=oItem) oNdesc[n++] = _.aDesc[i];
	_.tree.all[oItem.id] == 0;
	if(!oNdesc.length) _.aDesc = 0;
	else _.aDesc = oNdesc;
	gRerenderItem(_);
}

function gRemoveItem(_){
	if(_.aDesc)
	while(_.aDesc[0]) gRemoveItem(_.aDesc[0]);
	gRemoveDesc(_.oAnc, _);
}

function gOpenItem(_, bClose){
	_.bOpened = !bClose;
	var oIdiv = gGetDiv('i_div'+ _.tree.id + '_'+ _.id);
	if (oIdiv) {	
		if (!oIdiv.innerHTML) oIdiv.innerHTML = gDescHtml(_).join('');

		var oWdiv = gGetDiv('wr'+_.tree.id + '_' + _.id);
		if(oWdiv) oWdiv.className = 't' + _.tree.id + '_bg' + (bClose ? '1' : '2');

		oIdiv.style.display = (bClose ? 'none' : 'block');
		
		var oJicon = document.images['j_img' + _.tree.id + '_'+ _.id],
			oIicon = document.images['i_img' + _.tree.id + '_'+ _.id];
		if (oJicon) oJicon.src = gIconItem(_,true);
		if (oIicon) oIicon.src = gIconItem(_);
	}
	return false;
}


function gSelectItem(_, bDesel){
	if(!bDesel){
		var oOldsel = _.tree.oSel;
		_.tree.oSel = _;
		if(oOldsel) gSelectItem(oOldsel, 1);
	}
	if(_.bShow) {
		document.images['i_img' + _.tree.id + '_' + _.id].src = gIconItem(_,false);
		gGetDiv('i_txt'+ _.tree.id + '_'+ _.id).style.fontWeight = bDesel ? 'normal' : 'bold';
		gStatusbarItem(_, bDesel);
	}
	return Boolean(_.sLnk);
}

function gHideItem(_, bShow){
	_.bShow = bShow;
	if(_.level) gRerenderItem(_.oAnc);
	else {
		var oIdiv = gGetDiv('s_div'+ _.tree.id + '_'+ _.id);
		if (!oIdiv) return false;
		oIdiv.style.display = (bShow ? 'block' : 'none');
	}
}

function gStatusbarItem (_, bClear) {
	window.setTimeout('window.status=unescape("' + (bClear ? '' : escape(_.sSrc + (_.sLnk ? ' ('+ _.sLnk + ')' : ''))) + '")', 10);
}

function gInitItem(oAnc, sSrc, sLnk, sTpl){
	this.oAnc = oAnc;
	this.tree = oAnc.tree;
	this.id = this.tree.all.length;
	this.tree.all[this.id] = this;
	this.sSrc = sSrc;
	this.oTpl = sTpl ? this.tree.aTpl[sTpl]:null;
	this.sLnk = sLnk?sLnk:this.tree.aTpl.def_link;
	this.level = oAnc.level + 1;
	this.bShow = 1;
	this.bOpened = 0;
}

function gRerenderItem(_){
	if(!_.bShow) return;
	var oIdiv = gGetDiv('s_div'+ _.tree.id + '_'+ _.id);
	if (!oIdiv) return;
	oIdiv.innerHTML = gHtmlItem(_);
}

function gRenderItem(_){
	return ['<div id="s_div', _.tree.id , '_' , _.id , '" style="display:', (_.bShow ? 'block' : 'none') ,'">', gHtmlItem(_), '</div>'].join('');
}

function gHtmlItem(_){
	var aOffset = [],
		oCurrent_item = _.oAnc,
		sW1 = 'class="t' + _.tree.id + '_bg1"><img src="f_icons/wrapempty.gif" width=1 height=2 border="0" style="height:expression(offsetParent.offsetHeight)"></td>',
		sW2 = '<td class="t' + _.tree.id + '_bg2"><img src="f_icons/wrapempty.gif" width=1 height=2 border="0" style="height:expression(offsetParent.offsetHeight)"></td>',
		sWrap = '',
		bLast;
	for (var i = _.level; i > 1; i--) {
		bLast = gLastItem(oCurrent_item)
		aOffset[i] = '<td valign=top><img height=16 src="' + _.tree.aTpl[ bLast ? 'ie' : 'il'] + '" border="0" align="absbottom"></td>';
		oCurrent_item = oCurrent_item.oAnc;
		sWrap += bLast ? '<td '+sW1 : sW2;
	}
	
	bLast = gLastItem(_);
	if(_.level) 
		sWrap += bLast ? '<td '+sW1 : sW2;
	sWrap = '<tr>'+sWrap+(_.aDesc ? '<td id=wr'+_.tree.id + '_' + _.id+' ' +sW1 : '')+'</tr>';
	
	var sToggle = ['gTrees[\'' , _.tree.id , '\'].toggle(\'' , _.id , '\')'].join(''),
		sRollover = [' onmouseover="javascript: gTrees[\'' , _.tree.id , '\'].rollover(\'' , _.id , '\')" onmouseout="javascript: gTrees[\'' , _.tree.id , '\'].rollover(\'' , _.id , '\',1)"'].join(''),
		sSelect = ['onclick="return gTrees[\'' , _.tree.id , '\'].select(\'' , _.id , '\')"'].join('');
		sDesc = _.aDesc ? '<div id="i_div'+ _.tree.id + '_'+ _.id + '"  style="display:'+(_.bOpened?'block':'none')+'" >'+ (_.bOpened||_.tree.aTpl.build_whole?gDescHtml(_).join(''):'')+'</div>' : '';
	return ['<table cellpadding="0" cellspacing="0" border="0"><tr>' , (_.level ? 
		aOffset.join('') + (_.aDesc
		? ['<td height=16 valign=top><a href="javascript:',sToggle,'"', sRollover ,'><img height=16 src="' , gIconItem(_, true) , '" border="0" align="absbottom" name="j_img', _.tree.id , '_' , _.id , '"></a></td>'].join('')
		: ['<td height=16 valign=top><img height=16 src="' , gIconItem(_, true) , '" border="0" align="absbottom"></td>'].join('')) : '') 
		, '<td height=16 valign=top><a href="' , _.sLnk , '" target="' , _.tree.aTpl['target'] , '" ', sSelect,(_.aDesc?' ondblclick="'+sToggle+'"':''), '"><img height=16 src="' , gIconItem(_) , '" border="0" align="absbottom" name="i_img', _.tree.id , '_' , _.id , '" class="t' , _.tree.id , 'im"></td><td rowspan=2><a href="' , _.sLnk , '" target="' , _.tree.aTpl['target'] , '" ', sSelect,(_.aDesc?' ondblclick="'+sToggle+'"':''), sRollover, ' class="t' , _.tree.id , 'i" id="i_txt', _.tree.id , '_' , _.id , '">' , _.sSrc , '</a></td></tr>'+sWrap+'</table>' , sDesc
		].join('');
}

function gDescHtml(_){
	var aHtml = [];
	for(var i=0; i< _.aDesc.length;i++) {
		if(_.aDesc[i].bShow	)
		aHtml[i] = gRenderItem(_.aDesc[i]);
	}
	return aHtml;
}

function gIconItem (_, bJunction) {
	var oTpl = _.oTpl ? _.oTpl : _.tree.aTpl;
	return oTpl[['i' , (_.level ? '_' : 'r') , (_.aDesc ? 'n' : '_') , (_.aDesc && _.bOpened ? 'o' : '_'), (_.tree.oSel == _ && !bJunction ? 's' : '_') ,  (bJunction ? 'j' : '_') + (bJunction && gLastItem(_) ? 'l' : '_')].join('')];
}

function gLastItem(_) {
	var oLevel = _.oAnc.aDesc,
		oLast;
	for(var i=0; i < oLevel.length; i++){
		if(oLevel[i].bShow) oLast = oLevel[i];
	}
	return oLast == _?1:0
}

gGetDiv = document.all 	? function (sId) {return document.all[sId]}	: (document.getElementById ? function (sId) {return document.getElementById(sId)}: null);
