﻿/**
 * 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 || !jQuery.support.boxModel)) { // IE, Gecko
//alert(mode + "|" + $.support.boxModel);
			height = (mode=="CSS1Compat") ? document.documentElement.clientHeight : document.body.clientHeight; // Quirks
		}

		return height;
	}

	$(window).scroll(function() {
		var vpH = getViewportHeight(),
			scrolltop = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop),
			elems = [];

		// naughty, but this is how it knows which elements to check for
		$.each($.cache, function() {
			var internalKey = $.expando;
			var internalCache = this[internalKey];
            if (internalCache && internalCache.events && internalCache.events.inview) {
                elems.push(internalCache.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);
