js.pl
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;