/*
* jQuery autoscroll plugin
*
* Copyright 2008 Wilker Lucio <wilkerlucio@gmail.com>
* 
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* 
*     http://www.apache.org/licenses/LICENSE-2.0
* 
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. 
*/
AUTOSCROLL_X = 1; AUTOSCROLL_Y = 2; AUTOSCROLL_BOTH = 3; (function($) { $.autoscroll = {}; $.autoscroll.Easemove = function() { this.current_point = 0; this.end_point = 0; this.running = false; this.speed = .07; this.onmove = function() { }; }; $.autoscroll.Easemove.prototype = { set_end_point: function(point) { this.end_point = point; if (this.running) { return; }; this.running = true; this.move(); }, move: function() { var distance = this.end_point - this.current_point; var move = distance * this.speed; this.current_point += move; this.onmove(this.current_point); if (Math.round(this.current_point) != this.end_point) { var t = this; setTimeout(function() { t.move(); }, 20); } else { this.running = false; } } }; $.autoscroll.zip = function() { var items = $.makeArray(arguments); var callback = items.shift(); var results = []; for (var i = 0; i < items[0].length; i++) { var line = []; for (var x = 0; x < items.length; x++) { line.push(items[x][i]); }; results.push(callback.apply(this, line)); }; return results; }; $.fn.autoscroll = function(mode, degree_window, speed) { mode = mode || AUTOSCROLL_BOTH; degree_window = degree_window || [20, 20]; speed = speed || .07; var directions = ['left', 'top']; return this.each(function() { var container = $(this); var inner_container = container.children(':first'); var ava_size = [container.width(), container.height()]; var position = inner_container.css('position'); inner_container.css('position', 'absolute'); var real_size = [inner_container.width(), inner_container.height()]; inner_container.css('position', position); var offset = container.offset(); offset = [offset.left, offset.top]; var easemove = []; jQuery.each(directions, function(i, v) { var obj = new jQuery.autoscroll.Easemove(); obj.speed = speed; obj.onmove = function(position) { inner_container.css('margin-' + v, -position); }; easemove.push(obj); }); container.mousemove(function(event) { var mouse = [event.pageX, event.pageY]; jQuery.autoscroll.zip(function(m, o, a, r, e, w, t) { if (!(t & mode)) return; var d = m - o; d = Math.min(Math.max(d - w, 0), a - w * 2); var f = d / (a - w * 2); var real = f * (r - a); e.set_end_point(real); }, mouse, offset, ava_size, real_size, easemove, degree_window, [AUTOSCROLL_X, AUTOSCROLL_Y]); }); }); }; })(jQuery);

