/*
Parameters:

pContainerID : MUST - the id of the containing div
pDirection : OPTIONAL - "down" or "up". "down" is default
pEdge : OPTIONAL - "left" or "right". "left is default
pStartY : OPTIONAL - integer to specify the vertical offset. 10 is default
pStartX : OPTIONAL - integer to specify the horizontal offset. 3 is default
*/
function wm_floatContainer(pContainerID, pDirection, pEdge, pStartY, pStartX)
{
	var direction = (pDirection == null) ? "down" : (pDirection == "up") ? "up" : "down";
	var edge = (pEdge == null) ? "left" : (pEdge == "right") ? "right" : "left";
	var startY = (pStartY == null) ? 10 : pStartY;
	var startX = (pStartX == null) ? 3 : pStartX;

	function initializeContainer(pContainerID)
	{
		var elm = document.getElementById(pContainerID);
		elm.style.zIndex = 100000;
		elm.direction = direction;
		elm.edge = edge;
		elm.startX = startX;
		elm.startY = startY;
		
		elm.setCoordinates = function(x, y){
			this.style.left = x + "px";
			this.style.top = y + "px";
		};
		if (edge == "left"){
			elm.coordinateX = startX;
		}
		else{
			elm.coordinateX = wm_floatContainer_support.scroll().X + wm_floatContainer_support.getViewPortWidth() - startX - elm.offsetWidth;
		}
		if (direction == "down")
			elm.coordinateY = startY;
		else{
			elm.coordinateY = wm_floatContainer_support.scroll().Y + wm_floatContainer_support.getViewPortHeight() - startY - elm.offsetHeight;
		}
		return elm;
	}
	
	window.wm_floatContainer_heartbeat = function(){
		for (var i = 0; i < wm_floatContainers.length; i++){
			var container = wm_floatContainers[i];
			if (container.direction == "down"){
				var scrollTop = wm_floatContainer_support.scroll().Y;
				container.coordinateY += (scrollTop + container.startY - container.coordinateY)/8;
				if (container.edge == "right"){
					container.coordinateX = wm_floatContainer_support.scroll().X + wm_floatContainer_support.getViewPortWidth() - container.startX - container.offsetWidth;
				}
			}
			else{
				var pY = wm_floatContainer_support.scroll().Y + wm_floatContainer_support.getViewPortHeight() - container.offsetHeight;
				container.coordinateY += (pY - container.startY - container.coordinateY)/8;
				if (container.edge == "right"){
					container.coordinateX = wm_floatContainer_support.scroll().X + wm_floatContainer_support.getViewPortWidth() - container.startX - container.offsetWidth;
				}
			}
			container.setCoordinates(container.coordinateX, container.coordinateY);
		}
		
		setTimeout("wm_floatContainer_heartbeat()", 10);
	}
	
	if (window.wm_floatContainers == null){
		window.wm_floatContainers = [];
	}
	

	thisContainer = initializeContainer(pContainerID);
	wm_floatContainers.push(thisContainer);
	if (wm_floatContainers.length == 1){//only start the heartbeat then receiving the first container (the heartbeat works on all existing containers)
		wm_floatContainer_heartbeat();
	}
}



var wm_floatContainer_support = new function(){
	this.scroll = function(pElm){
		var scrollLeft = 0;
		var scrollTop = 0;
		
		if (pElm){
			scrollLeft = (pElm.scrollLeft) ? pElm.scrollLeft : 0;
			scrollTop = (pElm.scrollTop) ? pElm.scrollTop : 0;
		}
		else if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft)){
			scrollLeft = document.documentElement.scrollLeft;
			scrollTop = document.documentElement.scrollTop;
		}
		else if (document.body){
			scrollLeft = document.body.scrollLeft;
			scrollTop = document.body.scrollTop;
		}
		else if (window.pageXOffset){
			scrollLeft = window.pageXOffset;
			scrollTop = window.pageYOffset;
		}
		else{
			//old browsers and minor browsers
		}
		
		return {"X":scrollLeft,"Y":scrollTop};
	}
	
	this.coordinates = function(pElm){
		var elm = pElm;
		var pageOffsetX = viewportOffsetX = parentX = elm.offsetLeft;
		var pageOffsetY = viewportOffsetY = parentY = elm.offsetTop;
		while (elm = elm.offsetParent){
			pageOffsetX += elm.offsetLeft;
			pageOffsetY += elm.offsetTop;
			viewportOffsetX += elm.offsetLeft - this.scroll(elm.offsetParent).X;//it is ok to send null or undefined to wm_scroll
			viewportOffsetY += elm.offsetTop - this.scroll(elm.offsetParent).Y;
		}

		var coordinates = {}
		coordinates.viewport = {"X":viewportOffsetX,"Y":viewportOffsetY};
		coordinates.document = {"X":pageOffsetX,"Y":pageOffsetY};

		return coordinates;
	}
	
	this.getViewPortHeight = function(){
		var x,y;
		if (self.innerHeight) // all except Explorer
		{
			x = self.innerWidth;
			y = self.innerHeight;
		}
		else if (document.documentElement && document.documentElement.clientHeight)
			// Explorer 6 Strict Mode
		{
			x = document.documentElement.clientWidth;
			y = document.documentElement.clientHeight;
		}
		else if (document.body) // other Explorers
		{
			x = document.body.clientWidth;
			y = document.body.clientHeight;
		}
		return y;	
	}
	
	this.getViewPortWidth = function(){
		var x,y;
		if (document.documentElement && document.documentElement.clientHeight)
			// Explorer 6 Strict Mode & FF
		{
			x = document.documentElement.clientWidth;
			y = document.documentElement.clientHeight;
		}
		else if (self.innerHeight) // all except Explorer
		{
			//FF will return the width & height inclusive any scrollbars, which is quite unlucky since we are almost always interested in the available space
			x = self.innerWidth;
			y = self.innerHeight;
		}
		else if (document.body) // other Explorers
		{
			x = document.body.clientWidth;
			y = document.body.clientHeight;
		}
		return x;	
	}
}