class vhErrorHandler {
  constructor(isDebug) {
    this.debugMode = isDebug;
    $('body').append('<div class="errorcanvas"></div>');
    $('body').append('<div class="errorcontainer" onclick="$(\'.errorcanvas, .errorcontainer\').fadeOut();"></div>');
  }
  setDebug(isDebug) {
    this.debugMode = isDebug;
  }
  isDebug() {
    return this.debugMode;
  }
  log(text, data) {
    if (this.isDebug()) {
      //console.log(text);
      if (data != undefined && data != null) console.log(data);
    }
  }
  trace() {
    if (this.isDebug()) {
      //console.trace(text);
    }
  }
  error(error, headline, data) {
    if (this.isDebug()) {
      //console.error(headline+' - '+error);
      if (data != undefined && data != null) console.error(data);
    }
    $('.errorcanvas').fadeIn();
    $('.errorcontainer').html('<div class="errormessage"><h2>' + headline + '</h2>' + error + (this.isDebug() ? '<br><br><span style="font-size: 0.8em;">' + data + '</span>' : '') + '</div>').fadeIn();
  }
}
vhLog = new vhErrorHandler();
class vhConsole {
  static getParameterByName(name) {
    let url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.location.href;
    name = name.replace(/[\[\]]/g, '\\$&');
    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
      results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
  }
  static enableResizeTool() {
    interact('.vhelement, .vhstatic').resizable({
      margin: 10,
      edges: {
        left: true,
        right: true,
        bottom: true,
        top: true
      },
      listeners: {
        move(event) {
          var target = event.target;
          var x = parseFloat(target.getAttribute('data-x')) || 0;
          var y = parseFloat(target.getAttribute('data-y')) || 0;
          target.style.width = event.rect.width + 'px';
          target.style.height = event.rect.height + 'px';
          x += event.deltaRect.left;
          y += event.deltaRect.top;
          target.style.webkitTransform = target.style.transform = 'translate(' + x + 'px,' + y + 'px)';
          target.setAttribute('data-x', x);
          target.setAttribute('data-y', y);
          vhConsole.showElementPosition('Resized element', event.target);
        }
      },
      modifiers: [interact.modifiers.restrictEdges({
        outer: 'parent'
      })],
      inertia: true
    }).draggable({
      inertia: true,
      modifiers: [interact.modifiers.restrictRect({
        restriction: 'parent',
        endOnly: true
      })],
      autoScroll: true,
      listeners: {
        move: vhConsole.dragMoveListener,
        end(event) {
          vhConsole.showElementPosition('Moved element', event.target);
        }
      }
    });
  }
  static dragMoveListener(event) {
    var target = event.target;
    var x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;
    var y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
    target.style.webkitTransform = target.style.transform = 'translate(' + x + 'px, ' + y + 'px)';
    target.setAttribute('data-x', x);
    target.setAttribute('data-y', y);
  }
  static showElementPosition(text, target) {
    if (text != undefined && text != null && text != '') console.log(text);
    //var parentWidth = $('#vhsceneparent').width();
    //var parentHeight = $('#vhsceneparent').height();
    var parentWidth = $('#vhsceneparent').get(0).getBoundingClientRect().width;
    var parentHeight = $('#vhsceneparent').get(0).getBoundingClientRect().height;
    var pos = $(target).position();
    var width = $(target).width();
    var height = $(target).height();
    var position = {
      top: (pos.top * 100 / parentHeight).toFixed(2) + '%',
      left: (pos.left * 100 / parentWidth).toFixed(2) + '%',
      width: (width * 100 / parentWidth).toFixed(2) + '%',
      height: (height * 100 / parentHeight).toFixed(2) + '%'
    };
    vhLog.log('Element position:', JSON.stringify(position));
  }
}
function getUUID() {
  var d = new Date().getTime();
  var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    var r = (d + Math.random() * 16) % 16 | 0;
    d = Math.floor(d / 16);
    return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);
  });
  return uuid;
}
function getUrlVars() {
  var vars = {},
    hash;
  var hashes = window.location.search.slice(window.location.search.indexOf('?') + 1).split('&');
  for (var i = 0; i < hashes.length; i++) {
    hash = hashes[i].split('=');
    if (Array.isArray(hash)) vars[hash[0]] = hash[1] || null;
  }
  return vars;
}

// polyfill
if (window.NodeList && !NodeList.prototype.forEach) {
  NodeList.prototype.forEach = Array.prototype.forEach;
}