//Drop Down/ Overlapping Content: http://www.dynamicdrive.com
//Last updated: Dec 19th, 07': Added ability to dynamically populate a Drop Down content using an external file (Ajax feature)

function mapNode(anchorid, index, pos, glidetime) {
	this.delaybeforehide = 250; //set delay in milliseconds before content box disappears onMouseout (1000=1 sec)
	this.disableanchorlink=true;
	this.ajaxloadingmsg="Loading"; 
	this.ajaxbustcache=true;
	
	this.anchorobj=document.getElementById(anchorid)
	this.subobj=document.getElementById(this.anchorobj.getAttribute("rel"))
	this.subobjsource=this.anchorobj.getAttribute("rev")
	this.container = document.getElementById("map_image");
	
	this.initialClass = this.anchorobj.className;
	
		if (this.subobjsource!=null && this.subobjsource!="")
			ajaxconnect(this.subobjsource, this.anchorobj.getAttribute("rel"))

		this.subobj.dropposition=pos.split("-")
		this.subobj.glidetime=glidetime || 1000
		this.subobj.style.left=this.subobj.style.top=0
		
		this.curObj = this;
				
		this.anchorobj.objBinder = this;
		this.subobj.objBinder = this;
		
		this.anchorobj.onmouseover=function(e){
			this.objBinder.show(this, this.objBinder.subobj, e)
				
			}
		this.anchorobj.onmouseout=function(e){
			this.objBinder.hide(this.objBinder.subobj, this.objBinder.anchorobj, this.objBinder.subobj, e)
			
			}
		//if (this.disableanchorlink) anchorobj.onclick=function(){return false}
		this.subobj.onmouseout=function(e){
			this.objBinder.hide(this, this.objBinder.anchorobj, this.objBinder.subobj, e)
			
			}
			
	this.subobj.style.visibility="hidden"; //fixes ie7 initial load issue;
	
	this.buildMarker(this.container, this.anchorobj, this.subobj, index);
				
}
function loadpage(page_request, divId){
	with (this);
	if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1)){
			document.getElementById(divId).innerHTML=page_request.responseText
	}
}

function buildMarker(container, anchorobj, subobj, index){
	/*Move onto page due to varying marker images*/
	/*
	try {
		objmarker1 = new OpacityObject("marker" + index, relWebUrl + "fragments/csf_imap/_images/marker");
		objmarker1.setBackground();
		}
	catch (err) {}
	*/
	
	try {
		objpointertop1 = new OpacityObject("pointertop" + index, relWebUrl + "fragments/csf_imap/_images/pointer");
		objpointertop1.setBackground();
		}
	catch (err) {}	
	
	try {
		objpointerbot1 = new OpacityObject("pointerbot" + index, relWebUrl + "fragments/csf_imap/_images/pointerback");
		objpointerbot1.setBackground();
		}
	catch (err) {}	
	
	var pointer = document.getElementById("pointer" + index);
	
	if(pointer != null){
		var containerLeft = this.getposOffset(container, "offsetLeft");
		var popLeft = this.getposOffset(anchorobj, "offsetLeft") + this.collisionOffset(subobj,anchorobj);
		var pointerLeftPos = this.getposOffset(anchorobj, "offsetLeft") - containerLeft;
		var offSet = popLeft-containerLeft;
		//alert(containerLeft+":"+popLeft+":"+pointerLeftPos+":"+offSet);
		pointer.style.left=pointerLeftPos - offSet - 3 + "px";
	}
}

