/**

* @version		$Id: qscroller.js 00002 2010-10-10 00:00:00 TrungDuong $

* @package		Joomla

* @subpackage	Horizontal Scroll Module

* @link 		http://www.netqcreative.com

* @copyright	Copyright (C) NetQ Creative sofware http://www.netqcreative.com

* @license		GNU/GPL

*/

var QScroller = new Class({

	options: {

		slides: 'qslide',

		direction: 'h',

		duration: 3000,

		auto: false,

		delay: 1000,

		transition: Fx.Transitions.linear

	},

	initialize: function(wrapper,options) {

		this.setOptions(options);

		this.wrapper = $(wrapper);

		this.wrapper.setStyles({

			position: 'relative',

			overflow: 'hidden'

		});

		this.wrapper.addEvent('mouseenter', this.fireEvent.pass('onMouseEnter',this));

		this.wrapper.addEvent('mouseleave', this.fireEvent.pass('onMouseLeave',this));

				

		this.slideOut = new Element('div').setStyles({

			position: 'absolute',

			overflow: 'hidden',

			top: 0,

			left: 0,

			width: this.wrapper.getStyle('width'),

			height: this.wrapper.getStyle('height')

		}).injectInside(this.wrapper);



		this.slideIn = this.slideOut.clone();

		this.slideIn.injectInside(this.wrapper);

				

		this.slides = $$('.'+this.options.slides);

		

		if($defined(this.options.buttons)) {

			if($defined(this.options.buttons.next)) {

				$(this.options.buttons.next).addEvent('click', this.next.bind(this));

			}

			if($defined(this.options.buttons.prev)) {

				$(this.options.buttons.prev).addEvent('click', this.prev.bind(this));

			}	

			if($defined(this.options.buttons.play)) {

				$(this.options.buttons.play).addEvent('click', this.play.bind(this));

			}	

			if($defined(this.options.buttons.stop)) {

				$(this.options.buttons.stop).addEvent('click', this.stop.bind(this));

			}	

		}

		this.auto = this.options.auto;

		this.idxSlide = 0;

		this.step = 0;

		this.isFirst = true;

	},

	load: function() {

		if(!this.isFirst) {

			this.idxSlide += this.step;

			if(this.idxSlide > this.slides.length-1) {

				this.idxSlide = 0;

			} else if(this.idxSlide < 0) {

				this.idxSlide = this.slides.length-1;

			}

		}

		this.curSlide = this.slides[this.idxSlide].clone();

		this.show();

	},

	show: function() {

		var slide = this.slideIn.getElement('div');

		if(slide) {

			slide.replaceWith(this.curSlide);

		} else {

			this.curSlide.injectInside(this.slideIn);

		}

		this.doEffect();

	},

	doEffect: function() {

		this.fxOn = true;

		var d = this.isFirst ? 0:this.options.duration;

		var t = this.options.transition;

		

		var fxObj = this.slideIn.effects({

			duration:d,

			transition: t

		});

		var inX = 0;

		var inY = 0;

		var outX = 0;

		var outY = 0;

		var ww = this.wrapper.getStyle('width').toInt();

		var wh = this.wrapper.getStyle('height').toInt();

		if(this.step > 0) {

			if(this.options.direction == 'h') {

				inX = -ww;

				outX = ww;

			} else {

				inY = -wh;

				outY = wh;

			}

		} else {

			if(this.options.direction == 'h') {

				inX = ww;

				outX = -ww;

			} else {

				inY =  wh;

				outY = -wh;

			}

		}

		if(this.isFirst) {

			if(this.auto) {

				this.step = 1;

			}

			this.isFirst = false;

		}

		fxObj.start({

			top: [inY, 0],

			left: [inX, 0],

			opacity: [1, 1]

		});

		this.slideOut.effects({

			duration: d,

			transition: t

		}).start({

			top: [0, outY],

			left: [0, outX]

		});

		

		this.fxEnd.delay(d + 75, this);

	},

	fxEnd: function() {

		this.fxOn = false;

		this.swapSlides();

		if(this.auto) {

			$clear(this.timer);

			this.timer = this.load.delay(this.options.delay, this);

		}

	},

	stop: function(){

		$clear(this.timer);

		this.auto = false;

	},

	play: function() {

		if(!this.auto ) {

			$clear(this.timer);

			this.auto=true;

			this.step = 1;

			if(!this.fxOn) {

				this.load();

			}

		}

	},

	next: function() {

		this.stop();

		if(this.fxOn) { return; }

		this.step = 1;

		this.load();

	},

	prev: function() {

		this.stop();

		if(this.fxOn) { return; }

		this.step = -1;

		this.load()

	},

	swapSlides: function() {

		this.slideOut.setStyles({

			zIndex: 0,

			opacity: 0

		});

		var t = this.slideOut;

		this.slideOut =this.slideIn;

		this.slideIn = t;

	}

});

QScroller.implement(new Options, new Events);
