/**************************************************************

	Script	: Image Menu
	Version	: 2.2
	Authors	: Samuel Birch
	Desc	: 
	Licence	: Open Source MIT Licence

**************************************************************/

var ImageMenu = new Class({
	
	getOptions: function(){
		return {
			onOpen: false,
			onClose: Class.empty,
			openWidth: 400,
			transition: Fx.Transitions.quadOut,
			duration: 400,
			open: null,
			border: 0
		};
	},

	initialize: function(elements, options){
		this.setOptions(this.getOptions(), options);
		
		this.elements = $$(elements);
		
		this.widths = {};
		this.widths.closed = this.elements[0].getStyle('width').toInt();
		this.widths.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.qI = 0;
		this.q = {};
		for (var i = 0; i < 20; i++) this.q[i] = -1;
		
		this.fx = new Fx.Elements(this.elements, {wait: false, duration: this.options.duration, transition: this.options.transition});
		
		var obj = this;
		this.fx.addEvent('onComplete', function() { 
			//var debug = document.getElementById('debug');
			//debug.innerHTML = debug.innerHTML + ' C';
			while(true) {
				if (obj.q[obj.qI] == -1) return;
				var i = obj.q[obj.qI];
				obj.q[obj.qI] = -1;
				//debug.innerHTML = debug.innerHTML + ' D=(' + obj.qI + '=>' + i + ')';
				obj.qI++;
				if (obj.qI >= 20) obj.qI = 0;
				this.elements[i].lastChild.src = 'http://www.eusoff.nus.edu.sg/ihg0809/wp-content/themes/ihg0809/images/small'+(i+1)+'.jpg';
			}
		});
		
		this.elements.each(function(el,i){
			
			el.addEvent('mouseenter', function(e){
				new Event(e).stop();
				this.reset(i);
				// huy ew: add directory
				
				//var debug = document.getElementById('debug');
				//debug.innerHTML = debug.innerHTML + ' E';
				
				var k = obj.qI;
				var l;
				//debug.innerHTML = debug.innerHTML + '{';
				for (var j = 0; j < 20; j++, k = (k + 1) % 20)  {
					if (obj.q[k] == -1) break;
					//debug.innerHTML = debug.innerHTML + k + ', ';
					if (obj.q[k] == i) {
						//debug.innerHTML = debug.innerHTML + ' R=(' + k + '=>' + obj.q[k] + ')';
						obj.q[k] = -1;
						if (k >=20) l = 0; else l = k + 1;
						for (var m = k; obj.q[m] > -1 || l == k; l = (l + 1) % 20, m = (m + 1) % 20) {
							obj.q[m] = obj.q[l];
						}
					}
				}
				//debug.innerHTML = debug.innerHTML + '} ';
				//alert('beh!');
				this.elements[i].lastChild.src = 'http://www.eusoff.nus.edu.sg/ihg0809/wp-content/themes/ihg0809/images/full'+(i+1)+'.jpg';
				
			}.bind(this));
			
			el.addEvent('mouseleave', function(e){
				new Event(e).stop();
				this.reset(this.options.open);
				
				//var debug = document.getElementById('debug');
				//debug.innerHTML = debug.innerHTML + ' L';
				
				for (var j = 0; j < 20; j++ ){
					if (this.q[(j + this.qI) % 20] == -1) {
						this.q[(j + this.qI) % 20] = i;
						//debug.innerHTML = debug.innerHTML + ' A=' + i;
						break;
				}} 
				
			}.bind(this));
			
			var obj = this;
			
			el.addEvent('click', function(e){

				if(obj.options.onOpen){
					new Event(e).stop();
					if(obj.options.open == i){
						obj.options.open = null;
						obj.options.onClose(this.href, i);
					}else{
						obj.options.open = i;
						obj.options.onOpen(this.href, i);
					}
					
					
				}
				
			})
			
		}.bind(this));
		
		if(this.options.open){
			if($type(this.options.open) == 'number'){
				this.reset(this.options.open);
			}else{
				this.elements.each(function(el,i){
					if(el.id == this.options.open){
						this.reset(i);
					}
				},this);
			}
		}
		
	},
	
	reset: function(num){
		if($type(num) == 'number'){
			var width = this.widths.openOthers;
			if(num+1 == this.elements.length){
				width += this.options.border;
			}
		}else{
			var width = this.widths.closed;
		}
		
		var obj = {};
		this.elements.each(function(el,i) {
			var w = width;
			if(i == this.elements.length-1) {
				w = width+5
			}
			obj[i] = {'width': w};
		}.bind(this));
		
		if($type(num) == 'number'){
			obj[num] = {'width': this.widths.openSelected};
		}
				
		this.fx.start(obj);
	}
	
});

ImageMenu.implement(new Options);
ImageMenu.implement(new Events);


/*************************************************************/