/* manual.js                                               Frank Lübeck  */

/* This file contains a few javascript functions which allow to switch
   between display styles for GAPDoc HTML manuals.
   If javascript is switched off in a browser or this file in not available
   in a manual directory, this is no problem. Users just cannot switch
   between several styles and don't see the corresponding button.

   A style with name mystyle can be added by providing two files (or only
   one of them).
     mystyle.js:   Additional javascript code for the style, it is 
                   read in the HTML pages after this current file.
                   The additional code may adjust the preprocessing function 
                   jscontent() with is called onload of a file. This
                   is done by appending functions to jscontentfuncs
                   (jscontentfuncs.push(newfunc);).
                   Make sure, that your style is still usable without
                   javascript.
     mystyle.css:  CSS configuration, read after manual.css (so it can 
                   just reconfigure a few details, or overwrite everything).

  Then adjust chooser.html such that users can switch on and off mystyle.
 
  A user can change the preferred style permanently by using the [Style]
  link and choosing one. Or one can append '?GAPDocStyle=mystyle' to the URL
  when loading any file of the manual (so the style can be configured in
  the GAP user preferences). 

*/

/* generic helper function */
function deleteCookie(nam) {
  document.cookie = nam+"=;Path=/;expires=Thu, 01 Jan 1970 00:00:00 GMT";
}

/* read a value from a "nam1=val1;nam2=val2;..." string (e.g., the search
   part of an URL or a cookie                                             */
function valueString(str,nam) {
  var cs = str.split(";");
  for (var i=0; i < cs.length; i++) {
    var pos = cs[i].search(nam+"=");
    if (pos > -1) {
      pos = cs[i].indexOf("=");
      return cs[i].slice(pos+1);
    }
  }
  return 0;
}

/* load dark appearance either explicitly or via the OS preference */
function writeAppearanceStyle(mode) {
  if (mode == "dark") {
    document.writeln(
      '<link rel="stylesheet" type="text/css" href="dark.css" />'
    );
  } else if (mode != "light") {
    document.writeln(
      '<style type="text/css">@import "dark.css" ' +
      '(prefers-color-scheme: dark);</style>'
    );
  }
}

/* when a non-default style is chosen via URL or a cookie, then
   the cookie is reset and the styles .js and .css files are read  */
function overwriteStyle() {
  /* style in URL? */
  var style = valueString(window.location.search, "GAPDocStyle");
  /* otherwise check cookie */
  if (style == 0)
    style = valueString(document.cookie, "GAPDocStyle");
  if (style == 0 || style == "default")
    writeAppearanceStyle("");
  if (style == 0)
    return;
  if (style == "default")
    deleteCookie("GAPDocStyle");
  else {
    /* ok, we set the cookie for path "/" */
    var path = "/";
    /* or better like this ???
    var here = window.location.pathname.split("/");
    for (var i=0; i+3 < here.length; i++)
      path = path+"/"+here[i];
    */
    document.cookie = "GAPDocStyle="+style+";Path="+path;
    /* split into names of style files */
    var stlist = style.split(",");
    var appearance = "";
    /* read style's css and js files */
    for (var i=0; i < stlist.length; i++) {
      if (stlist[i] == "dark" || stlist[i] == "light") {
        appearance = stlist[i];
      } else {
        document.writeln('<link rel="stylesheet" type="text/css" href="'+
                                                           stlist[i]+'.css" />');
        document.writeln('<script src="'+stlist[i]+
                                        '.js" type="text/javascript"></script>');
      }
    }
    writeAppearanceStyle(appearance);
  }
}

/* this adds a "[Style]" link next to the MathJax switcher   */
function addStyleLink() {
  var line = document.getElementById("mathjaxlink");
  var el = document.createElement("a");
  var oncl = document.createAttribute("href");
  var back = window.location.protocol+"//"
  if (window.location.protocol == "http:" || 
      window.location.protocol == "https:") {
    back = back+window.location.host;
    if (window.location.port != "") {
      back = back+":"+window.location.port;
    }
  }
  back = back+window.location.pathname;
  oncl.nodeValue = "chooser.html?BACK="+back; 
  el.setAttributeNode(oncl);
  var cont = document.createTextNode(" [Style]");
  el.appendChild(cont);
  line.appendChild(el);
}

var jscontentfuncs = new Array();

jscontentfuncs.push(addStyleLink);

/* the default jscontent() only adds the [Style] link to the page */
function jscontent () {
  for (var i=0; i < jscontentfuncs.length; i++)
    jscontentfuncs[i]();
}
