﻿/*
 * aScroller js
 * 
 * Copyright (C) 2005-2006
 * by Davide S. Casali
 * www.digitalhymn.com
 *
 * Last release: 2005-11-27
 *
 * Released under CC by-nc-sa 2.5
 * http://creativecommons.org/licenses/by-nc-sa/2.5/
 *
 */

/*
 * This is a simple JavaScript vertical scroller that is crossbrowser and also validates
 * as XHTML Strict.
 *
 * Usage:
 * (1) Define a <div> tag with a specified ID, containing the scrolling text. One <div> for each line.
 * (2) Define an INLINE CSS width and height (important, MUST be inline)
 * (3) Execute the divScroller function, passing id, mode (h or v),  speed (higher number means
 *     slower) and delay (in ms).
 *
 */

/****************************************************************************************************
 * Cross browser getElementByID.
 * From: www.quirksmode.org
 *
 * @param	id
 */
function getObj(name)
{
	if (document.getElementById)
	{
		this.obj = document.getElementById(name);
		this.style = document.getElementById(name).style;
	}
	else if (document.all)
	{
		this.obj = document.all[name];
		this.style = document.all[name].style;
	}
	else if (document.layers)
	{
		this.obj = document.layers[name];
		this.style = document.layers[name];
	}
}

/****************************************************************************************************
 * Enables the scrolling for the specified div (matching id).
 *
 * @param	string id of the tag
 * @param	speed
 * @param	delay
 */
function divScroller(id, direction, speed, delay)
{
	if (document.getElementById)
	{
		// DOM3 = IE5+, NS6+, FF0.7+
		// *** Scroller
		//var scroller = new getObj(id);
		var scroller = $(id);
		
		if(scroller)
		{
		    // *** Debug force vars
		    //scroller.style.height = "30px";
		    //scroller.style.backgroundColor = "#FFEEEE";
    		
		    // *** Computed Styles
		    //alert(scroller.obj.currentStyle.height);
		    /*if (!scroller.style.height)
			    if (scroller.obj.currentStyle)
				    scroller.style.height = scroller.obj.currentStyle.height;
			    else
				    scroller.style.height = document.defaultView.getComputedStyle(scroller.obj, null).getPropertyValue("height");*/
    		
		    // *** Needed vars
		    scroller.style.position = "relative";
		    scroller.style.overflow = "hidden";
    		
		    // *** Generate scrolling inner <div>
		    scroller.innerHTML = "<div id=\"" + id + "_inner\">" + scroller.innerHTML + "</div>";
    		
		    // *** Inner
		    //var inner = new getObj(id + "_inner");
		    var inner = $(id + "_inner");
		    inner.style.position = "absolute";
		    inner.style.left = parseInt(scroller.style.width) + "px";
		    inner.style.top = parseInt(scroller.style.height) + "px";
    		
		    // *** Apply sub-styles
		    //divScrollItemsStyler(id, direction);
    		
		    // *** Worker
		    if (direction == "h" || direction == "horizontal")
		    {
			    // ****** HORIZONTAL
			    // MouseOver: pauses the ticker
			    scroller.observe('mouseover', function(event) {
			        divScroll_onMouseOver(id);
			    });

			    scroller.observe('mouseout', function(event) {
			        divScroll_onMouseOut(id);
			    });
    			
			    //scroller.onmouseover = function() { divScroll_onMouseOver(id); };
			    //scroller.onmouseout = function() { divScroll_onMouseOut(id); };
    			
			    // Create a temp element to evaluate the size (awful, but no better way to do this)
			    fxpatch = navigator.userAgent.indexOf("Firefox") > -1 ? " left: -9000px;" : ""; // Firefox different CSS (on every other browser since IE5+ isn't needed)
			    spanContent = "<span id=\"" + id + "_widthEval\" style=\"visibility: hidden; position: absolute; top: -100px; left: -1px; z-index: -10; white-space: nowrap;" + fxpatch + "\"><nobr>" + inner.innerHTML + "</nobr></span>";
			    //if (document.createElement)
			    //{
				    //var span = document.createElement('span');
				    //span.innerHTML = spanContent;
				    var span = new Element('span').update(spanContent);
				    scroller.appendChild(span);
			    //}
			    //else
			    //{
			    //	document.write(spanContent);
			    //}
			    //var widthEval = new getObj(id + "_widthEval");
			    var widthEval = $(id + "_widthEval");
    			
			    // Setup the scrolling inner drawer
			    inner.style.top = "0px";
			    inner.style.whiteSpace = "nowrap";
			    inner.style.width = widthEval.offsetWidth + "px";
			    limit = parseInt(inner.style.width);
    			
			    // remove temp element.
			    span.remove();
    			
			    // Execute
			    divScrollHelperH.delay(speed/1000, id, limit, speed, delay);
		    }
		    else if (direction == "v" || direction == "vertical")
		    {
			    // ****** VERTICAL
			    // Setup the scrolling inner drawer
			    inner.style.left = "0px";
			    inner.style.width = parseInt(scroller.style.width) + "px";
			    limit = inner.getElementsByTagName('div').length * parseInt(scroller.style.height);
    			
			    // Execute
			    divScrollHelperV.delay(speed/1000, id, limit, speed, delay);
		    }
		}
	}
}

