
// Scroller Object 
var emwScrollerObj = function(id,containerId,initialTop,initialHeight,containerTop,frameHeight,scrollerSpeed,currentSpeed,scrollerDirection)
{
	//Split the Args and associate
	this.id = id;
	this.containerId = containerId;
	this.initialTop = initialTop;
	this.initialHeight = initialHeight;
	this.containerTop = containerTop;
	this.frameHeight = frameHeight;
	this.scrollerSpeed = scrollerSpeed;
	this.currentSpeed = currentSpeed;
	this.scrollerDirection = scrollerDirection;
}

//ScrollerManager
var emwScrollerManager = {
	
	SCROLLER_SPEED : 1,
	
	SCROLLER_TIMER_INTERVAL : 20,
	
	SCROLLER_FRAME_HEIGHT: 100,
	
	SCROLLER_ARRAY : new Array(),
	
	SCROLLER_DIRECTION_UP : "up",
	
	SCROLLER_DIRECTION_DOWN : "down",
	
	SCROLLER_DIRECTION_LEFT : "left",
	
	SCROLLER_DIRECTION_RIGHT : "right",

	addEvent : function(elm, evType, fn, useCapture)
	{
	  if (elm.addEventListener) { 
	    elm.addEventListener(evType, fn, useCapture); 
	    return true; 
	  } else if (elm.attachEvent) { 
	    var r = elm.attachEvent('on' + evType, fn); 
	    return r; 
	  } else {
	    elm['on' + evType] = fn;
	  }
	},
	
	// climb up the tree to the supplied tag.
	ascendDOM : function(e, target)
	{
	  while (e.nodeName.toLowerCase() != target.toLowerCase() && e.nodeName.toLowerCase() != 'html')
	    e = e.parentNode;
	  
	  return (e.nodeName.toLowerCase() == 'html') ? null : e;
	},
	
	makeScrollable : function(el)
	{
		//Get the Scroller Dimensions
		var posEl = ObjectPosition.get(el);
		
		var scrollerHeight = parseInt(posEl.height);
		var scrollerWidth = parseInt(posEl.width);
		var scrollerContent = el.innerHTML;
		
		//Set the Height and Speed
		//Set Speed and Height
		var scrollerSpeed = emwScrollerManager.SCROLLER_SPEED;
		if(el.getAttribute('scrollerspeed') != null)
		{
			 emwScrollerManager.SCROLLER_SPEED = el.getAttribute('scrollerspeed');
		}
			
		var scrollerFrameHeight = emwScrollerManager.SCROLLER_FRAME_HEIGHT;
		if(el.getAttribute('scrollerheight') != null)
		{
			 emwScrollerManager.SCROLLER_FRAME_HEIGHT = el.getAttribute('scrollerheight');
		}
		
		el.style.height = emwScrollerManager.SCROLLER_FRAME_HEIGHT + "px";
		el.style.width = scrollerWidth + "px";		
	},
	
	doScroll : function()
	{
		for (var i = 0; i < emwScrollerManager.SCROLLER_ARRAY.length; i++)
		{
			var scrollerObj = emwScrollerManager.SCROLLER_ARRAY[i];
			var el = document.getElementById(scrollerObj.id);
			
			//Get the Scroller Dimensions
			var posEl = ObjectPosition.get(el);
					
			var scrollerTop = parseInt(posEl.top) - scrollerObj.initialTop;
			var scrollerHeight = parseInt(posEl.height);
			
			//Scroll
			if(scrollerObj.scrollerDirection == emwScrollerManager.SCROLLER_DIRECTION_DOWN)
			{
				//if(parseInt(scrollerTop) < (scrollerObj.initialHeight - scrollerObj.initialTop))
				if(parseInt(scrollerTop) < (scrollerObj.initialHeight))
				{
					el.style.top=parseInt(scrollerTop) + parseInt(scrollerObj.currentSpeed) + "px";
				}
				else
				{
					el.style.top=parseInt(scrollerObj.initialTop - scrollerObj.initialHeight - scrollerObj.frameHeight) + "px";
				}
			}
			else
			{
				//if(parseInt(scrollerTop) > (scrollerObj.initialHeight*(-1) - scrollerObj.initialTop))
				if(parseInt(scrollerTop) > (scrollerObj.initialHeight*(-1)))
				{
					el.style.top=parseInt(scrollerTop) -  scrollerObj.currentSpeed + "px";					
				}
				else
				{
					el.style.top=parseInt(scrollerObj.frameHeight) + "px";
				}
			}
		}
	},
	
	repositionScroll : function(e)
	{
		var el, posX;
		if (window.event && window.event.srcElement)
		{
			el = window.event.srcElement;
			posX = event.clientX;
		}
		if (e && e.target)
		{
			el = e.target;
			posX = e.clientX;
		}
		if (!el) return;
		
		divEl = emwScrollerManager.ascendDOM(el,"div");
		
		//Get the Element ID
		if(divEl.id != null)
		{		
			elementId = divEl.id;
			var scrollerObj = null;
			
			//Find the ScrollerObj for this el;
			for (var i = 0; i < emwScrollerManager.SCROLLER_ARRAY.length; i++)
			{
				scrollerObj = emwScrollerManager.SCROLLER_ARRAY[i];
				containerEl = document.getElementById(scrollerObj.containerId);
				containerPos = ObjectPosition.get(containerEl);
				
				if(elementId == scrollerObj.id && scrollerObj.containerTop != containerPos.top && scrollerObj.containerTop != "undefined")
				{
					scrollerObj.currentSpeed = 0;
					scrollerObj.containerTop = containerPos.top;
					scrollerObj.initialTop = containerPos.top;
					emwScrollerManager.SCROLLER_ARRAY[i] = scrollerObj;
					
					//Reposition the Internal Element
					divEl.style.top = containerPos.top;
					emwScrollerManager.TerminateEvent(e);
					break;
				}
			}
		}
	},
	
	stopScroll : function(e)
	{
		var el, posX;
		if (window.event && window.event.srcElement)
		{
			el = window.event.srcElement;
			posX = event.clientX;
		}
		if (e && e.target)
		{
			el = e.target;
			posX = e.clientX;
		}
		if (!el) return;
		
		divEl = emwScrollerManager.ascendDOM(el,"div");
		
		//Get the Element ID
		if(divEl.id != null)
		{		
			elementId = divEl.id;
			var scrollerObj = null;
			
			//Find the ScrollerObj for this el;
			for (var i = 0; i < emwScrollerManager.SCROLLER_ARRAY.length; i++)
			{
				scrollerObj = emwScrollerManager.SCROLLER_ARRAY[i];
				
				if(elementId == scrollerObj.id)
				{
					scrollerObj.currentSpeed = 0;
					emwScrollerManager.SCROLLER_ARRAY[i] = scrollerObj;
					
					break;
				}
			}
		}
	},
	
	startScroll : function(e)
	{
		var el, posX;
		if (window.event && window.event.srcElement)
		{
			el = window.event.srcElement;
			posX = event.clientX;
		}
		if (e && e.target)
		{
			el = e.target;
			posX = e.clientX;
		}
		if (!el) return;
		
		divEl = emwScrollerManager.ascendDOM(el,"div");
		
		//Get the Element ID
		if(divEl.id != null)
		{		
			elementId = divEl.id;
			var scrollerObj = null;
			
			//Find the ScrollerObj for this el;
			for (var i = 0; i < emwScrollerManager.SCROLLER_ARRAY.length; i++)
			{
				scrollerObj = emwScrollerManager.SCROLLER_ARRAY[i];
				
				if(elementId == scrollerObj.id)
				{
					scrollerObj.currentSpeed = scrollerObj.scrollerSpeed;
					emwScrollerManager.SCROLLER_ARRAY[i] = scrollerObj;
					
					break;
				}
			}
		}
	},
	
	TerminateEvent: function(e)
	{
		if ( e.stopPropagation != undefined )
			e.stopPropagation();
		else if ( e.cancelBubble != undefined )
			e.cancelBubble = true;
	
		if ( e.preventDefault != undefined )
			e.preventDefault();
		else
			e.returnValue = false;
	},
	
	addListeners: function()
	{
		if (!document.getElementsByTagName) return;
	  
		var all_divs = document.getElementsByTagName('div');
		var timerArray = new Array();
						
		for (var i = 0; i < all_divs.length; i++)
		{
			//Scroller Container
			if(all_divs[i].getAttribute('scrollercontainer') != null && all_divs[i].getAttribute('scrollercontainer')=="true")
			{
				if(document.getElementById(all_divs[i].id))
				{
					var el = document.getElementById(all_divs[i].id);
					emwScrollerManager.makeScrollable(el);
										
					var scrollerSpeed = emwScrollerManager.SCROLLER_SPEED;
					if(el.getAttribute('scrollerspeed') != null)
					{
						 scrollerSpeed = el.getAttribute('scrollerspeed');
					}
					
					if(el.getAttribute('scrollertimerinterval') != null)
					{
					    emwScrollerManager.SCROLLER_TIMER_INTERVAL = el.getAttribute('scrollertimerinterval');
					}
						
					var scrollerFrameHeight = emwScrollerManager.SCROLLER_FRAME_HEIGHT;
					if(el.getAttribute('scrollerheight') != null)
					{
						 scrollerFrameHeight = el.getAttribute('scrollerheight');
					}
					
					var scrollerDirection = emwScrollerManager.SCROLLER_DIRECTION_UP;
					if(el.getAttribute('scrollerdirection') != null)
					{
						 scrollerDirection = el.getAttribute('scrollerdirection');
					}
					
					if(el.getAttribute('allowdragdrop') != null)
					{
						 allowdragdrop = el.getAttribute('allowdragdrop');
						 if(allowdragdrop == "true")
						 {
						 	//dragEl = new YAHOO.util.DD(el.id);	
						 }
					}
					
					//Reposition Container
					if(el.getAttribute('initialleft') != null)
					{
						 initialLeft = parseInt(el.getAttribute('initialleft'));
						 el.style.left = initialLeft + "px";
					}
					if(el.getAttribute('initialtop') != null)
					{
						 initialTop = parseInt(el.getAttribute('initialtop'));
						 el.style.top = initialTop + "px";
					}					
					var posContainer = ObjectPosition.get(el);
					
					//Check the Child Nodes
					if(el.childNodes.length > 0)
					{
						for (var j = 0; j < el.childNodes.length; j++)
						{
							child = el.childNodes[j];
							
							if(child.tagName != null && child.tagName.toLowerCase() == "div")
							{
								if(child.getAttribute('allowscrolling') != null && child.getAttribute('allowscrolling')=="true")
								{
									var posChild = ObjectPosition.get(child);
									var scrollerObj = new emwScrollerObj(child.id,el.id,posChild.top,posChild.height,posContainer.top,scrollerFrameHeight,scrollerSpeed,scrollerSpeed,scrollerDirection);
									if(scrollerDirection == emwScrollerManager.SCROLLER_DIRECTION_DOWN)
									{
										//Re-position
										child.style.top = parseInt(posChild.top - posChild.height - scrollerFrameHeight) + "px";
									}
									emwScrollerManager.SCROLLER_ARRAY.push(scrollerObj);
									//Add Stop / Start Events
									emwScrollerManager.addEvent(child, 'mouseover', emwScrollerManager.stopScroll, false);
									emwScrollerManager.addEvent(child, 'mouseout', emwScrollerManager.startScroll, false);
									emwScrollerManager.addEvent(child, 'mousemove', emwScrollerManager.repositionScroll, false);	
								}
							}
						}						
					}					
				}
			}
		}
		
		
		//for (var i = 0; i < emwScrollerManager.SCROLLER_ARRAY.length; i++)
		//{
			emwScrollerManager.TIMER_ARRAY=setInterval("emwScrollerManager.doScroll()",emwScrollerManager.SCROLLER_TIMER_INTERVAL);
		//}
	}
}

emwScrollerManager.addEvent(window, 'load', emwScrollerManager.addListeners, false);


