﻿var wPersonTabsManager = Class.create();
wPersonTabsManager.TAB_SELECTED_CLASSNAME = 'selected';
wPersonTabsManager.prototype = {
	
	initialize : function (container, loading, xaction) {
	
		// constants
		this.TAB_CLASSNAME = 'tab';
		
		
		// private members
		this.container = null;

		this.tabs = [];
		this.current = null;
		this.currentLetter = '';
		
		this.loading = null;

		this.filter = null;
		
		this.xaction = '';
		
		
		// ctor
		
		if (container == null)
			throw new Error('Ошибка инициализации менеджера вкладок');
			
		if (!xaction)
			throw new Error('Не указан адрес сервиса');
		
		this.container = container;
		this.loading = loading;
		this.xaction = xaction;

		var divs = container.getElementsByTagName('div');
		
		if (divs.length < 1)
			throw new Error('Не найдено ни одной вкладки');
		
		for (var i = 0; i < divs.length; i++)
		{
			if ($(divs[i]).hasClassName(this.TAB_CLASSNAME))
			{
				var field = divs[i];
				var button = $(divs[i].id+'-button');
				
				if (button == null)
					throw new Error('Не найдена кнопка для вкладки '+divs[i].id);
				
				this.addBehavior(button, field);
			}
		}
			
			
		if (this.tabs.length > 0 && this.current == null)
			this.activate( this.tabs[0] );
	
	},
	
	
	// public methods
	
	attachFilter : function (filter) {
		this.filter = filter;
		
		if (this.tabs.length > 0)
			for (var i = 0; i < this.tabs.length; i++)
				this.tabs[i].attachFilter(filter);
	},

	activateByLetter : function (letter) {
		var title = this.getTitleFromLetter(letter);
		
		if (title == this.currentLetter)
			return false;
			
		this.currentLetter = title;
		var tab = this.getTabByLetter(this.currentLetter);
		
		this.activate(tab, true);
	},
	
	
	// private methods
	
	addBehavior : function (button, field) {
		var button = this.createButton(button);
		
		var tab = new wPersonsTabBehaivor(button, field);
		tab.setLoading(this.loading);
		tab.setXAction(this.xaction);

		if (this.filter != null)
			tab.attachFilter(this.filter);
		
		this.tabs.push(tab);
		
		button.observe('click', this.clickHandler.bindAsEventListener(this, tab));
		
		if ( field.hasClassName(wPersonTabsManager.TAB_SELECTED_CLASSNAME) )
			this.activate(tab);
	},
	
	clickHandler : function (e, tab) {
		this.activate(tab);
		e.stop();
	},
	
	activate : function (tab, keepFilter) {
		if (!tab) return;
		
		var keepFilterVal = keepFilter ? keepFilter : false;
		
		if (this.filter && !keepFilterVal)
			this.filter.flush();
			
		if (this.current)
			tab.onBeforeActivate = this.current.deactivate.bind(this.current);
			
		tab.activate();
		this.current = tab;
		this.currentLetter = tab.letter;
	},
	
	getTitleFromLetter : function (letter) {
		letter = letter.toUpperCase();
		
		if (letter >= 'А' && letter <= 'Я')
			return letter;
		if (letter >= 'A' && letter <= 'Z')
			return 'A-Z';
		else
			return '#';
	},
	
	getTabByLetter : function (letter) {
		for (var i = 0; i < this.tabs.length; i++)
			if (this.tabs[i].letter == letter)
				return this.tabs[i];
	},
	
	createButton : function (button) {
		var str = '<span';
		str += ' id="'+button.id+'"';
		str += ' class="'+button.className+' anchor"';
		str += '>'+button.innerHTML+'</span>';
		
		button.outerHTML = str;
		
		return $(button.id);
	}
	
}

var wPersonsTabBehaivor = Class.create();
wPersonsTabBehaivor.prototype = {
	
	initialize : function (button, field) {

		// constants
		this.SELECTED_CLASSNAME = 'selected';

		// private members
		this.letter = '';
		
		this.button = null;
		this.field = null;
		
		this.active = false;
		
		this.loading = null;
		
		this.filter = null;
		
		this.xaction = 'personsbyletter';
		
		// events
		this.onBeforeActivate	= null;
	

	
		// ctor
		
		if (button == null || field == null)
			throw new Error('Ошибка инициализации вкладки');
			
		this.letter = button.childNodes[0].innerHTML;
		this.button = button;
		this.field = field;
	},
	
	
	// public methods
	
	setLoading : function (element) {
		this.loading = element;
	},
	
	attachFilter : function (filter) {
		this.filter = filter;
		
		if (this.field.innerHTML.length > 0)
			this.filter.addItems(this.field);
	},
	
	setXAction : function (xaction) {
		this.xaction = xaction;
	},
	
	
	activate : function () {
		this.active = true;

		this.button.addClassName(this.SELECTED_CLASSNAME);

		if (this.field.innerHTML.length == 0)
			this.getContents();
		else if (this.onBeforeActivate != null)
			this.onBeforeActivate();

		this.field.addClassName(wPersonTabsManager.TAB_SELECTED_CLASSNAME);
	},
	
	deactivate : function () {
		this.active = false;
		
		this.button.removeClassName(this.SELECTED_CLASSNAME);
		this.field.removeClassName(wPersonTabsManager.TAB_SELECTED_CLASSNAME);
	},
	
	getContents : function () {
		this.loading.style.display = 'block';
			
		new Ajax.Request(this.xaction+'&char='+this.letter+'&x='+Math.random(),
			{
				method : 'get',
				onSuccess : this.contentsResponseHandler.bind(this),
				onFailure : function () { alert('Ошибка запроса') }
			});
	},
	
	contentsResponseHandler : function (response) {
		this.loading.style.display = 'none';
		this.field.innerHTML = response.responseText;
		
		if (this.onBeforeActivate != null)
			this.onBeforeActivate();

		if (this.filter)
		{
			this.filter.addItems(this.field);
			this.filter.filter();
		}
	}

}

