var treeTables = new Object();
function TreeTableElement(record)
{
	this.record = record;
	this.oid = record[0];
	this.parent = record[1];
	if (this.parent == "") this.parent = null;
	this.icon = record[2];
	this.label = record[3];
	this.recordType = record[6];
	this.mimeType = record[7];
	this.fileExtension = record[8];
	this.children = new Array();
	this.tr = null;
	this.depth = null;
}

TreeTableElement.prototype.plusIcon = "iso_icons/dynlib_plus.gif";
TreeTableElement.prototype.minusIcon = "iso_icons/dynlib_minus.gif";
TreeTableElement.prototype.emptyIcon = "iso_icons/empty.gif";

TreeTableElement.prototype.appendChild = function(element)
{
	this.children[this.children.length] = element;
}
 
TreeTableElement.prototype.show = function(treeTable)
{
	var parent = null;
	if(this.parent != null) {
		parent = TreeTable.getElement(this.parent);
		if(parent == null) return;
		parent.show(treeTable);
		parent.open(true);
	}
}
TreeTableElement.prototype.buildHtml = function(treeTable, pivot, depth)
{

	if ( (depth/2) != Math.floor(depth/2) ) var currentCSS = oddCss ;
	else  var currentCSS = evenCss ;

	this.depth = depth;
	var tbody = treeTable.tbody;
	var tr = this.tr = document.createElement("tr");
	tr.id = "R" + this.oid;
	if(pivot) {
		tbody.insertBefore(tr, pivot);
	} else {
		tbody.appendChild(tr);
	}
	tr.valign = "middle";
	tr.height = "16";

	for(var i=0;i<treeTable.columns.length;i++) {
		var td = document.createElement("td");
		td.className = currentCSS ;
		tr.appendChild(td);
		var column = treeTable.columns[i];
		if(typeof(column) == "function") {
			column(td, this);
			var td = document.createElement("td");
			td.className = currentCSS ;
			td.width = "3" ;
			tr.appendChild(td);
			continue;
		} 
		switch(column) {
		case "radio":
			var id = this.oid ;
			td.width = "25" ;
			td.align = "center" ;
			var input = "<img src=\"iso_icons/empty.gif\" width='25' height='1'>" ;
			var a = "" ;
			switch (this.recordType)
			{
				case "vol":
					break ;
				case "fld":
					a = "onClick=\"selectFolder('" + this.oid.substr(3) + "');\"" ;
					break ;
				case "file":
					a = "onClick=\"selectDocument('" + this.oid.substr(3) + "');\"" ;
					break ;
				case "note":
					a = "onClick=\"selectNote('" + this.oid.substr(3) + "');\"" ;
					break ;
			}
			if ( this.recordType != "vol" ) input = "<input type='radio' name='postfolder' value=\"" + this.oid.substr(3) + "\" " + a + ">" ;
			td.innerHTML = input;
			break;
		case "main":
			td.width = "60%" ;
			td.align = "left" ;
			var a = this.a = document.createElement("a");
			td.style.paddingLeft = 20 * this.depth + "px";
			td.appendChild(a);
			var img = document.createElement("img");
			this.img = img;
			img.align='middle';
			img.style.width = "16px";
			img.style.height = "16px";
			img.border = 0;
			if(this.children.length > 0) {
				img.src = this.plusIcon;
				a.href = "#";
				a.name = "never";
				a.onclick = TreeTableElementPlusMinusClickEvent;
				///this.isOpen = false;
			} else {
				img.src = this.emptyIcon;
				///this.isOpen = null;
				a.name = "never";
			}
			a.appendChild(img);
			
			var icon = document.createElement("img");
			switch (this.recordType)
			{
				case "vol":
					icon.src = "iso_icons/fsm_disk.gif" ;
					break ;
				case "fld":
					icon.src = "iso_icons/fsm_folder_close.gif" ;
					break ;
				case "file":
					if ( iconsMap[ this.mimeType ] != null ) {
						if ( iconsMap[this.mimeType]["iconUrl"] != null && iconsMap[this.mimeType]["iconUrl"] != "" ) {
							icon.src = iconsMap[this.mimeType]["fullURL"] ;
							break ;
						}
					}
					if ( this.fileExtension != "" ) {
						if ( reverseIconsMap[this.fileExtension] != null ) {
							if ( iconsMap[reverseIconsMap[this.fileExtension]]["iconUrl"] != null && iconsMap[reverseIconsMap[this.fileExtension]]["iconUrl"] != "" ) {
								icon.src = iconsMap[reverseIconsMap[this.fileExtension]]["fullURL"] ;
								break ;
							}
						}
					}
					icon.src = "./iso_icons/sd_document.gif" ;
					break ;
				case "note":
					icon.src = "./iso_icons/sd_note.gif" ;
					break ;
			}
			icon.style.width = "16px";
			icon.style.height = "16px";
			icon.border = "0px";
			td.appendChild(icon);
			icon.align = "middle";
			
			var Alabel = "&nbsp;" ;
			if ( this.recordType == "file" || this.recordType == "note" ) {
				var o = "window.open('" + viewDocumentURL + "?docid=" + this.oid.substr(3) + "','_blank','menubar=no,scrollbars=yes,height=300,width=300,top=150,left=200,location=no,status=no') ;" ;
				Alabel += "<a href=\"#\" name=\"never\" onclick=\"" + o + "\">" + this.label + "</a>" ;
				td.innerHTML += Alabel ;
			}
			else {
				var span = this.title = document.createElement("span");
				span.innerHTML = "&nbsp;" + this.label;
				td.appendChild(span);
			}
			break;
		}
		var td = document.createElement("td");
		td.className = currentCSS ;
		td.width = "3" ;
		tr.appendChild(td);
	}
	var td = document.createElement("td");
	td.className = currentCSS ;
	td.width = "20" ;
	tr.appendChild(td);
}

