var noobSlide = new Class(
{
	initialize : function(a) {
		this.items = a.items;
		this.mode = a.mode || 'horizontal';
		this.modes = {
			horizontal : [ 'left', 'width' ],
			vertical : [ 'top', 'height' ]
		};
		this.size = a.size || 240;
		this.box = a.box.setStyle(this.modes[this.mode][1],
				(this.size * this.items.length) + 'px');
		this.button_event = a.button_event || 'click';
		this.handle_event = a.handle_event || 'click';
		this.onWalk = a.onWalk || null;
		this.currentIndex = null;
		this.previousIndex = null;
		this.nextIndex = null;
		this.interval = a.interval || 5000;
		this.autoPlay = a.autoPlay || false;
		this._play = null;
		this.handles = a.handles || null;
		if (this.handles) {
			this.addHandleButtons(this.handles)
		}
		this.buttons = {
			previous : [],
			next : [],
			play : [],
			playback : [],
			stop : []
		};
		if (a.addButtons) {
			for ( var b in a.addButtons) {
				this
						.addActionButtons(
								b,
								$type(a.addButtons[b]) == 'array' ? a.addButtons[b]
										: [ a.addButtons[b] ])
			}
		}
		this.fx = new Fx.Tween(this.box, $extend((a.fxOptions || {
			duration : 500,
			wait : false
		}), {
			property : this.modes[this.mode][0]
		}));
		this.walk((a.startItem || 0), true, true)
	},
	addHandleButtons : function(a) {
		for ( var i = 0; i < a.length; i++) {
			a[i].addEvent(this.handle_event, this.walk.pass(
					[ i, true ], this))
		}
	},
	addActionButtons : function(a, b) {
		for ( var i = 0; i < b.length; i++) {
			switch (a) {
			case 'previous':
				b[i].addEvent(this.button_event, this.previous.pass(
						[ true ], this));
				break;
			case 'next':
				b[i].addEvent(this.button_event, this.next.pass(
						[ true ], this));
				break;
			case 'play':
				b[i].addEvent(this.button_event, this.play.pass( [
						this.interval, 'next', false ], this));
				break;
			case 'playback':
				b[i].addEvent(this.button_event, this.play.pass( [
						this.interval, 'previous', false ], this));
				break;
			case 'stop':
				b[i].addEvent(this.button_event, this.stop.create( {
					bind : this
				}));
				break;
			}
			this.buttons[a].push(b[i])
		}
	},
	previous : function(a) {
		this.walk((this.currentIndex > 0 ? this.currentIndex - 1
				: this.items.length - 1), a)
	},
	next : function(a) {
		this
				.walk(
						(this.currentIndex < this.items.length - 1 ? this.currentIndex + 1
								: 0), a)
	},
	play : function(a, b, c) {
		this.stop();
		if (!c) {
			this[b](false)
		}
		this._play = this[b].periodical(a, this, [ false ])
	},
	stop : function() {
		$clear(this._play)
	},
	walk : function(a, b, c) {
		if (a != this.currentIndex) {
			this.currentIndex = a;
			this.previousIndex = this.currentIndex
					+ (this.currentIndex > 0 ? -1
							: this.items.length - 1);
			this.nextIndex = this.currentIndex
					+ (this.currentIndex < this.items.length - 1 ? 1
							: 1 - this.items.length);
			if(this.currentIndex==0) {
				this.fx = new Fx.Tween(this.box, $extend({
					duration : 0,
					wait : false
				}, {
					property : this.modes[this.mode][0]
				}));
			} else {
				this.fx = new Fx.Tween(this.box, $extend((a.fxOptions || {
					duration : 500,
					wait : false
				}), {
					property : this.modes[this.mode][0]
				}));
			}
			if (b) {
				this.stop()
			}
			if (c) {
				this.fx.cancel().set(
						(this.size * -this.currentIndex) + 'px')
			} else {
				this.fx.start(this.size * -this.currentIndex)
			}
			if (b && this.autoPlay) {
				this.play(this.interval, 'next', true)
			}
			if (this.onWalk) {
				this
						.onWalk(
								(this.items[this.currentIndex] || null),
								(this.handles
										&& this.handles[this.currentIndex] ? this.handles[this.currentIndex]
										: null))
			}
		}
	}
});
