
var Slide = {

	frameTime: 50,
	frameStep: 5,
	frameWheel: 20,
	frameJump: 50,

	wrap: null,
	slide: null,
	timer: null,

	// d&d
	moveListener: null,
	upListener: null,
	dragStartEle: null,
	prevMouseX: null,

	controls: {
		left: null,
		right: null
	},
	LEFT: 1,
	RIGHT: 2,

	init: function() {
		Slide.wrap = document.getElementById("slide-wrap2");
		Slide.slide = document.getElementById('slide');
		},

	gms: function() {
		// get max scroll
		return Slide.slide.scrollWidth - Slide.slide.offsetWidth;
	},

	controlOver: function(e) {
		if (e == "right") Slide.start(Slide.RIGHT);
		else Slide.start(Slide.LEFT);
		},

	controlOut: function(e) {
		Slide.stop();
	},

	controlDown: function(e) {
		var dir = (e.currentTarget == Slide.controls.right)
					? Slide.RIGHT
					: Slide.LEFT
		Slide.frame(dir, Slide.frameJump);
		e.stopPropagation();
	},

	wrapWheel: function(e) {
		var dir, delta = 0;
		if (e.wheelDelta) {
			delta = e.wheelDelta / 120;
			window.opera && (delta =  - delta);
		} else if (e.detail) {
			delta = - e.detail / 3
		}
		if (delta != 0) {
			dir = delta > 0 ? Slide.LEFT : Slide.RIGHT;
			Slide.frame(dir, Slide.frameWheel);
		}
		e.preventDefault();
	},

	dragAndDrop: function(e) {
		switch (e.type) {
			case 'mousedown':
				e.preventDefault(); // avoid FF internal image dragging
				Slide.dragStartEle = e.target;
				Slide.moveListener.listen();
				Slide.upListener.listen();
				Slide.dragStartEle.onselectstart = Slide.dragStartEle.ondrag = function(){return false;}
				ClassName.add(document.body, 'slide-dragging');
			break;
			case 'mousemove':
				var move = (e.clientX + Viewport.getScrollLeft()) - Slide.prevMouseX;
				if (move > 0) {
					Slide.frame(Slide.LEFT, move)
				} else {
					Slide.frame(Slide.RIGHT, +(-move))
				}
			break;
			case 'mouseup':
				Slide.moveListener.stopListen();
				Slide.upListener.stopListen();
				Slide.dragStartEle.onselectstart = Slide.dragStartEle.ondrag = null;
				ClassName.remove(document.body, 'slide-dragging');
			break;
		}
		Slide.prevMouseX = e.clientX + Viewport.getScrollLeft();
	},

	start: function(dir) {
		Slide.timer = window.setInterval(function(){
			Slide.frame(dir, Slide.frameStep);
		}, Slide.frameTime);
	},

	stop: function() {
		window.clearInterval(Slide.timer);
	},

	frame: function(dir, step) {
		// TODO: better support for IE 5.0
		if (dir == Slide.RIGHT && Slide.slide.scrollLeft >= Slide.gms()) {
			var img = Slide.slide.getElementsByTagName('img')[0];
			Slide.slide.appendChild(img);
			Slide.slide.scrollLeft = Slide.gms() - img.offsetWidth;
		} else if (dir == Slide.LEFT && Slide.slide.scrollLeft < 1) {
			var images = Slide.slide.getElementsByTagName('img')
			var img = images[images.length - 1];
			Slide.slide.insertBefore(img, Slide.slide.firstChild);
			Slide.slide.scrollLeft = img.offsetWidth;
		}
		Slide.slide.scrollLeft +=  (dir == Slide.RIGHT) ? step : -step
	}

}

