/************************************************************************
*	effects.js
*  v 1.1  12/5/05
*  Richard Davies (Richard.Davies@portlandoregon.gov)
*
*  Special effects
*
*  Requires DOM.js 
*
************************************************************************/


/************************************************************************
* Smooth Scroller
************************************************************************/


var ss_INTERVAL;

// Smoothly scrolls to an element optionally shifted by an adjustment
// Parameters:
//   element: the ID of the element you wish to scroll to
//   adjustment: an optional value you can use to tweak the final position 
//               of the scrolled-to element
function smoothScrollTo(element, adjustment, frame) {
	// Adjustment parameter is optional
	if ( typeof(adjustment) == "undefined" )
		adjustment = 0;

	// Set pointers to document and window object
	if ( typeof(frame) == "undefined" ) {
		var myDocument = document;
		var myWindow = window;
	} else {
		var myDocument = frames[frame].document;
		var myWindow = frames[frame];
	}

	// Get a reference to the element
	element = myDocument.getElementById(element);
	
	if (element == null) return -1;
	
	// Find the destination element's position
	 var destX = element.offsetLeft;  
	 var destY = element.offsetTop;
	 var thisNode = element;
	 while (thisNode.offsetParent &&  
			 (thisNode.offsetParent != myDocument.body)) {
		thisNode = thisNode.offsetParent;
		destX += thisNode.offsetLeft;
		destY += thisNode.offsetTop;
	 }
	 destY += adjustment;
	 
	var ss_STEPS = 25;
	clearInterval(ss_INTERVAL);
	var curYPos = frameScrollY(myWindow);
	var ss_stepsize = parseInt( (destY-curYPos)/ss_STEPS );
	if ( typeof(frame) == "undefined" )
		ss_INTERVAL = setInterval('ss_scrollWindow(' + ss_stepsize + ',' + destY + ')', 10);
	else
		ss_INTERVAL = setInterval('ss_scrollWindow(' + ss_stepsize + ',' + destY + ',' + frame + ')', 10);
	
}

// Aborts the scrolling in progress
function smoothScrollCancel() {
	clearInterval(ss_INTERVAL);
}

// Internal function called repeatedly by setInterval
function ss_scrollWindow(scrollAmt, dest, frame) {
	// Set pointer to optional window object
	if ( typeof(frame) == "undefined" )
		var frame = window;

	var wasCurYPos = frameScrollY(frame);
	var isAbove = (wasCurYPos < dest);
	frame.scrollTo(0, wasCurYPos + scrollAmt);
	var isCurYPos = frameScrollY(frame);
	var isAboveNow = (isCurYPos < dest);
	if ((isAbove != isAboveNow) || (wasCurYPos == isCurYPos)) {
		// If we've just scrolled past the destination, or
		// we haven't moved from the last scroll (i.e., we're at the
		// bottom of the page) then scroll exactly to the link
		frame.scrollTo(0, dest);
		// Cancel the repeating timer
		clearInterval(ss_INTERVAL);
	}
}



/************************************************************************
* Show, hide, and toggle elements
************************************************************************/


// Show an object
function show(obj) {
	if (!document.getElementById) return;
	
	var el = document.getElementById(obj);
	el.style.display = '';
}

// Hide an object
function hide(obj) {
	if (!document.getElementById) return;
	
	var el = document.getElementById(obj);
	el.style.display = 'none';
}

// Make an object invisible
function cloak(obj) {
	if (!document.getElementById) return;
	
	var el = document.getElementById(obj);
	el.style.visibility = 'hidden';
}

// Make an invisible object visible
function uncloak(obj) {
	if (!document.getElementById) return;
	
	var el = document.getElementById(obj);
	el.style.visibility = 'visible';
}

// Toggle an object between show() and hide()
function toggle(obj) {
	if (!document.getElementById) return;
	
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	} else {
		el.style.display = '';
	}
}

// Returns boolean indicating if object has been hidden or not
function isVisible(obj) {
	if (!document.getElementById) return;
	
	var el = document.getElementById(obj);
	if (el.style.display == '')
		return true;
	else
		return false;	
}

// Returns boolean indicating if object has been cloaked or not
function isCloaked(obj) {
	if (!document.getElementById) return;
	
	var el = document.getElementById(obj);
	if (el.style.visibility == 'hidden')
		return true;
	else
		return false;	
}

