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.bind(this, [i, true]));
		}
	},
	addActionButtons : function(a, b) {
		for ( var i = 0; i < b.length; i++) {
			switch (a) {
				case 'previous' :
					b[i].addEvent(this.button_event, this.previous.bind(this,
							[true]));
					break;
				case 'next' :
					b[i].addEvent(this.button_event, this.next.bind(this,
							[true]));
					break;
				case 'play' :
					b[i].addEvent(this.button_event, this.play.bind(this, [
							this.interval, 'next', false]));
					break;
				case 'playback' :
					b[i].addEvent(this.button_event, this.play.bind(this, [
							this.interval, 'previous', false]));
					break;
				case 'stop' :
					b[i].addEvent(this.button_event, this.stop.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 (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));
			}
		}
	}
});