blob: 76bbf824d28fc927be80a7d0a5bc0f7290e3a207 [file] [log] [blame]
Akron7524be12016-06-01 17:31:33 +02001/*
2 * TODO: Create lazy loading of objects including
3 * - obj.hint()
4 * - obj.alertify()
5 * - obj.session()
6 * - obj.tutorial()
7 * - obj.vc() // toggle
8 * - obj.matchCreate() (using webpack)
9 * - obj.koral() (show result, parse for errors ...)
10 * - obj.alignment() // toggle
11 */
12
Nils Diewald0e6992a2015-04-14 20:13:52 +000013define([
14 'match',
15 'hint',
16 'vc',
17 'tutorial',
Akronbec4a6a2018-07-10 14:45:15 +020018 'buttongroup',
Nils Diewald0e6992a2015-04-14 20:13:52 +000019 'lib/domReady',
Akron27ae9ec2015-06-23 00:43:21 +020020 'vc/array',
Nils Diewald7148c6f2015-05-04 15:07:53 +000021 'lib/alertify',
Akron7716f012015-07-01 20:38:32 +020022 'session',
Akronbe105b92016-01-04 14:13:20 +010023 'tagger',
Akron6bb71582016-06-10 20:41:08 +020024 'selectMenu',
Nils Diewald7148c6f2015-05-04 15:07:53 +000025 'api',
Nils Diewaldc46003b2015-05-07 15:55:35 +000026 'mailToChiffre',
Nils Diewald845282c2015-05-14 07:53:03 +000027 'lib/highlight/highlight.pack',
Nils Diewald0e6992a2015-04-14 20:13:52 +000028 'util'
29], function (matchClass,
Akron19d97fe2016-09-06 20:47:05 +020030 hintClass,
31 vcClass,
32 tutClass,
Akronbec4a6a2018-07-10 14:45:15 +020033 buttonGroupClass,
Akron19d97fe2016-09-06 20:47:05 +020034 domReady,
Akron19d97fe2016-09-06 20:47:05 +020035 vcArray,
36 alertifyClass,
37 sessionClass,
38 tagger,
39 selectMenuClass) {
Nils Diewalda0defc42015-05-07 23:54:17 +000040
Akron9cc3eaf2015-06-10 22:15:52 +020041 // Localization values
Akron0b489ad2018-02-02 16:49:32 +010042 const loc = KorAP.Locale;
Akrond3903fb2017-11-13 11:13:44 +010043 loc.VC_allCorpora = loc.VC_allCorpora || 'all corpora';
44 loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';
45 loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';
Akron7716f012015-07-01 20:38:32 +020046 loc.SHOW_KQ = loc.SHOW_KQ || 'show KoralQuery';
Akron9a5b1e12016-12-06 18:18:23 +010047
Akron0b489ad2018-02-02 16:49:32 +010048 const d = document;
Akron9cc3eaf2015-06-10 22:15:52 +020049
Akronf8035592018-05-24 20:40:51 +020050 KorAP.session = sessionClass.create('KalamarJS');
51
Nils Diewalda0defc42015-05-07 23:54:17 +000052 // Override KorAP.log
53 window.alertify = alertifyClass;
Akronf55504a2015-06-18 16:42:55 +020054 KorAP.log = function (code, msg) {
Nils Diewalda0defc42015-05-07 23:54:17 +000055
56 // Use alertify to log errors
57 alertifyClass.log(
Akronf55504a2015-06-18 16:42:55 +020058 (code === 0 ? '' : code + ': ') +
Akron19d97fe2016-09-06 20:47:05 +020059 msg,
Nils Diewalda0defc42015-05-07 23:54:17 +000060 'error',
Akronf55504a2015-06-18 16:42:55 +020061 10000
Nils Diewalda0defc42015-05-07 23:54:17 +000062 );
63 };
64
Nils Diewald0e6992a2015-04-14 20:13:52 +000065 domReady(function (event) {
66 var obj = {};
Akron71b91e42016-06-01 22:12:43 +020067
Akron7716f012015-07-01 20:38:32 +020068 // What should be visible?
Akronf8035592018-05-24 20:40:51 +020069 var show = KorAP.session.get('show') || {};
Nils Diewalda297f062015-04-02 00:23:46 +000070
71 /**
Akronf55504a2015-06-18 16:42:55 +020072 * Release notifications
73 */
74 if (KorAP.Notifications !== undefined) {
75 var n = KorAP.Notifications;
76 for (var i = 0; i < n.length; i++) {
Akron19d97fe2016-09-06 20:47:05 +020077 alertifyClass.log(n[i][1], n[i][0], 10000);
Akronf55504a2015-06-18 16:42:55 +020078 };
79 };
80
81 /**
Nils Diewald7148c6f2015-05-04 15:07:53 +000082 * Replace Virtual Collection field
83 */
Akron5c829e92017-05-12 18:10:00 +020084 var vcname, vcchoose;
Akron0b489ad2018-02-02 16:49:32 +010085 var input = d.getElementById('collection');
Nils Diewald7148c6f2015-05-04 15:07:53 +000086 if (input) {
87 input.style.display = 'none';
Akron0b489ad2018-02-02 16:49:32 +010088 vcname = d.createElement('span');
Nils Diewald7148c6f2015-05-04 15:07:53 +000089 vcname.setAttribute('id', 'vc-choose');
Akron6bb71582016-06-10 20:41:08 +020090 vcname.classList.add('select');
Akron941551e2015-06-11 16:06:22 +020091
Akron27ae9ec2015-06-23 00:43:21 +020092 var currentVC = loc.VC_allCorpora;
93 if (KorAP.koralQuery !== undefined && KorAP.koralQuery["collection"]) {
Akron19d97fe2016-09-06 20:47:05 +020094 currentVC = loc.VC_oneCollection;
Akron27ae9ec2015-06-23 00:43:21 +020095 };
96
Akron0b489ad2018-02-02 16:49:32 +010097 vcchoose = vcname.addE('span');
Akron5c829e92017-05-12 18:10:00 +020098
Akron0b489ad2018-02-02 16:49:32 +010099 vcchoose.addT(
100 d.getElementById('collection-name').value || currentVC
Nils Diewald7148c6f2015-05-04 15:07:53 +0000101 );
Akron27ae9ec2015-06-23 00:43:21 +0200102
Nils Diewald7148c6f2015-05-04 15:07:53 +0000103 input.parentNode.insertBefore(vcname, input);
104 };
105
Nils Diewald7148c6f2015-05-04 15:07:53 +0000106 /**
Nils Diewalda297f062015-04-02 00:23:46 +0000107 * Add actions to match entries
108 */
Akron0b489ad2018-02-02 16:49:32 +0100109 var inactiveLi = d.querySelectorAll(
Nils Diewald5c5a7472015-04-02 22:13:38 +0000110 '#search > ol > li:not(.active)'
111 );
Nils Diewalda297f062015-04-02 00:23:46 +0000112 var i = 0;
Akron6a535d42015-08-26 20:16:58 +0200113
Nils Diewalda297f062015-04-02 00:23:46 +0000114 for (i = 0; i < inactiveLi.length; i++) {
Nils Diewald5c5a7472015-04-02 22:13:38 +0000115 inactiveLi[i].addEventListener('click', function (e) {
Akron19d97fe2016-09-06 20:47:05 +0200116 if (this._match !== undefined)
117 this._match.open();
118 else {
119 // lazyLoad
120 matchClass.create(this).open();
121 };
Akrone0c32c72017-04-25 22:38:23 +0200122 // This would prevent the sidebar to go back
123 // e.halt();
Nils Diewalda297f062015-04-02 00:23:46 +0000124 });
Akron6a535d42015-08-26 20:16:58 +0200125 inactiveLi[i].addEventListener('keydown', function (e) {
Akron19d97fe2016-09-06 20:47:05 +0200126 var code = _codeFromEvent(e);
127
128 switch (code) {
129 case 32:
130 if (this._match !== undefined)
131 this._match.toggle();
132 else {
133 // lazyLoad
134 matchClass.create(this).open();
135 };
136 e.halt();
137 break;
138 };
Akron6a535d42015-08-26 20:16:58 +0200139 });
Nils Diewalda297f062015-04-02 00:23:46 +0000140 };
141
Akrone0c32c72017-04-25 22:38:23 +0200142 // Add focus listener to aside
Akron0b489ad2018-02-02 16:49:32 +0100143 var aside = d.getElementsByTagName('aside')[0];
Akrone0c32c72017-04-25 22:38:23 +0200144
145 if (aside && aside.classList.contains('active') == false) {
Akron1885ce92017-04-26 23:10:01 +0200146
Akron5258d462017-04-26 23:32:57 +0200147 // Horrible lock to deal with sidebar clicks
148 var asideClicked = false;
149
Akron1885ce92017-04-26 23:10:01 +0200150 // Make aside active on focus
151 aside.addEventListener('focus', function(e) {
Akrone0c32c72017-04-25 22:38:23 +0200152 this.classList.add('active');
153 });
154
Akron1885ce92017-04-26 23:10:01 +0200155 // Deactivate focus when clicking anywhere else
Akron0b489ad2018-02-02 16:49:32 +0100156 var body = d.getElementsByTagName('body')[0];
Akron1885ce92017-04-26 23:10:01 +0200157 if (body !== null) {
158 body.addEventListener('click', function() {
Akron5258d462017-04-26 23:32:57 +0200159 if (!asideClicked) {
160 aside.classList.remove('active');
161 }
162 else {
163 asideClicked = false;
164 };
Akron1885ce92017-04-26 23:10:01 +0200165 });
166 };
167
168 /* Stop click event on aside
169 * (to not trickle down to body)
170 */
171 aside.addEventListener('click', function(e) {
Akron5258d462017-04-26 23:32:57 +0200172 asideClicked = true;
Akrone0c32c72017-04-25 22:38:23 +0200173 });
174 };
Akronb9cdb102017-04-25 00:52:31 +0200175
176
Akron6bb71582016-06-10 20:41:08 +0200177 // Replace QL select menus with KorAP menus
Akron0b489ad2018-02-02 16:49:32 +0100178 var qlField = d.getElementById('ql-field');
Akronaba7a5a2016-08-15 21:58:33 +0200179 if (qlField !== null) {
Akron086fe5d2017-11-13 14:01:45 +0100180 KorAP.QLmenu = selectMenuClass.create(
Akron0b489ad2018-02-02 16:49:32 +0100181 d.getElementById('ql-field').parentNode
Akronaba7a5a2016-08-15 21:58:33 +0200182 ).limit(5);
183 };
Akron6bb71582016-06-10 20:41:08 +0200184
Akron0b489ad2018-02-02 16:49:32 +0100185 var result = d.getElementById('resultinfo');
Akronbec4a6a2018-07-10 14:45:15 +0200186 var resultButton;
Akron179c8ac2015-06-30 19:30:50 +0200187 if (result != null) {
Akron9a5b1e12016-12-06 18:18:23 +0100188
Akronbec4a6a2018-07-10 14:45:15 +0200189 // Add result button group
190 resultButton = buttonGroupClass.create(['result']);
191 result.appendChild(resultButton.element());
Akron179c8ac2015-06-30 19:30:50 +0200192 };
193
194 // There is a koralQuery
Akron7716f012015-07-01 20:38:32 +0200195 if (KorAP.koralQuery !== undefined) {
Akron179c8ac2015-06-30 19:30:50 +0200196
Akronbec4a6a2018-07-10 14:45:15 +0200197 if (result !== null) {
Akron19d97fe2016-09-06 20:47:05 +0200198 var kq;
Akron179c8ac2015-06-30 19:30:50 +0200199
Akron19d97fe2016-09-06 20:47:05 +0200200 var showKQ = function () {
201 if (kq === undefined) {
Akron0b489ad2018-02-02 16:49:32 +0100202 kq = d.createElement('div');
Akron19d97fe2016-09-06 20:47:05 +0200203 kq.setAttribute('id', 'koralquery');
204 kq.style.display = 'none';
Akron0b489ad2018-02-02 16:49:32 +0100205 var kqInner = d.createElement('div');
Akron19d97fe2016-09-06 20:47:05 +0200206 kq.appendChild(kqInner);
207 kqInner.innerHTML = JSON.stringify(KorAP.koralQuery, null, ' ');
208 hljs.highlightBlock(kqInner);
Akron0b489ad2018-02-02 16:49:32 +0100209 var sb = d.getElementById('search');
Akron19d97fe2016-09-06 20:47:05 +0200210 sb.insertBefore(kq, sb.firstChild);
211 };
Akron7716f012015-07-01 20:38:32 +0200212
Akron19d97fe2016-09-06 20:47:05 +0200213 if (kq.style.display === 'none') {
214 kq.style.display = 'block';
215 show['kq'] = true;
216 }
217 else {
218 kq.style.display = 'none';
219 delete show['kq'];
220 };
221 };
Akron7716f012015-07-01 20:38:32 +0200222
Akronbec4a6a2018-07-10 14:45:15 +0200223 // Add KoralQuery button
224 resultButton.add(loc.SHOW_KQ, ['show-kq','button-icon'], showKQ);
Akron179c8ac2015-06-30 19:30:50 +0200225 };
Akron7716f012015-07-01 20:38:32 +0200226
Akron00cd4d12016-05-31 21:01:11 +0200227 if (KorAP.koralQuery["errors"]) {
Akron19d97fe2016-09-06 20:47:05 +0200228 var errors = KorAP.koralQuery["errors"];
229 for (var i in errors) {
Akronf0c31ed2016-06-11 11:27:01 +0200230
Akron19d97fe2016-09-06 20:47:05 +0200231 // Malformed query
232 if (errors[i][0] === 302 && errors[i][2]) {
233 obj.hint = hintClass.create();
234 obj.hint.alert(errors[i][2], errors[i][1]);
235 break;
236 }
Akronf0c31ed2016-06-11 11:27:01 +0200237
Akron19d97fe2016-09-06 20:47:05 +0200238 // no query
239 else if (errors[i][0] === 301) {
240 obj.hint = hintClass.create();
241 obj.hint.alert(0, errors[i][1]);
242 }
243 }
Akron00cd4d12016-05-31 21:01:11 +0200244 };
245
Akron7716f012015-07-01 20:38:32 +0200246 // Session has KQ visibility stored
247 if (show["kq"])
Akron19d97fe2016-09-06 20:47:05 +0200248 showKQ.apply();
Akron179c8ac2015-06-30 19:30:50 +0200249 };
250
Akron9a5b1e12016-12-06 18:18:23 +0100251 // There is more than 0 matches and there is a resultButton
252 if (i > 0) {
Nils Diewald7148c6f2015-05-04 15:07:53 +0000253
Akron9a5b1e12016-12-06 18:18:23 +0100254 if (resultButton !== null) {
Akron9a5b1e12016-12-06 18:18:23 +0100255 /**
256 * Toggle the alignment (left <=> right)
257 */
Akron9a5b1e12016-12-06 18:18:23 +0100258
Akronbec4a6a2018-07-10 14:45:15 +0200259 resultButton.add(loc.TOGGLE_ALIGN, ['align','right','button-icon'], function (e) {
260 var ol = d.querySelector('#search > ol');
261 ol.toggleClass("align-left", "align-right");
262 this.toggleClass("left", "right");
263 });
Akron9a5b1e12016-12-06 18:18:23 +0100264 };
Nils Diewalda297f062015-04-02 00:23:46 +0000265 };
Nils Diewald5c5a7472015-04-02 22:13:38 +0000266
Nils Diewald7148c6f2015-05-04 15:07:53 +0000267 /**
268 * Toggle the Virtual Collection builder
269 */
270 if (vcname) {
Nils Diewald6283d692015-04-23 20:32:53 +0000271 var vc;
Akron179c8ac2015-06-30 19:30:50 +0200272 var vcclick = function () {
Akron0b489ad2018-02-02 16:49:32 +0100273 var view = d.getElementById('vc-view');
Nils Diewald6283d692015-04-23 20:32:53 +0000274
Akron19d97fe2016-09-06 20:47:05 +0200275 // The vc is visible
276 if (vcname.classList.contains('active')) {
277 view.removeChild(vc.element());
278 vcname.classList.remove('active');
279 delete show['collection'];
280 }
Nils Diewald6283d692015-04-23 20:32:53 +0000281
Akron19d97fe2016-09-06 20:47:05 +0200282 // The vc is not visible
283 else {
284 if (vc === undefined)
285 vc = _getCurrentVC(vcClass, vcArray);
286 view.appendChild(vc.element());
287 vcname.classList.add('active');
288 show['collection'] = true;
289 };
Nils Diewald58141332015-04-07 16:18:45 +0000290 };
Akron04671e72017-05-11 20:47:32 +0200291
Akron179c8ac2015-06-30 19:30:50 +0200292 vcname.onclick = vcclick;
Akron5c829e92017-05-12 18:10:00 +0200293
294 // Click, if the VC should be shown
Akron7716f012015-07-01 20:38:32 +0200295 if (show['collection']) {
Akron19d97fe2016-09-06 20:47:05 +0200296 vcclick.apply();
Akron5c829e92017-05-12 18:10:00 +0200297 }
Akron04671e72017-05-11 20:47:32 +0200298
Akron5c829e92017-05-12 18:10:00 +0200299 // else
300 else if (_checkVCrewrite(vcClass)) {
301 vcchoose.classList.add('rewritten');
Akron04671e72017-05-11 20:47:32 +0200302 };
Nils Diewald58141332015-04-07 16:18:45 +0000303 };
304
Akron19d97fe2016-09-06 20:47:05 +0200305
Nils Diewald58141332015-04-07 16:18:45 +0000306 /**
307 * Init Tutorial view
308 */
Akron0b489ad2018-02-02 16:49:32 +0100309 if (d.getElementById('view-tutorial')) {
Nils Diewaldfccfbcb2015-04-29 20:48:19 +0000310 window.tutorial = tutClass.create(
Akron0b489ad2018-02-02 16:49:32 +0100311 d.getElementById('view-tutorial'),
Akronf8035592018-05-24 20:40:51 +0200312 KorAP.session
Nils Diewaldfccfbcb2015-04-29 20:48:19 +0000313 );
314 obj.tutorial = window.tutorial;
315 }
Nils Diewald58141332015-04-07 16:18:45 +0000316
Nils Diewaldfccfbcb2015-04-29 20:48:19 +0000317 // Tutorial is in parent
318 else if (window.parent) {
319 obj.tutorial = window.parent.tutorial;
320 };
321
Akron0b489ad2018-02-02 16:49:32 +0100322 // Initialize queries for d
Akron6ed13992016-05-23 18:06:05 +0200323 if (obj.tutorial) {
Akron0b489ad2018-02-02 16:49:32 +0100324 obj.tutorial.initQueries(d);
Nils Diewaldfccfbcb2015-04-29 20:48:19 +0000325
Akron6ed13992016-05-23 18:06:05 +0200326 // Initialize documentation links
Akron0b489ad2018-02-02 16:49:32 +0100327 obj.tutorial.initDocLinks(d);
Akron6ed13992016-05-23 18:06:05 +0200328 };
Nils Diewald61e6ff52015-05-07 17:26:50 +0000329
Nils Diewald845282c2015-05-14 07:53:03 +0000330
Nils Diewald58141332015-04-07 16:18:45 +0000331 /**
Akronc1457bf2015-06-11 19:24:00 +0200332 * Add VC creation on submission.
333 */
Akron0b489ad2018-02-02 16:49:32 +0100334 var form = d.getElementById('searchform');
Akron792f58b2015-07-08 18:59:36 +0200335 if (form !== null) {
Akronc1457bf2015-06-11 19:24:00 +0200336 form.addEventListener('submit', function (e) {
Akron0b489ad2018-02-02 16:49:32 +0100337 var qf = d.getElementById('q-field');
Akronc1457bf2015-06-11 19:24:00 +0200338
Akron19d97fe2016-09-06 20:47:05 +0200339 // No query was defined
340 if (qf.value === undefined || qf.value === '') {
341 qf.focus();
342 e.halt();
343 KorAP.log(700, "No query given");
344 return;
345 };
Akron7716f012015-07-01 20:38:32 +0200346
Akron19d97fe2016-09-06 20:47:05 +0200347 // Store session information
Akronf8035592018-05-24 20:40:51 +0200348 KorAP.session.set("show", show);
Akron7716f012015-07-01 20:38:32 +0200349
Akron19d97fe2016-09-06 20:47:05 +0200350 // Set Virtual collection
351 if (vc === undefined) {
352 vc = _getCurrentVC(vcClass, vcArray);
353 };
Akron7716f012015-07-01 20:38:32 +0200354
Akron19d97fe2016-09-06 20:47:05 +0200355 if (vc !== undefined) {
356 input.value = vc.toQuery();
357 }
358 else {
359 delete input['value'];
360 };
Akronc1457bf2015-06-11 19:24:00 +0200361 });
362 };
363
364 /**
Nils Diewald58141332015-04-07 16:18:45 +0000365 * Init hint helper
366 * has to be final because of
367 * reposition
368 */
Nils Diewald0e6992a2015-04-14 20:13:52 +0000369 // Todo: Pass an element, so this works with
370 // tutorial pages as well!
Akron00cd4d12016-05-31 21:01:11 +0200371 if (obj.hint === undefined)
372 obj.hint = hintClass.create();
Nils Diewald7148c6f2015-05-04 15:07:53 +0000373
Akron99713ef2017-06-28 18:19:28 +0200374 // Add the hinthelper to the KorAP object to make it manipulatable globally
Akron72f73572017-12-05 12:31:09 +0100375 KorAP.Hint = obj.hint;
Akron99713ef2017-06-28 18:19:28 +0200376
Nils Diewald58141332015-04-07 16:18:45 +0000377 return obj;
Nils Diewald0e6992a2015-04-14 20:13:52 +0000378 });
379});
Akronc1457bf2015-06-11 19:24:00 +0200380
381// Render Virtual collection
Akron27ae9ec2015-06-23 00:43:21 +0200382function _getCurrentVC (vcClass, vcArray) {
383 var vc = vcClass.create(vcArray);
384 if (KorAP.koralQuery !== undefined && KorAP.koralQuery["collection"]) {
385 vc.fromJson(KorAP.koralQuery["collection"]);
386 };
Akronc1457bf2015-06-11 19:24:00 +0200387 return vc;
388};
Akron04671e72017-05-11 20:47:32 +0200389
390function _checkVCrewrite (vcClass) {
391 if (KorAP.koralQuery !== undefined && KorAP.koralQuery["collection"]) {
392 return vcClass.checkRewrite(KorAP.koralQuery["collection"]);
393 };
394 return false;
395}