js.pl
Copying Source is Forbidden
832 lines of code
1
#!/usr/bin/perl
2
3
#/
4
# the purpose of this particular javascript code
5
# is to allow the programmer a way to update HTML
6
# elements without reloading the entire page (AJAX)
7
#
8
# also, the name of this script is in..di..script!
9
#/
10
11
use strict;
12
use warnings;
13
use CGI::Carp qw(fatalsToBrowser);
14
use URI::Escape;
15
use JavaScript::Minifier qw(minify);
16
17
use lib "/var/www/html/Pm";
18
19
use Bc_misc qw(get_param clear_spaces minify_js);
20
use Bc_chef qw(cookie_get);
21
use Bc_sql qw(
22
get_constant
23
sql_execute
24
user_exists
25
$QUERY_PAGE
26
$QUERY_UID
27
$LOGGEDIN
28
29
$DB
30
);
31
use Html qw(pre_html_header);
32
33
use Security;
34
use User;
35
#Security::count_hits();
36
37
########################
38
39
my $DEBUG = get_param("debug");
40
my $ENABLE_CONSOLE = 0;
41
42
my $LET = get_param("let");
43
my $jsLET = "vit";
44
if ($LET) { $jsLET = $LET; }
45
46
my $javascript = <<END;
47
var enableconsole = 1;
48
49
if (!lastElementToggled) {
50
//////////////////////
51
// this MUST be a VAR!
52
var lastElementToggled = "$jsLET";
53
//////////////////////
54
console_msg("js.pl->init lastElementToggled: " + lastElementToggled);
55
} else {
56
console_msg("js.pl->init lastElementToggled was already set to: " + lastElementToggled);
57
}
58
59
// let or var here? does it matter? dunno, so var it is.
60
var lastDivSeen = "";
61
var console_enable = $ENABLE_CONSOLE;
62
63
END
64
65
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
66
67
$javascript .= <<END;
68
function ucfirst(string) {
69
return string.charAt(0).toUpperCase() + string.slice(1);
70
}
71
72
END
73
74
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
75
76
$javascript .= <<END;
77
function previous_page() { window.history.back(); }
78
79
END
80
81
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
82
83
$javascript .= <<END;
84
function back() { window.history.back(); }
85
86
END
87
88
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
89
90
$javascript .= <<END;
91
function reload() {
92
document.location.reload();
93
}
94
95
END
96
97
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
98
99
$javascript .= <<END;
100
function disableEnterKey(e) {
101
let key;
102
if (window.event) {
103
key = window.event.keyCode;
104
} else {
105
key = e.which;
106
}
107
108
return (key != 13); // returns key if it's NOT enter
109
}
110
END
111
112
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
113
114
$javascript .= <<END;
115
function acceptIntegerOnly(e, ignoreZero) {
116
// to ensure only POSITIVE integers are entered into a given input
117
// where "e" is an HTML element object
118
let DEBUG = 0;
119
let debugstr = "";
120
121
if (e) {
122
if (e.value) {
123
debugstr += "e.value (before fix)=" + e.value + "\\n";
124
125
e.value = e.value.replace(".", "");
126
e.value = e.value.replace("-", "");
127
128
let s = parseInt(e.value);
129
debugstr += "s (before fix)=" + s + "\\n";
130
if (!ignoreZero) {
131
if (s == 0 || !s) { s = 1; }
132
} else {
133
if (s == 0 || !s) { s = ""; }
134
}
135
e.value = s;
136
debugstr += "s (after fix)=" + s + "\\n";
137
138
debugstr += "e.value (after fix)=" + e.value + "\\n";
139
} else {
140
debugstr += "e.value is valueless\\n";
141
if (!ignoreZero) { e.value = "1"; } else { e.value = ""; }
142
}
143
} else {
144
debugstr += "no element object given\\n";
145
}
146
147
if (DEBUG) console.log("acceptIntegerOnly: \\n" + debugstr);
148
}
149
150
END
151
152
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
153
154
$javascript .= <<END;
155
function hasValue(v) {
156
let DEBUG = 0;
157
let debugstr = "";
158
let rv = false;
159
160
if (v) {
161
debugstr += "value is defined\\n";
162
163
if (v && v != "0") {
164
debugstr += v + "\\n";
165
rv = true;
166
} else {
167
debugstr += "no value discovered!\\n";
168
rv = false;
169
}
170
} else {
171
debugstr += "no value discovered!\\n";
172
rv = false;
173
}
174
175
if (DEBUG) console.log("hasValue:\\n" + debugstr);
176
177
return rv;
178
}
179
180
END
181
182
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
183
184
$javascript .= <<END;
185
function redden(e) {
186
let DEBUG = 0;
187
let debugstr = "";
188
189
if (e) {
190
debugstr += e.id;
191
e.style.backgroundColor = "red";
192
} else {
193
debugstr += "failed";
194
}
195
196
if (DEBUG) { console.log("redden:" + debugstr); }
197
}
198
199
END
200
201
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
202
203
$javascript .= <<END;
204
const cgetStyle = (el, ruleName) => getComputedStyle(el)[ruleName];
205
const hasClass = (el, className) => el.classList.contains(className);
206
207
function getStyle(el, styleProp) {
208
let e = document.getElementById(el);
209
let sp;
210
if (e) {
211
if (e.currentStyle)
212
sp = e.currentStyle[styleProp];
213
else if (window.getComputedStyle)
214
sp = document.defaultView.getComputedStyle(e, null).getPropertyValue(styleProp);
215
}
216
217
return sp;
218
}
219
220
END
221
222
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
223
224
$javascript .= <<END;
225
function showDiv(divId) {
226
div = document.getElementById(divId);
227
if (div) {
228
if (div.style.display == "none") {
229
div.style.display = "block";
230
if (lastDivSeen) {
231
document.getElementById(lastDivSeen).style.display = "none";
232
}
233
lastDivSeen = divId;
234
} else {
235
div.style.display = "none";
236
lastDivSeen = '';
237
}
238
} else {
239
console_msg("no div: " + divId);
240
}
241
}
242
243
END
244
245
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
246
247
$javascript .= <<END;
248
function get_selected(eid) {
249
// gets the value associated with the selected index of a dropdown
250
let e = document.getElementById(eid);
251
let rv = 0;
252
253
if (e) {
254
if (e.options) {
255
rv = e.options[e.selectedIndex].value;
256
}
257
} else {
258
console_msg('no such element: ' + eid);
259
}
260
261
return rv;
262
}
263
264
END
265
266
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
267
268
$javascript .= <<END;
269
function toggle_display(state, first, second) {
270
// where
271
// state is 1, 2, or 3
272
// where
273
// 1 = show both
274
// 2 = show "second", hide "first"
275
// 3 = show "first", hide "second"
276
// first is an html element ID
277
// second is another, different, html element ID
278
279
let f = document.getElementById(first);
280
let s = document.getElementById(second);
281
if (state == 3) {
282
f.style.display = "inline";
283
s.style.display = "inline";
284
} else if (state == 2) {
285
f.style.display = "none";
286
s.style.display = "inline";
287
} else {
288
// if state is NOT 2 or 3
289
f.style.display = "inline";
290
s.style.display = "none";
291
}
292
}
293
294
END
295
296
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
297
298
my $timeout = get_constant("REMOVE_MSG_TIMEOUT");
299
$javascript .= <<END;
300
function removeMsg(id, updateElementID, newHtmlForUpdatedElement, updatedCSSClass) {
301
let DEBUG = 1;
302
if (!id) { id = "MSGS"; }
303
let msgs = document.getElementById(id);
304
305
if (msgs) {
306
//if (DEBUG) console.log('rm: vanish, fucker, vanish!');
307
let clr = getStyle(id, "color");
308
let bg = getStyle(id, "background");
309
let border = getStyle(id, "border");
310
//msgs.className = msgs.className + " hidden";
311
msgs.classList.toggle("hidden");
312
//if (DEBUG) console.log('rm: msgs class: ' + msgs.className);
313
msgs.style.color = clr;
314
msgs.style.border = border;
315
msgs.style.background = bg;
316
317
if (updateElementID) {
318
let e = document.getElementById(updateElementID);
319
if (e) {
320
setTimeout(function() { e.innerHTML = newHtmlForUpdatedElement }, $timeout/2);
321
if (updatedCSSClass) { e.className = updatedCSSClass; }
322
}
323
}
324
} else {
325
if (enableconsole) console.error('no such HTML element id: ' + id);
326
}
327
}
328
329
END
330
331
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
332
333
$javascript .= <<END;
334
console_msg("js.pl->LET=" + lastElementToggled);
335
function toggle_display_element(element_id_to_toggle, toggler, debug) {
336
// element_id_to_toggle is rather obvious, but...pass in an HTML element ID (like "bio") to show.
337
// this HTML element is not the element being clicked
338
// toggler is the html element ID being clicked (or maybe the element which encapsulates the object being clicked)
339
// there is a method to this madness.
340
// each html element id (the toggler and the element to show/hide) must be as such:
341
// <div class=navbutton id=biodiv>Bio</div>
342
// <div class=navbutton id=locdiv>Location</div>
343
// <div id=bio>bio: this will hide/re-appear</div>
344
// <div id=loc>loc: this will hide/re-appear</div>
345
//
346
// DON'T use TD's as a toggler!
347
debug = 1;
348
349
if (debug) {
350
console.clear();
351
console.log(
352
"js.pl->toggle_display_element()->\\ntoggler ID: " + toggler + "\\n" +
353
"show div: " + element_id_to_toggle + "\\n" +
354
"LET: " + lastElementToggled
355
);
356
}
357
358
if (element_id_to_toggle == lastElementToggled) {
359
if (debug) { console.log('js.pl->toggle_display_element->' + element_id_to_toggle + ' is already visible!'); }
360
return 0; // 0 when your ID fails
361
}
362
363
let e = document.getElementById(element_id_to_toggle);
364
if (e) {
365
if (e.style.display != "none") {
366
// if the div is visible
367
if (debug) { console.log("js.pl->toggle_display_element->" + lastElementToggled + " is visible"); }
368
e.style.display = "none";
369
if (debug) { console.log("js.pl->toggle_display_element->updating '" + element_id_to_toggle + "div' class"); }
370
let d = document.getElementById(element_id_to_toggle + "div");
371
if (d) {
372
d.classList.add("navbutton_selected");
373
d.classList.remove("navbutton");
374
let lt = document.getElementById(lastElementToggled + "div");
375
if (debug) { console.log("js.pl->toggle_display_element->updating '" + element_id_to_toggle + "div' class"); }
376
lt.classList.add("navbutton");
377
lt.classList.remove("navbutton_selected");
378
} else {
379
console.error("no such id: " + element_id_to_toggle + "div");
380
}
381
} else {
382
// if the div is hidden
383
if (lastElementToggled) {
384
let div = document.getElementById(lastElementToggled);
385
if (div) {
386
if (debug) { console.log("js.pl->toggle_display_element->hiding " + lastElementToggled); }
387
div.style.display = "none";
388
if (debug) { console.log("js.pl->toggle_display_element->toggling '" + element_id_to_toggle + "div' class"); }
389
let lt = document.getElementById(lastElementToggled + "div");
390
lt.classList.remove("navbutton_selected");
391
lt.classList.add("navbutton");
392
} else if (debug) {
393
console.log("js.pl->toggle_display_element->'" + lastElementToggled + "' is not valid!");
394
}
395
} else {
396
if (debug) { console.log("js.pl->toggle_display_element->LET is NULL!"); }
397
}
398
399
if (debug) { console.log("js.pl->toggle_display_element->showing '" + element_id_to_toggle + "'"); }
400
e.style.display = "block";
401
402
let d = document.getElementById(element_id_to_toggle + "div");
403
if (d) {
404
d.classList.remove("navbutton");
405
d.classList.add("navbutton_selected");
406
lastElementToggled = element_id_to_toggle;
407
if (debug) { console.log('js.pl->toggle_display_element->LET is now: ' + lastElementToggled); }
408
} else {
409
console.error("no such id: " + element_id_to_toggle + "div");
410
}
411
}
412
} else {
413
console.error("no such id: " + element_id_to_toggle);
414
}
415
}
416
417
END
418
419
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
420
421
$javascript .= <<END;
422
function toggle_display_element_TOO(element_id_to_toggle, toggler) {
423
console_msg(element_id_to_toggle);
424
if (element_id_to_toggle == lastElementToggled) { return 0; }
425
426
let sp = document.getElementById("statpage");
427
if (sp) {
428
if (element_id_to_toggle == "bio") { sp.value = "b"; }
429
else if (element_id_to_toggle == "vit") { sp.value = "v"; }
430
else if (element_id_to_toggle == "loc") { sp.value = "l"; }
431
else if (element_id_to_toggle == "desc") { sp.value = "d"; }
432
else if (element_id_to_toggle == "pw") { sp.value = "p"; }
433
else if (element_id_to_toggle == "th") { sp.value = "t"; }
434
else if (element_id_to_toggle == "su") { sp.value = "m"; }
435
else if (element_id_to_toggle == "sp") { sp.value = "c"; }
436
else if (element_id_to_toggle == "bl") { sp.value = "B"; }
437
else { sp.value = "b"; }
438
}
439
440
let e = document.getElementById(element_id_to_toggle);
441
if (e) {
442
if (e.style.opacity == 1) {
443
// if the div is visible
444
console_msg('visible!');
445
446
e.classList.add("hidden");
447
let d = document.getElementById(element_id_to_toggle + "div");
448
d.classList.add("navbutton_selected");
449
d.classList.remove("navbutton");
450
lastElementToggled = 0;
451
} else {
452
// if the div is hidden
453
console_msg('not visible!');
454
455
if (lastElementToggled) {
456
console_msg('lastElementToggled: ' + lastElementToggled);
457
document.getElementById(lastElementToggled).classList.toggle('hidden');
458
let lt = document.getElementById(lastElementToggled + "div");
459
lt.classList.add("navbutton");
460
lt.classList.remove("navbutton_selected");
461
}
462
463
e.classList.add("visible");
464
let d = document.getElementById(element_id_to_toggle + "div");
465
d.classList.add("navbutton_selected");
466
d.classList.remove("navbutton");
467
lastElementToggled = element_id_to_toggle;
468
}
469
}
470
}
471
472
END
473
474
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
475
476
$javascript .= <<END;
477
function update_admin_users_pages() {
478
if (lastElementToggled == 0) {
479
lastElementToggled = 'stats';
480
} else {
481
console_msg(lastElementToggled);
482
}
483
484
let u = document.getElementById('users');
485
486
let s = document.getElementById('edit_ustats');
487
let p = document.getElementById('edit_uphotos');
488
let f = document.getElementById('edit_uflags');
489
END
490
491
if (User::isUserAdmin()) { $javascript .= " let m = document.getElementById('edit_umsgs');\n"; }
492
493
$javascript .= <<END;
494
let sString = "<table border=0 cellpadding=0 cellspacing=0 style='height: 100vh;' class=centered><tr><td align=center><table border=0 cellpadding=0 cellspacing=0 class=notice><tr><td>Loading...</td></tr></table></td></tr></table>";
495
496
if (s.document) { s.document.body.innerHTML = sString; } else { s.contentDocument.body.innerHTML = sString; }
497
if (p.document) { p.document.body.innerHTML = sString; } else { p.contentDocument.body.innerHTML = sString; }
498
if (f.document) { f.document.body.innerHTML = sString; } else { f.contentDocument.body.innerHTML = sString; }
499
END
500
501
if (User::isUserAdmin()) { $javascript .= " if (m.document) { m.document.body.innerHTML = sString; } else { m.contentDocument.body.innerHTML = sString; }\n"; }
502
503
$javascript .= <<END;
504
s.src = '/edit_ustats.pl?$QUERY_UID=' + u.value;
505
p.src = '/edit_uphotos.pl?$QUERY_UID=' + u.value;
506
f.src = '/edit_uflags.pl?$QUERY_UID=' + u.value;
507
END
508
509
if (User::isUserAdmin()) { $javascript .= " m.src = '/edit_umsgs.pl?$QUERY_UID=' + u.value;\n"; }
510
511
$javascript .= <<END;
512
}
513
514
END
515
516
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
517
518
$javascript .= <<END;
519
function preview_theme(t) {
520
// this function was written for the index page "settings", theme select box onchange event
521
let tid = document.getElementById("user_theme").value;
522
523
// remove the current css
524
let css = document.getElementById("css");
525
if (css) {
526
let mama = css.parentNode;
527
if (mama) {
528
//mama.removeChild(css);
529
530
let xhttp = new XMLHttpRequest();
531
xhttp.onreadystatechange = function() {
532
if (xhttp.readyState == 4 && xhttp.status == 200) {
533
if (xhttp.responseText) {
534
//console_msg("got the css!");
535
// now we insert the css
536
let s = document.createElement('style');
537
s.innerHTML = xhttp.responseText;
538
document.body.appendChild(s);
539
//console_msg("css updated");
540
} else {
541
console_msg("no css was delivered!");
542
}
543
}
544
}
545
546
xhttp.open("GET", "css.pl?tid=" + tid, true);
547
xhttp.send();
548
//console_msg("asking for css.pl?tid=" + tid);
549
} else { // else of if (mama)
550
//console_msg("parent not found!");
551
return;
552
}
553
} else { // else of if (css)
554
//console_msg("unable to remove css");
555
return;
556
}
557
558
//console_msg("awaiting response from css.pl...");
559
}
560
561
END
562
563
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
564
565
$javascript .= <<END;
566
function restore_theme() {
567
// this function was written for the index page "settings", theme select box onchange event
568
let tid = document.getElementById("user_theme").value;
569
570
// remove the current css
571
let css = document.getElementById("css");
572
if (css) {
573
let mama = css.parentNode;
574
if (mama) {
575
//mama.removeChild(css);
576
577
let xhttp = new XMLHttpRequest();
578
xhttp.onreadystatechange = function() {
579
if (xhttp.readyState == 4 && xhttp.status == 200) {
580
if (xhttp.responseText) {
581
//console_msg("got the css!");
582
// now we insert the css
583
let s = document.createElement('style');
584
s.innerHTML = xhttp.responseText;
585
document.body.appendChild(s);
586
//console_msg("css updated");
587
} else {
588
//console_msg("no css was delivered!");
589
}
590
}
591
}
592
593
xhttp.open("GET", "css.pl", true);
594
xhttp.send();
595
//console_msg("asking for default css.pl");
596
} else { // else of if (mama)
597
//console_msg("parent not found!");
598
return;
599
}
600
} else { // else of if (css)
601
//console_msg("unable to remove css");
602
return;
603
}
604
605
//console_msg("awaiting response from css.pl...");
606
}
607
608
END
609
610
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
611
612
$javascript .= <<END;
613
// When the user clicks on the 'dropdown' button, toggle
614
// between hiding and showing the dropdown content
615
function menu() {
616
let m = document.getElementById("myDropdown");
617
if (m) m.classList.toggle("show");
618
619
let t = document.getElementById("dropdownbutton");
620
if (t) {
621
if (t.innerHTML === "v") {
622
t.innerHTML = "=";
623
} else {
624
t.innerHTML = "v";
625
}
626
}
627
}
628
629
// Close the dropdown menu if the user clicks outside of it
630
window.onclick = function(event) {
631
if (!event.target.matches('.dropbtn')) {
632
let b = document.getElementById("dropdownbutton");
633
let m = document.getElementById("myDropdown");
634
635
if (b && m) {
636
if (m.classList.contains('show')) {
637
m.classList.remove('show');
638
}
639
640
if (m.classList.contains('show'))
641
{ b.innerHTML = "v"; } else
642
{ b.innerHTML = "="; }
643
}
644
}
645
}
646
647
END
648
649
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
650
651
$javascript .= <<END;
652
function fizzBuzz(a, b) {
653
let i = 1;
654
655
for (i = 1; i <= 100; i++) {
656
let output = "";
657
658
if (i % a == 0) { output += "Fizz"; }
659
if (i % b == 0) { output += "Buzz"; }
660
661
if (!output) { output = i; }
662
663
document.getElementsByTagName('body')[0].innerHTML += output + "<br>\\n";
664
}
665
}
666
667
END
668
669
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
670
671
$javascript .= <<END;
672
function console_msg(msg) {
673
END
674
675
if ($ENABLE_CONSOLE) {
676
$javascript .= " if (enableconsole) { console.info(msg); }\n";
677
} else {
678
$javascript .= " return 0;\n";
679
}
680
$javascript .= "}\n";
681
682
$javascript .= <<END;
683
684
function loadjs(src, onload) {
685
let script = document.createElement("script");
686
script.type = "text/javascript";
687
script.src = src;
688
if (onload) {
689
script.onload = onload;
690
691
script.onreadystatechange = function() {
692
if (script.readyState == "loaded" || script.readyState == "complete"){
693
script.onreadystatechange = null;
694
//execute the onload callback function
695
}
696
};
697
}
698
document.getElementsByTagName("head")[0].appendChild(script);
699
}
700
701
END
702
703
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
704
705
$javascript .= <<END;
706
function selectTitleToSelectedText(sid) {
707
let e = document.getElementById(sid);
708
e.title = e.options[e.selectedIndex].text;
709
}
710
711
END
712
713
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
714
715
$javascript .= <<END;
716
function selectBgImageToUserDisplayPic(sid) {
717
let e = document.getElementById(sid);
718
let url = '/getdpid.pl?$QUERY_UID=' + e.options[e.selectedIndex].value;
719
console_msg(url);
720
721
hrequest(url).then(
722
function(data) {
723
console_msg(data);
724
e.style.backgroundImage = "url('/getimage.pl?id=" + data + "')";
725
}
726
);
727
}
728
729
END
730
731
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
732
733
$javascript .= <<END;
734
function selectText(eid) {
735
let e = document.getElementById(eid, what);
736
if (e) {
737
e.focus();
738
if (what == 'value') { e.setSelectionRange(0, e.value.length); }
739
if (what == 'html') { e.setSelectionRange(0, e.innerHTML.length); }
740
return 1;
741
} else { // if not e
742
if (enableconsole) console.error('no such eid: ' + eid);
743
return 0;
744
}
745
}
746
747
END
748
749
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
750
751
$javascript .= <<END;
752
function copyText(eid) {
753
try {
754
document.execCommand('copy');
755
} catch (err) {
756
if (enableconsole) { console.error(err); }
757
}
758
}
759
760
END
761
762
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
763
764
$javascript .= <<END;
765
function as_copypaste_clicker(eid) {
766
let e = document.getElementById(eid);
767
if (e) {
768
e.addEventListener('click', () => {
769
selectText(eid);
770
copyText(eid);
771
});
772
} else {
773
if (enableconsole) console.error('no such eid: ' + eid);
774
return 0;
775
}
776
}
777
778
END
779
780
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
781
782
$javascript .= <<END;
783
function play_sound(fn) {
784
// fn will be relative to night-stand.ca/sounds/
785
// do not include leading or trailing slash(es) in fn
786
787
let sound = new Audio('/sounds/' + fn);
788
sound.play();
789
}
790
791
END
792
793
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
794
795
$javascript .= <<END;
796
function clearSelection() {
797
if (window.getSelection) { window.getSelection().removeAllRanges(); }
798
else if (document.selection) { document.selection.empty(); }
799
}
800
801
END
802
803
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
804
805
$javascript .= <<END;
806
function addOnload(f) {
807
if (window.addEventListener) {
808
window.addEventListener('load', f);
809
} else {
810
window.attachEvent('onload', f);
811
}
812
}
813
814
END
815
816
if ($DEBUG) { $javascript .= "/////////////////////////////////////////////////////////////////////\n\n"; }
817
818
$javascript .= <<END;
819
function ucfirst(s) {
820
return s[0].toUpperCase() + s.slice(1);
821
}
822
823
END
824
825
#######################################################
826
print pre_html_header({type=>"text/javascript", skipmaintcheck=>1});
827
828
if ($DEBUG)
829
{ print minify(input => $javascript); } else
830
{ print clear_spaces(minify(input => $javascript)); }
831
832
1;