(function ($) {$.fn.marquee = function (klass) {var newMarquee = [],last = this.length;function getReset(newDir, marqueeRedux, marqueeState) {var behavior = marqueeState.behavior, width = marqueeState.width, dir = marqueeState.dir;var r = 0;if (behavior == 'alternate') {r = newDir == 1 ? marqueeRedux[marqueeState.widthAxis] - (width*2) : width;} else if (behavior == 'slide') {if (newDir == -1) {r = dir == -1 ? marqueeRedux[marqueeState.widthAxis] : width;} else {r = dir == -1 ? marqueeRedux[marqueeState.widthAxis] - (width*2) : 0;}} else {r = newDir == -1 ? marqueeRedux[marqueeState.widthAxis] : 0;}return r;}function animateMarquee() {var i = newMarquee.length,marqueeRedux = null,$marqueeRedux = null,marqueeState = {},newMarqueeList = [],hitedge = false;while (i--) {marqueeRedux = newMarquee[i];$marqueeRedux = $(marqueeRedux);marqueeState = $marqueeRedux.data('marqueeState');if ($marqueeRedux.data('paused') !== true) {marqueeRedux[marqueeState.axis] += (marqueeState.scrollamount * marqueeState.dir);hitedge = marqueeState.dir == -1 ? marqueeRedux[marqueeState.axis] <= getReset(marqueeState.dir * -1, marqueeRedux, marqueeState) : marqueeRedux[marqueeState.axis] >= getReset(marqueeState.dir * -1, marqueeRedux, marqueeState);if ((marqueeState.behavior == 'scroll' && marqueeState.last == marqueeRedux[marqueeState.axis]) || (marqueeState.behavior == 'alternate' && hitedge && marqueeState.last != -1) || (marqueeState.behavior == 'slide' && hitedge && marqueeState.last != -1)) {if (marqueeState.behavior == 'alternate') {marqueeState.dir *= -1;}marqueeState.last = -1;$marqueeRedux.trigger('stop');marqueeState.loops--;if (marqueeState.loops === 0) {if (marqueeState.behavior != 'slide') {marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);} else {marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir * -1, marqueeRedux, marqueeState);}$marqueeRedux.trigger('end');} else {newMarqueeList.push(marqueeRedux);$marqueeRedux.trigger('start');marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);}} else {newMarqueeList.push(marqueeRedux);}marqueeState.last = marqueeRedux[marqueeState.axis];$marqueeRedux.data('marqueeState', marqueeState);} else {newMarqueeList.push(marqueeRedux);}}newMarquee = newMarqueeList;if (newMarquee.length) {setTimeout(animateMarquee, 1);}}this.each(function (i) {var $marquee = $(this),width = $marquee.attr('width') || $marquee.width(),height = $marquee.attr('height') || $marquee.height(),$marqueeRedux = $marquee.after('<div ' + (klass ? 'class="' + klass + '" ' : '') + 'style="display: block-inline; width: ' + width + 'px; height: ' + height + 'px; overflow: hidden;"><div style="float: left; white-space: nowrap;">' + $marquee.html() + '</div></div>').next(),marqueeRedux = $marqueeRedux.get(0),hitedge = 0,direction = ($marquee.attr('direction') || 'left').toLowerCase(),marqueeState = {dir : /down|right/.test(direction) ? -1 : 1,axis : /left|right/.test(direction) ? 'scrollLeft' : 'scrollTop',widthAxis : /left|right/.test(direction) ? 'scrollWidth' : 'scrollHeight',last : -1,loops : $marquee.attr('loop') || -1,scrollamount : $marquee.attr('scrollamount') || this.scrollAmount || 2,behavior : ($marquee.attr('behavior') || 'scroll').toLowerCase(),width : /left|right/.test(direction) ? width : height};if ($marquee.attr('loop') == -1 && marqueeState.behavior == 'slide') {marqueeState.loops = 1;}$marquee.remove();if (/left|right/.test(direction)) {$marqueeRedux.find('> div').css('padding', '0 ' + width + 'px');} else {$marqueeRedux.find('> div').css('padding', height + 'px 0');}$marqueeRedux.bind('stop', function () {$marqueeRedux.data('paused', true);}).bind('pause', function () {$marqueeRedux.data('paused', true);}).bind('start', function () {$marqueeRedux.data('paused', false);}).bind('unpause', function () {$marqueeRedux.data('paused', false);}).data('marqueeState', marqueeState);newMarquee.push(marqueeRedux);marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);$marqueeRedux.trigger('start');if (i+1 == last) {animateMarquee();}});return $(newMarquee);};}(jQuery));
