slideOutMenu.Registry = []
slideOutMenu.aniLen = 0
slideOutMenu.hideDelay = 0
slideOutMenu.minCPUResolution = 0
slideOutMenu.css = ""

function getLength(id)
{
	return slideOutMenu.Registry[id].visibility
}

// constructor
function slideOutMenu(id, dir, left, top, width, height, element)
{
	this.ie  = document.all ? 1 : 0
	this.ns4 = document.layers ? 1 : 0
	this.dom = document.getElementById ? 1 : 0

	if( this.ie || this.ns4 || this.dom )
	{
		this.id			 = id
		this.dir		 = dir
		this.orientation = dir == "left" || dir == "right" ? "h" : "v"
		this.dirType	 = dir == "right" || dir == "down" ? "-" : "+"
		this.dim		 = this.orientation == "h" ? width : height
		this.hideTimer	 = false
		this.aniTimer	 = false
		this.open		 = false
		this.over		 = false
		this.startTime	 = 0
		this.element	 = element
		this.left		 = left
		this.top		 = top

		// global reference to this object
		this.gRef = "slideOutMenu_" + id
		eval( this.gRef + "=this" )

		// add this menu object to an internal list of all menus

		slideOutMenu.Registry[id] = this

		var d = document
		slideOutMenu.css += '#' + this.id + 'Container { visibility:hidden; '
		slideOutMenu.css += 'left:' + left + 'px; '
		slideOutMenu.css += 'top:' + top + 'px; '
		slideOutMenu.css += 'overflow:hidden; z-index: 100000}'
		slideOutMenu.css += '#' + this.id + 'Container, #' + this.id + 'Content { position:absolute; '
		slideOutMenu.css += 'width:' + width + 'px; '
		slideOutMenu.css += 'height:' + height + 'px; '
		slideOutMenu.css += 'clip:rect(0 ' + width + ' ' + height + ' 0); '
		slideOutMenu.css += '}'

		this.load()
	}
}

slideOutMenu.prototype.load = function()
{
	var d = document
	var lyrId1 = this.id + "Container"
	var lyrId2 = this.id + "Content"
	var obj1 = this.dom ? d.getElementById(lyrId1) : this.ie ? d.all[lyrId1] : d.layers[lyrId1]
	if (obj1) var obj2 = this.ns4 ? obj1.layers[lyrId2] : this.ie ? d.all[lyrId2] : d.getElementById(lyrId2)
	var temp

	if (!obj1 || !obj2) 
		window.setTimeout(this.gRef + ".load()", 100)
	else 
	{
		this.container	= obj1
		this.menu		= obj2
		this.style		= this.ns4 ? this.menu : this.menu.style
		this.homePos	= eval("0" + this.dirType + this.dim)
		this.outPos		= 0
		this.accelConst	= (this.outPos - this.homePos) / slideOutMenu.aniLen / slideOutMenu.aniLen 

		// set event handlers.
		if (this.ns4) this.menu.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
//		this.menu.onmouseover = new Function("slideOutMenu.showMenu('" + this.id + "')")
//		this.menu.onmouseout = new Function("slideOutMenu.hideMenu('" + this.id + "')")

		//set initial state
		this.endSlide()
	}
}

function getObj(name)
{
	if (document.getElementById)
	{
		this.doc = document.getElementById(name);
		this.style = document.getElementById(name).style;
	}
	else if (document.all)
	{
		this.doc = document.all[name];
		this.style = document.all[name].style;
	}
	else if (document.layers)
	{
		this.doc = document.layers[name];
		this.style = document.layers[name];
	}
}
	
slideOutMenu.showMenu = function(id)
{
	var reg = slideOutMenu.Registry
	var obj = reg[id]
 

	var newLeft = findPosX(document.getElementById(obj.element)) + obj.left
	var newTop = findPosY(document.getElementById(obj.element)) + obj.top
	
	var containerId = id + 'Container'
	var x = new getObj(containerId)
	x.style.left = newLeft+'px'
	x.style.top = newTop+'px'
	

	if (obj.container)
	{
		obj.over = true

		// if this menu is scheduled to close, cancel it.
		if (obj.hideTimer) 
		{ 
			reg[id].hideTimer = window.clearTimeout(reg[id].hideTimer)
		}

		// if this menu is closed, open it.
		if (!obj.open && !obj.aniTimer) 
			reg[id].startSlide(true)
	}
	
}

slideOutMenu.hideMenu = function(id)
{
	// schedules the menu to close after <hideDelay> ms, which
	// gives the user time to cancel the action if they accidentally moused out
	var obj = slideOutMenu.Registry[id]
	if (obj.container) 
	{
		if (obj.hideTimer)
			window.clearTimeout(obj.hideTimer)
		obj.hideTimer = window.setTimeout("slideOutMenu.hide('" + id + "')", slideOutMenu.hideDelay);
	}
}

