/* Scribendi.TabPanels, version 1.3
 * (c) 2008 Terence Johnson / Scribendi Inc.
 * License: MIT (Open Source)
 */
if(!window.Scribendi) {Scribendi = {};}

Scribendi.TabPanels = Class.create({
	initialize: function(elements) {
		this.menuItems = [];
		this.panels = [];
		this.currentPanel = null;
		this.options = Object.extend({
				panelClass: 'tab-panel',
				menuClass: 'tab-menu',
				menuId: ''
			}, arguments[1] || {});
		this.menu = new Element('ul', { 
			'id' : this.options.menuId } );
		this.menu.addClassName(	this.options.menuClass );
		$(elements).each(this.addPanel.bind(this));
		this.panels.first().insert({ before : this.menu });
		this.showPanel(this.panels.first());
		document.observe('state:changed', this.setState.bindAsEventListener(this) );
	},
	addPanel: function(panel) {
		panel = $(panel);
		var panelId = panel.identify();
		var frag = '#' + panelId;
		var tabId = 'tab_' + panelId;
		panel.addClassName(this.options.panelClass).hide();
		this.panels.push(panel);
		var tab = new Element('a', { 'href' : frag, 'id': tabId }).update( panel.readAttribute('title') || panel.down().remove().innerHTML ).observe( 'click' , this.activate.bindAsEventListener(this), false );
		this.menuItems.push(tab);
		this.menu.insert(tab.wrap('li'));
	},
	activate: function(ev) {
		var element = ev.findElement("a");
		ev.stop();
		var panel = element.readAttribute('href').match(/#(\w.+)/)[1];
		this.showPanel(panel);
		element.blur();
		document.fire('state:change', this.getState());
	},
	showPanel: function(panel) {
		panel = $(panel);
		if (this.panels.include(panel) && !panel.visible()) {
			if (this.currentPanel) { this.currentPanel.fire('tabpanel:hide'); }
			this.panels.invoke('hide');
			panel.show();
			panel.fire('tabpanel:show');
			this.currentPanel = panel;
			this.menuItems.invoke('removeClassName', 'active-tab');
			$('tab_' + $(panel).identify()).addClassName('active-tab');
		}
	},
	getState: function() {
		var state = {};
		state[this.menu.identify()] = this.currentPanel.identify();
		return state;
	},
	setState: function(ev) {
		this.showPanel(ev.memo[this.menu.identify()] || this.panels.first());
	}
});
