BLCMS.Widgets.Slider=new Class({
	Implements: [Options],

	options: {
		style:	'slider',
		
		speed: 70,
		maxspeed: 500,
		fps: 24,
		
		ctrlimages: true,

		accelerate: 15,
		nullspace: 0.4,
		
		margin: 25
	},
	
	slider: null,
	
	speed: null,
	curspeed: 0,
		
	initialize: function(slider, data, options) {
		this.setOptions(options);

		this.slider=slider;
		
		this.preloader=slider.getElement('.preloader');
		this.images=slider.getElement('.images');
		this.title=slider.getElement('.title');
		
		this.prev=slider.getElement('.prev');
		this.next=slider.getElement('.next');
		
		this.images.fade('hide');
		this.title.fade('hide');

		var imgsrc=[];
		data.each(function(img) {
			imgsrc.push(img.image);
		});
		
		this.items=[];
		
		var imgs=Asset.images(imgsrc, {
			onComplete: function() {
				imgs.each(function(el, i) {
					var li=new Element('li');
					
					li.setStyle('position', 'absolute');
					
					el.inject(li);
					
					var d=data[i];
					
					if (d.url) {
						li.addEvent('click', function() { window.location=d.url; }.bind(this));
						li.setStyle('cursor', 'pointer');
					}
					li.addEvent('mouseover', function() { this.onHoverImage(li, el, d, true); }.bind(this));
					li.addEvent('mouseout', function() { this.onHoverImage(li, el, d, false); }.bind(this));
					
					this.items.push(li);
					
					li.inject(this.images);
				}, this);
				
				this.initializeSlider();
			}.bind(this)
		});
		
		if (this.options.ctrlimages) {
			this.images.addEvents({
				mousemove: function(e) {
					var pos=this.images.getPosition();
					var size=this.images.getSize();
					var x=e.client.x;
					
					var mx=((x-pos.x)/size.x-0.5)*2;
	
					if (Math.abs(mx)<this.options.nullspace) mx=0;
					
					this.speed=mx*this.options.maxspeed;
				}.bind(this),
			
				mouseout: function() {
					this.speed=this.options.speed;
				}.bind(this)
			});
		}
		
		if (this.prev && this.next) {
			this.prev.addEvents({
				mousedown: function() {
					this.speed=-this.options.maxspeed;
				}.bind(this),
				
				mouseup: function() {
					this.speed=this.options.speed;
				}.bind(this),
			});
			this.next.addEvents({
				mousedown: function() {
					this.speed=this.options.maxspeed;
				}.bind(this),
				
				mouseup: function() {
					this.speed=this.options.speed;
				}.bind(this),
			});
		}
		
		this.speed=this.options.speed;
	},
	
	onHoverImage: function(li, img, data, hover) {
		if (data.title==null) hover=false;
		
		if (hover) this.title.set('html', data.title);
		
		this.title.fade(hover ? 1 : 0);
	},
	
	initializeSlider: function() {
		this.total=0;
		
		this.items.each(function(el) {
			var imgsize=el.getElement('img').getSize();
			
			var x=this.total;
			
			el.setPosition({x: x, y: 0});
			el.store('x', x);
			el.setStyle('minWidth', imgsize.x);
			
			var size=el.getSize();
			this.total+=size.x+this.options.margin;
		}, this);
		
		this.images.fade(1);
		this.preloader.destroy();
		this.preloader=null;
		
		this.fps=1000/this.options.fps;
		
		switch(this.options.style) {
		case 'slider':
		default:
			this._slider1();
		}
	},
		
	_slider1: function() {
		(function() {
			this.curspeed-=(this.curspeed-this.speed)/this.options.accelerate;
		
			var dx=-this.curspeed/this.options.fps;
			
			var scroll=this.images.getSize();
			
			this.items.each(function(el) {
				var img=el.getElement('img');
				var imgsize=img.getSize();
				
				var size=el.getSize();
				var x=el.retrieve('x');
				var cx=size.x;
				
				x+=dx;
				
				if (dx<0 && x+cx<0) {
					x+=this.total;
				} else if (dx>0 && x>scroll.x) {
					x-=this.total;
				}
				
				el.store('x', x);
				el.setStyle('left', Math.round(x));
				img.setPosition({x: (size.x-imgsize.x)/2, y: (size.y-imgsize.y)/2});
			}, this);
		}).periodical(this.fps, this);
	}
});
