/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import {Listener, Phase} from "../tobago/standard/tobago-bootstrap/5.0.0-SNAPSHOT/js/tobago-listener";

class Demo {

  static init(element) {
    Demo.initAlert(element);
    // Demo.initInspect(element); //TODO fix inspection
    Demo.initTestLinks(element);
    Demo.initTestFrame(element);
    Demo.initGoogleSearch(element);
    Demo.initMailTo(element);
  }

  static initAlert(element) {
    for (const e of element.querySelectorAll("[data-alert-text]")) {
      e.addEventListener("click", function (event) {
        alert(event.currentTarget.dataset["alertText"]);
      });
    }
  }

  static initInspect(element) {

    for (const code of element.querySelectorAll("code")) {
      for (const br of code.querySelectorAll("br")) {
        br.parentNode.insertBefore("\n", br);
        br.parentNode.removeChild(br);
      }
    }

    for (const e of element.querySelectorAll(".tobago-flexLayout")) {

      // do highlighting with hovering only in the content-area
      if (e.closest("#page\\:content")) {
        e.addEventListener("hover", function (event) {

          // clear old selections:
          for (const selected of document.querySelectorAll(".demo-selected")) {
            selected.classList.remove("demo-selected");
          }

          const element = event.currentTarget;
          element.classList.add("demo-selected");
          const clientId = element.closest("[id]").id;
          const id = clientId.substr(clientId.lastIndexOf(":") + 1);
          const source = document.getElementById("demo-view-source");

          for (const span of source.querySelectorAll("span.token.attr-value")) {
            if (span.textContent === 'id=' + '"' + id + '"') {
              span.parentElement.classList.add("demo-selected");
            }
          }
        });
      }
    }
  }

  static initTestLinks(element) {
    const runLink = document.getElementById("page:header:runtest");
    if (runLink && parent.document.getElementById("qunit")) {
      runLink.classList.add("d-none");
    }
  }

  static initTestFrame(element) {
    const testFrame = document.getElementById("page:testframe");
    if (testFrame) {
      testFrame.addEventListener("onload", function () {
        element.height = element.contentWindow.body.scrollHeight;
      });
    }
  }

  static initGoogleSearch(element) {
    const input = document.getElementById("page:search:searchField");
    const search = "+site%3Atobago-vm.apache.org+demo-4";
    input.addEventListener("change", function (event) {
      const input = event.currentTarget;
      const button = document.getElementById("page:search:searchCommand");
      button.setAttribute("href", "https://www.google.com/search?q=" + encodeURI(input.value) + search);
    });
    input.addEventListener("keypress", function (event) {
      if (event.which === 13) {
        console.log("ENTER");
        window.location.href = "https://www.google.com/search?q=" + encodeURI(input.value()) + search;
      }
    });
  };

  static initMailTo(element) {
    for (let link of document.querySelectorAll("[href^=mailto]")) {
      // this is, to fix URL encoded spaces
      const string = link.getAttribute("href");
      const begin = string.indexOf("subject=");
      const href = string.substring(0, begin) + string.substring(begin).replace(/\+/g, "%20");
      link.setAttribute("href", href);
    }
  };

}

Listener.register(Demo.init, Phase.DOCUMENT_READY);
Listener.register(Demo.init, Phase.AFTER_UPDATE);

// call highlighting again. (is called for all, not only for the elements, because it's easier to implement.)
Listener.register(Prism.highlightAll, Phase.AFTER_UPDATE);
