/*
 * Visible - A jquery extension to render images and html content as the user scrolls down the page.
 *
 * Copyright (c) 2011 Matthew Drake (w) The Foundry Agency
 *
 * Licensed under the MIT license:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 *
 */

( function($) {

jQuery.fn.extend(
{
	visible: function(options)
	{
		if($.isFunction(options))
			options = {callback:options};
		
		var defaults = {callback:function(){},persist:false};
		options = $.extend(defaults, options);
		
		
		var d = $(window).data('onvisible');
		if (!d)
		{
			d = [];
		}
		
		this.each( function() { 
			d.push({target:this,options:options});
			$(this).toggleClass("visible-fired",false); 
		} );
		$(window).data('onvisible', d );
		return this;
	},
	
	fireVisible: function(options)
	{
		if(options.persist || !$(this).hasClass("visible-fired")){
			options.callback.apply(this,[options]);
			
			
			!$(this).toggleClass("visible-fired",true)
		}
	}

});

$(document).ready( function()
{
	$(document).ready( function()
			{
	
			var scrolling = false;
		
			$(window).scroll( function()
			{
					
				//Prevent scroll stacking
				if (!scrolling)
				{
					scrolling = true;
					//don't unlock for 250ms
					setTimeout( function()
					{
						var d = $(window).data('onvisible');
						if (!d || !d.length)
						{
											
							return;
						}
			
						$( d ).each( function(i)
						{	
							if ( this.target && $.inviewport( this.target, {threshold:0} ) )
							{
								$(this.target).fireVisible(this.options);
							}
						});
						
		
						scrolling = false;			
					}, 250);
							
				}
			});
/*			$(document).ready(function(){
				var d = $(window).data('onvisible');
				
				$( d ).each( function(i)
				{						
							if ( this.target && $.inviewport( this.target, {threshold:0} ) )
							{
								$(this.target).fireVisible(this.options);
							}
				});
			});*/
			$(window).trigger( 'scroll' );
		});
});


/*
 * Viewport - jQuery selectors for finding elements in viewport
 *
 * Copyright (c) 2008-2009 Mika Tuupola
 *
 * Licensed under the MIT license:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * Project home:
 *  http://www.appelsiini.net/projects/viewport
 *
 */
    $.belowthefold = function(element, settings) {
        var fold = $(window).height() + $(window).scrollTop();
        return fold <= $(element).offset().top - settings.threshold;
    };

    $.abovethetop = function(element, settings) {
        var top = $(window).scrollTop();
        return top >= $(element).offset().top + $(element).height() - settings.threshold;
    };

    $.rightofscreen = function(element, settings) {
        var fold = $(window).width() + $(window).scrollLeft();
        return fold <= $(element).offset().left - settings.threshold;
    };

    $.leftofscreen = function(element, settings) {
        var left = $(window).scrollLeft();
        return left >= $(element).offset().left + $(element).width() - settings.threshold;
    };

    $.inviewport = function(element, settings) {
        return !$.rightofscreen(element, settings) && !$.leftofscreen(element, settings) && !$.belowthefold(element, settings) && !$.abovethetop(element, settings);
    };

    $.extend($.expr[':'], {
        "below-the-fold": function(a, i, m) {
            return $.belowthefold(a, {threshold : 0});
        },
        "above-the-top": function(a, i, m) {
            return $.abovethetop(a, {threshold : 0});
        },
        "left-of-screen": function(a, i, m) {
            return $.leftofscreen(a, {threshold : 0});
        },
        "right-of-screen": function(a, i, m) {
            return $.rightofscreen(a, {threshold : 0});
        },
        "in-viewport": function(a, i, m) {
            return $.inviewport(a, {threshold : 0});
        }
    });

})(jQuery);
