/**
 * author Remy Sharp
 * url http://remysharp.com/2009/01/26/element-in-view-event-plugin/
 */
(function ($) {
	function getViewportHeight() {
		var height = window.innerHeight; // Safari, Opera
		var mode = document.compatMode;

		if ( (mode || !$.support.boxModel) ) { // IE, Gecko
			height = (mode == 'CSS1Compat') ?
			document.documentElement.clientHeight : // Standards
			document.body.clientHeight; // Quirks
		}

		return height;
	}

	var lastDistance = 0;
	var threshold = 100;

	$(window).scroll(function () {
	
		var vpH = getViewportHeight(),
			scrolltop = (document.documentElement.scrollTop ?
				document.documentElement.scrollTop :
				document.body.scrollTop),
			elems = [];
		
		// If the user hasn't scrolled enough we don't want to recurse
		// through all elements.
		if (scrolltop > (threshold + lastDistance) || lastDistance == 0) {
			lastDistance = scrolltop;
		}
		else {
			return;
		}
		
		// naughty, but this is how it knows which elements to check for
		$.each($.cache, function () {
			if (this.events && this.events.inview) {
				elems.push(this.handle.elem);
			}
		});

		if (elems.length) {
			$(elems).each(function () {
				var $el = $(this),
					top = $el.offset().top,
					height = $el.height(),
					inview = $el.data('inview') || false;

				if (scrolltop > (top + height) || scrolltop + vpH < top) {
					if (inview) {
						$el.data('inview', false);
						$el.trigger('inview', [ false ]);
					}
				} else if (scrolltop < (top + height)) {
					if (!inview) {
						$el.data('inview', true);
						$el.trigger('inview', [ true ]);
					}
				}
			});
		}
	});
	
	// kick the event to pick up any elements already in view.
	// note however, this only works if the plugin is included after the elements are bound to 'inview'
	$(function () {
		$(window).scroll();
	});
})(jQuery);

