(function($){
	$.fn.scroller = function(options){
		
		var defaults = {  
			direction: "down",
			infiniteScroll: false,
			randomize: false,
			errorCallback: undefined,
			itemMoveCallback: undefined
		};  
		var options = $.extend(defaults, options);
		
		return this.each(function() { //Script uitvoeren voor elk gevonden element.
			var viewport = $(this);
			var wrapper = $(viewport).children()[0];
			
			if (wrapper == undefined || viewport == undefined){
				if(typeof options.errorCallback == 'function'){
					options.errorCallback.call(this, "[001][AenV.Scroller] Wrapper or viewport not found");
				}else{
					throw new Error("[001][AenV.Scroller] Wrapper or viewport not found");
				}
				return;
			}
			
			if(options.randomize){
				$(wrapper).each(function() {
					var elems = $(this).children();
					elems.sort(function() { return (Math.round(Math.random())-0.5); });  

					for(var i=0; i < elems.length; i++)
					$(this).append(elems[i]);      
				});
			}
			
			var viewportHeight = $(viewport).height();
			var wrapperHeight = $(wrapper).height();
			
			if(wrapperHeight < viewportHeight){
				return
			}
			
			var direction = options.direction;
			var Infinitescroll = options.infiniteScroll;
			
			var auto = true;
			var Interval = setInterval(function(){scroll()}, 45);
			
			$(viewport).bind("mouseleave",function(){
				if (auto != false){
					return;
				}
				direction = options.direction;
				auto = true;
				Interval = clearInterval(Interval);
				Interval = setInterval(function(){scroll()}, 45);
			});
	
			$(viewport).bind("mousemove",function(e){
				var x = e.pageX - this.offsetLeft;
				var y = e.pageY - this.offsetTop;
				
				if(Interval == undefined || auto){
					if (auto){
						Interval = clearInterval(Interval);
						auto = false;
					}
					if (y < 50){
						direction = "up";
						Interval = setInterval(function(){scroll()}, 10);
					}
					
					if (y > viewportHeight - 50){
						direction = "down";
						Interval = setInterval(function(){scroll()}, 10);
					}
				}else{
					if (direction == "up" && y > viewportHeight - 50){
						direction = "down";
					}else if(direction == "down" && y < 50){
						direction = "up";
					}else if(y < viewportHeight - 50 && y > 50){
						direction = options.direction;
						Interval = clearInterval(Interval);
					}
				}
			});
			
			function scroll(){
				if(Infinitescroll){
					if(direction == "down"){
						var item = $("div > *:first", viewport);
						if ($(viewport).offset().top - ($(item).offset().top + $(item).outerHeight()) > 0){
							var events;
							if ($(item).data("events") != undefined){
								events = $(item).data("events");
							}
							item.remove();
							$("div > *:last", viewport).after(item);
							$(wrapper).css("top",parseInt($(wrapper).css("top"),10) + $(item).outerHeight() + "px");
							if ($(item).data("events") != undefined){
								$.each(events, function(eventType, data){
									$("div > *:last", viewport).bind(eventType, data[0].data, data[0].handler);
								});
							}
							
							if(typeof options.itemMoveCallback == 'function'){
								options.itemMoveCallback.call(this, $("div > *:last", viewport));
							}
						}
					}else if(direction == "up" && $(wrapper).offset().top == $(viewport).offset().top){
						var item = $("div > *:last", viewport);
						$(wrapper).css("top",parseInt($(wrapper).css("top"),10) - $(item).outerHeight() + "px");
						var events
						if ($(item).data("events") != undefined){
							events = $(item).data("events");
						}
						item.remove();
						$("div > *:first", viewport).before(item);
						if ($(item).data("events") != undefined){
							$.each(events, function(eventType, data){
								$("div > *:first", viewport).bind(eventType, data[0].data, data[0].handler);
							});
						}
						
						if(typeof options.itemMoveCallback == 'function'){
							options.itemMoveCallback.call(this, $("div > *:first", viewport));
						}
					}
				}
			
				if ((parseInt($(wrapper).css("top"),10) > 0 - (wrapperHeight - viewportHeight) && direction == "down") || (parseInt($(wrapper).css("top"),10) < 0 && direction == "up")){
					var x = 0;
					if (direction == "down"){
						x = -1;
					}else if(direction == "up"){
						x = 1;
					}
					$(wrapper).css("top", parseInt($(wrapper).css("top"),10) + x);
				}else{
					if (auto){
						direction = (direction == "down") ? "up" : "down";
					}else{
						Interval = clearInterval(Interval);
					}
				}
			};
			
			
		});
	};
})(jQuery);
