function NXSlide() {
	var settings = {};
	var timer = null;
	this.init = function(id, properties) {
		var root = document.getElementById(id);
		if (!root) return 1;

		var display = root.getElementsByClassName('display')[0];
		if (!display) return 1;
		var slides = display.childNodes;
		
		for (var i=slides.length-1; i>-1; i--) {
			if (slides[i] instanceof Text || slides[i] instanceof Comment) {
				display.removeChild(slides[i]);
			}
		}	
		
		var footer = root.getElementsByClassName('footer')[0];		
		if (!display) return 1;
		while (footer.childNodes.length) {
			footer.removeChild(footer.firstChild);
		}
		for (var i=0, c=slides.length; i<c; i++) {
			var bullit = document.createElement('a');
			bullit.appendChild(document.createTextNode('\u2022'));
			bullit.setAttribute('href', '#');
			bullit.setAttribute('onclick', "return NXSlide.gotoSlide('"+id+"','"+(i+1)+"')");
			footer.appendChild(bullit);
		}		
		var bullits = footer.childNodes;
		var current;
		for (var i=slides.length-1; i>-1; i--) {
			if (slides[i].hasClassName('selected')) {
				current = slides[i];
				bullits[i].addClassName('selected');
			}
		}

		if (current) {
			display.style.left = (current.offsetLeft*-1) + 'px';
		}
		else {
			slides[0].addClassName('selected');
			bullits[0].addClassName('selected');
			current = slides[0];
		}
		
		var nextLink = root.getElementsByClassName('next')[0];
		nextLink.setAttribute('onclick', "return NXSlide.nextSlide('"+id+"')");
		var previousLink = root.getElementsByClassName('previous')[0];
		previousLink.setAttribute('onclick', "return NXSlide.previousSlide('"+id+"')");
		
		if (display.firstElementChild == display.lastElementChild) {
			nextLink.addClassName('disabled');
			previousLink.addClassName('disabled');
		}
		else if (display.lastElementChild == current) {
			nextLink.addClassName('disabled');
			previousLink.removeClassName('disabled');
		}
		else if (display.firstElementChild == current) {
			nextLink.removeClassName('disabled');
			previousLink.addClassName('disabled');
		}
		
		settings[id] = {
			_root: root,
			_display: display,
			_footer: footer,
		}
		for (var prop in properties) {
			settings[id][prop] = properties[prop]
		}

		if (settings[id].autoplay) {
			if (!settings[id].delay) settings[id].delay = 2000;
			timer = setInterval(function() {
				autoplay(id);
			}, settings[id].delay);
		}
	}
	
	this.gotoSlide = function(id, slideNum) {
		toggleDisplay(id, 'goto', slideNum);
		return false;
	}
	
	this.previousSlide = function(id) {
		toggleDisplay(id, 'previous');
		return false;
	}
	
	this.nextSlide = function(id) {
		toggleDisplay(id, 'next');
		return false;
	}
	
	function autoplay(id) {
		var root = settings[id]._root;
		var display = settings[id]._display;
		var currentSlide = display.getElementsByClassName('selected')[0];
		NXSlide.nextSlide(id);
		if (!currentSlide.nextElementSibling) {
			clearInterval(timer);
			timer = null;
		}
	}
	
	function toggleDisplay(id, action, slideNum) {
		var root = settings[id]._root;
		if (!root || root.hasClassName('inprogress')) return 1;
		var display = settings[id]._display;
		var footer = settings[id]._footer;
		var currentBullits = footer.getElementsByClassName('selected')[0];
		var currentSlide = display.getElementsByClassName('selected')[0];
		var nextSlide;
		if (slideNum) {
			var currentSlideNum;
			for (var i=0, c=display.children.length; i<c; i++) {
				if (display.children[i].hasClassName('selected')) {
					currentSlideNum = i+1;
					break;
				}
			}
			if (currentSlideNum == slideNum) return 1;
			nextSlide = display.children[slideNum-1];
		}
		else {
			nextSlide = (action == 'next') ? 
				currentSlide.nextElementSibling : 
				currentSlide.previousElementSibling;
		}
		
		if (nextSlide) {
			var nextLink = root.getElementsByClassName('next')[0];
			var previousLink = root.getElementsByClassName('previous')[0];
	
			if (display.lastElementChild == nextSlide) {
				nextLink.addClassName('disabled');
				previousLink.removeClassName('disabled');
			}
			else if (display.firstElementChild == nextSlide) {
				nextLink.removeClassName('disabled');
				previousLink.addClassName('disabled');
			}
			else {
				nextLink.removeClassName('disabled');
				previousLink.removeClassName('disabled');		
			}

			root.addClassName('inprogress');
			currentSlide.removeClassName('selected');
			nextSlide.addClassName('selected');
			var transition = new NXTransition(display, {
				type: NX.Move,
				easing: settings[id].easing||NX.EaseOutRegular,
				duration: settings[id].speed||400,
				param: {
					x: (nextSlide.offsetLeft*-1),
				},
				onFinished: function(node) {
					root.removeClassName('inprogress');
					currentBullits.removeClassName('selected');
					if (slideNum) {
						var nextBullit = footer.children[slideNum-1];
						nextBullit.addClassName('selected');
					}
					else {
						var nextBullit = (action == 'next') ? 
							currentBullits.nextElementSibling : 
							currentBullits.previousElementSibling;
						nextBullit.addClassName('selected');
					}
					
					if (settings[id].onSlideFinish) {
						window.setTimeout(function() {
							settings[id].onSlideFinish(id);
						}, 1);
					}
				}
			})
			transition.start();
			if (settings[id].onSlideStart) {
				window.setTimeout(function() {
					settings[id].onSlideStart(id);
				}, 1);
			}
		}
	}
}
NXSlide = new NXSlide;

