/**
 * 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.
 *
 * Copyright 2002-2019, Carrot Search s.c, All Rights Reserved.
 *
 *
 * A simple utility for attaching a visualization relaxation
 * progress monitor to FoamTree. Currently, progress reporting
 * works only with relaxationVisible option set to true.
 *
 * This utility varies the width of the provided element to
 * reflect the progress of relaxation. Feel free to modify
 * this utility to show progress in a different fashion.
 *
 * Please see demos/relaxation-progress.html for the usage example.
 *
 * @param foamtree the FoamTree instance whose relaxation progress
 *        should be monitored
 * @param element the HTML element whose width will be modified
 *        from 0% to 100% to reflect the relaxation progress
 */
window.CarrotSearchFoamTree.relaxationProgress = function(foamtree, element) {
  // Initialize the element
  var style = element.style;
  var progressBarShowing = false;
  var opacityTimeout;

  foamtree.on("modelChanged", start);
  foamtree.on("relaxationStep", progress);

  function start() {
    if (!foamtree.get("relaxationVisible")) {
      style.display = "none";
      return;
    }
    progressBarShowing = true;
    window.clearTimeout(opacityTimeout);
    disableTransitions();
    style.display = "block";
    style.backgroundColor = "red";
    style.width = "0%";
    style.opacity = 1.0;
    window.setTimeout(enableTransitions, 1);
  }

  function progress(progress, complete, timeout) {
    if (!progressBarShowing) {
      start();
    }

    if (complete || timeout) {
      style.backgroundColor = "green";
      style.width = "100%";
      opacityTimeout = window.setTimeout(function() {
        style.opacity = 0;
        progressBarShowing = false;
      }, 2000);
    } else {
      // Bend the characteristics a bit so that
      // values close to 1.0 take more space.
      var width = 1 - Math.pow(1 - progress, 0.5);
      style.width = (100 * width) + "%";
    }
  }

  function enableTransitions() {
    style.WebkitTransition = "width 0.5s, background-color 1s, opacity 0.5s";
    style.transition = "background-color 1s, opacity 0.5s";
  }

  function disableTransitions() {
    style.WebkitTransition = "";
    style.transition = "";
  }
};