﻿/*
 * AutoScroll Plugin for jQuery
 *
 * Copyright (c) 2006 Jonathan Sharp (jdsharp.us)
 * Licensed under the GPL license.
 *
 * http://jdsharp.us/code/AutoScroll/
 *
 * Date: 2006-09-19
 * Rev: 001
 */
$.autoscroll = {
	settings: 	{},
	interval: 	0,
	event: 		null,

	init: function(opts) {
		$.autoscroll.settings = {
			step: 		80,
			trigger:	75,
			interval: 	80,
			mod_key: 	17
		};
		
		if (opts) {
			for (o in opts) {
				$.autoscroll.settings[o] = opts[o];
			}
		}

		document.onmousemove= $.autoscroll.setMouseEvent;
		document.onmouseout= $.autoscroll.setMouseEnd;
/* 		document.onkeydown 	= $.autoscroll.setKeyEvent;
		document.onkeyup	= function(){ clearInterval($.autoscroll.interval); $.autoscroll.interval = 0; }; */
		$.autoscroll.interval = setInterval($.autoscroll.step, $.autoscroll.settings.interval); //Modification-1 (Start scrolling without KeyDown); Originaly: absent
	//Arrow position init. Namber - max window size.
	 var Scroll_Left_Max=1350-f_clientWidth();
	 var Scroll_Top_Max=997-f_clientHeight();
	 $("#arrow-left").css('opacity',f_scrollLeft()/Scroll_Left_Max);
	 if(Scroll_Left_Max<0) $("#arrow-right").css('opacity',0); else $("#arrow-right").css('opacity',1-f_scrollLeft()/Scroll_Left_Max);
	 $("#arrow-up").css('opacity',f_scrollTop()/Scroll_Top_Max);
	 if(Scroll_Top_Max<0) $("#arrow-down").css('opacity',0); else $("#arrow-down").css('opacity',1-f_scrollTop()/Scroll_Top_Max);
	},

	setMouseEvent: function(e) {
		var e	= e || window.event;
		var de	= document.documentElement;
		var b	= document.body;
		$.autoscroll.event = {
			cursor: {
				x: e.pageX || (e.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0)),
				y: e.pageY || (e.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0))
			},
	
			win: {
				w: window.innerWidth  || (de.clientWidth && de.clientWidth != 0 ? de.clientWidth : b.offsetWidth),
				h: window.innerHeight || (de.clientHeight && de.clientWidth != 0 ? de.clientHeight : b.offsetHeight)
			},
	
			scroll: {
				x: (document.all ? 
						(!de.scrollLeft ? b.scrollLeft : de.scrollLeft)
						:
						(window.pageXOffset ? window.pageXOffset : window.scrollX)
						),
				y: (document.all ? 
						(!de.scrollTop ? b.scrollTop : de.scrollTop)
						:
						(window.pageYOffset ? window.pageYOffset : window.scrollY)
						)
			}
		};
		//var relTarg = e.relatedTarget || e.fromElement;
		//$('#tpl-fix').text(relTarg.tagName);
	},
	
	setMouseEnd: function(e) {
		$.autoscroll.event = {
			cursor: 0,
			scroll: 0
		};
	},	
	
	step: function() {
		var e = $.autoscroll.event;
		if (!e||!e.win) {
			return;
		}

		var hot_l 	= e.scroll.x;
		var hot_r 	= e.scroll.x + e.win.w;
		var x		= e.cursor.x;

		var hot_t	= e.scroll.y + 100; //Modification-2 (Start scrolling on filed top+100px); Originaly: "var hot_t	= e.scroll.y"
		var hot_b	= e.scroll.y + e.win.h;
		var y 		= e.cursor.y;
		
		//Arrow position init. Namber - max window size.
		var Scroll_Left_Max=1350-f_clientWidth();
		var Scroll_Top_Max=997-f_clientHeight();
		flag=0;
	
		if (hot_l <= x && x <= (hot_l + $.autoscroll.settings.trigger)) {
			var ratio 	= (1 - ((x - hot_l) / $.autoscroll.settings.trigger));
			var step	= Math.round(ratio * $.autoscroll.settings.step, 0);
			e.scroll.x += -step; 
			
			//Modification-3
			if(Scroll_Left_Max<0) $("#arrow-right").css('opacity',0); else $("#arrow-right").css('opacity',1-f_scrollLeft()/Scroll_Left_Max);
			$("#arrow-left").css('opacity',f_scrollLeft()/Scroll_Left_Max);
			//if(e.scroll.x<=0) $("#arrow-right").css('opacity',  1);
			//===============
			
			e.cursor.x += -step;
			flag=1;
		} else if ((hot_r - $.autoscroll.settings.trigger) <= x && x <= hot_r) {
			var ratio 	= (1 - ((hot_r - x) / $.autoscroll.settings.trigger));
			var step	= Math.round(ratio * $.autoscroll.settings.step, 0);
			e.scroll.x += step; 
			
			//Modification-4
			$("#arrow-left").css('opacity', f_scrollLeft()/Scroll_Left_Max); 
			if(Scroll_Left_Max<0) $("#arrow-right").css('opacity',0); else $("#arrow-right").css('opacity',1-f_scrollLeft()/Scroll_Left_Max);
			//==============
			
			e.cursor.x += step;
			flag=1;
		}
	
		if (hot_t <= y && y <= (hot_t + $.autoscroll.settings.trigger)) {
			var ratio 	= (1 - ((y - hot_t) / $.autoscroll.settings.trigger));
			var step	= Math.round(ratio * $.autoscroll.settings.step, 0);
			e.scroll.y += -step;
			
			//Modification-5
			if(Scroll_Top_Max<0) $("#arrow-down").css('opacity',0); else $("#arrow-down").css('opacity',1-f_scrollTop()/Scroll_Top_Max); 
			$("#arrow-up").css('opacity', f_scrollTop()/Scroll_Top_Max);
			//===============
			
			e.cursor.y += -step;
			flag=1;
			//$('#tpl-fix').text(hot_t+' - '+hot_t + $.autoscroll.settings.trigger+':'+e.scroll.y +'-'+e.cursor.y); //DEBUG
		} else if ((hot_b - $.autoscroll.settings.trigger) <= y && y <= hot_b) {
			var ratio 	= (1 - ((hot_b - y) / $.autoscroll.settings.trigger));
			var step	= Math.round(ratio * $.autoscroll.settings.step, 0);
			e.scroll.y += step; 
			
			//Modification-6
			$("#arrow-up").css('opacity', f_scrollTop()/Scroll_Top_Max); 
			if(Scroll_Top_Max<0) $("#arrow-down").css('opacity',0); else $("#arrow-down").css('opacity',1-f_scrollTop()/Scroll_Top_Max);
			//==============
			
			e.cursor.y += step;
			flag=1;
		}
	
		if (e.scroll.x < 0) {
			e.scroll.x = 0;
			e.cursor.x = 0;
		}
		if (e.scroll.y < 0) {
			e.scroll.y = 0;
			e.cursor.y = 0;
		}

		if(flag==1) window.scrollTo(e.scroll.x, e.scroll.y);
		//$('#tpl-fix').text(e.scroll.x+' - '+e.scroll.y+':'+$(window).scrollLeft()+'-'+$(window).scrollTop()); //DEBUG
		//$('#tpl-fix').text(e.cursor.x+' - '+e.cursor.y+':'+$(window).scrollLeft()+'-'+$(window).scrollTop()); //DEBUG
	}
};



