"use strict";

var logger = require('./logger');

var Functions = require('./Functions');
var SecurityError = require('./SecurityError');
var GuiMessageError = require('./gui/GuiMessageError');
var NetworkError = require('./NetworkError');

/**
 * This static global object contains set of functions that returns/set data in
 * the Gui (html).
 */
var GuiConnector = {};

/**
 * X coordinate of the mouse in a browser.
 */
GuiConnector.xPos = 0;

/**
 * Y coordinate of the mouse in a browser.
 */
GuiConnector.yPos = 0;

/**
 * List of GET params passed via url.
 */

GuiConnector.init = function () {
  var self = this;

  if (!String.prototype.endsWith) {
    String.prototype.endsWith = function (pattern) {
      var d = this.length - pattern.length;
      return d >= 0 && this.lastIndexOf(pattern) === d;
    };
  }
  var isIE = /* @cc_on!@ */false || !!document.documentMode;

  if (isIE) {
    alert("This webpage works well with Chrome, Firefox and Safari.");
  }
  // bootstrap tab initialization
  $("ul.nav-tabs a").click(function (e) {
    e.preventDefault();
    $(this).tab('show');
  });

  self.getParams = [];

  // find GuiConnector.getParams
  window.location.search.replace(/\??(?:([^=]+)=([^&]*)&?)/g, function () {
    function decode(s) {
      return decodeURIComponent(s.split("+").join(" "));
    }

    GuiConnector.getParams[decode(arguments[1])] = decode(arguments[2]);
  });

  // forser browser to update mouse coordinates whenever mouse move
  jQuery(document).ready(function () {
    $(document).mousemove(function (e) {
      GuiConnector.updateMouseCoordinates(e.pageX, e.pageY);
    });
  });

  if (self._windowResizeEvents === undefined) {
    self._windowResizeEvents = [];

    if (window.onresize !== null && window.onresize !== undefined) {
      self.addWindowResizeEvent(window.onresize);
    }

    window.onresize = function () {
      for (var i = 0; i < self._windowResizeEvents.length; i++) {
        self._windowResizeEvents[i]();
      }
    };
  }
};

GuiConnector.addWindowResizeEvent = function (handler) {
  this._windowResizeEvents.push(handler);
};

/**
 * Returns name of the file with LCSB logo.
 *
 * @param bigLogo
 *          {@link Boolean} value determining if we want to have big logo or
 *          small one
 */
GuiConnector.getLcsbLogoImg = function (bigLogo) {
  if (bigLogo) {
    return 'lcsb_logo_mid.png';
  } else {
    return 'lcsb_logo.png';
  }
};

/**
 * Returns name of the file with image that should be presented when we are
 * wainting for data to be loaded.
 */
GuiConnector.getLoadingImg = function () {
  return "icons/ajax-loader.gif";
};

/**
 * Returns home directory for images in the application.
 */
GuiConnector.getImgPrefix = function () {
  return "resources/images/";
};

/**
 * Updates coordinates of the mouse in the browser.
 */
GuiConnector.updateMouseCoordinates = function (x, y) {
  this.xPos = x;
  this.yPos = y;
};

GuiConnector.showProcessing = function (messageText) {
  var self = GuiConnector;
  if (self._processingDialog === undefined) {
    self._processingDialog = document.createElement("div");
    self._errorDialogContent = document.createElement("div");
    self._processingDialog.appendChild(self._errorDialogContent);
    document.body.appendChild(self._processingDialog);
    $(self._processingDialog).dialog({
      modal: true,
      title: "PROCESSING",
      width: "150px",
      closeOnEscape: false,
      open: function (event, ui) {
        $(".ui-dialog-titlebar-close", ui).hide();
      },
    });
  }
  if (messageText === undefined) {
    messageText = "PROCESSING";
  }
  var messageImg = Functions.createElement({
    type: "img",
    src: 'resources/images/icons/ajax-loader.gif',
  });
  self._errorDialogContent.innerHTML = "";
  self._errorDialogContent.style.textAlign = "center";
  self._errorDialogContent.appendChild(messageImg);

  $(self._processingDialog).dialog("option", "title", messageText);

  $(self._processingDialog).dialog("open");
};

GuiConnector.hideProcessing = function () {
  var self = GuiConnector;
  $(self._processingDialog).dialog("close");
};

GuiConnector.alert = function (error) {
  var self = GuiConnector;
  logger.error(error);
  if (self._errorDialog === undefined) {
    self._errorDialog = document.createElement("div");
    self._errorDialogContent = document.createElement("div");
    self._errorDialog.appendChild(self._errorDialogContent);
    document.body.appendChild(self._errorDialog);
    $(self._errorDialog).dialog({
      classes: {
        "ui-dialog": "ui-state-error"
      },
      modal: true,
      title: "ERROR"
    }).siblings('.ui-dialog-titlebar').css("background", "red");
  }
  var message = error;
  if (message instanceof SecurityError) {
    message = error.message + "<p>Please <a href=\"login.xhtml?from="+encodeURI(window.location.href)+"\">login</a> to access this resource</p>";
  } else if (message instanceof GuiMessageError) {
    message = error.message;
  } else if (message instanceof NetworkError && (error.message === "XHR error" || error.message === "Failed to fetch")) {
    message = "File to big.<br>Please reduce file size or contact administrators.";
  } else if (message instanceof Error) {
    message = "Unexpected error occurred:<p>" + error.message + "</p>";
  }
  self._errorDialogContent.innerHTML = message;
  $(self._errorDialog).dialog("open");

};

module.exports = GuiConnector;