ypXmlTree.isIE   = document.all ? 1 : 0
ypXmlTree.isMAC  = navigator.platform == "MacPPC"
ypXmlTree.isDOM  = document.getElementById ? 1 : 0

if (navigator.userAgent.toLowerCase().indexOf("opera") != -1) {
	if (parseFloat(navigator.userAgent.match(new RegExp("opera ([^ ]+)", "i"))[1]) < 7) {
                ypXmlTree.isIE = 0
                ypXmlTree.isDOM = 0
        }
}
if (ypXmlTree.isIE || ypXmlTree.isDOM) {
	document.writeln('<style type="text/css">')
	document.writeln('.ypXmlTree {display:none;}')
	//document.writeln('.ypXmlTree .ypxt-n {width:100%;}')
	document.writeln('.ypXmlTree div { margin-bottom:0px; }')
	document.writeln('.ypxt-clip { overflow:hidden; display:none; }')
	document.writeln('</style>')
}
function ypXmlTree(sContainerId) 
{
	if (ypXmlTree.isIE || ypXmlTree.isDOM)
	{
		this.containerId		= sContainerId
		this.openFolders		= []
		this.activeNode			= 0
		this.animating			= 0
		this.aniInfo			= {}
		this.globalRef = "ypXmlTree_" + this.containerId
		eval(this.globalRef+"=this")
		this.load()
	}
}
ypXmlTree.prototype.load = function()
{
	this.root  = ypGetElementById(this.containerId)
	this.divs  = ypGetDescendantsByTagName(this.root, "DIV")
	this.rows  = ypGetDescendantsByTagName(this.root, "TR")
	this.links = ypGetDescendantsByTagName(this.root, "A")
	this.root.onmousedown = this.mouseEvent
	this.root.ondblclick = this.mouseEvent
	this.root.onclick = this.mouseEvent
	this.root.yp = this
	this.selectionStyle		= def(this.root.getAttribute("selection-style"), 1)
	this.animationStyle		= def(this.root.getAttribute("animation-style"), "pop")
	this.animationFrames	= def(this.root.getAttribute("animation-frames"), 5)
	this.animationStep		= def(this.root.getAttribute("animation-step"), 35)
	this.persistState		= def(this.root.getAttribute("persist-state"), 1) == '1'
	this.setTargetWindow()
	this.getState()
	this.initDefaultImgs()
	this.initRowImgs()
	this.initNodes()

	this.root.style.display = "block"	

	function def(opt, def) {
		return (opt == "" || opt == null ? def : opt)
	}
}
ypXmlTree.prototype.initDefaultImgs = function() {
	var r = this.root
	var imgPath		= r.getAttribute("img-path")
	this.toggleC	= ypImage(imgPath + r.getAttribute("toggle-closed"))
	this.toggleO	= ypImage(imgPath + r.getAttribute("toggle-open"))
	this.folderC	= ypImage(imgPath + r.getAttribute("default-folder-icon"))
	this.folderO	= ypImage(imgPath + r.getAttribute("default-folder-open-icon"))
	this.folderA	= ypImage(imgPath + r.getAttribute("default-folder-active-icon"))
	this.fileC		= ypImage(imgPath + r.getAttribute("default-file-icon"))
	this.fileA		= ypImage(imgPath + r.getAttribute("default-file-active-icon"))
}
ypXmlTree.prototype.initRowImgs = function()
{
	var aImgs, img, cls, custom
	aImgs = ypGetDescendantsByTagName(this.root, "IMG")
	
	for (var i = 0; (img = aImgs[i]); i++) {
		cls		= ypGetParentNode(img).className
		custom	= img.getAttribute("custom-icon")

		if (cls == "ypxt-i" && custom != null && custom != "") {
			img.c = ypImage(img.src)
			img.o = ypImage(img.getAttribute("osrc"))
			img.a = ypImage(img.getAttribute("asrc"))
		}
		else if (cls == "ypxt-t") {
			img.src = this.toggleC.src
		}
	}
}
ypXmlTree.prototype.initNodes = function()
{
	var row, membs, id
	for (var i = 0; (row = this.rows[i]); i++) {
		id = row.getAttribute("fId")
		if (this.openFolders[id] || row == this.activeNode) {
			membs = this.getNodeMembers(row)
			if (this.openFolders[id]) this.toggle(id, row, membs.marker, membs.icon, membs.clip, true, "pop")
			if (row == this.activeNode) this.activate(id, row, membs.marker, membs.icon, membs.name, membs.clip, "pop")
		}
	}
}
ypXmlTree.prototype.getState = function() {
	this.retreiveSavedState()
	var aNode, urlMatches
	aNode = this.getRow(this.root.getAttribute("active-node"))
	if (!aNode || aNode == null) {
		urlMatches = this.getNodeMatchesByURL()
		if (urlMatches.length == 1) aNode = ypGetParentNode(ypGetParentNode(urlMatches[0]))
	}
	if (aNode) this.activeNode = aNode
}
ypXmlTree.prototype.getNodeMatchesByURL = function() 
{
	var pageURL = new ypURL(this.targetWindow.location)
	var curMatches = [], matchDegree = -1, link, foldersMatch

	function update(newMatchDegree, newObj) {
		if (newMatchDegree == matchDegree) curMatches[curMatches.length] = newObj
		if (newMatchDegree > matchDegree) {
			matchDegree = newMatchDegree
			curMatches = [newObj]
		}
	}

	for (var i = 0; i < this.links.length; i++) {
		var link = this.links[i]
		var curURL = new ypURL(link)
		foldersMatch = true
		curDegree = 0
		for (var j = 0; j < curURL.folders.length; j++) {
			if (curURL.folders[j] == pageURL.folders[j])
				curDegree++
			else
				foldersMatch = false
		}
		if (foldersMatch) {
			if (curURL.file == pageURL.file) curDegree++
			if (curURL.query == pageURL.query) curDegree++
			if (curURL.hash == pageURL.hash) curDegree++
		}
		update(curDegree, link)
	}
	
	return curMatches
}
ypXmlTree.prototype.saveState = function() {
	if (this.persistState) {
		var a1, a2, id
		id = this.activeNode ? this.activeNode.getAttribute("fId") : ""
		a1 = this.openFolders
		a2 = []
		for (i = 0; i < a1.length; i++) if (a1[i] == true) a2[a2.length] = i
		document.cookie = "ypxt-" + this.root.id + "=" + a2.join("&") + "|" + id + ";path=" + "/"
	}
}
ypXmlTree.prototype.retreiveSavedState = function() {
	var c, s, e, a1, a2, a3, n
	if (this.persistState) {
		c = document.cookie
		n = "ypxt-"+this.root.id+"="
		s = c.indexOf(n)
		if (s != -1) {
			s += n.length
			e  = c.indexOf(";",s)
			if (e == -1) e = c.length
			c  = c.substring(s, e)
			a1 = c.split("|")
			a2 = a1[0].split("&")
			for (i in a2) this.openFolders[a2[i]] = 1
			this.activeNode = this.getRow(a1[1])
		}
	}
}
ypXmlTree.prototype.mouseEvent = function(e) 
{
	var srcEl, srcTD, ypType, row, oMembs, y, id, bOpen
	if (!e) e = window.event

	srcEl	= e.originalTarget ? e.originalTarget : e.srcElement
	if (srcEl.nodeType == 3) srcEl = srcEl.parentNode
	srcTD	= ypGetParentNode(srcEl)
	y		= this.yp

	if (srcTD && srcTD.tagName == "TD" && srcTD.className.indexOf("ypxt") == 0) {
		row		= ypGetParentNode(srcTD)
		id		= row.getAttribute("fId")
		bOpen	= y.openFolders[id] == 1
		ypType	= srcTD.className.split("-")[1]
		oMembs	= y.getNodeMembers(row)

		if (e.type == "mousedown") {
			if (row.className == "ypxt-r-fo") {
				if (ypType == "t" || ((ypType == "i" || ypType == "n") && y.selectionStyle == 3)) {
					y.toggle(id, row, oMembs.marker, oMembs.icon, oMembs.clip, !bOpen)
					y.openFolders[id] = !bOpen
				}
			}

			if (ypType == "i" || ypType == "n" || (ypType == "t" && y.selectionStyle == 3)) {
				y.activate(id, row, oMembs.marker, oMembs.icon, oMembs.name, oMembs.clip)
			}

			y.saveState()
			return false
		}

		if (e.type == "dblclick" && ((ypType == "i" || ypType == "n") && y.selectionStyle == 1)) {
			y.toggle(id, row, oMembs.marker, oMembs.icon, oMembs.clip, !bOpen)
			y.openFolders[id] = !bOpen
		}

		if (e.type == "click" && row.className.indexOf("ypxt-") == 0 && ypType == "i" && y.selectionStyle != 3 && oMembs.name.href) {
			y.targetWindow.location = oMembs.name.href
		}
	}
}

