if (typeof MOTO === 'undefined') { var MOTO = {}; MOTO.modulesLoaded = []; }

MOTO.Rollover = new Class({
	Implements: [Options],
	
	options: {
		currentClass: 'currentPage',
		stateClasses: {
			_default: 'default',
			over: 'over',
			selected: 'selected',
			current: 'current',
			down: 'down'
		}
	},
	
	events: {
		click: null,
		mouseenter: null,
		mouseleave: null
	},
	
	initialize: function(element) {
		this.element = element;
		
		this.stateElements = new Elements();
		for (var i in this.options.stateClasses) {
			var stateElement = this.getStateElement(this.options.stateClasses[i]);
			if (stateElement) {
				this.stateElements.push(stateElement);
			}
		}
		
		var defaultStateClass = this.options.stateClasses._default;
		if (element.hasClass(this.options.currentClass)) {
			defaultStateClass = this.options.stateClasses.current;
		}
		this.setDefaultState(defaultStateClass);
		var events = this.events;
		events.mouseenter = this.mouseEnter.bind(this);
		events.mouseleave = this.mouseLeave.bind(this);
		events.click = this.click.bind(this);
		this.addEvents();
	},
	
	addEvents: function() {
		var element = this.element;
		var events = this.events;
		element.addEvent('mouseenter', events.mouseenter);
		element.addEvent('mouseleave', events.mouseleave);
		element.addEvent('click', events.click);
	},
	
	removeEvents: function() {
		var element = this.element;
		var events = this.events;
		element.removeEvent('mouseenter', events.mouseenter);
		element.removeEvent('mouseleave', events.mouseleave);
		element.removeEvent('click', events.click);
	},
	
	getStateElement: function(stateClass) {
		return this.element.getElement('.' + stateClass);
	},
	
	setDefaultState: function(stateClass) {
		this.defaultStateClass = stateClass;
		this.setState(stateClass);
	},
	
	showState: function(stateClass) {
		var stateElement = this.getStateElement(stateClass);
		if (stateElement) {
			stateElement.setStyle('display', 'inline');
		}
	},
	
	setState: function(stateClass) {
		this.stateElements.setStyle('display', 'none');
		this.showState(stateClass);
	},

	setInactiveState: function() {
		this.stateElements.setStyle('display', 'none');
		this.showState(this.options.stateClasses._default);
	},
		
	resetState: function() {
		this.setState(this.defaultStateClass);
	},
	
	hasState: function(stateClass) {
		var stateElement = this.getStateElement(stateClass);
		if (stateElement) {
			return true;
		} else {
			return false;
		}
	},

	select: function() {
    	this.setDefaultState(this.options.stateClasses.selected);
    },
	
	deselect: function() {
		this.setDefaultState(this.options.stateClasses._default);
	},
	
	mouseEnter: function() {
		this.setState(this.options.stateClasses.over);
	},
	
	mouseLeave: function() {
		this.resetState();
	},
	
	click: function() {
		if (this.hasState(this.options.stateClasses.down)) {
			this.setState(this.options.stateClasses.down);
		}
	},
	
	destroy: function() {
		this.element = null;
		this.stateElements = null;
	}
	
});