// Begin Library
	var sys = navigator.appName;
	var vers = parseInt(navigator.appVersion);
	var n4 = document.layers
	var ie4Mac = (vers>=4) && (navigator.appVersion.indexOf("Mac")>-1) && (!n4)
	
	
	// Track property changes in Netscape
	
	function testScroll() {
		// For onscroll event
		// Initialize scrollbar cache if necessary
		if (window._pageXOffset==null) {
			window._pageXOffset = window.pageXOffset
			window._pageYOffset = window.pageYOffset
		}
		// Expose Internet Explorer compatible object model
		document.body.unwatch("scrollTop") 
		document.body.unwatch("scrollLeft")
		document.body.scrollTop = window.pageYOffset
		document.body.scrollLeft = window.pageXOffset
		window.document.body.scrollHeight = document.height
		window.document.body.scrollWidth = document.width    
		document.body.watch("scrollTop",CheckScrollTop)
		document.body.watch("scrollLeft",CheckScrollLeft)
	
		document.body.clientWidth = window.innerWidth-20; 
		document.body.clientHeight = window.innerHeight-20;
	
		// If cache!=current values, call the onscroll event
		if (((window.pageXOffset!=window._pageXOffset) || (window.pageYOffset!=window._pageYOffset)) && (window.onscroll)) 
			window.onscroll()
		// Cache new values
		window._pageXOffset = window.pageXOffset
		window._pageYOffset = window.pageYOffset
	}
	
	function CheckScrollTop(prop,temp,newValue) {
		//window.pageYOffset = newValue
		return newValue	
	}
	function CheckScrollLeft(prop,temp,newValue) {
		//window.pageXOffset= newValue
		return newValue	
	}
	
	function CheckTopChange(prop,temp,newValue) {
		this.NSLayer.owningElement.offsetTop = this.NSLayer.top = newValue
		return newValue	
	}
	
	function CheckLeftChange(prop,temp,newValue) {
		this.NSLayer.owningElement.offsetLeft= this.NSLayer.left = newValue
		return newValue
	}
	
	function CheckWidthChange(prop,temp,newValue) {
		this.NSLayer.owningElement.offsetWidth = this.NSLayer.clip.width = newValue
		return newValue
	}
	
	function CheckHeightChange(prop,temp,newValue) {
		this.NSLayer.owningElement.offsetHeight = this.NSLayer.clip.height = newValue
		return newValue
	}
	
	function CheckColorChange(prop,temp,newValue) {
		this.NSLayer.bgColor = newValue
		return newValue
	}
	
	function CheckClipChange(prop,temp,newValue) {
		var sText = newValue.substring(5) 
		sText = sText.substring(0,sText.length-1)
		var aVal = sText.split(" ")
		this.NSLayer.clip.top = aVal[0]
		this.NSLayer.clip.width = aVal[1]
		this.NSLayer.clip.height = aVal[2]
		this.NSLayer.clip.left = aVal[3]
		return newValue
	}
	
	function CheckZIndexChange(prop,temp,newValue) {
		this.NSLayer.zIndex = newValue
		return newValue
	}
	
	function CheckContentChange(prop,temp,newValue) {
		this.NSLayer.document.open()
		this.NSLayer.document.write(newValue)
		this.NSLayer.document.close()
		this.NSLayer.document.owningElement = this.NSLayer.owningElement = this
		_extract(this.NSLayer, true)
		
		return newValue
	}
	
	function CheckVisibilityChange(prop,temp,newValue) {
		if (newValue=="hidden")
			this.NSLayer.visibility = "hide";
		else if (newValue=="visible")
			this.NSLayer.visibility = "show";
		else if (newValue=="inherit")
			this.NSLayer.visibility = "inherit";
		else
			this.NSLayer.visibility = "";
		return newValue
	}
	
	/* BEGIN CORE CODE TO BUILD OBJECT MODEL */
	function CheckContains(el) {
		return (el==this)
	}
	
	
	function _getInputTagName(type) {
		var sName
		if (type=="textarea")
			sName = "TEXTAREA"
		else if (type=="select-one")
			sName = "SELECT"
		else if (type=="select-multiple")
			sName = "SELECT"
		else
			sName = "INPUT"
		return sName
	}
	
	function _appendAll(obj, el, sName) {
		obj.all[sName] = el
		while (obj.offsetParent) {
			obj = obj.offsetParent
			obj.all[sName] = el
		}
	}
	
	function _extractRoot(obj, par) {
		for (var intLoop = 0; intLoop< obj.images.length; intLoop++) {
			var i = obj.images[intLoop]
			i.offsetParent = par
			i.offsetLeft = i.x
			i.offsetTop = i.y
			i.offsetWidth = i.width
			i.offsetHeight = i.height
			i.tagName = "IMG"
			i.contains = CheckContains
			if (""!=i.name) {
				window.document.all[i.name] = i
	// window.document.images[i.name] = 
				if (obj.owningElement) _appendAll(obj.owningElement, i, i.name)
			}
		}
	
		for (var intLoop = 0; intLoop< obj.anchors.length; intLoop++) {
			var i = obj.anchors[intLoop]
			i.contains = CheckContains
			i.offsetWidth=i.offsetHeight=0
			if (""!=i.name) {
				window.document.all[i.name] = i
				if (obj.owningElement) _appendAll(obj.owningElement, i, i.name)
			}
	//			window.document.anchors[obj.anchors[intLoop].name] = obj.anchors[intLoop]
			obj.anchors[intLoop].offsetParent = par
		}
	
	
		for (var intLoop = 0; intLoop< obj.links.length; intLoop++) {
			var i=obj.links[intLoop]
			i.offsetWidth=0;i.offsetHeight=20
			i.contains = CheckContains
			i.innerText = obj.links[intLoop].text
			i.offsetParent = par
			i.offsetLeft = obj.links[intLoop].x
			i.offsetTop = obj.links[intLoop].y
		}
	
		for (var intLoop = 0; intLoop< obj.forms.length; intLoop++) {
			obj.forms[intLoop].offsetParent = par
			var sName = obj.forms[intLoop].name
			obj.forms[intLoop].tagName = "FORM"
			if (""!=sName) {
				window.document.all[sName] = obj.forms[intLoop]
				if (obj.owningElement) _appendAll(obj.owningElement, obj.forms[intLoop], sName)
			}
			for (var intElements = 0; intElements < obj.forms[intLoop].length; intElements++) {
				var i = obj.forms[intLoop][intElements]
				var sName = i.name
				i.offsetParent = par
				i.tagName = _getInputTagName(i.type)
				if (""!=sName) {
					window.document.all[sName] = i
					if (obj.owningElement) _appendAll(obj.owningElement, i, sName)
	//					obj.owningElement.all[sName] = window.document.all[sName]
				}
			}
		}
		if (obj.owningElement) {
			var sName = obj.owningElement.id
			window.document.all[sName] = obj.owningElement
			_appendAll(obj.owningElement.offsetParent, obj.owningElement, sName)
		}
	}
	
	function _extract(obj, bRefresh) {
		/* This creates the all collection when run in Netscape and
		   promotes the nested name spaces in Netscape to the top-level collection.
		   The length property is not updated for the built-in collections */
		// This function is called recursively for nested layers 
	
	// Add walk up tree to add to collections code... ugh
		obj.document.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP | Event.MOUSEMOVE | Event.KEYDOWN | Event.KEYPRESS | Event.KEYUP)
		obj.document.onmousedown = _NSLayerBubbling;          
		obj.document.onmouseup = _NSLayerBubbling;
		obj.document.onmousemove = _NSLayerBubbling;
		obj.document.onkeydown = _NSLayerBubbling;
		obj.document.onkeypress = _NSLayerBubbling;
		obj.document.onkeyup = _NSLayerBubbling;
	
		obj.document._type = "document" // internal variable to track state
		// Hookup event handlers to establish event bubbling. 
		if (bRefresh==null) {
			if (""!=obj.id) 
				document.all[obj.id] =  new Object
			var newEl = document.all[obj.id]
			newEl.all = new Object
			obj.document.owningElement= obj.owningElement = newEl
	
			newEl.id = obj.id
			newEl.style = new Object
			newEl.NSLayer = newEl.style.NSLayer = obj
			newEl.offsetTop = parseInt(obj.top)
			newEl.offsetLeft = parseInt(obj.left) 
			obj._type = "layer" // internal variable
			if (obj.parentLayer.owningElement!=null)
				newEl.offsetParent = obj.parentLayer.owningElement
			else
				newEl.offsetParent = document.body
			newEl.style.pixelTop = parseInt(obj.top)
			newEl.style.pixelLeft = parseInt(obj.left)
			if (null!=obj.clip) {
				newEl.style.pixelWidth = obj.clip.width   // estimation
				newEl.style.pixelHeight = obj.clip.height
			}
			newEl.style.clip = "rect(" + obj.clip.top + " " + obj.clip.width + " " + obj.clip.height + " " + obj.clip.left + ")"
			newEl.offsetWidth = newEl.style.pixelWidth  // estimation
			newEl.offsetHeight = newEl.style.pixelHeight
			newEl.contains = CheckContains;
			if (obj.visibility=="hide")
				newEl.style.visibility = "hidden";
			else if (obj.visibility=="show")
				newEl.style.visibility = "visible";
			else if (obj.visibility=="inherit")
				newEl.style.visibility = "inherit";
			else
				newEl.style.visibility = "";
			newEl.style.zIndex = obj.zIndex
			newEl.style.backgroundColor = obj.bgColor;
			newEl.style.backgroundImage = "url("+obj.background+")";
		
			newEl.innerHTML = ""
		        
			newEl.style.watch("visibility",CheckVisibilityChange)
			newEl.style.watch("pixelTop",CheckTopChange)
			newEl.style.watch("pixelLeft",CheckLeftChange)
			newEl.style.watch("pixelWidth",CheckWidthChange)
			newEl.style.watch("pixelHeight",CheckHeightChange)
			newEl.style.watch("backgroundColor",CheckColorChange)
			newEl.style.watch("zIndex",CheckZIndexChange)
			newEl.style.watch("clip",CheckClipChange)
			newEl.watch("innerHTML",CheckContentChange)
		}
		_extractRoot(obj.document,newEl)	
				
		for (var intLayer = 0; intLayer< obj.document.layers.length; intLayer++) 
			_extract(obj.document.layers[intLayer])  // Nested layers, go get them.
		
	}
	
	
	function _NSLayerBubbling(ev) {
		// Bubble through any positioned elements.
		this.routeEvent(ev);
		// Fire on positioned element
		if (!window.event.cancelBubble)
			if (null!=this.owningElement["on"+ev.type]) this.owningElement["on"+ev.type]()
	}
	
	function _NSBubbling(ev) {
		// This simulates very simple event bubbling in Netscape
		// Create the event object on the window.
		window.event = ev;
		// Initialize properties on the event object
		window.event.cancelBubble = false;
		window.event.button = ev.which 
		window.event.keyCode = ev.which
		window.event.type = ev.type
		if ((ev.type=="focus") || (ev.type=="blur")) return false
		// Get the "synthesized" element if it fired the event.
		var el = null;
		if ("document"==ev.target._type) 
			el = ev.target.owningElement.id
		else
			el = ev.target.id
		if ((el!=null) && (el!="")) {
			el = document.all[el]
			window.event.srcElement = el
		} else {
			if (ev.target!=null) {
				window.event.srcElement=ev.target
			}
			else
				ev.target=null
		}
		window.event.returnValue = true
		window.event.clientX = ev.pageX - window.pageXOffset
		window.event.clientY = ev.pageY - window.pageYOffset
		window.event.offsetX = ev.layerX
		window.event.offsetY = ev.layerY
		window.event.screenX = ev.screenX
		window.event.screenY = ev.screenY
		window.event.altKey = (ev.modifiers & Event.ALT_MASK) ? true : false
		window.event.ctrlKey = (ev.modifiers & Event.CONTROL_MASK) ? true : false
		window.event.shiftKey = (ev.modifiers & Event.SHIFT_MASK) ? true : false
		window.event.NSEvent = ev;
		if ((ev.target._type=="layer") && ((ev.type=="mouseover") || (ev.type=="mouseout")))  {
			// Special handling to bubble over and out events on layers
			var elLoop = ev.target.document.owningElement
			while (elLoop!=null) {
				if (!window.event.cancelBubble)
					if (elLoop["on"+ev.type]!=null) elLoop["on"+ev.type]()
						elLoop = elLoop.offsetParent;
			}
		}
		// Send this event onward...
		// Make sure to wire event return values 
		var bCancel = window.routeEvent(ev);
		if (typeof bCancel=="boolean") 
			window.event.returnValue = bCancel
		else
			bCancel = window.event.returnValue
		
		// Bubble but do not fire document events twice
		if ((ev.target!=window.document) && (!window.event.cancelBubble))
			if (typeof document["on"+ev.type]=="function") bCancel = document["on"+ev.type]()
		if (typeof bCancel=="boolean")
			window.event.returnValue = bCancel
		return (window.event.returnValue)
	}
	
	function _setupBubbling() {
		// Setup event bubbling from the source ot the document.
		window.captureEvents(Event.CLICK | Event.MOUSEMOVE | Event.CLICK | Event.DBLCLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.MOUSEOUT | Event.MOUSEOVER | Event.KEYDOWN | Event.KEYUP | Event.KEYPRESS | Event.FOCUS | Event.BLUR)
		window.onclick = _NSBubbling;
		window.ondblclick = _NSBubbling;
		window.onmousemove = _NSBubbling;
		window.onmouseover = _NSBubbling;
		window.onmouseout = _NSBubbling;
		window.onmousedown = _NSBubbling; 
		window.onmouseup = _NSBubbling;
		window.onkeydown = _NSBubbling;
		window.onkeypress = _NSBubbling;
		window.onkeyup = _NSBubbling;
		window.onfocus = _NSBubbling;
		window.onblur = _NSBubbling;
	}
	function MacScroll() {
		// Add IE Mac onscroll Support
		if ((document.body.oldScrollTop!=document.body.scrollTop) || (document.body.oldScrollLeft!=document.body.scrollLeft))
			if (window.onscroll)
				window.onscroll()
		document.body.oldScrollTop = document.body.scrollTop
		document.body.oldScrollLeft = document.body.scrollLeft
	}
	
	/* The setup() function - This must be called in the onload event of the document */
	function setup() {  
		if (4>vers) return;  // Can't help old browsers
		if (ie4Mac)
			setInterval("MacScroll()",50)
		if ("Netscape"==sys) {
			document.all = null;
			document.all = new Array;
			document.body = new Object;
			document.body.clientWidth = window.innerWidth-20; document.body.clientHeight = window.innerHeight-20
			document.body.scrollTop = window.pageXOffset; document.body.scrollLeft = window.pageYOffset
			document.body.watch("scrollTop",CheckScrollTop)
			document.body.watch("scrollLeft",CheckScrollLeft)
			document.body.offsetParent = null
			document.body.offsetLeft = document.body.offsetTop = 0
			document.body.all = new Object
			document.parentWindow = window
			_extractRoot(document,document.body)
	
			for (var intLayer = 0; intLayer< document.layers.length; intLayer++) {
				_extract(document.layers[intLayer])  // Nested layers, go get them.
			}
			
			_setupBubbling();
			testScroll()
			setInterval("testScroll()",50)
			document.readyState = "complete"
		}               
		return 
	}
	window.onload = setup; // Initialize when loaded
	if ("Netscape"==sys)
		document.readyState = "loading"
