/*
 * Maki Scroll - a delicious scroll jQuery plugin
 *
 * Copyright (c) 2009 Dahito - dahito@gmail.com
 *
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Last revised: 31/10/2009
 *
 */
(function($){
	$.fn.MakiScroll = function(settings) {
		this.each(function(){
			new $.MakiScroll(this, settings);
			}
		);
		return this;
    };
	
	var defaults = {
		className: 'maki-scroll',
		frameRate: 25, //No of movements per second
		speed: 1, //No of pixels per frame
		maxSpeed: 7,
		pauseOnHover: true
	};
	
	// Class
	$.MakiScroll = function(el,o) {	
		var self = this;
	
		this.o = $.extend({}, defaults, o || {});
		
		//called on ul/ol/div etc
		this.$list = $(el);
		
		//generate extra markup
		this.$list.addClass('maki-scroll-list')
			.wrap('<div class="maki-scroll-clip"></div>')
			.parent().wrap('<div class="' + this.o.className + ' maki-scroll-container"></div>');
		this.$list.parent().parent()
			.prepend('<div class="maki-scroll-preload"></div>')
				
		self.preload();	
	};
	$.MakiScroll.fn = $.MakiScroll.prototype = {};
	$.MakiScroll.fn.extend  = $.MakiScroll.extend = $.extend;
	
	$.MakiScroll.fn.extend({
		preload: function(){
			this.count = 0;			
			this.$items = this.$list.children(); // UL .maki-scroll-list 
			this.$clip = this.$list.parent(); // DIV .maki-scroll-clip
			this.$container = this.$clip.parent(); // DIV .maki-scroll-container
			this.$preload = this.$container.find('.maki-scroll-preload');
			this.$clip.css('height', '180px');
			
			var self = this
			
			// Preload Images
			this.$list.find('img').each(function(){				
				img = $('<img />'); //new Image();
				img.attr('src', $(this).attr('src'));
				// Update Preload Info
				img.load(function(){
					self.count ++;
					self.$preload.html($('<p>Loading &nbsp;'+self.count+' / '+self.$items.length+'</p>'));
				});		
			});
			
			// Check preload status
			$(window).load(function(){				
				self.init();					
			});
		},
		init: function(){
			//shortcuts
			this.speed = this.o.speed;
			this.movement = "forward";
			this.clipMax = this.$clip.width();
			this.posMax = 0;
			this.$items.css('float', 'left');
			var self = this			
			jQuery.each( this.$items, function(o){				
				self.posMax += $(this).width();				
			});

			this.$list.css('width', (this.posMax) +'px');
			var addItems = this.$items.length;
			this.$items.slice(0,addItems).clone(true).appendTo(this.$list);
			this.$items.slice(0,addItems).clone(true).appendTo(this.$list);
			this.$list.css('width',  (this.posMax * 3)+'px');
			this.$list.css('left',  -this.posMax+'px');
			
			
			this.interval = null;
			this.intervalDelay = Math.floor(1000 / this.o.frameRate);
			
			this.funcMoveReset = function(){
				self.speed = self.o.speed;	
			};			
			this.funcMoveBack = function() {
				self.movement = "back";	
				self.speed = self.o.speed * 4;		 
			};
			this.funcMoveForward = function() { 
				self.movement = "forward";
				self.speed = self.o.speed * 4;	
			};
			
			this.funcMoveStop = function() { 
				self.speed = 0;
			};

			this.$list.hide(0);
			this.$preload.fadeOut(500, function(){
				self.$list.fadeIn(1000, function(){				
					self.$clip.animate({'height': self.$list.height()+'px'}, 500, function(){
						self.move();
						self.mouseListener();
					});				
				});
			});
		},
		mouseListener: function(){
			var self = this;
			var pos = this.$container.offset();
			var width = this.$container.width();
			var over = 400;
			var rght = width -over;
			var xmax = this.o.maxSpeed;
			var speed_offset = xmax - this.o.speed;
			
			this.$container.mousemove(function(e){
				var x = e.pageX - pos.left;
				var y = e.pageY - pos.top;				

				if ( x < over){
					self.movement = 'back';				
					self.speed = self.o.speed + Math.round((over -x) / over * speed_offset);
				} 
				else if ( x > rght ) {
					self.movement = 'forward';
					self.speed = self.o.speed + Math.round((x-rght) / over * speed_offset);
				}
				else {
					self.speed = 0;
					
				}
//				$('#debug').html(x +', '+ y +'<br/>' + pos.left +', '+ pos.top);	    
//				$('#debug').append($('<p>Sped: '+self.speed+'<br/>Dir: '+self.movement+'</p>'));
   			});
		},
		
		move: function(){
			var self = this;
			self.interval = setInterval(function() {				
				lft = self.$list.position().left;	
//				$('#debug').html($('<p>Sped: '+self.speed+'<br/>Dir: '+self.movement+'</p>'));	
//				$('#debug').append($('<p>PosMAX x 2: '+self.posMax * 2+'</p>'));
				if (self.movement == "forward") {					
					if (lft > (-self.posMax * 2) ){
						self.$list.css('left', (lft - self.speed) + "px");
					}
					else {
						self.$list.css('left', (-self.posMax)+'px');
					}
				}
				else {
					if (lft <  (0)) {
						self.$list.css('left', (lft + self.speed) + "px");
					}
					else {
						self.$list.css('left', (-self.posMax)+'px');
					}					
				}
			}, self.intervalDelay);
		},
		reset: function(){
			this.$list.css('left', -self.posMax+"px");
			this.$list.css('top', '0px');
		}
	});
})(jQuery);
