
/*
 * Mootools: Slider, by Limarc /Alexander Lobashev/
 * 
 * (c) 2008-2010 by Limarc, Lim-on Media
 * _link: http://www.free-lance.ru/users/Limarc
 *
 * _version: 1.5
 * 
 */

 var iSlider = new Class
 ({
	 Implements : [Options, Events],
	 
	 options:
	 {
		 wrapper: 'slider-photography',
		 elements: 'photography-elements',
		 element: 'a',
		 controls: {back: 'ctrl-left', next: 'ctrl-right'},
		 size: 4,
		 move: 4,
		 width: 0,
		 fade: true
	 },
	 
	 initialize: function(options)
	 {
		 this.setOptions(options);
		 
		 // -> filtration
		 if (!document.id(this.options.wrapper) || !document.id(this.options.elements))
		 {
			 return;
		 }
		 
		 // -> set params
 		 this.slider =
		 {
			 wrapper: document.id(this.options.wrapper),
			 elements: document.id(this.options.elements),
			 element: this.options.element,
			 id: this.options.elements,
			 controls: {back: document.id(this.options.controls.back), next: document.id(this.options.controls.next)},
			 
			 conf:
			 {
			     element: {width: 0, picture: 0, padding: 0},
			     size: 0,
			     selected: this.options.size,
			     margin: 0
			 },
			 
			 myFx: undefined,
			 scroll: undefined
		 }
		 
		 // -> get defferent
		 this.getDifferent(this);
		 
		 // -> set slider
		 this.setSlider(this);
		 
		 // -> set controls
		 this.setControls(this);
	 },
	 
	 //
	 // -> get defferent
	 //
	 getDifferent: function(element)
	 {
		 //
		 // -> calculate width {one element}
		 //
		 $each(this.slider.elements.getElements(this.slider.element), function(element, index)
		 {
			 //
			 // -> calculate width {one element}
			 //
			 if (index < 1)
			 {
				 this.slider.conf.element.width = (element.getSize().x).toInt();
				 this.slider.conf.element.width += (element.getStyle('margin-right')).toInt() + (element.getStyle('margin-left')).toInt();
				 
				 this.slider.conf.element.padding = (element.getStyle('padding-right')).toInt();
			 }
			 
			 //
			 // -> count element {slider}
			 //
			 this.slider.conf.size = this.slider.conf.size + 1;
		 }
		 .bind(this));
		 
		 // -> set my width
		 if (this.options.width > 0)
		 {
			 this.slider.conf.element.width = this.options.width;
		 }
	 },
	 
	 //
	 // -> slider: effect slide
	 //
	 setSlider: function()
	 {
		 this.slider.myFx = new Fx.Morph(this.slider.id, { wait: true, transition: Fx.Transitions.linear, duration: 500 });
	 },
	 
	 //
	 // -> set controls
	 //
	 setControls: function()
	 {
		 //
		 // -> add events
		 //
		 this.slider.controls.back.addEvents
		 ({
		     click: function (e) { e = new Event(e).stop(); this.iSliding(-this.options.move, this); }.bind(this),
		     dblclick: function (e) { e.stop(); }.bind(this),
		     mouseenter: function() { this.slider.controls.back.addClass('hover'); }.bind(this),
		     mouseleave: function() { this.slider.controls.back.removeClass('hover'); }.bind(this)
		 });
		 
		 this.slider.controls.next.addEvents
		 ({
		     click: function (e) { e = new Event(e).stop(); this.iSliding(this.options.move, this); }.bind(this),
		     dblclick: function (e) { e.stop(); }.bind(this),
		     mouseenter: function() { this.slider.controls.next.addClass('hover'); }.bind(this),
		     mouseleave: function() { this.slider.controls.next.removeClass('hover'); }.bind(this)
		 });
	 },
	 
	 //
	 // -> set template
	 //
	 iSliding: function(index)
	 {
		 this.selected = this.slider.conf.selected + index;
		 
		 //
		 // -> filtration
		 //
		 if (this.selected > this.slider.conf.size)
		 {
		 	 this.slider.conf.margin = 0;
			 this.selected = this.options.size;
		 }
		 else if (this.selected < this.options.size)
		 {
			 this.slider.conf.margin = -(this.slider.conf.size-this.options.size)*this.slider.conf.element.width;
			 this.selected = this.slider.conf.size;
		 }
		 else
		 {
			 this.slider.conf.margin = this.slider.conf.margin - this.slider.conf.element.width*index;
			 this.selected = this.slider.conf.selected + index;
		 }
		 
		 //
		 // -> scrolled
		 //
		 this.slider.myFx.start
		 ({ 
		     'margin-left': this.slider.conf.margin,
		     onStart: function ()
		     {
			     if (this.options.fade) this.slider.elements.fade(0.2);
		     }
		     .bind(this),		     
		     onComplete: function ()
		     {
			     if (this.options.fade) (function () { this.slider.elements.fade(1) }.bind(this) ).delay(500);
		     }
		     .bind(this)
		 })
		 .chain(function()
		 {
		     this.slider.conf.selected = this.selected;
		     this.slider.conf.margin = (this.slider.elements.getStyle('margin-left')).toInt();
		 }
		 .bind(this));	 
	 }
 });