/*
 * 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.
 */

// XXX regexp example only - blueprint

import {Listener, Phase} from "./tobago-listener";
import {DomUtils} from "./tobago-utils";

class RegExpTest {

  private readonly element: HTMLInputElement;
  private readonly regexp: RegExp;

  constructor(element: HTMLInputElement) {

    this.element = element;
    this.regexp = new RegExp(this.element.dataset["regexp"]);

    console.info("constructor: " + element.id);

    this.element.addEventListener("change", this.checkValue.bind(this));
  };

  checkValue(event: TextEvent) {
    console.info("changed: check if " + this.regexp + " is okay!");
    if (!this.regexp.test(this.element.value)) {
      this.element.classList.add("border-danger");
    } else {
      this.element.classList.remove("border-danger");
    }
  };

  static init = function (element: HTMLElement): void {
    for (const input of DomUtils.selfOrElementsByClassName(element, "tobago-in")) { // todo only for data-regexp
      new RegExpTest(<HTMLInputElement>input);
    }
  };
}

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