// -----------------------------------------------------------------------------------
// ImageSlider v1.2
// http://travisjbeck.com/blog/javascript/the-imageslider-mootools-class/
// by Travis Beck - http://travisjbeck.com
// Last Modification: 10/6/08
//
//
// Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
//    - Free for use in both personal and commercial projects
//    - Attribution requires leaving author name, author link, and the license info intact.
// -----------------------------------------------------------------------------------

var ImageSlider = new Class
(
	{
		Implements:[Options,Events],
		options:{objToSlide: '',
		sliderElements: '',
		numOfElementsToSlide: 2,
		numOfElementsShown: 3,
		leftBtn: '',
		rightBtn: '',
		easing: Fx.Transitions.Expo.easeInOut
	},

	initialize: function(options)
	{
		this.setOptions(options);
		this.options.objToSlide = $(this.options.objToSlide);
		if(!(this.options.objToSlide))
		{
			return false;
		}
		this.setup();
	},

	setup: function()
	{
		var o = this.options;
		o.sliderElements = (o.objToSlide.getElements(o.sliderElements));
		o.leftBtn = $(o.leftBtn);
		o.rightBtn = $(o.rightBtn);
		o.objToSlide.setStyles({position:'relative',left:0});
		var element = $(o.sliderElements[0]);
		var margins = parseFloat(element.getStyle('margin-left')) + parseFloat(element.getStyle('margin-right'));
		var size = element.getSize();
		o.elementWidth = size.x + margins;
		o.objToSlide.setStyle('width',(o.elementWidth * o.sliderElements.length));
		o.index = 0;
		o.total = o.sliderElements.length - o.numOfElementsShown;
		o.totalMoves =- (o.total/o.numOfElementsToSlide);
		o.myFx = new Fx.Morph(o.objToSlide,{
			duration: 500,
			transition: o.easing,
			link: 'chain'
		});
		o.leftBtn.addEvent("mousedown", this.leftClick.bindWithEvent(this));
		o.rightBtn.addEvent("mousedown", this.rightClick.bindWithEvent(this));
	},

	leftClick: function(e)
	{
		e.stop();
		if (this.sliding)
		{
			return;
		}
		var o = this.options;
		var newPos;
		o.index += 1;
		if (o.index < 0)
		{
			newPos = (o.elementWidth * o.numOfElementsToSlide) * o.index;
		} else
		{
			o.index = 0;
			newPos = 0;
		}
		var cur = o.objToSlide.getCoordinates(o.objToSlide.getParent()).left;
		if (cur == newPos)
		{
			return false;
		}
		this.slide(newPos);
	},

	rightClick: function(e)
	{
		e.stop();
		if (this.sliding)
		{
			return;
		}
		var o = this.options;
		var newPos;
		o.index -= 1;
		if (o.index >= o.totalMoves)
		{
			newPos = (o.elementWidth * o.numOfElementsToSlide) * o.index;
		} else
		{
			// End reached
			o.index = o.totalMoves;
			newPos = (o.elementWidth * o.numOfElementsToSlide) * o.index;
		}
		var cur = o.objToSlide.getCoordinates(o.objToSlide.getParent()).left;
		if (cur == newPos)
		{
			return false;
		}
		this.slide(newPos);
	},

	slide: function(newPos)
	{
		this.sliding = true;
		this.options.myFx.start({'left':newPos}).chain(
			function()
			{
				this.sliding = false;
				this.fireEvent('onSlideComplete',this.options.index);
			}.bind(this)
		);
	},

	slideTo: function(pos)
	{
		if ($type(pos) != "number")
		{
			return false;
		}
		var o = this.options;
		pos = pos + 1;
		var newPos;
		o.index =-(((pos-o.numOfElementsShown) / o.numOfElementsToSlide).round());
		if (o.index >= o.totalMoves)
		{
			newPos = (o.elementWidth * o.numOfElementsToSlide) * o.index;
		} else
		{
			o.index = o.totalMoves;
			newPos = (o.elementWidth * o.numOfElementsToSlide) * o.index;
		}
		this.slide(Math.min(0,newPos));
	}
});
