/**
 * @license
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed 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.
 */

export const DomUtilBehavior = {
  /**
   * Are any ancestors of the element (or the element itself) members of the
   * given class.
   *
   * @param {!Element} element
   * @param {string} className
   * @param {Element=} opt_stopElement If provided, stop traversing the
   *     ancestry when the stop element is reached. The stop element's class
   *     is not checked.
   * @return {boolean}
   */
  descendedFromClass(element, className, opt_stopElement) {
    let isDescendant = element.classList.contains(className);
    while (!isDescendant && element.parentElement &&
        (!opt_stopElement || element.parentElement !== opt_stopElement)) {
      isDescendant = element.classList.contains(className);
      element = element.parentElement;
    }
    return isDescendant;
  },
};

// TODO(dmfilippov) Remove the following lines with assignments
// Plugins can use the behavior because it was accessible with
// the global Gerrit... variable. To avoid breaking changes in plugins
// temporary assign global variables.
window.Gerrit = window.Gerrit || {};
window.Gerrit.DomUtilBehavior = DomUtilBehavior;
