/*
---
name: ImageMenu
description: horizontal menu, reveals more of the image as you rollover it.

license: Open Source MIT Licence
authors: Samuel Birch

requires: [Core/Fx.CSS, Core/Fx.Transitions, More/Fx.Elements]
provides: ImageMenu

...
*/


var ImageMenu = new Class({

	Implements: [Options, Events],

	options: {/*
		onOpen: function(){},
		onClose: function(){},
		onClick: function(){},
		onClickOpen: function(){},
		onClickClose: function(){},*/
		openWidth: 200,
		openOnClick: true,
		transition: Fx.Transitions.Quad.easeOut,
		duration: 400,
		open: null,
		border: 0
	},

	initialize: function(elements, options){
		this.elements = $$(elements);
		this.setOptions(options);

		this.widths = {
			closed: this.elements[0].getStyle('width').toInt(),
			openSelected: this.options.openWidth
		};
		this.widths.openOthers = Math.round(((this.widths.closed * this.elements.length) - (this.widths.openSelected + this.options.border)) / (this.elements.length - 1));

		this.fx = new Fx.Elements(this.elements, {
			link: 'cancel',
			duration: this.options.duration,
			transition: this.options.transition
		});

		var self = this;

		this.elements.each(function(el, i){

			el.addEvents({

				mouseenter: function(e){
					self.reset(i);
					self.fireEvent('open', [el, i]);
				},

				mouseleave: function(e){
					self.reset(self.options.open);
					self.fireEvent('close', [el, i]);
				}

			});

			if (self.options.openOnClick) el.addEvent('click', function(e){
				e.stop();
				self.options.open = (self.options.open == i) ? null : i;
				var event = (self.options.open == i) ? 'Close' : 'Open';
				self.fireEvent('click' + event, [this.href, i])
					.fireEvent('click', [this.href, i]);
			});

		});


		if (this.options.open != null){
			var isNumber = typeOf(this.options.open) == 'number',
				open = isNumber ? this.options.open : this.elements.indexOf(document.id(this.options.open));

			this.reset(open);
		}

	},

	reset: function(num){

		var isNumber = typeOf(num) == 'number',
			obj = {},
			width;

		if (isNumber){
			width = this.widths.openOthers;
			if ((num + 1) == this.elements.length) width += this.options.border;
		} else {
			width = this.widths.closed;
		}

		this.elements.each(function(el, i){
			var w = width;
			if (i == (this.elements.length - 1)) w = width + 5;
			obj[i] = {width: w};
		}, this);

		if (isNumber) obj[num] = {width: this.widths.openSelected};

		this.fx.start(obj);

	}

});

