/*
	ringFade.js
	
	Group of functions to switch between elements.
	
	Defaults to fading in and out in the same location.  Locations of each item to switch can be overridden if set in CSS
*/

// Global Default options
// To change options for a particular instance, call ringFadeSet...

// Fading out
ringFadeDefaultOptions = { duration: 0.3 };

// Fading in
ringFadeDefaultAppearOptions = { duration: 0.3 };

// Initial Hiding
ringFadeDefaultInitOptions = { duration: 0 };

// First element to show -- only works if called before initialization
ringFadeDefaultStart = 0;


// OPTION SETTERS

// sets fade options
function ringFadeSetFadeOptions( outerDivId, options ) {
	$( outerDivId ).ringFadeFadeOptionsArray = options;
}

// sets appear options
function ringFadeSetAppearOptions( outerDivId, options ) {
	$( outerDivId ).ringFadeAppearOptionsArray = options;
}

// sets options for initial hide
function ringFadeSetInitOptions( outerDivId, options ) {
	$( outerDivId ).ringFadeInitOptionsArray = options;
}

// sets the first element to show -- only works if called before initialization
function ringFadeSetStartNum( outerDivId, startNum ) {
	$( outerDivId ).ringFadeIter = startNum;
}



// Initialization function
// - Sets ids for elements without ids
// - positions items
// - Set default options that wree not already set
// - Hides all but the starting element
function ringFadeInit( outerDivId ) {
	
	// Create array of elements to be hidden/shown
	$( outerDivId ).ringFadeArray = new Array(); 
	$( outerDivId ).ringFadeArray = Element.childElements($(outerDivId));
	
	$( outerDivId ).ringFadeArraySize = $( outerDivId ).ringFadeArray.size();
	
	// Set position if not already set
	if ( $( outerDivId ).getStyle('position') == null ) {
		$(outerDivId).setStyle({
			position: 'relative',
			top: '0px',
			left: '0px'
		});
	}
	
	// Create array of ids
	$( outerDivId ).ringFadeIdArray = new Array();
	
	// Populate id array
	// position children elements
	for ( i = 0; i < $( outerDivId ).ringFadeArraySize; i++ ) {
		if ( Element.readAttribute( $( outerDivId ).ringFadeArray[ i ], "id" ) == null || Element.readAttribute( $( outerDivId ).ringFadeArray[ i ], "id" ) == "" ) {
			$( outerDivId ).ringFadeArray[ i ].id = outerDivId + i;
		}
		$( outerDivId ).ringFadeIdArray[ i ] = Element.readAttribute( $( outerDivId ).ringFadeArray[ i ], "id" );
		
		if ( $( $(outerDivId).ringFadeIdArray[ i ] ).getStyle( 'position' ) == null || $( $(outerDivId).ringFadeIdArray[ i ] ).getStyle( 'position' ) == 'static' ) {
			$( $(outerDivId).ringFadeIdArray[ i ] ).setStyle ({
				position: 'absolute',
				top: '0px',
				left: '0px'
			});
		}
		
		$( $(outerDivId).ringFadeIdArray[ i ] ).iter = i;
	}
	
	
	// Initial frame.  If not already set, start at 0
	if ( $( outerDivId ).ringFadeIter == null || $( outerDivId ).ringFadeIter == "" ) {
		$( outerDivId ).ringFadeIter = 0;
	}
	
	// Hide all but starting element
	for ( i=0; i < $( outerDivId ).ringFadeArraySize; i++) {
		// skip starting element
		if ( i == $( outerDivId ).ringFadeIter ) {
			$( $( outerDivId ).ringFadeArray[ i ] ).show();
		}
		else {
			Effect.Fade( $( outerDivId ).ringFadeArray[ i ], $( outerDivId ).ringFadeInitOptionsArray || ringFadeDefaultInitOptions );
		}
	}
	
	// set default fade transision options
	if ( $( outerDivId ).ringFadeFadeOptionsArray == null ) {
		$( outerDivId ).ringFadeFadeOptionsArray = ringFadeDefaultOptions;
	}
	
	// set default appear transision options
	if ( $( outerDivId ).ringFadeAppearOptionsArray == null ) {
		$( outerDivId ).ringFadeAppearOptionsArray = ringFadeDefaultOptions;
	}
}

// show next item listed in DOM...wraps to the first element when end is reached
function ringFadeToNext( outerDivId /*, options */ ) {
	var options = arguments[1] || $( outerDivId ).ringFadeFadeOptionsArray;
	var appearOptions = arguments[2] || $( outerDivId ).ringFadeAppearOptionsArray;
	
	nextNum = ( $( outerDivId ).ringFadeIter + 1 ) % $( outerDivId ).ringFadeArraySize;
	
	ringFadeToNum( outerDivId, nextNum, options, appearOptions );
}

// show previous item listed in the DOM...wraps to the last element when first is reached
function ringFadeToPrev( outerDivId /*, options */ ) {
	var options = arguments[1] || $( outerDivId ).ringFadeFadeOptionsArray;
	var appearOptions = arguments[2] || $( outerDivId ).ringFadeAppearOptionsArray;
	
	if ( $( outerDivId ).ringFadeIter == 0 ) {
		nextNum = $( outerDivId ).ringFadeArraySize - 1;
	}
	else {
		nextNum = $( outerDivId ).ringFadeIter - 1;
	}
	
	ringFadeToNum( outerDivId, nextNum, options, appearOptions );
}


// jump to an ID or DOM object
// returns FALSE if not found
function ringFadeToElement( outerDivId, innerId /*, options */ ) {
	var options = arguments[2] || $( outerDivId ).ringFadeFadeOptionsArray;
	var appearOptions = arguments[3] || $( outerDivId ).ringFadeAppearOptionsArray;
	
	nextNum = ringFadeElementNumber( outerDivId, innerId )
	
	if ( nextNum == -1 ) return false;
	
	ringFadeToNum( outerDivId, nextNum, options, appearOptions );
}

// jump to a numbered position
// returns FALSE if number doesn't exist.
function ringFadeToNum( outerDivId, nextNum /*, options, AppearOptions */ ) {
	if ( nextNum >= $( outerDivId ).ringFadeArraySize ) return false;
	
	var options = arguments[2] || $( outerDivId ).ringFadeFadeOptionsArray;
	var appearOptions = arguments[3] || $( outerDivId ).ringFadeAppearOptionsArray;
	
	if ( $( outerDivId ).ringFadeArray == null ) {
		ringFadeInit( outerDivId );
	}
	
	if ( nextNum == $( outerDivId ).ringFadeIter ) return;
	
	Effect.Fade( $( $( outerDivId ).ringFadeArray[ $( outerDivId ).ringFadeIter ] ), options );
	
	$( outerDivId ).ringFadeIter = nextNum;
	
	Effect.Appear( $( $( outerDivId ).ringFadeArray[ $( outerDivId ).ringFadeIter ] ), appearOptions );
}

// returns bool...checks if current element is active
function ringFadeIsActive( outerDivId, innerId ) {
	if ( ringFadeElementNumber( outerDivId, innerId ) == $( outerDivId ).ringFadeIter ) {
		return true;
	}
	else {
		return false;
	}
	
}

// returns int of position of element
function ringFadeElementNumber( outerDivId, innerId ) {
	return $( outerDivId ).ringFadeIdArray.indexof( $( innerId ).readAttribute('id') );
}
