blob: 5573682ab9e4912d764d83a5418d65b6784d4aaf [file] [log] [blame]
/**
* Open and close a tutorial page.
* The current page is stored and retrieved in a session cookie.
*/
// TODO: Make this a panel
// TODO: Add query mechanism!
// TODO: Highlight current section:
// http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page
"use strict";
define(['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {
// Localization values
const loc = KorAP.Locale;
loc.CLOSE = loc.CLOSE || 'Close';
const d = document;
return {
/**
* Create new tutorial object.
* Accepts an element to bind the tutorial window to.
*/
create : function (obj,session) {
if (!obj)
return null;
return Object.create(this)._init(obj,session);
},
// Initialize Tutorial object
_init : function (obj, session) {
const t = this;
if (session === undefined) {
t._session = sessionClass.create();
}
else {
t._session = session;
};
if (obj) {
t._show = obj;
t.start = obj.getAttribute('href');
// Unknown which tutorial to show
if (!t.start)
return null;
obj.removeAttribute('href');
obj.onclick = function () {
this.show();
}.bind(t);
// Injects a tutorial div to the body
const div = d.createElement('div');
div.setAttribute('id', 'tutorial');
div.style.display = 'none';
d.getElementsByTagName('body')[0].appendChild(div);
t._iframe = null;
t._el = div;
// Some fields
t._ql = d.getElementById("ql-field");
t._q = d.getElementById("q-field")
t._cutoff = d.getElementById("q-cutoff-field");
};
return t;
},
/**
* Initialize a search with a defined query.
*/
useQuery : function (e) {
const t = this;
const q = e.getAttribute("data-query"),
ql = e.getAttribute("data-query-language"),
qc = e.getAttribute("data-query-cutoff");
if (qc !== 0 && qc !== "0" && qc !== "off" && qc !== null) {
if (t._cuttoff)
t._cutoff.checked = true;
};
if (KorAP.QLmenu) {
KorAP.QLmenu.selectValue(ql);
}
else if (t._ql) {
let found = Array.from(t._ql.options).find(o => o.value === ql);
if (found)
found.selected = true;
};
if (t._q)
t._q.value = q;
t.setPage(e);
t.hide();
},
/**
* Decorate a page with query event handler.
*/
initQueries : function (d) {
let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');
const that = this;
for (var i = 0; i < qs.length; i++) {
qs[i].onclick = function (e) {
that.useQuery(this,e);
};
};
},
/**
* Decorate a page with documentation links
*/
initDocLinks : function (d) {
const that = this;
Array.from(d.getElementsByClassName('doc-link')).forEach(
i =>
i.onclick = function () {
that.setPage(this.getAttribute('href'));
return true;
}
);
},
/**
* Show the tutorial page embedded.
*/
show : function () {
const t = this;
const element = t._el;
if (element.style.display === 'block')
return;
if (t._iframe === null) {
t._iframe = d.createElement('iframe');
t._iframe.setAttribute(
'src',
(t.getPage() || t.start + '?embedded=true')
);
const btn = buttonGroupClass.create(
['action','button-view']
);
btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {
element.style.display = 'none';
});
element.appendChild(btn.element());
// Add open in new window button
// Add scroll to top button
/*
var info = document.createElement('li');
info.appendChild(document.createElement('span'))
.appendChild(document.createTextNode(loc.SHOWINFO));
info.classList.add('info');
info.setAttribute('title', loc.SHOWINFO);
ul.appendChild(close);
element.appendChild(ul);
*/
element.appendChild(t._iframe);
};
element.style.display = 'block';
},
/**
* Close tutorial window.
*/
hide : function () {
this._el.style.display = 'none';
},
/**
* Set a page to be the current tutorial page.
* Expects either a string or an element.
*/
setPage : function (obj) {
let page = obj;
if (typeof page != 'string') {
const l = this._iframe !== null ? window.frames[0].location : window.location;
page = l.pathname + l.search;
for (let i = 1; i < 5; i++) {
if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {
page += '#' + obj.getAttribute('id');
break;
}
else {
obj = obj.parentNode;
if (obj === null)
break;
};
};
};
this._session.set('tutpage', page);
},
/**
* Get the current tutorial URL
*/
getPage : function () {
return this._session.get('tutpage');
}
};
});