PageSourceSearch

https://www.w3schools.com/lib/w3schools_footer.js?update=20260819

js w3schools.com collected 2026-09-24 08:24:00 UTC 68,004 bytes, 1,680 lines download raw bytes

1function highlightClassicSubNavActiveLinks(subNavId) {
2  var subNavBarElm = document.getElementById(subNavId);
3
4  if (subNavBarElm) {
5    var currentUrlPathSlashesCount = window.location.pathname.split('/').length - 1;
6
7    // we expect at least one parent directory for each topic
8    if (currentUrlPathSlashesCount < 2) {
9      return;
10    }
11
12    var currentUrl = 'https://' + window.location.hostname + window.location.pathname;
13    var currentBaseUrlDirPath = 'https://' + window.location.hostname + '/';
14
15    var subNavLinks = subNavBarElm.getElementsByTagName("A");
16
17    var getDirPath = function (path) {
18      var pathChunks = path.split('/');
19      pathChunks.pop();
20      return pathChunks.join('/');
21    }
22
23    for (var i = 0; i < subNavLinks.length; i++) {
24      var subNavLinkUrl = subNavLinks[i].href;
25
26      if (currentUrl === subNavLinkUrl) {
27        subNavLinks[i].classList.add('active');
28        // break;
29      } else {
30        var subNavLinkDirPath = getDirPath(subNavLinkUrl) + '/';
31
32        if (currentBaseUrlDirPath === subNavLinkDirPath) {
33          continue;
34        }
35
36        if (currentUrl.indexOf(subNavLinkDirPath) === 0) {
37          subNavLinks[i].classList.add('active');
38          // break;
39        }
40      }
41    }
42  }
43}
44highlightClassicSubNavActiveLinks('topnav');
45
46function w3sFindInnerElements(parentElement, queryStr, callback) {
47  var output = [];
48
49  var hasCallback = typeof callback !== 'undefined';
50
51  var elements = parentElement.querySelectorAll(queryStr);
52
53  for (var index = 0; index < elements.length; index++) {
54    output.push(elements[index]);
55
56    if (hasCallback) {
57      callback(elements[index], index);
58    }
59  }
60
61  return output;
62};
63
64function w3sElementAddClass(elm, className, context) {
65  // console.log("w3sElementAddClass: ", {
66  //   elm,
67  //   className,
68  //   context,
69  // });
70
71  if (!elm) {
72    return;
73  }
74
75  if (typeof elm.classList !== "undefined") {
76    elm.classList.add(className);
77  } else {
78    elm.className += " " + className;
79  }
80};
81
82function w3sElementRemoveClass(elm, className) {
83  if (!elm) {
84    return;
85  }
86
87  if (typeof elm.classList !== "undefined") {
88    elm.classList.remove(className);
89  } else {
90    elm.className = elm.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
91  }
92};
93
94function w3sElementContainsClass(elm, className) {
95  if (!elm) {
96    return false;
97  }
98
99  if (typeof elm.classList !== "undefined") {
100    return elm.classList.contains(className);
101  } else {
102    var classes = elm.className.split(/\s+/);
103    return classes.indexOf(className) !== -1;
104  }
105};
106
107function w3sElementTriggerCustomEvent(element, eventName, eventData) {
108  try {
109    // Check if the browser supports the CustomEvent constructor
110    if (typeof CustomEvent === "function") {
111      // Modern browsers
112      var event = new CustomEvent(eventName, { detail: eventData });
113      element.dispatchEvent(event);
114    } else if (document.createEvent) {
115      // For IE9+
116      var event = document.createEvent('CustomEvent');
117      event.initCustomEvent(eventName, true, true, eventData);
118      element.dispatchEvent(event);
119    } else {
120      // IE8 and below
121      var event = document.createEventObject();
122      event.detail = eventData;
123      element.fireEvent("on" + eventName, event);
124    }
125  } catch (exc) {
126    console.error("w3sElementTriggerCustomEvent: ", exc);
127  }
128};
129
130function w3sScrollToMiddle(targetElm, scrollElm) {
131  if (
132    !targetElm
133    || !scrollElm
134  ) {
135    return false;
136  }
137
138  // Target element's top position relative to its parent (scrollElm)
139  var teTop = targetElm.offsetTop;
140  var teHeight = targetElm.offsetHeight;
141
142  // Height of the scrollable element
143  var seHeight = scrollElm.clientHeight;
144
145  // Calculate the middle position of the target element
146  var teMiddle = teTop + (teHeight / 2);
147
148  // Calculate the new scroll position to bring the target element to the middle of the scrollable element
149  var newScrollTop = teMiddle - (seHeight / 2);
150
151  // Apply the new scroll position to the scrollable element
152  scrollElm.scrollTop = newScrollTop;
153
154  return true;
155};
156
157function open_menu() {
158  var x, m;
159  m = (document.getElementById("leftmenu") || document.getElementById("sidenav"));
160  if (m && m.style.display == "block") {
161    close_menu();
162    w3sElementTriggerCustomEvent(m, 'w3sSideNavClose', null);
163  } else {
164    w3_close_all_nav();  
165    if (m) {
166      m.style.display = "block";
167
168      if (m.getAttribute("data-scrolled") !== "true") {
169        sidemenuitemintoview();
170      }
171    }
172
173    if (document.getElementsByClassName) {
174      x = document.getElementsByClassName("chapter")
175      for (i = 0; i < x.length; i++) {
176        x[i].style.visibility = "hidden";
177      }
178      x = document.getElementsByClassName("nav")
179      for (i = 0; i < x.length; i++) {
180        x[i].style.visibility = "hidden";
181      }
182      x = document.getElementsByClassName("sharethis")
183      for (i = 0; i < x.length; i++) {
184        x[i].style.visibility = "hidden";
185      }
186    }
187    fix_sidemenu();
188    w3sElementTriggerCustomEvent(m, 'w3sSideNavOpen', null);
189  }
190}
191function close_menu() {
192  var m;
193  m = (document.getElementById("leftmenu") || document.getElementById("sidenav"));
194  if (m) m.style.display = "none";  
195  if (document.getElementsByClassName) {
196    x = document.getElementsByClassName("chapter")
197    for (i = 0; i < x.length; i++) {
198      x[i].style.visibility = "visible";
199    }
200    x = document.getElementsByClassName("nav")
201    for (i = 0; i < x.length; i++) {
202      x[i].style.visibility = "visible";
203    }
204    x = document.getElementsByClassName("sharethis")
205    for (i = 0; i < x.length; i++) {
206      x[i].style.visibility = "visible";
207    }            
208  }
209}
210if (window.addEventListener) {
211  window.addEventListener("scroll", function () {fix_sidemenu(); });
212  window.addEventListener("resize", function () {fix_sidemenu(); });  
213  window.addEventListener("touchmove", function () {fix_sidemenu(); });  
214  window.addEventListener("load", function () {fix_sidemenu(); });
215} else if (window.attachEvent) {
216  window.attachEvent("onscroll", function () {fix_sidemenu(); });
217  window.attachEvent("onresize", function () {fix_sidemenu(); });  
218  window.attachEvent("ontouchmove", function () {fix_sidemenu(); });
219  window.attachEvent("onload", function () {fix_sidemenu(); });
220}
221function fix_sidemenu() {
222  const fw = document.getElementById("footerwrapper");
223  if (fw) {
224    const iw = window.innerWidth;    
225    if (iw < 992) {
226      const lmi = document.getElementById("leftmenuinner");
227      if (lmi) {lmi.style.height = '';}
228    } else {
229      const ch = fw.getBoundingClientRect().top;
230      if (ch) {
231        let h = Math.min(window.innerHeight, ch);
232        h = Math.max(h, 0);
233        const lmi = document.getElementById("leftmenuinner");
234        if (lmi) {lmi.style.height = h + "px";}
235      }
236    }
237  }
238  const srb = document.getElementById("scroll_right_btn");
239  if (srb) {
240    let winwidth = document.documentElement.clientWidth;
241    let a = winwidth - 1750;
242    let b;
243    if (a <= 0) {
244      b = 0;
245    } else {
246      b = a / 2;
247    }
248    srb.style.right = b + "px";
249  }
250    
251return false;
252  var w, top;
253  w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
254  top = scrolltop()    
255/*  if (w < 993 && w > 600) {
256    if (top == 0) {
257      document.getElementById("sidenav").style.top = "144px";
258    }
259    if (top > 0 && top < 100) {
260      document.getElementById("sidenav").style.top = (144 - top) + "px";      
261    }
262    if (top > 100) {
263      document.getElementById("sidenav").style.top = document.getElementById("topnav").offsetHeight + "px";
264      document.getElementById("belowtopnav").style.paddingTop = "44px";    
265      document.getElementById("topnav").style.position = "fixed";    
266      document.getElementById("topnav").style.top = "0";
267    } else {
268      document.getElementById("belowtopnav").style.paddingTop = "0";
269      document.getElementById("topnav").style.position = "relative";
270    }
271    document.getElementById("leftmenuinner").style.paddingTop = "0";
272  } else {*/
273
274
275    if (top == 0) {
276      document.getElementById("sidenav").style.top = "118px";      
277    }
278    if (top > 0 && top < 73) {
279      document.getElementById("sidenav").style.top = (118 - top) + "px";      
280    }
281    if (top > 73) {
282      document.getElementById("sidenav").style.top = "44px";
283      if (w > 992) {document.getElementById("leftmenuinner").style.paddingTop = "44px";}
284      document.getElementById("belowtopnav").style.paddingTop = "44px";    
285      document.getElementById("topnav").style.position = "fixed";
286      document.getElementById("topnav").style.top = "0";
287      document.getElementById("myAccordion").style.paddingTop = "44px";
288    } else {
289      if (w > 992) {
290        document.getElementById("leftmenuinner").style.paddingTop = (118 - top) + "px";
291      } else { //ELSEN ER NY
292        document.getElementById("leftmenuinner").style.paddingTop = 0;
293      }
294      document.getElementById("belowtopnav").style.paddingTop = "0";
295      document.getElementById("myAccordion").style.paddingTop = "0";
296      document.getElementById("topnav").style.position = "relative";
297    }
298/*  }*/
299}
300
301function sidemenuitemintoview() {
302  var a, b;
303  a = document.getElementById("leftmenuinnerinner");
304  if (!a || !a.getElementsByClassName) {return false;}
305  b = a.getElementsByClassName("active");
306  if (b.length < 1) {return false;}
307
308  var o = 0; // active element max offset top
309  var e = null; // active element ref with max offset top
310
311  for (var li = 0; li < b.length; li++) {
312    var le = b[li];
313
314    if (le.offsetTop > o) {
315      o = le.offsetTop;
316
317      e = le;
318    }
319  }
320
321  var s = w3sScrollToMiddle(e, a);
322
323  var m = (document.getElementById("leftmenu") || document.getElementById("sidenav"));
324
325  if (m) {
326    m.setAttribute("data-scrolled", s ? "true" : "false");
327  }
328};
329
330function scrolltop() {
331  var top = 0;
332  if (typeof(window.pageYOffset) == "number") {
333    top = window.pageYOffset;
334  } else if (document.body && document.body.scrollTop) {
335    top = document.body.scrollTop;
336  } else if (document.documentElement && document.documentElement.scrollTop) {
337    top = document.documentElement.scrollTop;
338  }
339  return top;
340}
341
342function xxxchangecodetheme() {
343  var cc = document.body.className;
344  if (cc.indexOf("darktheme") > -1) {
345    document.body.className = cc.replace("darktheme", "");
346    localStorage.setItem("preferredmode", "light");
347  } else {
348    document.body.className += " darktheme";
349    localStorage.setItem("preferredmode", "dark");
350  }
351}
352function changecodetheme(n) {
353  var cc = document.body.className;
354  if (cc.indexOf("darktheme") > -1) {
355    document.body.className = cc.replace("darktheme", "");
356    document.body.className = document.body.className.replace("  ", " ");
357    localStorage.setItem("preferredmode", "light");
358  } else {
359    document.body.className += " darktheme";
360    document.body.className = document.body.className.replace("  ", " ");    
361    localStorage.setItem("preferredmode", "dark");
362  }
363  if (n == 2) {
364    cc = document.body.className;
365    if (cc.indexOf("darkpagetheme") > -1) {
366      document.body.className = cc.replace("darkpagetheme", "");
367      document.body.className = document.body.className.replace("  ", " ");    
368      localStorage.setItem("preferredpagemode", "light");
369    } else {
370      document.body.className += " darkpagetheme";
371      document.body.className = document.body.className.replace("  ", " ");    
372      localStorage.setItem("preferredpagemode", "dark");
373    }
374  }
375}
376
377function click_login_btn() {
378  w3_open_nav("login");
379}
380
381function w3_close_all_nav() {
382  w3_close_all_topnav();
383  close_menu();
384}
385
386(function () {
387  var x, y, i, a, aa, b, bb, c, cc, d, dd, m, tn, oa, ohe, obe;
388  m = (document.getElementById("leftmenu") || document.getElementById("sidenav"));
389  if (m) {
390    x = m.getElementsByTagName("A");
391    dd = document.location.href;
392    if (dd.indexOf("quiztest") > -1) {
393      d = dd;
394    } else {
395      d = dd.split('?')[0]; // added split to show active regardless of parameters
396    }
397    for (i = 0; i < x.length; i++) {
398      if (dd.indexOf("quiztest") > -1) {
399        aa = x[i].href;
400        //console.log("Haystack: " + d);
401        //console.log("Needle: " + aa);
402      } else {
403        aa = x[i].href.split('?')[0];  // added split to show active regardless of parameters
404      }
405      bb = false;
406      if (d.substr(-1, 1) == "/" && (aa.indexOf("default.asp") > -1 ||  aa.indexOf("index.php") > -1)) bb = true;
407      if (d.indexOf(aa) >= 0 || bb) {
408        w3sElementAddClass(x[i], "active");
409        y = x[i].nextElementSibling;
410        if (y && (y.className.indexOf("ref_overview") > -1 || y.className.indexOf("tut_overview") > -1)) {
411          ohe = x[i]; // overview header element
412          obe = y; // overview body element
413          y.style.display = "block";
414          w3sElementAddClass(x[i], "active_overview");
415
416          oa = y.getElementsByTagName("a")[0];
417
418          if (oa && oa.href.split('?')[0].indexOf(aa) >= 0) {
419            w3sElementAddClass(oa, "active");
420          }
421
422          if (x[i].addEventListener) {
423            cc = true;
424            var lessonGroupToggleElm = x[i];
425
426            lessonGroupToggleElm.addEventListener("click", function () {
427              if (cc == true) {
428                w3sElementRemoveClass(lessonGroupToggleElm, "open");
429                w3sElementAddClass(lessonGroupToggleElm, "closed");
430                y.style.display = "none";
431                event.preventDefault();
432                cc = false;
433              } else {
434                w3sElementRemoveClass(lessonGroupToggleElm, "closed");
435                w3sElementAddClass(lessonGroupToggleElm, "open");
436                y.style.display = "block";
437                cc = true;
438                event.preventDefault();
439              }
440            });
441          }
442        } else if (x[i].parentElement.className.indexOf("ref_overview") > -1) {
443          x[i].parentElement.style.display = "block";
444          w3sElementAddClass(x[i].parentElement.previousElementSibling, "active");
445          w3sElementAddClass(x[i].parentElement.previousElementSibling, "activesub");
446        } else if (x[i].parentElement.className.indexOf("tut_overview") > -1) {
447          x[i].parentElement.style.display = "block";
448          w3sElementAddClass(x[i].parentElement.previousElementSibling, "active");
449          w3sElementAddClass(x[i].parentElement.previousElementSibling, "active_overview");
450        } else if (x[i].parentElement.className.indexOf("step_bar") > -1 && x[i].parentElement.parentElement.className.indexOf("tut_overview") > -1) {
451          x[i].parentElement.parentElement.style.display = "block";
452          w3sElementAddClass(x[i].parentElement.parentElement.previousElementSibling, "active");
453          w3sElementAddClass(x[i].parentElement.parentElement.previousElementSibling, "active_overview");
454        }
455        break;
456      } else if (d.indexOf("/tags/att_") > -1) {
457         c = d.substring(d.indexOf("/tags/att_") + 10, d.lastIndexOf("_"));
458         if (x[i].href == d.substr(0, d.indexOf("/tags/")) + "/tags/tag_" + c + ".asp") {
459           w3sElementAddClass(x[i], "active");
460         }
461      } else if (d.indexOf("/howto/default_page") > -1) {
462         if (x[i].href.indexOf("default.asp") > -1) {
463           w3sElementAddClass(x[i], "active");
464         }
465      }
466    }
467
468    if (ohe && obe) {
469      var activeOverviewElementLinks = w3sFindInnerElements(obe, "a.active");
470
471      if (activeOverviewElementLinks.length > 0) {
472        w3sElementAddClass(ohe, "active-links-present");
473        w3sElementAddClass(obe, "active-links-present");
474      } else {
475        w3sElementAddClass(ohe, "active-links-absent");
476        w3sElementAddClass(obe, "active-links-absent");
477      }
478    }
479
480    sidemenuitemintoview();
481  }
482  tn = (document.getElementById("topnav") || document.getElementById("subtopnav"));
483  x = tn.getElementsByTagName("A");
484  for (i = 0; i < x.length; i++) {
485    a = document.location.pathname;
486    b = x[i].pathname;
487    if ((x[i].parentNode.tagName == "LI" || (a != "/" && x[i].parentNode.className.indexOf("w3-bar") > -1) && a.substr(0, a.indexOf("/",1)) ==  b.substr(0, b.indexOf("/",1)))) {
488      w3sElementAddClass(x[i], "active");
489    }
490  }
491  if (window.addEventListener) { 
492    document.getElementById("main").addEventListener("click", w3_close_all_nav, true);
493    if (m) m.addEventListener("click", w3_close_all_topnav, true);
494    document.getElementById("right").addEventListener("click", w3_close_all_nav, true);
495    document.getElementById("main").addEventListener("wheel", w3_close_all_nav, true);
496    document.getElementById("main").addEventListener("touchstart", w3_close_all_nav, true);
497  } else if (window.attachEvent) {         
498    document.getElementById("main").attachEvent("onclick", w3_close_all_nav);
499    if (m) m.attachEvent("onclick", w3_close_all_topnav);
500    document.getElementById("right").attachEvent("onclick", w3_close_all_nav);
501  }
502  if ('ontouchstart' in window || 'onmsgesturechange' in window) {
503    if (document.getElementById("leftmenuinnerinner")) document.getElementById("leftmenuinnerinner").style.overflowY = "scroll";
504  }
505
506  MyLearning.uiSidenavPatch();
507})();
508(function () {
509  var a, b, c, cc, d, e, l, ll, i, j, r, n;
510  a = document.getElementsByClassName("w3-example");
511  l = a.length;
512  for (i = 0; i < l; i++) {
513    r = [];
514    b = a[i].querySelectorAll("[data-tab-header]");
515    ll = b.length;
516    n = 0;
517    for (j = 0; j < ll; j++) {
518      if (b[j].getAttribute("data-active-tab") == "true") n = j;
519      r.push(b[j]);
520    }
521    ll = r.length;
522    if (ll > 0) {
523      c = document.createElement("DIV");
524      c.classList.add("w3-example-tabs")
525      d = document.createElement("DIV");
526      d.classList.add("w3-example-tabs-header-container");
527      for (j = 0; j < ll; j++) {
528        e = document.createElement("DIV");
529        e.classList.add("w3-example-tab-header")
530        if (j == n) {
531          e.classList.add("active-tab");
532          r[n].style.display = "block";
533        }
534        e.innerHTML = b[j].getAttribute("data-tab-header");
535        e.addEventListener("click", activate_example_tab);
536        d.appendChild(e);
537      }
538      c.appendChild(d);
539      a[i].insertBefore(c, a[i].querySelectorAll("[data-tab-header]")[0]);
540    }
541  }
542})();
543(function () {
544  var exercise = document.getElementById("exercisecontainer")
545  if (exercise) {
546    var src = exercise.getAttribute("src");
547    if (!src) return;
548    var extensions = (exercise.getAttribute("data-extensions") || "asp");
549    var s = document.createElement("script");
550    s.src = src;
551    document.getElementById("exercisecontainer").appendChild(s);
552    var filename = src.replace(".js", "1");
553    window.addEventListener("load", load_quiz);
554  }
555  function insert_exercise() {
556    var qobj, l, i = 0, a = "";
557    qobj = qobjects[0];
558    if (qobj.draganddroptext) {
559      var x, l, i = 0, a = "", b, cl = 2, ddquestion = qobj.draganddropquestion, ddtext = qobj.draganddroptext, resttxt;
560      a = "<h2>Exercise<span class='questionmark w3-tooltip'><span style='display:block;text-align:left;'>?</span>";
561      a += "<span class='w3-text' style='padding:0 20px 30px 20px'><b>What is this?</b><br>";
562      a += "Test your skills by answering a few questions about the topics of this page</span></span></h2>";
563      a += "<div id='qobj_question'></div>";
564      a += "<div id='qobj_drag_and_drop'></div>";
565      a += "<div id='qobj_code_area'></div>";
566      document.getElementById("exercisecontainer").innerHTML = a;
567      a = "";
568      for (i = 0; i < qobj.options.length; i++) {
569        a += "<div";
570         a += " class='dragoptioncontainer'";
571         a += " id='dragoptioncontainer" + i + "'";       
572         a += " ondragenter='handleDragBackEnter(this, " + i + ")'";
573         a += " ontouchmove='handleDragBackEnter(this, " + i + ")'";       
574         a += " ondragleave='handleDragBackLeave(this)'";
575         a += " ondrop='handleDragBackDrop(this)'";
576         a += " ontouchleave='handleDragBackLeave(this)'";
577         a += " ontouchend='handleDragBackDrop(this)'";
578         a += ">";
579          a += "<div";
580           a += " class='dragoption'";
581           a += " id='dragoption" + i + "'";
582           a += " draggable='true'";
583           a += " ondragstart='handleDragStart(this, " + i + ")'";
584           a += " ondragend='handleDragEnd(this, " + i + ")'";
585           a += " onclick='click_drag_option(" + i + ")'";
586           a += " ontouchstart='handleDragStart(this, " + i + ")'";
587           a += " ontouchmove='touch_ttt_move(event)'";
588           a += " ontouchend='handleDragEnd(this, " + i + ")'";
589           a += " style='touch-action: none;'>";
590        a += qobj.options[i];
591        a += "</div></div>";
592      }
593      document.getElementById("qobj_code_area").innerHTML = "<div id='qobj_drag_and_drop_options'>" + a + "</div>";
594      x = document.getElementsByClassName("dragoption");
595      l = x.length;
596      for (i = 0; i < l; i++) {
597        if (x[i].innerText.length > cl) cl = x[i].innerText.length;
598      }
599      cl = cl + 4;
600      resttxt = ddtext;
601      i = -1;
602      while (resttxt.indexOf("___") > -1) {
603        ddanswers.push(-1);
604        i++;
605        a = "<span";
606         a += " class='ddcontainer'";
607         a += " id='ddcontainer" + i + "'";
608         a += " style='width:" + cl + "ch;'";
609         a += " ondragenter='handleDragEnter(this, " + i + ")'";
610         a += " ondragleave='handleDragLeave(this)'";
611         a += " ondrop='handleDragDrop(this)'";
612         a += " ontouchleave='handleDragLeave(this)'";
613         a += " ontouchend='handleDragDrop(this)'"
614         a += ">";
615          a += " <span";
616           a += " class='ddanswer'";
617           a += " id='ddanswer" + i + "'";
618           a += " onclick='remove_drag_option(" + i + ")'";
619           a += " draggable='true'";
620           a += " ondragstart='handleDragBackStart(this, " + i + ")'";
621           a += " ondragend='handleDragBackEnd(this, " + i + ")'";
622           a += " ondtouchstart='handleDragBackStart(this, " + i + ")'";
623           a += " ontouchmove='touch_ttt_move_back(this, event)'";         
624           a += " ontouchend='handleDragBackEnd(this, " + i + ")'";
625           a += " style='touch-action: none;'>";         
626        a += "</span></span>";
627        ddtext = ddtext.replace("___", a);
628        resttxt = resttxt.substr(resttxt.indexOf("___") + 3);
629      }      
630      document.getElementById("qobj_drag_and_drop").innerHTML = ddtext;
631      document.getElementById("qobj_drag_and_drop").style.display = "block";
632      document.getElementById("qobj_question").innerHTML = ddquestion;
633      a = "<form action='exercise." + extensions + "?x=" + filename + "' method='post' target='_blank' rel='opener'>";
634      a += "<input type='hidden' id='formanswer' name='formanswer'>";
635      a += "<br><br><button type='submit' class='ws-btn' onclick='fill_dd_formanswer()'>Submit Answer &raquo;</button></form>";
636      document.getElementById("exercisecontainer").innerHTML += a;
637      document.getElementById("exercisecontainer").addEventListener("dragover", (event) => {
638        event.preventDefault();
639      });
640    } else {
641      a = "<h2>Exercise<span class='questionmark w3-tooltip'><span style='display:block;text-align:left;'>?</span><span class='w3-text' style='padding:0 20px 30px 20px'><b>What is this?</b><br>Test your skills by answering a few questions about the topics of this page</span></span></h2>";
642      a += "<p>" + qobj.question + "</p><br>";
643      a += "<form action='exercise." + extensions + "?x=" + filename + "' method='post' target='_blank' rel='opener'>";
644      l = qobj.options.length;
645      for (i = 0; i < l; i++) {
646        a += "<div class='quizoption'>";
647        a += "<input type='radio' name='quizoption' id='quizoption" + i + "' value='" + i + "'>";
648        a += "<label for='quizoption" + i + "'>" + qobj.options[i] + "</label>";
649        a += "</div>";
650      }
651      a += "<br><button type='submit' class='ws-btn'>Submit Answer &raquo;</button>";
652      document.getElementById("exercisecontainer").innerHTML = a;
653    }
654  }
655  function click_option(event) {
656    var a, x = event.srcElement;
657    if (x.tagName != "DIV") return false;
658    a = x.getElementsByTagName("INPUT")[0];
659    a.checked = true;  
660  }
661  function load_quiz() {
662    insert_exercise()
663    var x, l, i = 0;
664    x = document.getElementsByClassName("quizoption");
665    l = x.length;
666    for (i = 0; i < l; i++) {
667      x[i].addEventListener("click", click_option);
668    }
669  }
670})();
671(
672function () {
673  if (!document.getElementsByClassName) {return;}
674  if (document.getElementsByClassName("track-progress-btn").length > 0) {
675    var cc = true;  
676    if (document.getElementsByClassName("nextprev").length == 0) {
677      cc = false;
678    } else {
679      if (document.getElementsByClassName("nextprev")[0].children.length > 2) cc = false;
680      var dd = document.getElementsByClassName("nextprev")[0].children[0].innerText;
681      if (dd.indexOf("Previous") == -1 && dd.indexOf("Home") == -1) cc = false;      
682    }
683    if (!cc) {
684      document.getElementsByClassName("track-progress-btn")[0].style.display = "none";
685    }
686  }
687  window.addEventListener("load", function () {
688    var cc = 0;
689    if (!UserSession) {
690      cc = -1;
691    } else {
692      if (UserSession.loggedIn == true) cc = 1;
693    }
694    if (cc == 1) {
695      var a, i;
696      a = document.getElementsByClassName("ws-hide-on-logged-in");
697      for (i = 0; i < a.length; i++) {
698        a[i].style.display = "none";
699      }
700    }
701  });
702})();
703function fill_dd_formanswer() {
704  document.getElementById("formanswer").value = ddanswers;
705}
706var current_mode = "question";
707var ttt_option_bottom = "none";
708var ttt_option_top = "none";
709var ttt_container_bottom = "none";
710var ttt_container_top = "none";
711var ttt_container_from_top = "none";
712var active_ddcontainer = 0;
713var active_dragback_option = -1;
714var ddanswers = [];
715function set_no_dd() {
716  ttt_option_bottom = "none";
717  ttt_option_top = "none";
718  ttt_container_bottom = "none";
719  ttt_container_top = "none";
720  ttt_container_from_top = "none";
721}
722//document.body.addEventListener('touchmove', function(e){ e.preventDefault(); });
723function touch_ttt_move(e) {
724  var x, y, z, n;
725  x = e.touches[0].pageX;
726  y = e.touches[0].pageY;  
727  z = document.elementFromPoint(x, y);
728  if (z.id && z.id.indexOf("ddcontainer") > -1) {
729    n = z.id.substr(11);
730    active_ddcontainer = n;
731    ttt_container_top = n;
732  }
733}
734function touch_ttt_move_back(elmnt, e) {
735  var x, y, z, n = -1, m = -1;
736  x = e.touches[0].pageX;
737  y = e.touches[0].pageY;  
738  z = document.elementFromPoint(x, y);
739  if (z.id && z.id.indexOf("dragoptioncontainer") > -1) {
740    n = z.id.substr(19);
741    ttt_container_bottom = n;
742  } else if (z.id && z.id.indexOf("ddcontainer") > -1) {
743    n = z.id.substr(11);
744    m = elmnt.id.substr(8);
745    active_ddcontainer = n;
746    ttt_container_top = m;
747    ttt_container_from_top = m;
748    ttt_option_top = ddanswers[m];
749  }
750}
751function remove_drag_option(i) {
752  var a, x = document.getElementById("ddanswer" + i);
753  x.style.visibility = "hidden";
754  a = document.getElementsByClassName("dragoption")[ddanswers[i]];
755  ddanswers[i] = -1;
756  a.style.visibility = "visible";
757  set_active_ddcontainer();
758}
759function click_drag_option(i) {
760  if (active_ddcontainer == -1) return false;
761  var a, x = document.getElementById("dragoption" + i);
762  ddanswers[active_ddcontainer] = i;
763  a = document.getElementsByClassName("ddanswer")[active_ddcontainer];
764  a.style.visibility = "visible";
765  a.innerHTML = x.innerHTML;
766  x.style.visibility = "hidden";
767  set_active_ddcontainer();
768}
769function set_active_ddcontainer() {
770  var i;
771  for (i = 0; i < ddanswers.length; i++) {
772    if (ddanswers[i] == -1) {
773      active_ddcontainer = i;
774      return false;
775    }
776  }
777  active_ddcontainer = -1;
778}
779function handleDragStart(x, i) {
780  ttt_option_bottom = i;
781  ttt_container_bottom = i;
782  x.style.opacity = '0.4';
783  event.dataTransfer.dropEffect = "move";
784}
785function handleDragBackStart(x, i) {
786  ttt_container_from_top = i;
787  ttt_option_top = ddanswers[i];
788  active_dragback_option = i;
789  x.style.opacity = '0.4';
790  event.dataTransfer.dropEffect = "move";
791}
792function handleDragEnd(x, i) {
793  x.style.opacity = '1';
794  if (ttt_container_top == "none") {
795  } else {
796    if (ddanswers[ttt_container_top] == -1) click_drag_option(i);
797  }
798  set_active_ddcontainer();
799  set_no_dd();
800}
801function handleDragBackEnd(x, i) {
802  x.style.opacity = '1';
803  if (ttt_container_bottom == "none" && ttt_container_top == "none") {
804  } else if (ttt_container_bottom != "none") {
805    remove_drag_option(i);  
806    document.getElementById("dragoption" + ttt_container_bottom).style.opacity = '1'; 
807  } else if (ttt_container_top != "none") {
808    if (ddanswers[ttt_container_top] == -1) {
809      click_drag_option(ttt_option_top);
810      document.getElementById("ddanswer" + ttt_container_from_top).style.visibility = "hidden";
811      ddanswers[ttt_container_from_top] = -1;
812    }
813  }
814  set_active_ddcontainer();
815  set_no_dd();
816}
817function handleDragEnter(x, i) {
818  ttt_container_top = i;
819  active_ddcontainer = i;
820  if ((ttt_container_from_top != ttt_container_top) && ddanswers[ttt_container_top] == -1) {
821    x.style.outline = '1px solid #aaaaaa';
822  }
823}
824function handleDragBackEnter(x, i) {
825  if (ttt_option_top == "none") return false;
826  ttt_container_bottom = i;
827  var dropcontainertext = document.getElementById("dragoption" + i).innerHTML;
828  var dropoptiontext = document.getElementById("ddanswer" + active_dragback_option).innerHTML;  
829  if (dropcontainertext == dropoptiontext) {
830    x.style.outline = '1px solid #aaaaaa';
831  }
832}
833function handleDragLeave(x) {
834  ttt_container_top = "none";
835  x.style.outline = 'none';
836}
837function handleDragBackLeave(x) {
838  ttt_container_bottom = "none";
839  x.style.outline = 'none';
840}
841function handleDragDrop(x) {
842  x.style.outline = 'none';
843}
844function handleDragBackDrop(x) {
845  x.style.outline = 'none';
846}
847function activate_example_tab(event) {
848  var a, b, c, d = -1, l, i;
849  a = event.target;
850  b = a.parentNode.parentNode.parentNode;
851  c = b.querySelectorAll("[data-tab-header]");
852  l = c.length;
853  for (i = 0; i < l; i++) {
854    c[i].style.display = "none";
855    if (b.getElementsByClassName("w3-example-tab-header")[i]) b.getElementsByClassName("w3-example-tab-header")[i].classList.remove("active-tab");
856    if (a.innerText == c[i].getAttribute("data-tab-header")) d = i;
857  }
858  c[d].style.display = "block";
859  a.classList.add("active-tab");
860}
861
862// function gTra(el) {
863//   var gtra = document.createElement('script'); gtra.id = 'gTra'; gtra.type = 'text/javascript'; gtra.async = true;
864//   gtra.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
865//   var el = document.getElementById('gTra');
866//   if (el == null) {
867//     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gtra, s);
868//   }
869//   open_translate(el);
870// };
871function searchfield_focus(obj) {
872  obj.style.color = "";
873  obj.style.fontStyle = "";
874  if (obj.value == "Search w3schools.com") {obj.value = "";}
875}
876var addr = document.location.href;
877function displayError() {
878//  document.getElementById("err_url").value = addr;
879  document.getElementById("err_form").style.display = "block";
880//  document.getElementById("err_email").focus();
881//  hideSent();
882}
883function hideError() {
884  document.getElementById("err_form").style.display = "none";
885}
886function reportError() {
887  if (document.getElementById("err_message").style.display == "block") {
888    document.getElementById("err_message").style.display = "none";
889  } else {
890    document.getElementById("err_message").style.display = "block";
891  }
892}
893function hideSent() {
894  document.getElementById("err_sent").style.display = "none";
895}
896function sendErr() {
897  var xmlhttp;
898  var err_url = document.getElementById("err_url").value;
899  var err_email = document.getElementById("err_email").value;
900  var err_desc = document.getElementById("err_desc").value;
901  if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
902    xmlhttp = new XMLHttpRequest();
903  } else {// code for IE6, IE5
904    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
905  }
906  xmlhttp.open("POST", "/err_sup.asp", true);
907  xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
908  xmlhttp.send("err_url=" + err_url + "&err_email=" + err_email + "&err_desc=" + escape(err_desc));
909  document.getElementById("err_desc").value = "";
910  hideError();
911  document.getElementById("err_sent").style.display = "block";
912}
913function clickFBLike() {
914  document.getElementById("fblikeframe").style.display = 'block';
915  document.getElementById("popupDIV").innerHTML = "<iframe src='/fblike.asp?r=" + Math.random() + "' frameborder='no' style='height:200px;width:250px;'></iframe><br><button onclick='hideFBLike()' class='w3-btn w3-black'>Close</button>";
916}
917function hideFBLike() {
918  document.getElementById("fblikeframe").style.display = 'none';
919}
920
921function googleTranslateElementInit() {
922  new google.translate.TranslateElement({
923    pageLanguage: 'en',
924    autoDisplay: false,
925    gaTrack: true,
926    gaId: 'UA-3855518-1',
927    layout: google.translate.TranslateElement.InlineLayout.SIMPLE
928  }, 'google_translate_element');
929}
930function printPage() {
931  var content = document.getElementById("main").innerHTML;
932  var css = "", i, j, c = document.getElementById("main").cloneNode(true);
933  for (i = 0; i < c.childNodes.length; i++) {
934    if (c.childNodes[i].nodeType == 1 && (c.childNodes[i].getAttribute("id") == "mainLeaderboard" || c.childNodes[i].getAttribute("id") == "midcontentadcontainer")) {
935      c.removeChild(c.childNodes[i]);
936      content = c.innerHTML;
937    }
938  }
939  var head = document.getElementsByTagName("head")[0].innerHTML;
940  var myWindow=window.open('','','');
941  myWindow.document.write("<html><head>"+head+"<style>body{padding:15px;}@media print {.printbtn {display:none;}}</style></head><body><button class='printbtn' onclick='window.print()'>Print Page</button><br><br>"+content+"<p><a href='/about/about_copyright.asp'>Copyright 1999-2019</a> by Refsnes Data. All Rights Reserved.</p></body></html>");
942}
943
944/* w3codecolor ver 1.32 by w3schools.com */
945(
946function w3CodeColor() {
947  var x, i, j, k, l, modes = ["html", "js", "java", "css", "sql", "python"];
948  if (!document.getElementsByClassName) {return;}
949  k = modes.length;
950  for (j = 0; j < k; j++) {
951    x = document.getElementsByClassName(modes[j] + "High");
952    l = x.length;
953    for (i = 0; i < l; i++) {
954//      if (modes[j] == "react") {
955//        codemirrorize(x[i]);
956//      } else {
957        x[i].innerHTML = w3CodeColorize(x[i].innerHTML + " ", modes[j]);
958//      }
959    }
960}
961/*
962function codemirrorize(x) {
963  var txt = x.innerText;
964  x.innerHTML = "";
965  var myCodeMirror = CodeMirror(x, 
966    {
967      mode: "jsx",
968      value: txt,
969      readOnly: true
970    });
971
972}
973*/
974function w3CodeColorize(x, lang) {
975  var tagcolor = "#999"; //mediumblue
976  var tagnamecolor = "#905"; //brown
977  var attributecolor = "#005cc5"; //red
978  var attributevaluecolor = "green"; //mediumblue
979  var commentcolor = "slategray"; //green
980  var doctypecolor = "slategray"; //green
981  var cssselectorcolor = "#07a"; //brown
982  var csspropertycolor = "#d73a49"; //red
983  var csspropertyvaluecolor = "green"; //"mediumblue"
984  var cssdelimitercolor = "#999"; //black
985  var cssimportantcolor = "#d73a49"; //"#DD4A68"; //red
986
987  var tagcolor = "#999"; //mediumblue
988  var tagnamecolor = "#905"; //brown
989  var attributecolor = "green"; //"#690" //red
990  var attributevaluecolor = "#005cc5"; //mediumblue
991  var commentcolor = "slategray"; //green
992  var cssselectorcolor = "green"; //brown
993  var csspropertycolor = "#905"; //red
994  var csspropertyvaluecolor = "black"; //"mediumblue"
995  var cssdelimitercolor = "#999"; //black
996  var cssimportantcolor = "#d73a49"; //red
997
998  var cssselectorcolor = "#905"; //brown
999  var csspropertycolor = "#d73a49"; //red
1000  var csspropertyvaluecolor = "#005cc5"; //"#07a"; //"mediumblue"
1001  var cssdelimitercolor = "#999"; //black
1002  var cssimportantcolor = "#d73a49"; //red
1003  
1004  var doctypecolor = "slategray"; //green
1005
1006  var jscolor = "black";
1007  var jskeywordcolor = "#005cc5"; //"mediumblue";
1008  var jsstringcolor = "green"; //"brown";
1009  var jsstringtempcolor = "#f50"; //orange
1010  var jsregexpcolor = "#e90"; //"#f50"; //orange  
1011  var jsnumbercolor = "#905"; //red
1012  var jspropertycolor = "black";
1013
1014  var javacolor = "black";
1015  var javakeywordcolor =  "#005cc5"; //"mediumblue";
1016  var javastringcolor = "green"; //"brown";
1017  var javanumbercolor = "#905"; //"red";
1018  var javapropertycolor = "black";
1019
1020  var kotlincolor = "black";
1021  var kotlinkeywordcolor = "mediumblue";
1022  var kotlinstringcolor = "brown";
1023  var kotlinnumbercolor = "red";
1024  var kotlinpropertycolor = "black";
1025
1026  var phptagcolor = "#d73a49"; //red
1027  var phpcolor = "black";
1028  var phpkeywordcolor = "#005cc5"; //mediumblue
1029  var phpglobalcolor = "goldenrod";
1030  var phpstringcolor = "green"; //"brown
1031  var phpnumbercolor = "#905"; //red
1032
1033  var pythoncolor = "black";
1034  var pythonkeywordcolor = "#005cc5"; //mediumblue
1035  var pythonstringcolor = "green" //"#22863a"; //brown
1036  var pythonnumbercolor = "#905"; //red
1037
1038  var angularstatementcolor = "#d73a49"; //red
1039
1040  var sqlcolor = "black";
1041  var sqlkeywordcolor = "#005cc5"; //mediumblue
1042  var sqlstringcolor = "green"; //brown
1043  var sqlnumbercolor = "#905"; //
1044
1045  if (!lang) {lang = "html"; }
1046  if (lang == "html") {return htmlMode(x);}
1047  if (lang == "css") {return cssMode(x);}
1048  if (lang == "js") {return jsMode(x);}
1049  if (lang == "java") {return javaMode(x);}
1050  if (lang == "kotlin") {return kotlinMode(x);}
1051  if (lang == "php") {return phpMode(x);}
1052  if (lang == "sql") {return sqlMode(x);}  
1053  if (lang == "python") {return pythonMode(x);}
1054  return x;
1055  function extract(str, start, end, func, repl) {
1056    var s, e, d = "", a = [];
1057    while (str.search(start) > -1) {
1058      s = str.search(start);
1059      e = str.indexOf(end, s);
1060      if (e == -1) {e = str.length;}
1061      if (repl) {
1062        a.push(func(str.substring(s, e + (end.length))));      
1063        str = str.substring(0, s) + repl + str.substr(e + (end.length));
1064      } else {
1065        d += str.substring(0, s);
1066        d += func(str.substring(s, e + (end.length)));
1067        str = str.substr(e + (end.length));
1068      }
1069    }
1070    this.rest = d + str;
1071    this.arr = a;
1072  }
1073  function htmlMode(txt) {
1074    var rest = txt, done = "", php, comment, dctype, angular, startpos, endpos, note, i;
1075    php = new extract(rest, "&lt;\\?php", "?&gt;", phpMode, "W3PHPPOS");
1076    rest = php.rest;
1077    comment = new extract(rest, "&lt;!--", "--&gt;", commentMode, "W3HTMLCOMMENTPOS");
1078    rest = comment.rest;
1079    dctype = new extract(rest, "&lt;!DOCTYPE", "&gt;", doctypeMode, "W3HTMLDOCTYPEPOS");
1080    rest = dctype.rest;
1081    while (rest.indexOf("&lt;") > -1) {
1082      note = "";
1083      startpos = rest.indexOf("&lt;");
1084      if (rest.substr(startpos, 9).toUpperCase() == "&LT;STYLE") {note = "css";}
1085      if (rest.substr(startpos, 10).toUpperCase() == "&LT;SCRIPT") {note = "javascript";}        
1086      endpos = rest.indexOf("&gt;", startpos);
1087      if (endpos == -1) {endpos = rest.length;}
1088      done += rest.substring(0, startpos);
1089      done += tagMode(rest.substring(startpos, endpos + 4));
1090      rest = rest.substr(endpos + 4);
1091      if (note == "css") {
1092        endpos = rest.indexOf("&lt;/style&gt;");
1093        if (endpos > -1) {
1094          done += cssMode(rest.substring(0, endpos));
1095          rest = rest.substr(endpos);
1096        }
1097      }
1098      if (note == "javascript") {
1099        endpos = rest.indexOf("&lt;/script&gt;");
1100        if (endpos > -1) {
1101          done += jsMode(rest.substring(0, endpos));
1102          rest = rest.substr(endpos);
1103        }
1104      }
1105    }
1106    rest = done + rest;
1107    angular = new extract(rest, "{{", "}}", angularMode);
1108    rest = angular.rest;
1109    for (i = 0; i < dctype.arr.length; i++) {
1110      rest = rest.replace("W3HTMLDOCTYPEPOS", dctype.arr[i]);
1111    }
1112    for (i = 0; i < comment.arr.length; i++) {
1113        rest = rest.replace("W3HTMLCOMMENTPOS", comment.arr[i]);
1114    }
1115    for (i = 0; i < php.arr.length; i++) {
1116        rest = rest.replace("W3PHPPOS", php.arr[i]);
1117    }
1118    return rest;
1119  }
1120  function tagMode(txt) {
1121    var rest = txt, done = "", startpos, endpos, result;
1122    while (rest.search(/(\s|<br>)/) > -1) {    
1123      startpos = rest.search(/(\s|<br>)/);
1124      endpos = rest.indexOf("&gt;");
1125      if (endpos == -1) {endpos = rest.length;}
1126      done += rest.substring(0, startpos);
1127      done += attributeMode(rest.substring(startpos, endpos));
1128      rest = rest.substr(endpos);
1129    }
1130    result = done + rest;
1131    result = "<span class='tagcolor' style=color:" + tagcolor + ">&lt;</span>" + result.substring(4);
1132    if (result.substr(result.length - 4, 4) == "&gt;") {
1133      result = result.substring(0, result.length - 4) + "<span class='tagcolor' style=color:" + tagcolor + ">&gt;</span>";
1134    }
1135    return "<span class='tagnamecolor' style=color:" + tagnamecolor + ">" + result + "</span>";
1136  }
1137  function attributeMode(txt) {
1138    var rest = txt, done = "", startpos, endpos, singlefnuttpos, doublefnuttpos, spacepos;
1139    while (rest.indexOf("=") > -1) {
1140      endpos = -1;
1141      startpos = rest.indexOf("=");
1142      singlefnuttpos = rest.indexOf("'", startpos);
1143      doublefnuttpos = rest.indexOf('"', startpos);
1144      spacepos = rest.indexOf(" ", startpos + 2);
1145      if (spacepos > -1 && (spacepos < singlefnuttpos || singlefnuttpos == -1) && (spacepos < doublefnuttpos || doublefnuttpos == -1)) {
1146        endpos = rest.indexOf(" ", startpos);      
1147      } else if (doublefnuttpos > -1 && (doublefnuttpos < singlefnuttpos || singlefnuttpos == -1) && (doublefnuttpos < spacepos || spacepos == -1)) {
1148        endpos = rest.indexOf('"', rest.indexOf('"', startpos) + 1);
1149      } else if (singlefnuttpos > -1 && (singlefnuttpos < doublefnuttpos || doublefnuttpos == -1) && (singlefnuttpos < spacepos || spacepos == -1)) {
1150        endpos = rest.indexOf("'", rest.indexOf("'", startpos) + 1);
1151      }
1152      if (!endpos || endpos == -1 || endpos < startpos) {endpos = rest.length;}
1153      done += rest.substring(0, startpos);
1154      done += attributeValueMode(rest.substring(startpos, endpos + 1));
1155      rest = rest.substr(endpos + 1);
1156    }
1157    return "<span class='attributecolor' style=color:" + attributecolor + ">" + done + rest + "</span>";
1158  }
1159  function attributeValueMode(txt) {
1160    return "<span class='attributevaluecolor' style=color:" + attributevaluecolor + ">" + txt + "</span>";
1161  }
1162  function angularMode(txt) {
1163    return "<span class='angularstatementcolor' style=color:" + angularstatementcolor + ">" + txt + "</span>";
1164  }
1165  function commentMode(txt) {
1166    return "<span class='commentcolor' style=color:" + commentcolor + ">" + txt + "</span>";
1167  }
1168  function doctypeMode(txt) {
1169    return "<span class='doctypecolor' style=color:" + doctypecolor + ">" + txt + "</span>";
1170  }
1171  function cssMode(txt) {
1172    var rest = txt, done = "", s, e, comment, i, midz, c, cc;
1173    comment = new extract(rest, /\/\*/, "*/", commentMode, "W3CSSCOMMENTPOS");
1174    rest = comment.rest;
1175    while (rest.search("{") > -1) {
1176      s = rest.search("{");
1177      midz = rest.substr(s + 1);
1178      cc = 1;
1179      c = 0;
1180      for (i = 0; i < midz.length; i++) {
1181        if (midz.substr(i, 1) == "{") {cc++; c++}
1182        if (midz.substr(i, 1) == "}") {cc--;}
1183        if (cc == 0) {break;}
1184      }
1185      if (cc != 0) {c = 0;}
1186      e = s;
1187      for (i = 0; i <= c; i++) {
1188        e = rest.indexOf("}", e + 1);
1189      }
1190      if (e == -1) {e = rest.length;}
1191      done += rest.substring(0, s + 1);
1192      done += cssPropertyMode(rest.substring(s + 1, e));
1193      rest = rest.substr(e);
1194    }
1195    rest = done + rest;
1196    rest = rest.replace(/{/g, "<span class='cssdelimitercolor' style=color:" + cssdelimitercolor + ">
1196{</span>");
1197    rest = rest.replace(/}/g, "<span class='cssdelimitercolor' style=color:" + cssdelimitercolor + ">}</span>");
1198    for (i = 0; i < comment.arr.length; i++) {
1199        rest = rest.replace("W3CSSCOMMENTPOS", comment.arr[i]);
1200    }
1201    return "<span class='cssselectorcolor' style=color:" + cssselectorcolor + ">" + rest + "</span>";
1202  }
1203  function cssPropertyMode(txt) {
1204    var rest = txt, done = "", s, e, n, loop;
1205    if (rest.indexOf("{") > -1 ) { return cssMode(rest); }
1206    while (rest.search(":") > -1) {
1207      s = rest.search(":");
1208      loop = true;
1209      n = s;
1210      while (loop == true) {
1211        loop = false;
1212        e = rest.indexOf(";", n);
1213        if (rest.substring(e - 5, e + 1) == "&nbsp;") {
1214          loop = true;
1215          n = e + 1;
1216        }
1217      }
1218      if (e == -1) {e = rest.length;}
1219      done += rest.substring(0, s);
1220      done += cssPropertyValueMode(rest.substring(s, e + 1));
1221      rest = rest.substr(e + 1);
1222    }
1223    return "<span class='csspropertycolor' style=color:" + csspropertycolor + ">" + done + rest + "</span>";
1224  }
1225  function cssPropertyValueMode(txt) {
1226    var rest = txt, done = "", s;
1227    rest = "<span class='cssdelimitercolor' style=color:" + cssdelimitercolor + ">:</span>" + rest.substring(1);
1228    while (rest.search(/!important/i) > -1) {
1229      s = rest.search(/!important/i);
1230      done += rest.substring(0, s);
1231      done += cssImportantMode(rest.substring(s, s + 10));
1232      rest = rest.substr(s + 10);
1233    }
1234    result = done + rest;    
1235    if (result.substr(result.length - 1, 1) == ";" && result.substr(result.length - 6, 6) != "&nbsp;" && result.substr(result.length - 4, 4) != "&lt;" && result.substr(result.length - 4, 4) != "&gt;" && result.substr(result.length - 5, 5) != "&amp;") {
1236      result = result.substring(0, result.length - 1) + "<span class='cssdelimitercolor' style=color:" + cssdelimitercolor + ">;</span>";
1237    }
1238    return "<span class='csspropertyvaluecolor' style=color:" + csspropertyvaluecolor + ">" + result + "</span>";
1239  }
1240  function cssImportantMode(txt) {
1241    return "<span class='cssimportantcolor' style=color:" + cssimportantcolor + ";font-weight:bold;>" + txt + "</span>";
1242  }
1243  function jsMode(txt) {
1244    var rest = txt, done = "", esc = [], i, cc, tt = "", sfnuttpos, dfnuttpos, compos, comlinepos, keywordpos, numpos, mypos, dotpos, y;
1245    for (i = 0; i < rest.length; i++)  {
1246      cc = rest.substr(i, 1);
1247      if (cc == "\\") {
1248        esc.push(rest.substr(i, 2));
1249        cc = "W3JSESCAPE";
1250        i++;
1251      }
1252      tt += cc;
1253    }
1254    rest = tt;
1255    y = 1;
1256    while (y == 1) {
1257      regexppos = getRegExpPos(rest, jsRegExpMode);
1258      sfnuttpos = getPos(rest, "'", "'", jsStringMode);
1259      dfnuttpos = getPos(rest, '"', '"', jsStringMode);
1260      bfnuttpos = getPos(rest, '`', '`', jsStringTempMode);      
1261      compos = getPos(rest, /\/\*/, "*/", commentMode);
1262      comlinepos = getPos(rest, /\/\//, "<br>", commentMode);      
1263      numpos = getNumPos(rest, jsNumberMode);
1264      keywordpos = getKeywordPos("js", rest, jsKeywordMode);
1265      dotpos = getDotPos(rest, jsPropertyMode);
1266      if (Math.max(numpos[0], regexppos[0], sfnuttpos[0], dfnuttpos[0], bfnuttpos[0], compos[0], comlinepos[0], keywordpos[0], dotpos[0]) == -1) {break;}
1267      mypos = getMinPos(numpos, regexppos, sfnuttpos, dfnuttpos, bfnuttpos, compos, comlinepos, keywordpos, dotpos);
1268      if (mypos[0] == -1) {break;}
1269      if (mypos[0] > -1) {
1270        done += rest.substring(0, mypos[0]);
1271        done += mypos[2](rest.substring(mypos[0], mypos[1]));
1272        rest = rest.substr(mypos[1]);
1273      }
1274    }
1275    rest = done + rest;
1276    for (i = 0; i < esc.length; i++) {
1277      rest = rest.replace("W3JSESCAPE", esc[i]);
1278    }
1279    return "<span class='jscolor' style=color:" + jscolor + ">" + rest + "</span>";
1280  }
1281  function jsRegExpMode(txt) {
1282    return "<span class='jsregexpcolor' style=color:" + jsregexpcolor + ">" + txt + "</span>";
1283  }
1284  function jsStringMode(txt) {
1285    return "<span class='jsstringcolor' style=color:" + jsstringcolor + ">" + txt + "</span>";
1286  }
1287  function jsStringTempMode(txt) {
1288    return "<span class='jsstringtempcolor' style=color:" + jsstringtempcolor + ">" + txt + "</span>";
1289  }
1290  function jsKeywordMode(txt) {
1291    return "<span class='jskeywordcolor' style=color:" + jskeywordcolor + ">" + txt + "</span>";
1292  }
1293  function jsNumberMode(txt) {
1294    return "<span class='jsnumbercolor' style=color:" + jsnumbercolor + ">" + txt + "</span>";
1295  }
1296  function jsPropertyMode(txt) {
1297    return "<span class='jspropertycolor' style=color:" + jspropertycolor + ">" + txt + "</span>";
1298  }
1299  function getRegExpPos(txt, func) {
1300    var pos1, cc, pos2 = 0, mArr, i, len, patt, modOK = false;
1301    pos1 = txt.search(/\/.+?\//);
1302    if (pos1 > -1) {
1303      len = txt.match(/\/.+?\//)[0].length; 
1304      patt = /\W/g;
1305      cc = txt.match(/\/.+?\//)[0];
1306      pos2 = cc.length;
1307      mArr = ["img", "igm", "mig", "mgi", "gim", "gmi", "im", "ig", "mi", "mg", "gi", "gm", "i", "m", "g", "d", "gs", "y", "u", "v", "s"];
1308      for (i = 0; i < mArr.length; i++) {
1309        re = new RegExp(`\\b^${mArr[i]}\\b`, 'gi');
1310        if (txt.substr(pos1+pos2).search(re) > -1) {
1311          modOK = true;
1312          pos2 = pos2 + mArr[i].length;
1313        }
1314      }
1315      //console.log(txt.substr(pos1 + len - 2,1));
1316      //console.log((txt.substr(pos1 + len - 2,1)!= "<"));
1317      if ((cc.indexOf("<br>") == -1 && txt.substr(pos1 + len,1)!= "/" && txt.substr(pos1 + len,1).match(patt) && txt.substr(pos1 - 1,1).match(patt)  && txt.substr(pos1 - 1,1) !="/") || modOK == true && txt.substr(pos1 + len - 2,1)!= "<") {
1318      } else {
1319        pos1 = -1;
1320        pos2 = 0;
1321      }
1322    }
1323    return [pos1, pos1 + pos2, func];
1324  }
1325  function getDotPos(txt, func) {
1326    var x, i, j, s, e, arr = [".","<", " ", ";", "(", "+", ")", "[", "]", ",", "&", ":", "{", "}", "/" ,"-", "*", "|", "%"];
1327    s = txt.indexOf(".");
1328    if (s > -1) {
1329      x = txt.substr(s + 1);
1330      for (j = 0; j < x.length; j++) {
1331        cc = x[j];
1332        for (i = 0; i < arr.length; i++) {
1333          if (cc.indexOf(arr[i]) > -1) {
1334            e = j;
1335            return [s + 1, e + s + 1, func];
1336          }
1337        }
1338      }
1339    }
1340    return [-1, -1, func];
1341  }
1342  function getMinPos() {
1343    var i, arr = [];
1344    for (i = 0; i < arguments.length; i++) {
1345      if (arguments[i][0] > -1) {
1346        if (arr.length == 0 || arguments[i][0] < arr[0]) {arr = arguments[i];}
1347      }
1348    }
1349    if (arr.length == 0) {arr = arguments[i];}
1350    return arr;
1351  }
1352  function javaMode(txt) {
1353    var rest = txt, done = "", esc = [], i, cc, tt = "", sfnuttpos, dfnuttpos, compos, comlinepos, keywordpos, numpos, mypos, dotpos, y;
1354    for (i = 0; i < rest.length; i++)  {
1355      cc = rest.substr(i, 1);
1356      if (cc == "\\") {
1357        esc.push(rest.substr(i, 2));
1358        cc = "W3JSESCAPE";
1359        i++;
1360      }
1361      tt += cc;
1362    }
1363    rest = tt;
1364    y = 1;
1365    while (y == 1) {
1366      sfnuttpos = getPos(rest, "'", "'", javaStringMode);
1367      dfnuttpos = getPos(rest, '"', '"', javaStringMode);
1368      compos = getPos(rest, /\/\*/, "*/", commentMode);
1369      comlinepos = getPos(rest, /\/\//, "<br>", commentMode);      
1370      numpos = getNumPos(rest, javaNumberMode);
1371      keywordpos = getKeywordPos("java", rest, javaKeywordMode);
1372      dotpos = getDotPos(rest, javaPropertyMode);
1373      if (Math.max(numpos[0], sfnuttpos[0], dfnuttpos[0], compos[0], comlinepos[0], keywordpos[0], dotpos[0]) == -1) {break;}
1374      mypos = getMinPos(numpos, sfnuttpos, dfnuttpos, compos, comlinepos, keywordpos, dotpos);
1375      if (mypos[0] == -1) {break;}
1376      if (mypos[0] > -1) {
1377        done += rest.substring(0, mypos[0]);
1378        done += mypos[2](rest.substring(mypos[0], mypos[1]));
1379        rest = rest.substr(mypos[1]);
1380      }
1381    }
1382    rest = done + rest;
1383    for (i = 0; i < esc.length; i++) {
1384      rest = rest.replace("W3JSESCAPE", esc[i]);
1385    }
1386    return "<span class='javacolor' style=color:" + javacolor + ">" + rest + "</span>";
1387  }
1388  function javaStringMode(txt) {
1389    return "<span class='javastringcolor' style=color:" + javastringcolor + ">" + txt + "</span>";
1390  }
1391  function javaKeywordMode(txt) {
1392    return "<span class='javakeywordcolor' style=color:" + javakeywordcolor + ">" + txt + "</span>";
1393  }
1394  function javaNumberMode(txt) {
1395    return "<span class='javanumbercolor' style=color:" + javanumbercolor + ">" + txt + "</span>";
1396  }
1397  function javaPropertyMode(txt) {
1398    return "<span class='javapropertycolor' style=color:" + javapropertycolor + ">" + txt + "</span>";
1399  }
1400  function kotlinMode(txt) {
1401    var rest = txt, done = "", esc = [], i, cc, tt = "", sfnuttpos, dfnuttpos, compos, comlinepos, keywordpos, numpos, mypos, dotpos, y;
1402    for (i = 0; i < rest.length; i++)  {
1403      cc = rest.substr(i, 1);
1404      if (cc == "\\") {
1405        esc.push(rest.substr(i, 2));
1406        cc = "W3JSESCAPE";
1407        i++;
1408      }
1409      tt += cc;
1410    }
1411    rest = tt;
1412    y = 1;
1413    while (y == 1) {
1414      sfnuttpos = getPos(rest, "'", "'", kotlinStringMode);
1415      dfnuttpos = getPos(rest, '"', '"', kotlinStringMode);
1416      compos = getPos(rest, /\/\*/, "*/", commentMode);
1417      comlinepos = getPos(rest, /\/\//, "<br>", commentMode);      
1418      numpos = getNumPos(rest, kotlinNumberMode);
1419      keywordpos = getKeywordPos("kotlin", rest, kotlinKeywordMode);
1420      dotpos = getDotPos(rest, kotlinPropertyMode);
1421      if (Math.max(numpos[0], sfnuttpos[0], dfnuttpos[0], compos[0], comlinepos[0], keywordpos[0], dotpos[0]) == -1) {break;}
1422      mypos = getMinPos(numpos, sfnuttpos, dfnuttpos, compos, comlinepos, keywordpos, dotpos);
1423      if (mypos[0] == -1) {break;}
1424      if (mypos[0] > -1) {
1425        done += rest.substring(0, mypos[0]);
1426        done += mypos[2](rest.substring(mypos[0], mypos[1]));
1427        rest = rest.substr(mypos[1]);
1428      }
1429    }
1430    rest = done + rest;
1431    for (i = 0; i < esc.length; i++) {
1432      rest = rest.replace("W3JSESCAPE", esc[i]);
1433    }
1434    return "<span class='kotlincolor' style=color:" + kotlincolor + ">" + rest + "</span>";
1435  }
1436  function kotlinStringMode(txt) {
1437    return "<span class='kotlinstringcolor' style=color:" + kotlinstringcolor + ">" + txt + "</span>";
1438  }
1439  function kotlinKeywordMode(txt) {
1440    return "<span class='kotlinkeywordcolor' style=color:" + kotlinkeywordcolor + ">" + txt + "</span>";
1441  }
1442  function kotlinNumberMode(txt) {
1443    return "<span class='kotlinnumbercolor' style=color:" + kotlinnumbercolor + ">" + txt + "</span>";
1444  }
1445  function kotlinPropertyMode(txt) {
1446    return "<span class='kotlinpropertycolor' style=color:" + kotlinpropertycolor + ">" + txt + "</span>";
1447  }
1448  function sqlMode(txt) {
1449    var rest = txt, y, done = "", sfnuttpos, dfnuttpos, compos, comlinepos, keywordpos, numpos, mypos;
1450    y = 1;
1451    while (y == 1) {
1452      sfnuttpos = getPos(rest, "'", "'", sqlStringMode);
1453      dfnuttpos = getPos(rest, '"', '"', sqlStringMode);
1454      compos = getPos(rest, /\/\*/, "*/", commentMode);
1455      comlinepos = getPos(rest, /--/, "<br>", commentMode);      
1456      numpos = getNumPos(rest, sqlNumberMode);
1457      keywordpos = getKeywordPos("sql", rest, sqlKeywordMode);
1458      if (Math.max(numpos[0], sfnuttpos[0], dfnuttpos[0], compos[0], comlinepos[0], keywordpos[0]) == -1) {break;}
1459      mypos = getMinPos(numpos, sfnuttpos, dfnuttpos, compos, comlinepos, keywordpos);
1460      if (mypos[0] == -1) {break;}
1461      if (mypos[0] > -1) {
1462        done += rest.substring(0, mypos[0]);
1463        done += mypos[2](rest.substring(mypos[0], mypos[1]));
1464        rest = rest.substr(mypos[1]);
1465      }
1466    }
1467    rest = done + rest;
1468    return "<span class='sqlcolor' style=color:" + sqlcolor + ">" + rest + "</span>";
1469  }
1470  function sqlStringMode(txt) {
1471    return "<span class='sqlstringcolor' style=color:" + sqlstringcolor + ">" + txt + "</span>";
1472  }
1473  function sqlKeywordMode(txt) {
1474    return "<span class='sqlkeywordcolor' style=color:" + sqlkeywordcolor + ">" + txt + "</span>";
1475  }
1476  function sqlNumberMode(txt) {
1477    return "<span class='sqlnumbercolor' style=color:" + sqlnumbercolor + ">" + txt + "</span>";
1478  }
1479  function phpMode(txt) {
1480    var rest = txt, done = "", sfnuttpos, dfnuttpos, compos, comlinepos, comhashpos, keywordpos, mypos, y;
1481    y = 1;
1482    while (y == 1) {
1483      sfnuttpos = getPos(rest, "'", "'", phpStringMode);
1484      dfnuttpos = getPos(rest, '"', '"', phpStringMode);
1485      compos = getPos(rest, /\/\*/, "*/", commentMode);
1486      comlinepos = getPos(rest, /\/\//, "<br>", commentMode);      
1487      comhashpos = getPos(rest, "#", "<br>", commentMode);
1488      numpos = getNumPos(rest, phpNumberMode);
1489      keywordpos = getKeywordPos("php", rest, phpKeywordMode);      
1490      if (Math.max(numpos[0], sfnuttpos[0], dfnuttpos[0], compos[0], comlinepos[0], comhashpos[0], keywordpos[0]) == -1) {break;}
1491      mypos = getMinPos(numpos, sfnuttpos, dfnuttpos, compos, comlinepos, comhashpos, keywordpos);
1492      if (mypos[0] == -1) {break;}
1493      if (mypos[0] > -1) {
1494        done += rest.substring(0, mypos[0]);
1495        done += mypos[2](rest.substring(mypos[0], mypos[1]));
1496        rest = rest.substr(mypos[1]);
1497      }
1498    }
1499    rest = done + rest;
1500    rest = "<span class='phptagcolor' style=color:" + phptagcolor + ">&lt;" + rest.substr(4, 4) + "</span>" + rest.substring(8);
1501    if (rest.substr(rest.length - 5, 5) == "?&gt;") {
1502      rest = rest.substring(0, rest.length - 5) + "<span class='phptagcolor' style=color:" + phptagcolor + ">?&gt;</span>";
1503    }
1504    return "<span class='phpcolor' style=color:" + phpcolor + ">" + rest + "</span>";
1505  }
1506  function phpStringMode(txt) {
1507    return "<span class='phpstringcolor' style=color:" + phpstringcolor + ">" + txt + "</span>";
1508  }
1509  function phpNumberMode(txt) {
1510    return "<span class='phpnumbercolor' style=color:" + phpnumbercolor + ">" + txt + "</span>";
1511  }
1512  function phpKeywordMode(txt) {
1513    var glb = ["$GLOBALS","$_SERVER","$_REQUEST","$_POST","$_GET","$_FILES","$_ENV","$_COOKIE","$_SESSION"];
1514    if (glb.indexOf(txt.toUpperCase()) > -1) {
1515      if (glb.indexOf(txt) > -1) {
1516        return "<span class='phpglobalcolor' style=color:" + phpglobalcolor + ">" + txt + "</span>";
1517      } else {
1518        return txt;
1519      }
1520    } else {
1521      return "<span class='phpkeywordcolor' style=color:" + phpkeywordcolor + ">" + txt + "</span>";
1522    }
1523  }
1524  function pythonMode(txt) {
1525    var rest = txt, done = "", sfnuttpos, dfnuttpos, compos, comlinepos, comhashpos, keywordpos, mypos, y;
1526    y = 1;
1527    while (y == 1) {
1528      sfnuttpos = getPos(rest, "'", "'", pythonStringMode);
1529      dfnuttpos = getPos(rest, '"', '"', pythonStringMode);
1530      compos = getPos(rest, /\/\*/, "*/", commentMode);
1531      comhashpos = getPos(rest, "#", "<br>", commentMode);
1532      numpos = getNumPos(rest, pythonNumberMode);
1533      keywordpos = getKeywordPos("python", rest, pythonKeywordMode);      
1534      if (Math.max(numpos[0], sfnuttpos[0], dfnuttpos[0], compos[0], comhashpos[0], keywordpos[0]) == -1) {break;}
1535      mypos = getMinPos(numpos, sfnuttpos, dfnuttpos, compos, comhashpos, keywordpos);
1536      if (mypos[0] == -1) {break;}
1537      if (mypos[0] > -1) {
1538        done += rest.substring(0, mypos[0]);
1539        done += mypos[2](rest.substring(mypos[0], mypos[1]));
1540        rest = rest.substr(mypos[1]);
1541      }
1542    }
1543    rest = done + rest;
1544    return "<span class='pythoncolor' style=color:" + pythoncolor + ">" + rest + "</span>";
1545  }
1546  function pythonStringMode(txt) {
1547    return "<span class='pythonstringcolor' style=color:" + pythonstringcolor + ">" + txt + "</span>";
1548  }
1549  function pythonNumberMode(txt) {
1550    return "<span class='pythonnumbercolor' style=color:" + pythonnumbercolor + ">" + txt + "</span>";
1551  }
1552  function pythonKeywordMode(txt) {
1553    return "<span class='pythonkeywordcolor' style=color:" + pythonkeywordcolor + ">" + txt + "</span>";
1554  }
1555  function getKeywordPos(typ, txt, func) {
1556    var words, i, pos, rpos = -1, rpos2 = -1, patt;
1557    if (typ == "js") {
1558      words = ["abstract","arguments","async","await","boolean","break","byte","case","catch","char","class","const","continue","debugger","default","delete",
1559      "do","double","else","enum","eval","event","export","extends","false","final","finally","float","for","function","goto","if","implements","import",
1560      "in","instanceof","int","interface","let","long","NaN","native","new","null","package","private","protected","public","return","short","static",
1561      "super","switch","synchronized","then","this","throw","throws","transient","true","try","typeof","undefined","var","void","volatile","while","with","yield"];
1562    } else if (typ == "java") {
1563      words = ["abstract","arguments","boolean","break","byte","case","catch","char","class","const","continue","debugger","default","delete",
1564      "do","double","else","enum","eval","event","export","extends","false","final","finally","float","for","function","goto","if","implements","import",
1565      "in","instanceof","int","interface","let","long","NaN","native","new","null","package","private","protected","public","return","short","static",
1566      "super","switch","synchronized","this","throw","throws","transient","true","try","typeof","var","void","volatile","while","with","yield",
1567      "String"];
1568    } else if (typ == "kotlin") {
1569      words = ['package','as','typealias','class','interface','this','super','val','operator','var','fun','for','is','in','This','throw','return',
1570      'annotation','break','continue','object','if','else','while','do','try','when','!in','!is','as?','file','import','where','by','get','
1570set',
1571      'abstract','enum','open','inner','override','private','public','internal','protected','catch','finally','out','final','vararg','reified',
1572      'dynamic','companion','constructor','init','sealed','field','property','receiver','param','sparam','lateinit','data','inline','noinline',
1573      'tailrec','external','annotation','crossinline','const','operator','infix','suspend','actual','expect','setparam','Boolean','Byte','Character',
1574      'CharSequence','Class','ClassLoader','Cloneable','Comparable','Compiler','Double','Exception','Float','Integer','Long','Math','Number','Object',
1575      'Package','Pair','Process','Runtime','Runnable','SecurityManager','Short','StackTraceElement','StrictMath','String','StringBuffer','System',
1576      'Thread','ThreadGroup','ThreadLocal','Throwable','Triple','Void','Annotation','Any','BooleanArray','ByteArray','Char','CharArray',
1577      'DeprecationLevel','DoubleArray','Enum','FloatArray','Function','Int','IntArray','Lazy','LazyThreadSafetyMode','LongArray','Nothing','ShortArray','Unit'];
1578    } else if (typ == "php") {
1579      words = ["$GLOBALS","$_SERVER","$_REQUEST","$_POST","$_GET","$_FILES","$_ENV","$_COOKIE","$_SESSION",
1580      "__halt_compiler","abstract","and","array","as","break","callable","case","catch","class","clone","const","continue","declare","default",
1581      "die","do","echo","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","eval","exit","extends","final","for",
1582      "foreach","function","global","goto","if","implements","include","include_once","instanceof","insteadof","interface","isset","list","namespace","new",
1583      "or","print","private","protected","public","require","require_once","return","static","switch","throw","trait","try","unset","use","var","while","xor"];
1584    } else if (typ == "sql") {
1585      words = ["ADD","EXTERNAL","PROCEDURE","ALL","FETCH","PUBLIC","ALTER","FILE","RAISERROR","AND","FILLFACTOR","READ","ANY","READTEXT","AS","FOREIGN",
1586      "RECONFIGURE","ASC","FREETEXT","REFERENCES","AUTHORIZATION","FREETEXTTABLE","REPLICATION","BACKUP","FROM","RESTORE","BEGIN","FULL","RESTRICT","BETWEEN",
1587      "FUNCTION","RETURN","BREAK","GOTO","REVERT","BROWSE","GRANT","REVOKE","BULK","GROUP","RIGHT","BY","HAVING","ROLLBACK","CASCADE","HOLDLOCK","ROWCOUNT",
1588      "CASE","IDENTITY","ROWGUIDCOL","CHECK","IDENTITY_INSERT","RULE","CHECKPOINT","IDENTITYCOL","SAVE","CLOSE","IF","SCHEMA","CLUSTERED","IN",
1589      "SECURITYAUDIT","COALESCE","INDEX","SELECT","COLLATE","INNER","SEMANTICKEYPHRASETABLE","COLUMN","INSERT","SEMANTICSIMILARITYDETAILSTABLE","COMMIT",
1590      "INTERSECT","SEMANTICSIMILARITYTABLE","COMPUTE","INTO","SESSION_USER","CONSTRAINT","IS","SET","CONTAINS","JOIN","SETUSER","CONTAINSTABLE","KEY",
1591      "SHUTDOWN","CONTINUE","KILL","SOME","CONVERT","LEFT","STATISTICS","CREATE","LIKE","SYSTEM_USER","CROSS","LINENO","TABLE","CURRENT","LOAD","TABLESAMPLE",
1592      "CURRENT_DATE","MERGE","TEXTSIZE","CURRENT_TIME","NATIONAL","THEN","CURRENT_TIMESTAMP","NOCHECK","TO","CURRENT_USER","NONCLUSTERED","TOP","CURSOR",
1593      "NOT","TRAN","DATABASE","NULL","TRANSACTION","DBCC","NULLIF","TRIGGER","DEALLOCATE","OF","TRUNCATE","DECLARE","OFF","TRY_CONVERT","DEFAULT","OFFSETS",
1594      "TSEQUAL","DELETE","ON","UNION","DENY","OPEN","UNIQUE","DESC","OPENDATASOURCE","UNPIVOT","DISK","OPENQUERY","UPDATE","DISTINCT","OPENROWSET",
1595      "UPDATETEXT","DISTRIBUTED","OPENXML","USE","DOUBLE","OPTION","USER","DROP","OR","VALUES","DUMP","ORDER","VARYING","ELSE","OUTER","VIEW","END",
1596      "OVER","WAITFOR","ERRLVL","PERCENT","WHEN","ESCAPE","PIVOT","WHERE","EXCEPT","PLAN","WHILE","EXEC","PRECISION","WITH","EXECUTE","PRIMARY",
1597      "WITHIN GROUP","EXISTS","PRINT","WRITETEXT","EXIT","PROC","LIMIT","MODIFY","COUNT","REPLACE"];
1598    } else if (typ == "python") {
1599      words = ["as", "assert", "break", "class", "continue", "def", "del", "elif", "else", "except", "False", "finally", "for", "from", "global", "if", "import",
1600      "lambda", "pass", "raise", "return", "try", "while", "with", "yield", "in", "abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr",
1601      "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "filter", "float", "format", "frozenset", "getattr",
1602      "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "list", "locals", "map", "max",
1603      "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "print", "property", "range", "repr", "reversed", "round", "set", "setattr", "slice",
1604      "sorted", "staticmethod", "str", "sum", "super", "tuple", "True", "type", "vars", "zip", "__import__", "NotImplemented", "Ellipsis", "__debug__"];
1605    }
1606    for (i = 0; i < words.length; i++) {
1607      if (typ == "php" || typ == "sql") {
1608        pos = txt.toLowerCase().indexOf(words[i].toLowerCase());
1609      } else {
1610        pos = txt.indexOf(words[i]);
1611      }
1612      if (pos > -1) {
1613        patt = /\W/g;
1614        if (txt.substr(pos + words[i].length,1).match(patt) && txt.substr(pos - 1,1).match(patt)) {
1615          if (pos > -1 && (rpos == -1 || pos < rpos)) {
1616            rpos = pos;
1617            rpos2 = rpos + words[i].length;
1618          }
1619        }
1620      } 
1621    }
1622    return [rpos, rpos2, func];
1623  }
1624  function getPos(txt, start, end, func) {
1625    var s, e;
1626    s = txt.search(start);
1627    e = txt.indexOf(end, s + (end.length));
1628    if (e == -1) {e = txt.length;}
1629    return [s, e + (end.length), func];
1630  }
1631  function getNumPos(txt, func) {
1632    var arr = ["<br>", "n", " ", ";", "(", "+", ")", "[", "]", ",", "&", ":", "{", "}", "/" ,"-", "*", "|", "%", "="], i, j, c, startpos = 0, endpos, word, npos = -1;
1633    for (i = 0; i < txt.length; i++) {
1634      for (j = 0; j < arr.length; j++) {
1635        c = txt.substr(i, arr[j].length);
1636        if (c == "n") {npos = i;}
1637        if (c == arr[j]) {
1638          if (c == "-" && (txt.substr(i - 1, 1) == "e" || txt.substr(i - 1, 1) == "E")) {
1639            continue;
1640          }
1641          endpos = i;
1642          if (startpos < endpos) {
1643            word = txt.substring(startpos, endpos);
1644            if (c == "n") {
1645              if (isNaN(word)) break;
1646            }
1647            if (!isNaN(word)) {
1648              if (npos > -1 && startpos == (npos+1)) {continue;}
1649              return [startpos, endpos, func];
1650            }
1651          }          
1652          i += arr[j].length;
1653          startpos = i;
1654          i -= 1;
1655          break;
1656        }
1657      }
1658    }  
1659    return [-1, -1, func];
1660  }  
1661}
1662}
1663)();
1664/*
1665(
1666function setThemeMode() {
1667  var x = localStorage.getItem("preferredmode");
1668  var y = localStorage.getItem("preferredpagemode");  
1669  if (x == "dark") {
1670    document.body.className += " darktheme";
1671  }
1672  if (y == "dark") {
1673    document.body.className += " darkpagetheme";
1674  }
1675})();
1676*/
1677
1678
1679
1680

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.