import * as DOM from "../dom/DOM"
import * as Browser from "../core/Browser"
import Events from "../core/Events";
import { DOMMixins } from "../dom/DOMMixins"
import { easeInOutQuint } from "../animation/Ease"
import { classMixin, mergeData } from "../core/Util"
import { DOMEvent } from "../dom/DOMEvent"
import { I18NMixins } from "../language/I18NMixins";
export class MenuBar {
constructor(elem, parent_elem, options, language) {
// DOM ELEMENTS
this._el = {
parent: {},
container: {},
button_forwardtoend: {},
button_backtostart: {},
button_zoomin: {},
button_zoomout: {},
arrow: {},
line: {},
coverbar: {},
grip: {}
};
this.collapsed = false;
if (typeof elem === 'object') {
this._el.container = elem;
} else {
this._el.container = DOM.get(elem);
}
if (parent_elem) {
this._el.parent = parent_elem;
}
// Data
this.data = {
visible_ticks_dates: {}
}
//Options
this.options = {
width: 600,
height: 600,
duration: 1000,
ease: easeInOutQuint,
menubar_default_y: 0
};
// Animation
this.animator = {};
this.setLanguage(language)
// Merge Data and Options
mergeData(this.options, options);
this._initLayout();
this._initEvents();
}
/* Public
================================================== */
show(d) {
var duration = this.options.duration;
if (d) {
duration = d;
}
}
hide(top) {}
toogleZoomIn(show) {
if (show) {
this._el.button_zoomin.removeAttribute('disabled');
} else {
this._el.button_zoomin.setAttribute('disabled', true);
}
}
toogleZoomOut(show) {
if (show) {
this._el.button_zoomout.removeAttribute('disabled');
} else {
this._el.button_zoomout.setAttribute('disabled', true);
}
}
changeVisibleTicks(visible_ticks) {
const minor_ticks = visible_ticks.minor;
if (!minor_ticks.length) {
this.data.visible_ticks_dates = {};
return;
}
const firstTick = minor_ticks[0];
const firstYear = firstTick.date.getFullYear();
const lastTick = minor_ticks[minor_ticks.length - 1];
const lastYear = lastTick.date.getFullYear();
this.data.visible_ticks_dates = {
start: firstYear,
end: lastYear
};
this._updateZoomAriaLabels()
}
setSticky(y) {
this.options.menubar_default_y = y;
}
/* Color
================================================== */
setColor(inverted) {
if (inverted) {
this._el.container.className = 'tl-menubar tl-menubar-inverted';
} else {
this._el.container.className = 'tl-menubar';
}
}
/* Update Display
================================================== */
updateDisplay(w, h, a, l) {
this._updateDisplay(w, h, a, l);
}
/* Events
================================================== */
_onButtonZoomIn(e) {
this.fire("zoom_in", e);
}
_onButtonZoomOut(e) {
this.fire("zoom_out", e);
}
_onButtonForwardToEnd(e) {
this.fire("forward_to_end", e);
}
_onButtonBackToStart(e) {
this.fire("back_to_start", e);
}
/* Private Methods
================================================== */
_initLayout() {
// Create Layout
this._el.button_zoomin = DOM.createButton('tl-menubar-button', this._el.container);
this._el.button_zoomout = DOM.createButton('tl-menubar-button', this._el.container);
this._el.button_forwardtoend = DOM.createButton('tl-menubar-button', this._el.container);
this._el.button_backtostart = DOM.createButton('tl-menubar-button', this._el.container);
if (Browser.mobile) {
this._el.container.setAttribute("ontouchstart", " ");
}
this._el.button_backtostart.innerHTML = "";
this._el.button_backtostart.setAttribute('aria-label', this._('return_to_title'));
this._el.button_forwardtoend.innerHTML = "";
this._el.button_forwardtoend.setAttribute('aria-label', this._('go_to_end'));
this._el.button_zoomin.innerHTML = "";
this._el.button_zoomin.setAttribute('aria-label', this._('zoom_in'));
this._el.button_zoomout.innerHTML = "";
this._el.button_zoomout.setAttribute('aria-label', this._('zoom_out'));
}
_initEvents() {
DOMEvent.addListener(this._el.button_forwardtoend, 'click', this._onButtonForwardToEnd, this);
DOMEvent.addListener(this._el.button_backtostart, 'click', this._onButtonBackToStart, this);
DOMEvent.addListener(this._el.button_zoomin, 'click', this._onButtonZoomIn, this);
DOMEvent.addListener(this._el.button_zoomout, 'click', this._onButtonZoomOut, this);
}
// Update Display
_updateDisplay(width, height, animate) {
if (width) {
this.options.width = width;
}
if (height) {
this.options.height = height;
}
}
// Update Display
_updateZoomAriaLabels() {
if (Object.keys(this.data.visible_ticks_dates).length == 0) {
this._el.button_zoomin.setAttribute('aria-description', '');
this._el.button_zoomout.setAttribute('aria-description', '');
} else {
this._el.button_zoomin.setAttribute('aria-description',
this._("aria_label_zoomin",
this.data.visible_ticks_dates));
this._el.button_zoomout.setAttribute('aria-description',
this._("aria_label_zoomout",
this.data.visible_ticks_dates));
}
}
}
classMixin(MenuBar, DOMMixins, Events, I18NMixins)