/**
 * jquery.scrollFollow.js
 * Copyright (c) 2008 Net Perspective (http://kitchen.net-perspective.com/)
 * Licensed under the MIT License (http://www.opensource.org/licenses/mit-license.php)
 * 
 * @author R.A. Ray (modified by S.Kelly)
 * 
 * @param speed		int - Duration of animation (in milliseconds)
 * 								default: 500
 * @param offset			int - Number of pixels box should remain from top of viewport
 * 								default: 0
 * @param container	string - ID of the containing div
 * 								default: box's immediate parent
 * @param relativeTo	string - Scroll animation can be relative to either the 'top' or 'bottom' of the viewport
 * 								default: 'top'
 * @param delay			int - Time between the end of the scroll and the beginning of the animation in milliseconds
 * 								default: 0
 */

( function( $ ) {
	
	$.scrollFollow = function (box, options)
	{ 
		// Convert box into a jQuery object
		box = $( box );
		
		// 'box' is the object to be animated
		var position = box.css('position');
		
		function ani()
		{		
			// The script runs on every scroll which really means many times during a scroll.
			// We don't want multiple slides to queue up.
			box.queue( [ ] );
		
			// A bunch of values we need to determine where to animate to
			var viewportHeight = parseInt($(window).height());	
			var pageScroll =  parseInt($(document).scrollTop());
			var parentTop =  parseInt(box.cont.offset().top);
			var parentHeight = parseInt(box.cont.attr('offsetHeight'));
			var boxHeight = parseInt(box.attr('offsetHeight') + (parseInt( box.css('margin-top')) || 0 ) + (parseInt( box.css('margin-bottom')) || 0 ));
			var aniTop;
			
			// If the box should animate relative to the top of the window
			if ( options.relativeTo == 'top' )
			{
				// Don't animate until the top of the window is close enough to the top of the box
				if (box.initialOffsetTop >= (pageScroll + options.offset ))
				{
					aniTop = box.initialTop;
				}
				else
				{
					aniTop = Math.min(( Math.max((-parentTop), (pageScroll - box.initialOffsetTop + box.initialTop)) + options.offset), (parentHeight - boxHeight - box.paddingAdjustment) );
				}
			}
			// If the box should animate relative to the bottom of the window
			else if (options.relativeTo == 'bottom')
			{
				// Don't animate until the bottom of the window is close enough to the bottom of the box
				if ( (box.initialOffsetTop + boxHeight) >= (pageScroll + options.offset + viewportHeight))
				{
					aniTop = box.initialTop;
				}
				else
				{
					aniTop = Math.min((pageScroll + viewportHeight - boxHeight - options.offset), (parentHeight - boxHeight));
				}
			}
			
			// Checks to see if the relevant scroll was the last one
			// "-20" is to account for inaccuracy in the timeout
			if ((new Date().getTime() - box.lastScroll) >= (options.delay - 20))
			{
				box.animate(
					{
						top: aniTop
					}, options.speed, options.easing
				);
			}
		};
				
		// If no parent ID was specified, and the immediate parent does not have an ID
		// options.container will be undefined. So we need to figure out the parent element.
		if ( options.container == '')
		{
			box.cont = box.parent();
		}
		else
		{
			box.cont = $('#' + options.container);
		}
		
		// Finds the default positioning of the box.
		box.initialOffsetTop =  parseInt(box.offset().top);
		box.initialTop = parseInt(box.css('top')) || 0;
		
		// Hack to fix different treatment of boxes positioned 'absolute' and 'relative'
		if ( box.css('position') == 'relative')
		{
			box.paddingAdjustment = parseInt(box.cont.css('padding-top')) + parseInt(box.cont.css('padding-bottom'));
		}
		else
		{
			box.paddingAdjustment = 0;
		}
		
		// Animate the box when the page is scrolled
		$( window ).scroll( function ()
			{
				// Sets up the delay of the animation
				$.fn.scrollFollow.interval = setTimeout( function(){ ani();} , options.delay );
				
				// To check against right before setting the animation
				box.lastScroll = new Date().getTime();
			}
		);
		
		// Animate the box when the page is resized
		$( window ).resize( function ()
			{
				// Sets up the delay of the animation
				$.fn.scrollFollow.interval = setTimeout( function(){ ani();} , options.delay );
				
				// To check against right before setting the animation
				box.lastScroll = new Date().getTime();
			}
		);

		// Run an initial animation on page load
		box.lastScroll = 0;
		
		ani();
		
		// toggles faqs
		$('p.clickextra').click(function () {
			$myelement = $(this);
			if ($myelement.next().is(':hidden')) {
				$myelement.next().show();
				box.initialOffsetTop =  parseInt(box.offset().top);
			} else {
				$myelement.next().hide();
				box.initialOffsetTop =  parseInt(box.offset().top);
			}
		});
		
	};
	
	$.fn.scrollFollow = function (options)
	{
		options = options || {};
		options.relativeTo = options.relativeTo || 'top';
		options.speed = options.speed || 500;
		options.offset = options.offset || 0;
		options.container = options.container || this.parent().attr('id');
		options.delay = options.delay || 0;
		
		this.each( function() 
			{
				new $.scrollFollow( this, options );
			}
		);
		
		return this;
	};
})( jQuery );




