//
//	Cyclomedia Scroller Object - v 0.1
//	
//	JS file
//	
//	The inner workings of the file, all variable and function names are of
//	the form: [type]Scroller[description]. e.g. iScrollerFoo is an int
//	named "Foo" used solely by this Scroller object
//	
//	In order for the Javascript to be able to override the settings in the
//	CSS file it must be loaded, in the pages HEAD section *before* this file
//

// The CSS override, activated if (compatible) javascript is available
if( document.getElementById )
	document.write('<' + 'link rel="stylesheet" type="text/css" href="cyclomedia_scroller_imported.css">');
	
// Collection of scroller objects
var gaScrollers = new Array();
		

//
// oScroller
//
// The scroller object, holds position and state information for each scroller
//
// hScroller			handle to "scrollinner" div the object controls
// iMaxLeft				maximum left scroll amount, usually width minus width of parent "scroller" div			
// iMaxTop				maximum top scroll amount, usually width minus width of parent "scroller" div			
//
// iLeft				left position in pixels
// iTop					top position in pixels
//
// iOfsLeft				left offset, in case scroller outer div has borders or padding
// iOfsTop				top offset, as above
//
// iHeight				height of inner div, check before accessing as it may have changed
// iWidth				width, as above
//
// iTimeout				scrolling state as per above constants
//
function oScroller( hScroller , iMaxLeft , iMaxTop )
{
	this.hScroller  = hScroller;
	this.iMaxLeft	= iMaxLeft;
	this.iMaxTop	= iMaxTop;

	this.iLeft 		= 0
	this.iTop  		= 0
	
	this.iOfsLeft	= hScroller.offsetLeft;
	this.iOfsTop	= hScroller.offsetTop;
	
	this.iHeight	= hScroller.offsetHeight;
	this.iWidth		= hScroller.offsetWidth;
	
	this.iTimeout	= 0;
}

//
// fScroller_init
//
// load and initialise a scrolling panel, called by fScroller_get if no panel is found on first try
//
function fScroller_init( sScrollerID )
{
	if( document.getElementById && !gaScrollers[ sScrollerID ] )
	{
		var hScroller = document.getElementById(sScrollerID);

		if( hScroller )			
			gaScrollers[ sScrollerID ] = new oScroller( hScroller , hScroller.parentNode.offsetWidth , hScroller.parentNode.offsetHeight );
	}
}

//
// fScroller_get
//
// return handle to specified scroller
//
function fScroller_get( sScrollerID )
{
	if( !gaScrollers[ sScrollerID ] )
		fScroller_init( sScrollerID );
	
	return gaScrollers[ sScrollerID ];		// warning: may still be null!
}

//
// fScroller_stop
//
// stops specified scroller from scrolling
//
function fScroller_stop( sScrollerID )
{
	var o = fScroller_get( sScrollerID );
			
	if( o )
		clearTimeout( o.iTimeout );
}

//
// fScroller_up
//
// scrolls specified scroller up 10 pixels, then sets a timeout to call itself in .1 of a second
//
function fScroller_up( eEvent , sScrollerID )
{
	var o = fScroller_get( sScrollerID );
			
	if( o )
	{
		clearTimeout( o.iTimeout );
	
		fScroller_events( eEvent , sScrollerID );
	
		o.iTimeout	= 0;
		o.iTop		= (o.hScroller.offsetTop + 10) - o.iOfsTop;
		o.iHeight	= o.hScroller.offsetHeight;

		if( o.iTop > 0 )
			o.iTop = 0;
		else
			o.iTimeout = setTimeout( "fScroller_up(null,'" + sScrollerID + "')" , 100 );

		o.hScroller.style.top = o.iTop + "px";
	}
}

//
// fScroller_down
//
// scrolls specified scroller down 10 pixels, then sets a timeout to call itself in .1 of a second
//
function fScroller_dn( eEvent , sScrollerID )
{
	var o = fScroller_get( sScrollerID );
			
	if( o )
	{
		clearTimeout( o.iTimeout );
		
		fScroller_events( eEvent , sScrollerID );
	
		o.iTimeout	= 0;
		o.iTop		= (o.hScroller.offsetTop - 10) - o.iOfsTop;
		o.iHeight	= o.hScroller.offsetHeight;

		if( o.iTop + o.iHeight < o.iMaxTop )			//dont allow to scroll up too far
			if( o.iHeight > o.iMaxTop )					//only if it's actually taller than the container
				o.iTop = o.iMaxTop - o.iHeight;
			else
				o.iTop = 0;
		else
			o.iTimeout = setTimeout( "fScroller_dn(null,'" + sScrollerID + "')" , 100 );

		o.hScroller.style.top = o.iTop + "px";
	}
}

//
// fScroller_lt
//
// scrolls specified scroller left
//
function fScroller_lt( eEvent , sScrollerID )
{
	var o = fScroller_get( sScrollerID );

	if( o )
	{
		clearTimeout( o.iTimeout );
		
		fScroller_events( eEvent , sScrollerID );
	
		o.iTimeout	= 0;
		o.iLeft		= (o.hScroller.offsetLeft + 10) - o.iOfsLeft;
		o.iWidth	= o.hScroller.offsetWidth;

		if( o.iLeft > 0 )
			o.iLeft = 0;
		else
			o.iTimeout = setTimeout( "fScroller_lt(null,'" + sScrollerID + "')" , 100 );

		o.hScroller.style.left = o.iLeft + "px";
	}
}

//
// fScroller_rt
//
// scrolls specified scroller left
//
function fScroller_rt( eEvent , sScrollerID )
{
	var o = fScroller_get( sScrollerID );

	if( o )
	{
		clearTimeout( o.iTimeout );
		
		fScroller_events( eEvent , sScrollerID );
	
		o.iTimeout	= 0;
		o.iLeft		= (o.hScroller.offsetLeft - 10) - o.iOfsLeft;
		o.iWidth	= o.hScroller.offsetWidth;

		if( o.iLeft + o.iWidth < o.iMaxLeft )			//dont allow to scroll too far
			if( o.iWidth > o.iMaxLeft )					//only if it's actually wider than the container
				o.iLeft = o.iMaxLeft - o.iWidth;
			else
				o.iLeft = 0;
		else
			o.iTimeout = setTimeout( "fScroller_rt(null,'" + sScrollerID + "')" , 100 );

		o.hScroller.style.left = o.iLeft + "px";
	}
}

function fScroller_events( eEvent , sScrollerID )
{
	if( !eEvent )
		return;
		
	var hClicked;
	
	if( window.event )
	{
		eEvent = window.event;
		hClicked = eEvent.srcElement;
	}
	else
		hClicked = eEvent.target;

	if( hClicked )
	{
		if( !hClicked.onmouseup )
			hClicked.onmouseup = function () { fScroller_stop( sScrollerID ); };
			
		if( !hClicked.onmouseout )
			hClicked.onmouseout = function () { fScroller_stop( sScrollerID ); };
	}
}

function debug( s )
{
	var d = document.getElementById("debug");
	
	if(d)
		d.innerHTML = s;
}