TreeTableElement.prototype.open = function(isOpen, treeTable)
{
	this.isOpen = isOpen;
	if(this.children.length == 0) return;
	var firstChild = this.children[0];
	if(!firstChild.tr) {
		var nextSibling = this.tr.nextSibling
		for(var i=0;i<this.children.length;i++) {
			this.children[i].buildHtml(treeTable, nextSibling, this.depth + 1);
		}
		this.img.src = this.minusIcon;
	}
	if(isOpen) {
		for(var i=0;i<this.children.length;i++) {
			if(document.all) {
				this.children[i].tr.style.display = "block";
			} else {
				this.children[i].tr.style.display = "table-row";
			}
		}
		this.img.src = this.minusIcon;
	} else {
		for(var i=0;i<this.children.length;i++) {
			var child = this.children[i];
			child.open(false, treeTable);
			child.tr.style.display = "none";
		}
		this.img.src = this.plusIcon;
	}
}

TreeTableElement.prototype.highlight = function(status)
{
	if(this.tr == null) return;
	if(status) {
		this.title.className = "TreeTableTitleSelected";		
	} else {
		this.title.className = "TreeTableTitle";		
	}
}

function TreeTable(data, div)
{
	this.tbody = div;
	treeTables[div.id] = this;
	this.elements = new Object();
	for(var i=0;i<data.length;i++) {
		var element = new TreeTableElement(data[i].split("|"));
		this.elements[element.oid] = element;	
	}
	this.topElements = new Array();
	for(var oid in this.elements) {
		var element = this.elements[oid];
		var parent = element.parent;
		if(parent == null) {
			this.topElements[this.topElements.length] = element;
			continue;
		}
		parent = this.elements[parent];
		if(parent == null) continue;
		parent.appendChild(element);
	}
	this.iconMap = new Object();
	this.columns = new Array();

}
TreeTable.prototype.setColumns = function(columns)
{
	this.columns = columns;
}

TreeTable.prototype.start = function()
{
	for(var i=0;i<this.topElements.length;i++) {
		var element = this.topElements[i];
		element.buildHtml(this, null, 0);
	}
}