ypXmlTree.prototype.toggle = function(id, r, m, i, c, bOpen, style)
{
	if (r.className == "ypxt-r-fo") {
		var custom = i ? i.getAttribute("custom-icon") : 0
		if (custom == null) custom = ""
		if (typeof style == "undefined") style = this.animationStyle
		// slide animation style doesn't work for IE4. Always use "pop".
		if (!ypXmlTree.isDOM) style = "pop"

		if (m) m.src = bOpen && this.toggleO ? this.toggleO.src : this.toggleC.src
		if (i && r != this.activeNode) {
			if (bOpen) {
				if (custom && i.o) i.src = i.o.src
				else if (!custom && this.folderO) i.src = this.folderO.src
			} else {
				if (custom && i.c) i.src = i.c.src
				else if (!custom && this.folderC) i.src = this.folderC.src
			}
		}
		this[style](c, bOpen)
	}
}
ypXmlTree.prototype.activate = function(id, r, m, i, n, c, style) 
{
	var bFolder	= r.className == "ypxt-r-fo"
	var bFile	= r.className == "ypxt-r-fi"
	var sNew, old

	if (!(this.selectionStyle == 3 && bFolder)) {
		if (this.activeNode) {
			old = this.getNodeMembers(this.activeNode)
			ypSwap(old.icon)
			old.name.className = ""
		}

		n.className = "ypxt-active"
		sNew = i.a ? i.a.src : bFolder && this.folderA ? this.folderA.src : bFile && this.fileA ? this.fileA.src : 0
		if (sNew) ypSwap(i, sNew)

		if (bFolder && this.selectionStyle == 2 && !this.openFolders[id]) {
			this.toggle(id, r, m, i, c, true, style ? style : this.animationStyle)
			this.openFolders[id] = true
		}

		this.activeNode = r
	}
}
ypXmlTree.prototype.setTargetWindow = function() {
	var win = window
	var t = this.root.getAttribute("target-frame")
	if (t && t != null) {
		t = t.toLowerCase()
		if (t == "_top") win = top
		else if (t == "_parent") win = win.parent
		else if (t == "_blank") win = win.open("", "", "")
		else if (win.frames[t]) win = win.frames[t]
	}
	this.targetWindow = win
}