slideOutMenu.hide = function(id)
{
	var obj = slideOutMenu.Registry[id]
	obj.over = false

	if (obj.hideTimer)
		window.clearTimeout(obj.hideTimer)
	
	// flag that this scheduled event has occured.
	obj.hideTimer = 0

	// if this menu is open, close it.
	if (obj.open && !obj.aniTimer)
		obj.startSlide(false)
}

slideOutMenu.prototype.startSlide = function(open)
{
	this[open ? "onactivate" : "ondeactivate"]()
	this.open = open
	if (open)
		this.setVisibility(true)
	this.startTime = (new Date()).getTime()	
	this.aniTimer = window.setInterval(this.gRef + ".slide()", slideOutMenu.minCPUResolution)
}

slideOutMenu.prototype.slide = function()
{
	var elapsed = (new Date()).getTime() - this.startTime
	if (elapsed > slideOutMenu.aniLen) 
		this.endSlide()
	else 
	{
		var d = Math.round(Math.pow(slideOutMenu.aniLen-elapsed, 2) * this.accelConst)
		if (this.open && this.dirType == "-")		d = -d
		else if (this.open && this.dirType == "+")	d = -d
		else if (!this.open && this.dirType == "-")	d = -this.dim + d
		else										d = this.dim + d

		this.moveTo(d)
	}
}

slideOutMenu.prototype.endSlide = function()
{
	this.aniTimer = window.clearTimeout(this.aniTimer)
	this.moveTo(this.open ? this.outPos : this.homePos)
	if (!this.open) 
		this.setVisibility(false)
	if ((this.open && !this.over) || (!this.open && this.over)) 
	{
		this.startSlide(this.over)
	}
}

slideOutMenu.prototype.setVisibility = function(bShow) 
{ 
	var s = this.ns4 ? this.container : this.container.style
	s.visibility = bShow ? "visible" : "hidden"
}

slideOutMenu.prototype.moveTo = function(p) 
{ 
	this.style[this.orientation == "h" ? "left" : "top"] = this.ns4 ? p : (p) + "px"
}

slideOutMenu.prototype.getPos = function(c) 
{
	return parseInt(this.style[c])
}

// events
slideOutMenu.prototype.onactivate		= function() { }
slideOutMenu.prototype.ondeactivate	= function() { }

function swapImgRestore()
{
	var i, x, a = document.sr;
	for( i = 0; a && i < a.length && ( x = a[i] ) && x.oSrc; i++ )
		x.src=x.oSrc;
}
function preloadImages()
{
	var d = document;
	if( d.images )
	{
		if( !d.p )
			d.p = new Array();
		var i, j = d.p.length, a = preloadImages.arguments;
		for( i = 0 ; i < a.length; i++ )
		{
			if( a[i].indexOf("#") != 0 )
			{
				d.p[j] = new Image;
				d.p[j++].src=a[i];
			}
		}
	}
}
function findObj(n, d)
{ 
	var p, i, x;
	if( !d )
		d = document;
	if( ( p = n.indexOf( "?" ) ) > 0 && parent.frames.length )
	{
		d = parent.frames[n.substring(p+1)].document;
		n = n.substring(0,p);
	}
	if( !( x = d[n] ) && d.all )
		x = d.all[n];
	for( i = 0; !x && i < d.forms.length; i++ )
		x = d.forms[i][n];
	for( i = 0; !x && d.layers && i < d.layers.length; i++ )
		x = findObj( n, d.layers[i].document );
	if( !x && document.getElementById )
		x = document.getElementById(n);
	return x;
}
function swapImage()
{
	var i, j = 0, x, a = swapImage.arguments;
	document.sr = new Array;
	for( i = 0; i < ( a.length - 2 ); i += 3 )
	{
		if( ( x = findObj( a[i] ) ) != null )
		{
			document.sr[j++] = x;
			if( !x.oSrc )
				x.oSrc = x.src;
			x.src = a[i+2];
		}
	}
}
function showHideLayers()
{
	var i, p, v, obj, args = showHideLayers.arguments;
	for( i = 0; i < ( args.length - 2 ); i += 3 )
	{
		if( ( obj = findObj( args[i] ) ) != null)
		{
			v = args[i+2];
			if( obj.style )
			{
				obj = obj.style;
				v = ( v == 'show' ) ? 'visible' : ( v = 'hide' ) ? 'hidden' : v;
			}
			obj.visibility = v;
		}
	}
}

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent) 
	{
		curleft = obj.offsetLeft
		while (obj = obj.offsetParent)
		{
			curleft += obj.offsetLeft
		}
	}
	return curleft;
}
function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		curtop = obj.offsetTop
		while (obj = obj.offsetParent)
		{
			curtop += obj.offsetTop
		}
	}
	return curtop;
}

function writeCSS()
{
	document.write('<style type="text/css">')
	document.write(slideOutMenu.css)
	document.write('</style>')

	//document.write(slideOutMenu.css)
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();