TreeTable.prototype.getElement = function(oid)
{
	return this.elements[oid];
}
TreeTable.prototype.getOid = function(htmlElement)
{
	while(htmlElement && htmlElement.nodeType == 1) {
		var id = htmlElement.id;
		if(id != "") break;
		htmlElement = htmlElement.parentNode;
	}
	if(htmlElement == null || htmlElement.nodeType != 1) return;
	var oid = htmlElement.id.substr(1);
	return oid;
}

TreeTable.prototype.selectHtmlElement = function(evt, htmlElement)
{
	var oid = this.getOid(htmlElement);
	var element = this.elements[oid];
	if(element == null) return;
	this.selectElement(element)
}

TreeTable.prototype.selectElement = function(element)
{
	if(this.selectedElement) {
		this.selectedElement.highlight(false);
		this.selectedElement = null;
	}
	this.selectedElement = element;
	element.highlight(true);
	onInternalLinkChange();
}

TreeTable.prototype.openElement = function(evt, htmlElement)
{
	var oid = this.getOid(htmlElement);
	var element = this.elements[oid];
	if(element == null) return;
	element.open(!element.isOpen, this);
}

TreeTable.prototype.loopOpenElement = function(evt, oid)
{
	var element = this.elements[oid];
	if ( element.parent != null && element.parent != "" ) {
		var parent = this.elements[element.parent] ;
		this.loopOpenElement( null, element.parent ) ;
	}
	if(element == null) return;
	element.open(!element.isOpen, this);
}

TreeTable.prototype.getSelectedLabel = function()
{
	if(this.selectedElement == null) return "";
	return this.selectedElement.label;
}

TreeTable.prototype.getSelectedUrl = function()
{
	if(this.selectedElement == null) return "";
	return "page:" + this.selectedElement.oid;
}

TreeTable.prototype.showOid = function(oid)
{
	var element = this.getElement(oid);
	if(element == null) return;
	element.show();
	this.selectElement(element);
	var topPosition = this.getAbsolutePos(this.tbody);
	var position = this.getAbsolutePos(element.tr);
	var delta_y = position.y - topPosition.y;
	var delta_x = position.x - topPosition.x;
	var scrollY = this.tbody.scrollTop;
	if(delta_y > 230) {
		scrollY += delta_y - 230;
		this.tbody.scrollTop = scrollY;
	}
}

TreeTable.prototype.getAbsolutePos = function(element)
{
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(element.tagName);
	if (is_div && element.scrollLeft)
		SL = element.scrollLeft;
	if (is_div && element.scrollTop)
		ST = element.scrollTop;
	var r = { x: element.offsetLeft - SL, y: element.offsetTop - ST, w: element.offsetWidth, h:element.offsetHeight};
	if (element.offsetParent) {
		var tmp = this.getAbsolutePos(element.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
}

TreeTable.prototype.setIconMap = function(iconMap)
{
	this.iconMap = iconMap
}
TreeTable.prototype.getIconUrl = function(id)
{
	var url =  this.iconMap[id];
	if(url == null) return "iso_icons/folder.png";
	return url;
}

function getTreeTable(element)
{
	while(element && element.nodeType == 1) {
		var treeTable = treeTables[element.id];
		if(treeTable != null) return treeTable;
		element = element.parentNode;
	}
}
function TreeTableElementSelectEvent(evt)
{
	evt || (evt = window.event);
	if (document.all != null) {
		element = window.event.srcElement;
	} else {
		element = evt.currentTarget;
	}
	var treeTable = getTreeTable(element);
	if(!treeTable) return false;
	treeTable.selectHtmlElement(evt, element);
	return false;
}
function TreeTableElementDblClickEvent(evt)
{
	commit();
	return false;
}

function TreeTableElementPlusMinusClickEvent(evt)
{
	evt || (evt = window.event);
	if (document.all != null) {
		element = window.event.srcElement;
	} else {
		element = evt.currentTarget;
	}
	var treeTable = getTreeTable(element);
	if(!treeTable) return false;
	treeTable.openElement(evt, element);
	return false;
}

