;(function ( $, window, document, undefined ) { // defaults var _buffer = null, _watch = [], $window = $(window), plugin = function() { } ; plugin.prototype = { globals: { pluginname: "fadethis", buffertime: 300, }, defaults: { basename: "slide-", speed: 500, easing: "swing", offset: 0, reverse: true, distance: 50, scrolledin: null, scrolledout: null }, init: function ( elem, options ) { this.addelements( elem, options ); this._setevent(); this._checkvisibleelements(); }, addelements: function ( elem, options ) { var element = elem === document.body ? window : elem, $element = element === window ? $("body") : $(element), base = this, classbasename = (options && options.basename) ? options.basename : this.defaults.basename ; if (!$element.is("[class^='" + classbasename + "']")) { $element.find("[class^='" + classbasename + "']").each(function() { base._addelement($(this), options); }); } else { base._addelement($element, options); } return $element; }, _addelement: function ($elem, options) { var metadata = $elem.data( "plugin-options" ), localoptions = $.extend({}, this.defaults, options, metadata), item = { element: $elem, options: localoptions, invp: false } ; _watch.push(item); this._prepareelement(item); return $elem; }, _prepareelement: function (item) { var cssoptionsin = { opacity: 0, visibility: "visible", position: "relative" }, direction = null ; if (item.element.hasclass(item.options.basename + "right")) { direction = "left"; } else if (item.element.hasclass(item.options.basename + "left")) { direction = "right"; } else if (item.element.hasclass(item.options.basename + "top")) { direction = "bottom"; } else if (item.element.hasclass(item.options.basename + "bottom")) { direction = "top"; } else { return false; } cssoptionsin[direction] = item.options.distance; item.element.css(cssoptionsin); }, _setevent: function () { var base = this; $window.on("scroll", function(e) { if(!_buffer) { _buffer = settimeout(function(){ base._checkvisibleelements( e ); _buffer = null; }, base.globals.buffertime); } }); }, _checkvisibleelements: function( e ) { var base = this; $.each(_watch, function(key, item){ if (base._isvisible(item)) { if ( !item.invp ) { item.invp = true; base._triggerfading(item); if ( item.options.scrolledin ) { item.options.scrolledin.call( item.element, e ); } item.element.trigger("fadethisscrolledin", e); } } else if ( item.invp ) { item.invp = false; if ( item.options.reverse ) { base._triggerfading(item, false); } if ( item.options.scrolledout ) { item.options.scrolledout.call( item.element, e ); } item.element.trigger("fadethisscrolledout", e); } }); }, _isvisible: function(item) { var docviewtop = $window.scrolltop() + item.options.offset, docviewbottom = docviewtop + $window.height() - 2 * item.options.offset, elemtop = item.element.offset().top, elembottom = elemtop + item.element.height() ; return ((elembottom >= docviewtop) && (elemtop <= docviewbottom) && (elembottom <= docviewbottom) && (elemtop >= docviewtop)); }, _triggerfading:function (item, appear) { appear = typeof appear !== "undefined" ? appear : true; var stateanimin = { opacity: 1 }, stateanimout = { opacity: 0, }, direction = null ; if (item.element.hasclass(item.options.basename + "right")) { direction = "left"; } else if (item.element.hasclass(item.options.basename + "left")) { direction = "right"; } else if (item.element.hasclass(item.options.basename + "top")) { direction = "bottom"; } else if (item.element.hasclass(item.options.basename + "bottom")) { direction = "top"; } else { return false; } stateanimin[direction] = 0; stateanimout[direction] = item.options.distance; if (appear) { item.element.stop(true).animate(stateanimin, item.options.speed, item.options.easing); } else { item.element.stop(true).animate(stateanimout, item.options.speed, item.options.easing); } } }; plugin.defaults = plugin.prototype.defaults; plugin.globals = plugin.prototype.globals; window.plugin = new plugin(); // preventing against multiple instantiations for the same dom element $.fn[ plugin.globals.pluginname ] = function ( options ) { this.each(function() { if ( !$.data( window, "plugin_" + plugin.globals.pluginname ) ) { $.data( window, "plugin_" + plugin.globals.pluginname, "set" ); $.data( this, "plugin_" + plugin.globals.pluginname, window.plugin.init( this, options ) ); } else if ( !$.data( this, "plugin_" + plugin.globals.pluginname )) { $.data( this, "plugin_" + plugin.globals.pluginname, window.plugin.addelements( this, options ) ); } }); // chain jquery functions return this; }; })( jquery, window, document );