"use strict";
// Знает о том, что где-то на странице живет контейнер .tabs_js
//
//
// NOTE-q:: невнятно подвешен вопрос касательно количества подобных компонентов на странице
// NOTE-q:: код написан с условием, что на странице живет один tabs_js, сейчас пока нет времени думать о нём
//
function Tabs(options) {
var _this = this;
// параметры, по которым построен компонент
var _options;
// view контейнеры, в которых живут кнопки и контент
var _$div_tabs;
var _$div_tab_buttons;
var _$div_tab_content;
// массив кнопок
var _tab_buttons = [];
// массив содержимого вкладок
var _tab_contents = [];
// айди текущей просматриваемой вкладки
var _current_tab_id = -1;
// zero-based индекс текущей просматриваемой вкладки
var _selected_index = -1;
// структура данных, которая описывает текущее содержимое копонента: кнопки и контент
var _data = {};
// хэш колбеков: при клике по кнопке с id=ID будет вызван соответствующий колбэк
var _callbacks = {};
//--[ public ]----------------------------------------------------------------------------------------------------------------------
/**
* Удалить все элементы: кнопки, вкладки и данные
*/
this.removeAll = function () {
console.log('');
// очистим данные
_data = {};
// очистим массив колбэков
_callbacks = {};
// сбросим курсор
_current_tab_id = -1;
// удалим все кнопки и слушатели
for (var i = 0; i < _tab_buttons.length; i++) {
var $ibuttn = _tab_buttons[i];
$ibuttn.remove();
$ibuttn.off('click', this._onTabButtonClick)
}
};
/**
* Добавить именованную вкладку.
*
*
* @param tab_title
* @param tab_id
* @param on_tab_show
*
*/
this.addTab = function (tab_title, tab_id, on_tab_show) {
// создадим кнопку и контент
var btn = this._buttonAdd(tab_title, tab_id, on_tab_show);
//var cnt = this._contentAdd();
// запишем это в структуру
_data[tab_id] = {
tab_button: btn,
tab_content: null
};
// поместим в массивы
//_tab_contents.push(cnt);
};
this.setSelectedIndex = function (index) {
console.log(' index: ' + index);
_$div_tab_buttons.find('a[data-index='+index+']')
.click();
};
//--[ controller ]----------------------------------------------------------------------------------------------------------------------
this._onTabButtonClick = function (e) {
//console.log('<_onTabButtonClick>');
//console.log(e);
e.preventDefault();
// фиксируем кнопку
var $clicked_button = $(e.target);
// зафиксируем id нажатой кнопки
var clicked_id = $clicked_button.data('id');
//console.log('<_onTabButtonClick> clicked_id: ' + clicked_id);
// зафиксируем index нажатой кнопки
var clicked_index = $clicked_button.data('index');
//console.log('<_onTabButtonClick> clicked_index: ' + clicked_index);
// сравним с курсором, колбэк вызовем, только если есть изменения
if (_current_tab_id != clicked_id) {
_current_tab_id = clicked_id;
_selected_index = clicked_index;
var fun = _callbacks[clicked_id];
if (fun != undefined) {
fun(clicked_id);
}
}
// сделаем эту кнопку активной
_$div_tab_buttons
.find('a')
.removeClass('active');
_$div_tab_buttons
.find('a[data-index='+clicked_index+']')
.addClass('active');
};
//--[ private ]----------------------------------------------------------------------------------------------------------------------
this._buttonAdd = function (tab_button_title, button_id, on_click_callback) {
console.log('<_addTabButton> tab_button_title: ' + tab_button_title);
// создадим кнопку
var b = $('')
.text(tab_button_title)
.attr('data-id',button_id)
.attr('data-index', _tab_buttons.length)
//.data('id', button_id)
//.data('index', _tab_buttons.length)
.appendTo(_$div_tab_buttons)
.on('click', this._onTabButtonClick);
// её колбэк поместим в отдельный массив
_callbacks[button_id] = on_click_callback;
_tab_buttons.push(b);
};
this._contentAdd = function () {
};
this._buttonRemove = function ($a_button) {
};
this._contentRemove = function () {
};
this._fInit = function (options) {
// найдем нужную DOM структуру
_$div_tabs = $('.tabs_js');
if (_$div_tabs.length) { /*NOTE-q*/
_$div_tab_buttons = _$div_tabs.find('.tab_buttons');
_$div_tab_content = _$div_tabs.find('.tab_content');
}
};
//--[ startup ]----------------------------------------------------------------------------------------------------------------------
this._fInit(options);
}