aboutsummaryrefslogblamecommitdiffstats
path: root/hesla.ts
blob: 921b442b176a6a320007dea52b10addbd052cf99 (plain) (tree)
1
2
3
4
5
6
7
8
9

                           
                                           
 


                                  

     

                                                                































































                                                                                            
                                      























                                                                       
                                                                          















                                                                                                                            




                                  
                                    



















































                                                                                     
/// <reference lib="dom" />

import {ActivePage} from "./activePage.js";

function toISODateString(date) {
    function pad(n) {
      return n < 10 ? '0' + n : n;
    }

    return date.getFullYear() + '-' + pad(date.getMonth() + 1) +
      '-' + pad(date.getDate());
}

export class Hesla extends ActivePage {
  public cur_section = null;
  
  constructor(appName?:string) {
    super(appName);
    this.cur_section = null;
    document.getElementById("czech_nav").addEventListener("click",
      (evt) => {
        localStorage.setItem("language", "cs");
        this.lang_reload();
      }, false);

    document.getElementById("german_nav").addEventListener("click",
      (evt) => {
        localStorage.setItem("language", "de");
        this.lang_reload();
      }, false);

    // requires IE 10, Opera 12.10, Safari 7,
    // FIXME Android browser requires 4.4 and has only
    // webkitHidden and the event is webkitvisibilitychange
    if (typeof document.hidden !== "undefined") {
        document.addEventListener("visibilitychange",
          (evt) => {
            if (! document.hidden) {
                this.today();
            }
          }, false);
    }
  }

  /**
   * react to the discovered distance of swipe
   *
   * @param distX Number distance in points in direction X
   * @param distY Number distance in points in direction Y
   *
   * There is a preference for the horizontal swipe; if that doesn't
   * happen (i.e., the distance travelled horizontally is less than
   * negligible), then the vertical swipe (in either direction) means
   * jump to today.
   */
  handle_move(distX, distY) {
    var negligible = 100;
    console.log('distX = ' + distX);
    console.log('distY = ' + distY);

    if (distX < -negligible) {
      console.log("swipe left");
      this.next();
    }
    else if (distX > negligible) {
      console.log("swipe right");
      this.prev();
    }
  }

  // cur_watchword is actually just a virtual property, which is not stored anywhere and its
  // accessor methods change the value of the cur_section property instead.
  get cur_watchword() {
    console.log(`this.cur_section = ${this.cur_section}`);
    if (!this.cur_section) {
        this.cur_section = new Date();
    }

    return this.cur_section;
  }

  set cur_watchword(value) {
    // Remove 'visible' style from the currently displayed psalm, if
    // there is any

    this.cur_section = value;

    // set the parameter directly to avoid call to getter.
    console.log('Displaying ' + this.cur_section);
    this.display();
  }

  /**
   * Display losungen for given day
   *
   * Displays the Losungen for the given date (or today if not defined)
   */
  display() {
    super.display();

    console.log("cur_watchword = " + toISODateString(this.cur_watchword));
    var disp_watchword = document.getElementById(toISODateString(this.cur_watchword));
    disp_watchword.classList.add("visible");

    // Complete mobile device identification /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/
    if (/Android/i.test(navigator.userAgent)) {
      // true for mobile device
      var href_attr = "";
      Array.prototype.forEach.call(disp_watchword.getElementsByTagName("a"), a_elem => {
        href_attr = a_elem.getAttribute("href");
        console.log("before replacement: href_attr = " + href_attr);
        href_attr = href_attr.replace(/http:\/\/www\.crosswire\.org\/study\/passagestudy\.jsp\?key=([^&]+)&mod=([a-zA-Z]+)/,
                                      "https://www.stepbible.org/?q=version=$2|reference=$1");
        console.log("after replacement: href_attr = " + href_attr);
        a_elem.setAttribute("href", href_attr);
      });
    }
    window.scroll(0, 0);
  }

  today() {
    console.log("jump to today!");
    this.cur_watchword = new Date();
    this.display();
  }

  shiftDate(shift) {
    var cur_date = this.cur_watchword;
    cur_date.setDate(cur_date.getDate() + shift);
    this.cur_watchword = cur_date;
  }

  next() {
    console.log("Next day!");
    this.shiftDate(+1);
  }

  prev() {
    console.log("Previous day!");
    this.shiftDate(-1);
  }

  // Switch langauge
  /**
   * Handler for the switch language event
   *
   * Switches the displayed langauge page according to the state stored
   * in the localStorage.langauge variable which contains ISO code for
   * the chosen language ('de' and 'cs' currently).
   */
  lang_reload() {
    var new_basename = "index.html", new_url = window.location.href,
      old_basename = window.location.pathname.split("/").slice(-1)[0];
    console.log('old_basename = ' + old_basename);

    if (localStorage.getItem("language") &&
        (localStorage.getItem("language") === "de")) {
      new_basename = "index_de.html";
    }

    console.log('new_basename = ' + new_basename);
    if ((old_basename !== new_basename) || (window.location.pathname.length === 0)) {
      new_url = window.location.href.replace(/(index[-\w]*\.html)?$/,
        new_basename);
    }

    if (window.location.href !== new_url) {
      window.location.assign(new_url);
    }
  }
}

var thisHesla = new Hesla();
thisHesla.lang_reload();
thisHesla.display();