(function(jQuery) {
    jQuery.fn.lazyload = function(options) {
        var settings = {
            threshold    : 0,
            failurelimit : 0,
            event        : "scroll",
            effect       : "show",
            container    : window,
			basis		 : "img[original]"
        };
                
        if(options) {
            jQuery.extend(settings, options);
        }

        /* Fire one scroll event per scroll. Not one scroll event per image. */
        var elements = this;
        if ("scroll" == settings.event) {
            jQuery(settings.container).bind("scroll", function(event) {
               	elements = jQuery(settings.basis);
                var counter = 0;
                elements.each(function(i) {

						if (jQuery.abovethetop(jQuery(this), settings)) {
								/* Nothing. */
						} else if (!jQuery.belowthefold(jQuery(this), settings)) {
							var _self = jQuery(this);
							if (_self.attr("open") != "1"){
								jQuery("<img />")
									.one("load", function() {
										_self
											.hide()
											.removeAttr("height")
											.attr("src", _self.attr("original"))
											[settings.effect](settings.effectspeed);
									})
									.one("seterrurl", function() {
										_self
											.hide()
											.removeAttr("height")
											.attr("src", "http://static.tianyaui.com/img/static/2011/imgloadingerr.gif")
											[settings.effect](settings.effectspeed);
									})
									.one("error",function(){jQuery(this).trigger("seterrurl")})
									.attr("src", _self.attr("original"));
								_self.attr("open","1");
							}
						} else {
							if (counter++ > settings.failurelimit) {
								return false;
							}
						}
                });
            });
        }
        
        /* Force initial check if images should appear. */
        jQuery(settings.container).trigger(settings.event);
        
        return this;
    };
	
    jQuery.belowthefold = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = jQuery(window).height()*2 + jQuery(window).scrollTop();
        } else {
            var fold = jQuery(settings.container).offset().top + jQuery(settings.container).height()*2;
        }		
        return fold <= jQuery(element).offset().top - settings.threshold;

    };
	
    jQuery.abovethetop = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = jQuery(window).scrollTop();
        } else {
            var fold = jQuery(settings.container).offset().top;
        }
        return fold >= element.offset().top + settings.threshold  + element.height();
    };
    /* Custom selectors for your convenience.   */
    /* Use as jQuery("img:below-the-fold").something() */

    jQuery.extend(jQuery.expr[':'], {
        "below-the-fold" : "jQuery.belowthefold(a, {threshold : 0, container: window})",
        "above-the-fold" : "!jQuery.belowthefold(a, {threshold : 0, container: window})"
    });
    
})(jQuery);