function ajaxconnect(pageurl, divId){
	with (this);
	var page_request = false
	var bustcacheparameter=""
	if (window.XMLHttpRequest) // if Mozilla, IE7, Safari etc
		page_request = new XMLHttpRequest()
	else if (window.ActiveXObject){ // if IE6 or below
		try {
		page_request = new ActiveXObject("Msxml2.XMLHTTP")
		} 
		catch (e){
			try{
			page_request = new ActiveXObject("Microsoft.XMLHTTP")
			}
			catch (e){}
		}
	}
	else
		return false
	document.getElementById(divId).innerHTML=this.ajaxloadingmsg //Display "fetching page message"
	page_request.onreadystatechange=function(){loadpage(page_request, divId)}
	if (this.ajaxbustcache) //if bust caching of external page
		bustcacheparameter=(pageurl.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime()
	page_request.open('GET', pageurl+bustcacheparameter, true)
	page_request.send(null)
}

function hide( activeobj, anchorobj, subobj, e){
	with (this);
	if (!isContained(activeobj, e) && !isContained(anchorobj, e)){
		window["hidetimer_"+subobj.id]=setTimeout(function(){
			subobj.style.visibility="hidden"
			subobj.style.left=subobj.style.top=0
			/*anchorobj.className=this.initialClass*/
			clearTimeout(window["glidetimer_"+subobj.id])
		}, this.delaybeforehide)
	}
}
function slideengine(obj, direction){
	with (this);
	var elapsed=new Date().getTime()-obj.startTime //get time animation has run
	if (elapsed<obj.glidetime){ //if time run is less than specified length
		var distancepercent=(direction=="down")? this.curveincrement(elapsed/obj.glidetime) : 1-this.curveincrement(elapsed/obj.glidetime)
		var currentclip=(distancepercent*obj.contentheight)+"px"
		obj.style.clip=(direction=="down")? "rect(0 auto "+currentclip+" 0)" : "rect("+currentclip+" auto auto 0)"
		window["glidetimer_"+obj.id]=setTimeout(function(){slideengine(obj, direction)}, 10)
	}
	else{ //if animation finished
		obj.style.clip="rect(0 auto auto 0)"
	}
}
function curveincrement(percent){
	with (this);
	return (1-Math.cos(percent*Math.PI)) / 2 //return cos curve based value from a percentage input
}
function show(anchorobj, subobj, e){
	with (this);	
	if (!this.isContained(anchorobj, e) && subobj.style.visibility!="visible"){

		//var horizontaloffset=(subobj.dropposition[0]=="left")? -this.collisionOffset(subobj,anchorobj) : this.collisionOffset(subobj,anchorobj) //calculate user added horizontal offset
		var horizontaloffset = this.collisionOffset(subobj,anchorobj);
		var verticaloffset=(subobj.dropposition[1]=="top")? -subobj.offsetHeight : anchorobj.offsetHeight //calculate user added vertical offset
				
		subobj.style.left=anchorobj.offsetLeft + horizontaloffset + "px"
		subobj.style.top=anchorobj.offsetTop + verticaloffset + 12 +"px"
		
		subobj.style.clip=(subobj.dropposition[1]=="top")? "rect(auto auto auto 0)" : "rect(0 auto 0 0)" //hide drop down box initially via clipping
		subobj.style.visibility="visible"
		subobj.startTime=new Date().getTime()
		subobj.contentheight=parseInt(subobj.offsetHeight)
		if (typeof window["hidetimer_"+subobj.id]!="undefined") //clear timer that hides drop down box?
			clearTimeout(window["hidetimer_"+subobj.id])
		this.slideengine(subobj, (subobj.dropposition[1]=="top")? "up" : "down")
		/*anchorobj.className="on"*/
	}


}

function collisionOffset(subobj,anchorobj)
{
	with (this);

	//var parent = anchorobj.parentNode; //image object
	var centerOffset = (subobj.offsetWidth/2);
	
	var parent = document.getElementById("map_image");
	
	//alert(subobj.offsetWidth+"\n"+anchorobj.offsetLeft+"\n"+parent.offsetWidth+"\n"+parent.offsetLeft);
	
	var subobjWidth = subobj.offsetWidth;
		
	if (parent != null && (anchorobj.offsetLeft + centerOffset) > (parent.offsetLeft+parent.offsetWidth))
	{
		return -( (anchorobj.offsetLeft + subobjWidth) - (parent.offsetLeft+parent.offsetWidth) );
	}
	else if (parent != null && (anchorobj.offsetLeft - centerOffset) < (parent.offsetLeft))
	{
		return -(anchorobj.offsetLeft - parent.offsetLeft);
	}
	else
	{
		return -centerOffset;
	}

}

function isContained(m, e){
	with (this);
	var e=window.event || e
	var c=e.relatedTarget || ((e.type=="mouseover")? e.fromElement : e.toElement)
	while (c && c!=m)try {c=c.parentNode} catch(e){c=m}
	if (c==m)
		return true
	else
		return false
}
function getposOffset(what, offsettype){
	with (this);
	return (what.offsetParent)? what[offsettype]+this.getposOffset(what.offsetParent, offsettype) : what[offsettype]
}

mapNode.prototype.loadpage=loadpage;
mapNode.prototype.ajaxconnect=ajaxconnect;
mapNode.prototype.hide=hide;
mapNode.prototype.slideengine=slideengine;
mapNode.prototype.curveincrement=curveincrement;
mapNode.prototype.show=show;
mapNode.prototype.isContained=isContained;
mapNode.prototype.collisionOffset=collisionOffset;
mapNode.prototype.getposOffset=getposOffset;
mapNode.prototype.buildMarker=buildMarker;

/*Determines relative paths on content server and SSPU*/
function getRelUrl()
{
	var path = window.location.pathname;
	path = path.substring(1,path.length);
	path = path.substring(0,path.indexOf("/"));

	var relWebUrl = "";

	if(ssUrlPrefix == "/" + path + "/")
	{
		relWebUrl = g_HttpRelativeWebRoot;
	}
	else
	{
		relWebUrl = ssUrlPrefix + g_HttpRelativeWebRoot.substring(1, g_HttpRelativeWebRoot.length);
	}

	return relWebUrl;
}

/*Setss relative paths on content server and SSPU*/
var relWebUrl = getRelUrl();







	



	

	