ypXmlTree.prototype.pop = function(div, bOpen) 
{
	div.style.display = bOpen ? "block" : "none"
	if (ypXmlTree.isMAC && ypXmlTree.isIE) {
		window.resizeBy(0,1)
		window.resizeBy(0,-1)
	}
}
ypXmlTree.prototype.getNodeMembers = function(row) {
	var id = row.getAttribute("fId")
	var obj = {marker:0,icon:0,name:0,clip:0}
	
	var cells = row.cells, c, d
	for (var i = 0; (c = cells[i]); i++) {
		if (c.className == "ypxt-b" || c.className == "ypxt-t") obj.marker = ypFirstChild(c)
		else if (c.className == "ypxt-i") obj.icon = ypFirstChild(c)
		else if (c.className == "ypxt-n") obj.name = ypFirstChild(c)
	}
	for (var i = 0; (d = this.divs[i]); i++) {
		if (d.getAttribute("fId") == id) {
			obj.clip = d
			break
		}
	}
	return obj
}
ypXmlTree.prototype.getRow = function(id) {
	var row
	if (id && id != "" && id != null) {
		for (var i = 0; (row = this.rows[i]); i++)
			if (row.getAttribute("fId") == id) return row
	}
	return 0
}
function ypGetElementById(s) {
	var o = (document.getElementById ? document.getElementById(s) : document.all[s])
	return o == null ? false : o
}
function ypGetParentNode(objChild) {
	return (objChild.parentNode ? objChild.parentNode : objChild.parentElement)
}
function ypFirstChild(a) {
	return a.firstChild ? a.firstChild : a.children[0]
}
function ypGetDescendantsByTagName(a, s) {
	return (a.getElementsByTagName ? a.getElementsByTagName(s) : a.all.tags(s))
}
function ypImage(s) {
	if (s && s != null && s != "") {
		var oImg  = new Image()
		oImg.loadError = false
		oImg.onerror = function() { this.loadError = true }
		oImg.src = s
		return oImg
	}
	return 0
}

function ypSwap(img, s) {
	if (img) {
		if (s) { img.swap = ypImage(img.src); img.src = s; }
		else if (img.swap) img.src = img.swap.src
	}
}
function ypURL(linkObj) {
	if (linkObj.href.indexOf("http:") == 0) {
		var s, a
		s = linkObj.pathname
		if (s.indexOf("/") == 0) s = s.substring(1, s.length)
		a = s.split("/")
		for (var i = 0; i < a.length; i++) a[i] = a[i].toLowerCase()
		this.file = a[a.length-1].toLowerCase()
		a.length--
		this.folders = a
		this.query = linkObj.search.toLowerCase()
		this.hash = linkObj.hash.toLowerCase()
	} else {
		this.folders = []
		this.file = linkObj.href.toLowerCase()
		this.query = ""
		this.hash = ""
	}
}