/****************************************************************************************************
 * Helper for the HORIZONTAL scrolling for the specified div (matching id).
 * This is the real "ticker" function, executed to move the div.
 *
 * @param	string id of the tag
 * @param	pre-calculated height limit (to speed up execution)
 * @param	speed
 * @param	delay
 */
function divScrollHelperH(id, limit, speed, delay)
{
	if (document.getElementById)
	{
		// DOM3 = IE5+, NS6+, FF0.7+
		//var scroller = new getObj(id);
		var scroller = $(id);
		//var inner = new getObj(id + "_inner");
		var inner = $(id + "_inner");
		
		// *** Tick duration
		nextTick = speed;
		
		// *** Avoiding some errors
		if (!inner.style.left) inner.style.left = "0px";
		
		// *** Moving the inner div. At the end, restart.
		if (parseInt(inner.style.left) < -limit)
		{
			inner.style.left = parseInt(scroller.style.width) + "px";
		}
		else if (!scroller.pause || scroller.pause == false)
		{
			inner.style.left = (parseInt(inner.style.left) - 1) + "px";
			
			// Deceiving Opera8 stupidity
			//inner.style.width = parseInt(scroller.style.width) - (parseInt(inner.style.left) - 4) + "px";
		}
		
		// *** Bigger delay on item found
		// Skips borders to make transition without delays on loop
		/*if (!(parseInt(inner.style.left) == parseInt(scroller.style.width)) &&
			!(parseInt(inner.style.left) == -limit) &&
			(parseInt(inner.style.left) % parseInt(scroller.style.width)) == 0)
		{
			nextTick = delay;
		}*/
		
		// *** Tick!
		divScrollHelperH.delay(nextTick/1000, id, limit, speed, delay);
	}
}

/****************************************************************************************************
 * Helper for the VERTICAL scrolling for the specified div (matching id).
 * This is the real "ticker" function, executed to move the div.
 *
 * @param	string id of the tag
 * @param	pre-calculated height limit (to speed up execution)
 * @param	speed
 * @param	delay
 */
function divScrollHelperV(id, limit, speed, delay)
{
	// DOM3 = IE5+, NS6+, FF0.7+
	//var scroller = new getObj(id);
	var scroller = $(id);
	//var inner = new getObj(id + "_inner");
	var inner = $(id + "_inner");
	
	// *** Tick duration
	nextTick = speed;
	
	// *** Avoiding some errors
	if (!inner.style.top) inner.style.top = "0px";
	
	// *** Moving the inner div. At the end, restart.
	if (parseInt(inner.style.top) < -limit)
	{
		inner.style.top = parseInt(scroller.style.height) + "px";
	}
	else
	{
		inner.style.top = (parseInt(inner.style.top) - 1) + "px";
	}
	
	// *** Bigger delay on item found
	// Skips borders to make transition without delays on loop
	if (!(parseInt(inner.style.top) == parseInt(scroller.style.height)) &&
		!(parseInt(inner.style.top) == -limit) &&
		(parseInt(inner.style.top) % parseInt(scroller.style.height)) == 0)
	{
		nextTick = delay;
	}
	
	// *** Tick!
	divScrollHelperV.delay(nextTick/1000, id, limit, speed, delay);
}

/****************************************************************************************************
 * OnMouseOver helper for the HORIZONTAL scrolling for the specified div (matching id).
 *
 * @param	string id of the tag
 */
function divScroll_onMouseOver(id)
{
	//var scroller = new getObj(id);
	var scroller = $(id);
	scroller.pause = true;
}

function divScroll_onMouseOut(id)
{
	//var scroller = new getObj(id);
	var scroller = $(id);
	scroller.pause = false;
}

/****************************************************************************************************
 * Apply essential working styles to each <div> inside the scroller.
 *
 * @param	string id of the inner div
 */
function divScrollItemsStyler(id, direction)
{
	// DOM3 = IE5+, NS6+, FF0.7+
	//var scroller = new getObj(id);
	var scroller = $(id);
	//var inner = new getObj(id + "_inner");
	var inner = $(id + "_inner");
	
	elements = inner.getElementsByTagName('div');
	
	for (var i = 0; i < elements.length; i++)
	{
		var item = elements.item(i);
		
		item.style.width = scroller.style.width;
	}
}