// JScript source code


function setdeb(text) {
	var deb = $('_debug');
	if(!deb) {
		deb = new Element('div');
		deb.setStyles({position:'absolute', left:'0px', top:'0px', width:'300px', backgroundColor:'#FFFFFF'});
		deb.id = '_debug';
		deb.inject(document.body);
		
	}
		
	if(deb)
		deb.innerHTML += '<br/>' + text;	
}

var navslide = new Class({
	initialize: function(options) {
		if(options.container) {
			this.container	= $pick($(options.container), document.body);
			this.timing = $pick(options.timing, {transition:Fx.Transitions.Sine.easeOut, duration:1000});
			var selector	= $pick(options.selector, '');
			this.panes		= this.container.getElements(options.selector); 
			if(this.panes.length) {
				var first		= null;
				var leftrun		= 0;
				for(var i = 0; i < this.panes.length; i++) {
					this.panes[i].initialleft	= leftrun;
					leftrun += options.delta[i];
					this.panes[i].next			= $pick(this.panes[i+1], null);
					this.panes[i].previous		= first;
					first = this.panes[i];
				}
				for(var i = 1; i < this.panes.length; i++) {
					this.panes[i].animation = new Fx.Style(this.panes[i], 'left', this.timing);
				}
				this.distance		= this.container.getCoordinates().width - leftrun;
				this.allpanes(this.initpanes.bind(this), this.distance, this.panes[0]);
				this.initialindex = 0;
				this.expand({target:this.panes[0]});
				this.container.addEvent('mouseleave', this.reset.bindWithEvent(this));
				this.running = {};		
			}	
		}
	},
	reset: function() {
		this.panes.each(function(pane, i) {
			var dir = i - this.initialindex;
			this.move(pane, i - this.initialindex, i); 
		}, this);
		this.openpane = this.panes[0];
	},
	initpanes: function(pane, distance, loop) {
		this.setleft(pane, pane.initialleft);
		pane.ultimateleft = pane.initialleft + distance;
		pane.addEvent('mouseenter', this.expand.bindWithEvent(this));
		pane.addEvent('mouseleave', this.reset.bindWithEvent(this));
		return false;
	},
	allpanes: function(fn, params, startpane, endpane) {
		var pane = $pick(startpane, this.panes[0]);
		var nrun = 0;
		while($defined(pane)) {
			var res = fn(pane, params, nrun++);
			if(res !== false)
				return res;
			pane = pane.next;
			if(pane == endpane)
				return;
		}
	},
	setleft: function(pane, left) {
		pane.effect('left').set(left);
		pane.currentleft = left;
	},
	move: function(pane, dir, loop) {
		var left = (dir <= 0) ? (pane.initialleft) : (pane.ultimateleft);
		
		if(left != pane.currentleft) {
			pane.isActive = true;
			if(!pane.fixed) {
				pane.animation.stop();
				pane.animation.start(left);//('left', {onComplete:function(){this.isActive = false;}.bind(pane)}).start(left);
				pane.currentleft = left;
			}
		}
		return false;
	},
	expand: function(ev) {
		
		var current = -1;
		
		var parent = $(ev.target);
		while(parent) {	
			current = this.panes.indexOf(parent);
			if(current > -1)
				break;
			parent = $(parent).getParent();
		}
		
		if(current > 1)
			this.allpanes(this.move.bind(this), -1, this.panes[1], ev.target);
			
		this.move(parent, -1);
		if($defined(parent.next))
			this.allpanes(this.move.bind(this), 1, parent.next, null);
		return;
		this.allpanes(this.move.bind(this), 1, ev.target, null);
		
		if(this.openpane) {
			if(this.openpane == ev.target)
				return;
			if(ev.target == this.openpane.next) {
				this.move(ev.target, -1);
				this.openpane = ev.target;
				return;
			} else {
				
			}
		} else {
			this.openpane = ev.target;
			if(this.openpane.next) {
				this.allpanes(this.move.bind(this), 1, this.openpane.next);
			}
		}
	},
	inject: function(index, url) {
		this.running[index] = this.panes[index];
		var pane = {self:this, destination:this.panes[index], index:index};
		var aj = new Ajax(url, {method:'get', onComplete:function(response){
				this.destination.innerHTML = response + this.destination.innerHTML;
				this.destination.ready = 1;
				delete(this.self.running[this.index]);
				var len = new Array();
				for(var key in this.self.running) 
					len[len.length] = key;
				if(len.length == 0) {
					if($defined(this.self.onInjected))
						this.self.onInjected();
				}
			}.bind(pane)}).request();
	},
	forceOpen: function(paneindex) {
		var extractpanes = new Array();
		for(var i = 1; i < paneindex; i++) {
			var pane = this.panes[i];
			if(pane.animation) {
				pane.animation.stop();
				pane.animation.start(pane.initialleft);
				pane.removeEvent('mouseenter', this.expand.bindWithEvent(this));
				pane.removeEvent('mouseleave', this.reset.bindWithEvent(this));
				pane.fixed = true;
			}
			
		}
		
	}
});

var navcascade = new Class({
	initialize: function(options) {
		if(options.container) {
			this.container = $(options.container);
			this.cooPlayground = this.container.getCoordinates();
			if(options.selector) {
				var cascade = this.container.getElement(options.selector);
				this.cascade = cascade;
				var nrun			= 0;
				var ultimateleft	= 0;
				while($defined(cascade)) {
					var next = cascade.getElement(options.selector);
					if(next) {
						cascade.next = next;
						next.previous = cascade;
					}
					cascade = next;
				}
			}
			options.lesum = 0; 
			options.left.each(function(le, i) {
				this.lesum += le;
			}, options);
			this.distance			= this.cooPlayground.width - options.lesum;
			options.left[1]			+= this.distance;
			this.left				= options.left;
			this.openpane			= this.getPane(0);
			this.allpanes(this.init.bind(this), options.left);
			this.container.addEvent('mouseleave', this.reset.bind(this));
		}
	},
	reset: function() {
		this.allpanes(this.init.bind(this), this.left);
		this.openpane			= this.getPane(0);
	},
	getPane: function(index) {
		return this.allpanes(this.item_at, index);
	},
	
	init: function(cascade, left, loop) {
		cascade.initialleft = left[loop];
		this.moveto(cascade, left[loop]);
		cascade.addEvent('mouseenter', this.opencascade.bindWithEvent(this));
		return false;
	},
	item_at: function(cascade, lookup, loop) {
		if(lookup == loop)
			return cascade;
		return false;
	},
	allpanes: function(fn, params) {
		if(this.cascade) {
			var cascade = this.cascade;
			var loop = 0;
			while($defined(cascade)) {
				var res = fn(cascade, params, loop++);
				if(res !== false)
					return res;
				cascade = cascade.next;
			}
		}
	},
	moveby: function(cascade, delta, pin){
		if(cascade) {
			
			setdeb('moveby : ' + delta);
			
			cascade.effect('left').start(cascade.getLeft([this.container]) - $pick(cascade.previous, this.container).getLeft() + delta); 
		}
	},
	moveto: function(cascade, left) {
		if(cascade) {
			cascade.effect('left').start(left); 
		}
	},
	getlast: function() {
		if(this.cascade) {
			var last = this.cascade;
			while($defined(last.next)) {
				last = last.next;
			}
			return last;
		}
		return null;
	},
	opencascade: function(ev) {
		if(this.openpane == ev.target)
			return;
		this.moveby(this.openpane.next, -this.distance, ev.target.next);
		this.openpane = ev.target;
	}
});
