var MenuSite = new Class({
	Implements: [Options, Events],
	options: {
		tabs: 'tab',
		links: 'AJAX_MAIN',
		frames: 'mainContainer'
	},
	initialize: function(options){
		this.setOptions(options);
		this.tabs = $$('#' + this.options.menuId + ' .' + this.options.tabs);
		this.links = $$('#' + this.options.menuId + ' .' + this.options.links);
		this.frames = $$('#' + this.options.menuId + ' .' + this.options.frames);
		var hide = (function(){
			this.hidder = new Element('div', {
				'styles': {
					'width': window.getWidth(),
					'height': window.getHeight(),
					'background': '#ffffff',
					'opacity': 0.1,
					'position': 'absolute'
				}
			}).inject(document.body);
		}).bind(this);
		hide();
		var show = (function(){
			this.hidder.addEvent('onClose', function(){ this.dispose(); });
			this.hidder.close();
		}).bind(this);
		this.addEvents({ 'onOpen': show, 'onClose': hide });
		this.links.each((function(lnk, i){
			lnk.addEvent('click', (function(e){
				e.preventDefault();
				if(!lnk.hasClass('loading')){
					if(this.tabs[i].hasClass('OPEN')) this.loadPage(lnk.href, i);
					else this.openPage(lnk, i);
				}
			}).bind(this));
		}).bind(this));
	},
	openPage: function(lnk, i, Id){
		if(i < 0) i = this.getIndex(Id);
		var close = function(i){
			this.removeEvent('close', closeBound);
			if(!this.links[i].hasClass('LOADED')) this.loadPage(lnk.href, i);
			else if(!this.tabs[i].hasClass('OPEN')) {
				this.openTab(i);
				this.removeEvent('load', loadBound);
			}
		}
		var load = function(){
			this.removeEvent('load', loadBound);
			if(!this.tabs[i].hasClass('OPEN')) this.openTab(i);
		}
		var closeBound = close.create({bind: this, arguments: i});
		var loadBound = load.bind(this);
		this.addEvents({
			'onLoad': loadBound,
			'onClose': closeBound
		});
		this.closeTabs();
	},
	close: function(i){
		this.fireEvent('onBeforeClose', i);
		this.tabs[i].removeClass('OPEN');
		new Fx.Tween(this.tabs[i], {
			'onComplete': (function(){
				this.fireEvent('onClose', i);
			}).bind(this),
			transition: Fx.Transitions.Circ.easeOut,
			duration: 1000, link: 'cancel'
		}).start('width', this.links[i].getWidth());
	},
	closeTabs: function(){
		this.tabs.each((function(el, j){
			if(el.hasClass('OPEN')) {
				this.close(j);
			}
		}).bind(this));
	},
	openTab: function(i){
		new Fx.Tween(this.tabs[i], {
			transition: Fx.Transitions.Circ.easeOut,
			duration: 1500, link: 'cancel',
			onComplete: (function(){
				this.tabs[i].addClass('OPEN');
				this.frames[i].fade(1);
				this.fireEvent('onOpen', i);
			}).bind(this)
		}).start('width', this.frames[i].getWidth());
	},
	loadPage: function(URL, i){
		this.frames[i].setStyle('opacity', 0);
		this.links[i].addClass('loading');
		if(!URL.test(/\?/)) URL += '?';
		else URL += '&';
		URL += 'template=module';
		new Request.HTML({
			url: URL,
			update: this.frames[i],
			method: 'get',
			evalScripts: true,
			onRequest: (function(){
				this.fireEvent('onRequest');
			}).bind(this),
			onSuccess: (function(){
				this.links[i].removeClass('loading');
				this.links[i].addClass('LOADED');
				this.frames[i].fade(1);
				this.frames[i].scrollTo(0, 0);
				this.ajaxify(i);
				this.fireEvent('onLoad', i);
				this.frames[i].getFirst().erase('title');
				window.fireEvent('pageready');
			}).bind(this)
		}).send();
		site.history.push(URL);
	},
	ajaxify: function(i){
		this.frames[i].getElements('.AJAX').each((function(a){
			a.addEvent('click', (function(e){
				e.preventDefault();
				var URL = a.href;
				if(!URL.test(/\?/)) URL += '?';
				else URL += '&';
				URL += 'template=ajax';
				if(a.hasClass('hidden'))
					new Request({url: URL, method: 'post'}).send();
				else if(a.target)
					this.openPage(a, -1, a.target.replace('#', ''));
				else
					this.loadPage(a.href, i);
			}).bind(this))
		}).bind(this));
	},
	getIndex: function(Id){
		this.i = '';
		this.tabs.filter((function(item, index){
			if(item.id == Id) this.i = index;
		}).bind(this));
		return this.i;
	},
	absorb: function(what, Id){
		var i = this.getIndex(Id);
		this.frames[i].innerHTML = what.innerHTML;
		this.openTab(i);
		this.frames[i].getFirst().erase('title');
		this.links[i].addClass('LOADED');
		this.ajaxify(i);
		what.destroy();
		window.fireEvent('pageready');
	}
});
