var ENTERPRISE_DIR = "enterprise";

/* Function to hide/unhide a specific Div id */
function toggleDiv(divid) {
  if (document.getElementById(divid).style.display == "none") {
    document.getElementById(divid).style.display = "block";
  } else {
    document.getElementById(divid).style.display = "none";
  }
}

function winopeng(url, wid) {
  open(
    url,
    wid,
    "width=1000,height=550,status=no,toolbar=no,menubar=no,scrollbars=yes,resizable=yes"
  );
  // WARNING !! Internet Explorer DOESNT SUPPORT "-" CARACTERS IN WINDOW HANDLE VARIABLE
  status = wid;
}

function winopeng_var(url, wid, width, height) {
  open(
    url,
    wid,
    "width=" +
      width +
      ",height=" +
      height +
      ",status=no,toolbar=no,menubar=no,scrollbar=yes"
  );
  // WARNING !! Internet Explorer DOESNT SUPPORT "-" CARACTERS IN WINDOW HANDLE VARIABLE
  status = wid;
}

function open_help(help_id, home_url, id_user) {
  open(
    home_url + "general/pandora_help.php?id=" + help_id + "&id_user=" + id_user,
    "pandorahelp",
    "width=650,height=500,status=0,toolbar=0,menubar=0,scrollbars=1,location=0"
  );
}

/**
 * Decode HTML entities into characters. Useful when receiving something from AJAX
 *
 * @param str String to convert
 *
 * @retval str with entities decoded
 */
function js_html_entity_decode(str) {
  if (!str) return "";

  str2 = str
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/&lt;/g, "<")
    .replace(/&gt;/g, ">")
    .replace(/&#92;/g, "\\")
    .replace(/&quot;/g, '"')
    .replace(/&#039;/g, "'")
    .replace(/&amp;/g, "&")
    .replace(/&#x20;/g, " ")
    .replace(/&#13;/g, "\r")
    .replace(/&#10;/g, "\n");

  return str2;
}

/**
 * Function to search an element in an array.
 *
 * Extends the array object to use it like a method in an array object. Example:
 * <code>
 a = Array (4, 7, 9);
 alert (a.in_array (4)); // true
 alert (a.in_array (5)); // false
 */
Array.prototype.in_array = function() {
  for (var j in this) {
    if (this[j] == arguments[0]) return true;
  }

  return false;
};

/**
 * Util for check is empty object
 *
 * @param obj the object to check
 * @returns {Boolean} True it is empty
 */
function isEmptyObject(obj) {
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) return false;
  }

  return true;
}

/**
 * Fill up select box with id "module" with modules after agent has been selected, but this not empty the select box.s
 *
 * @param event that has been triggered
 * @param id_agent Agent ID that has been selected
 * @param selected Which module(s) have to be selected
 */
function agent_changed_by_multiple_agents(event, id_agent, selected) {
  // Hack to avoid certain module types
  var module_types_excluded = [];
  if (typeof $("input.module_types_excluded") !== "undefined") {
    try {
      $("input.module_types_excluded").each(function(index, el) {
        var module_type = parseInt($(el).val());

        if (module_type !== NaN) module_types_excluded.push(module_type);
      });
    } catch (error) {}
  }

  var module_status = -1;
  if (typeof $("#status_module") !== "undefined") {
    try {
      module_status = $("#status_module").val();
    } catch (error) {}
  }

  // Module name
  var module_name = $("#text-module_filter").val();

  var idAgents = Array();

  jQuery.each($("#id_agents option:selected"), function(i, val) {
    //val() because the var is same <option val="NNN"></option>
    idAgents.push($(val).val());
  });

  var tags_to_search = $("#tags1").val();

  //Hack to find only enabled modules
  //Pass a flag as global var
  find_modules = "all";
  if (
    typeof show_only_enabled_modules !== "undefined" &&
    show_only_enabled_modules
  ) {
    find_modules = "enabled";
  }

  var selection_mode = $("#modules_selection_mode").val();
  if (typeof selection_mode === "undefined") {
    selection_mode = "common";
  }

  var serialized = $("#hidden-serialized").val();
  if (typeof serialized === "undefined") {
    serialized = "";
  }

  $("#module")
    .prop("disabled", true)
    .empty()
    .append(
      $("<option></option>")
        .html("Loading...")
        .attr("value", 0)
    );

  // Check if homedir was received like a JSON
  var homedir = ".";
  var id_server = 0;
  if (typeof event !== "undefined" && typeof event.data !== "undefined") {
    if (event.data != null) {
      if (typeof event.data !== "undefined") {
        if (typeof event.data.homedir !== "undefined") {
          homedir = event.data.homedir;
        }

        if (
          typeof event.data.metaconsole !== "undefined" &&
          event.data.metaconsole
        ) {
          id_server = $("#" + event.data.id_server).val();
        }
      }
    }
  }

  jQuery.post(
    homedir + "/ajax.php",
    {
      page: "operation/agentes/ver_agente",
      get_agent_modules_json_for_multiple_agents: 1,
      "id_agent[]": idAgents,
      "tags[]": tags_to_search,
      all: find_modules,
      "module_types_excluded[]": module_types_excluded,
      name: module_name,
      selection_mode: selection_mode,
      serialized: serialized,
      id_server: id_server,
      status_module: module_status
    },
    function(data) {
      $("#module").empty();

      if (isEmptyObject(data)) {
        //Trick for catch the translate text.
        var noneText =
          $("#id_agents").val() === null
            ? $("#select_agent_first_text").html()
            : $("#none_text").html();
        if (noneText == null) {
          noneText = "None";
        }

        $("#module").append(
          $("<option></option>")
            .html(noneText)
            .attr("None", "")
            .prop("selected", true)
        );

        return;
      }

      if (typeof $(document).data("text_for_module") != "undefined") {
        $("#module").append(
          $("<option></option>")
            .html($(document).data("text_for_module"))
            .attr("value", 0)
            .prop("selected", true)
        );
      } else {
        if (typeof data["any_text"] != "undefined") {
          $("#module").append(
            $("<option></option>")
              .html(data["any_text"])
              .attr("value", 0)
              .prop("selected", true)
          );
        } else {
          var anyText = $("#any_text").html(); //Trick for catch the translate text.

          if (anyText == null) {
            anyText = "Any";
          }

          $("#module").append(
            $("<option></option>")
              .html(anyText)
              .attr("value", 0)
              .prop("selected", true)
          );
        }
      }
      jQuery.each(data, function(i, val) {
        var s = js_html_entity_decode(val);

        $("#module").append(
          $("<option></option>")
            .html(s)
            .attr("value", i)
            .attr("title", s)
        );

        $("#module").fadeIn("normal");
      });
      if (typeof selected !== "undefined") $("#module").attr("value", selected);

      $("#module")
        .css("max-width", "")
        .prop("disabled", false);

      if (typeof function_hook_loaded_module_list == "function") {
        function_hook_loaded_module_list();
      }
    },
    "json"
  );
}

/**
 * Fill up select box with id "module" with modules with alerts of one template
 * after agent has been selected, but this not empty the select box.s
 *
 * @param event that has been triggered
 * @param id_agent Agent ID that has been selected
 * @param selected Which module(s) have to be selected
 */
function agent_changed_by_multiple_agents_with_alerts(
  event,
  id_agent,
  selected
) {
  var idAgents = Array();

  jQuery.each($("#id_agents option:selected"), function(i, val) {
    //val() because the var is same <option val="NNN"></option>
    idAgents.push($(val).val());
  });

  var selection_mode = $("#modules_selection_mode").val();
  if (selection_mode == undefined) {
    selection_mode = "common";
  }

  template = $("#id_alert_template option:selected").val();

  $("#module").attr("disabled", 1);
  $("#module").empty();
  $("#module").append(
    $("<option></option>")
      .html("Loading...")
      .attr("value", 0)
  );
  jQuery.post(
    "ajax.php",
    {
      page: "operation/agentes/ver_agente",
      get_agent_modules_multiple_alerts_json_for_multiple_agents: 1,
      template: template,
      "id_agent[]": idAgents,
      selection_mode: selection_mode
    },
    function(data) {
      $("#module").empty();

      if (typeof $(document).data("text_for_module") != "undefined") {
        $("#module").append(
          $("<option></option>")
            .html($(document).data("text_for_module"))
            .attr("value", 0)
            .prop("selected", true)
        );
      } else {
        if (typeof data["any_text"] != "undefined") {
          $("#module").append(
            $("<option></option>")
              .html(data["any_text"])
              .attr("value", 0)
              .prop("selected", true)
          );
        } else {
          var anyText = $("#any_text").html(); //Trick for catch the translate text.

          if (anyText == null) {
            anyText = "Any";
          }

          $("#module").append(
            $("<option></option>")
              .html(anyText)
              .attr("value", 0)
              .prop("selected", true)
          );
        }
      }
      jQuery.each(data, function(i, val) {
        s = js_html_entity_decode(val);
        $("#module").append(
          $("<option></option>")
            .html(s)
            .attr("value", val)
        );
        $("#module").fadeIn("normal");
      });
      if (selected != undefined) $("#module").attr("value", selected);
      $("#module").removeAttr("disabled");
    },
    "json"
  );
}

/**
 * Fill up select box with id "module" with modules with alerts of one or more templates
 * before agent has been selected, but this not empty the select box.s
 *
 * @param event that has been triggered
 * @param id_agent Agent ID that has been selected
 * @param selected Which module(s) have to be selected
 */
function alert_templates_changed_by_multiple_agents_with_alerts(
  event,
  id_agent,
  selected
) {
  var idAgents = Array();

  jQuery.each($("#id_agents option:selected"), function(i, val) {
    //val() because the var is same <option val="NNN"></option>
    idAgents.push($(val).val());
  });

  var selection_mode = $("#modules_selection_mode").val();
  if (selection_mode == undefined) {
    selection_mode = "common";
  }

  templates = Array();
  jQuery.each($("#id_alert_templates option:selected"), function(i, val) {
    //val() because the var is same <option val="NNN"></option>
    templates.push($(val).val());
  });

  $("#module").attr("disabled", 1);
  $("#module").empty();
  $("#module").append(
    $("<option></option>")
      .html("Loading...")
      .attr("value", 0)
  );
  jQuery.post(
    "ajax.php",
    {
      page: "operation/agentes/ver_agente",
      get_agent_modules_alerts_json_for_multiple_agents: 1,
      "templates[]": templates,
      "id_agent[]": idAgents,
      selection_mode: selection_mode
    },
    function(data) {
      $("#module").empty();

      if (typeof $(document).data("text_for_module") != "undefined") {
        $("#module").append(
          $("<option></option>")
            .html($(document).data("text_for_module"))
            .attr("value", 0)
            .prop("selected", true)
        );
      } else {
        if (typeof data["any_text"] != "undefined") {
          $("#module").append(
            $("<option></option>")
              .html(data["any_text"])
              .attr("value", 0)
              .prop("selected", true)
          );
        } else {
          var anyText = $("#any_text").html(); //Trick for catch the translate text.

          if (anyText == null) {
            anyText = "Any";
          }

          $("#module").append(
            $("<option></option>")
              .html(anyText)
              .attr("value", 0)
              .prop("selected", true)
          );
        }
      }
      jQuery.each(data, function(i, val) {
        s = js_html_entity_decode(val);
        $("#module").append(
          $("<option></option>")
            .html(s)
            .attr("value", val)
        );
        $("#module").fadeIn("normal");
      });
      if (selected != undefined) $("#module").attr("value", selected);
      $("#module").removeAttr("disabled");
    },
    "json"
  );
}

/**
 * Fill up select box with id "agent" with agents after module has been selected, but this not empty the select box.s
 *
 * @param event that has been triggered
 * @param id_module Module ID that has been selected
 * @param selected Which agent(s) have to be selected
 */
function module_changed_by_multiple_modules(event, id_module, selected) {
  var idModules = Array();

  jQuery.each($("#module_name option:selected"), function(i, val) {
    //val() because the var is same <option val="NNN"></option>
    idModules.push($(val).val());
  });

  $("#agents").attr("disabled", 1);
  $("#agents").empty();
  $("#agents").append(
    $("<option></option>")
      .html("Loading...")
      .attr("value", 0)
  );

  var status_module = -1;
  if (typeof $("#status_module") !== "undefined") {
    try {
      status_module = $("#status_module").val();
    } catch (error) {}
  }

  var selection_mode = $("#agents_selection_mode").val();
  if (selection_mode == undefined) {
    selection_mode = "common";
  }

  var tags_selected = [];

  var tags_to_search = $("#tags").val();
  if (tags_to_search != null) {
    if (tags_to_search[0] != -1) {
      tags_selected = tags_to_search;
    }
  }
  jQuery.post(
    "ajax.php",
    {
      page: "operation/agentes/ver_agente",
      get_agents_json_for_multiple_modules: 1,
      status_module: status_module,
      "module_name[]": idModules,
      selection_mode: selection_mode,
      tags: tags_selected
    },
    function(data) {
      $("#agents").append(
        $("<option></option>")
          .html("Loading...")
          .attr("value", 0)
      );

      $("#agents").empty();

      if (isEmptyObject(data)) {
        var noneText = $("#none_text").html(); //Trick for catch the translate text.

        if (noneText == null) {
          noneText = "None";
        }

        $("#agents").append(
          $("<option></option>")
            .html(noneText)
            .attr("None", "")
            .prop("selected", true)
        );

        return;
      }

      if (typeof $(document).data("text_for_module") != "undefined") {
        $("#agents").append(
          $("<option></option>")
            .html($(document).data("text_for_module"))
            .attr("value", 0)
            .prop("selected", true)
        );
      } else {
        if (typeof data["any_text"] != "undefined") {
          $("#agents").append(
            $("<option></option>")
              .html(data["any_text"])
              .attr("value", 0)
              .prop("selected", true)
          );
        } else {
          var anyText = $("#any_text").html(); //Trick for catch the translate text.

          if (anyText == null) {
            anyText = "Any";
          }

          $("#agents").append(
            $("<option></option>")
              .html(anyText)
              .attr("value", 0)
              .prop("selected", true)
          );
        }
      }
      jQuery.each(data, function(i, val) {
        s = js_html_entity_decode(val);
        $("#agents").append(
          $("<option></option>")
            .html(s)
            .attr("value", i)
        );
        $("#agents").fadeIn("normal");
      });

      if (selected != undefined) $("#agents").attr("value", selected);
      $("#agents").removeAttr("disabled");
    },
    "json"
  );
}

/**
 * Fill up select box with id "module" with modules after agent has been selected, but this not empty the select box.s
 *
 * @param event that has been triggered
 * @param id_agent Agent ID that has been selected
 * @param selected Which module(s) have to be selected
 */
function agent_changed_by_multiple_agents_id(event, id_agent, selected) {
  var idAgents = Array();

  jQuery.each($("#id_agents option:selected"), function(i, val) {
    //val() because the var is same <option val="NNN"></option>
    idAgents.push($(val).val());
  });

  $("#module").attr("disabled", 1);
  $("#module").empty();
  $("#module").append(
    $("<option></option>")
      .html("Loading...")
      .attr("value", 0)
  );
  jQuery.post(
    "ajax.php",
    {
      page: "operation/agentes/ver_agente",
      get_agent_modules_json_for_multiple_agents_id: 1,
      "id_agent[]": idAgents
    },
    function(data) {
      $("#module").empty();

      if (typeof $(document).data("text_for_module") != "undefined") {
        $("#module").append(
          $("<option></option>")
            .html($(document).data("text_for_module"))
            .attr("value", 0)
            .prop("selected", true)
        );
      } else {
        if (typeof data["any_text"] != "undefined") {
          $("#module").append(
            $("<option></option>")
              .html(data["any_text"])
              .attr("value", 0)
              .prop("selected", true)
          );
        } else {
          var anyText = $("#any_text").html(); //Trick for catch the translate text.

          if (anyText == null) {
            anyText = "Any";
          }

          $("#module").append(
            $("<option></option>")
              .html(anyText)
              .attr("value", 0)
              .prop("selected", true)
          );
        }
      }

      jQuery.each(data, function(i, val) {
        s = js_html_entity_decode(val["nombre"]);
        //$('#module').append ($('<option></option>').html (s).attr ("value", val));
        $("#module").append(
          $("<option></option>")
            .html(s)
            .attr("value", val["id_agente_modulo"])
        );
        $("#module").fadeIn("normal");
      });
      if (selected != undefined) $("#module").attr("value", selected);
      $("#module").removeAttr("disabled");
    },
    "json"
  );
}

function post_process_select_init(name) {
  // Manual mode is hidden by default

  $("#" + name + "_manual").hide();
  $("#" + name + "_default").show();
}

function post_process_select_init_unit(name, selected) {
  // Manual mode is hidden by default

  $("#" + name + "_manual").hide();
  $("#" + name + "_default").show();

  if (selected != "") {
    var select_or_text = false;
    $("#" + name + "_select option").each(function(i, item) {
      if ($(item).val() == selected) {
        select_or_text = true;
        return false;
      }
    });

    if (select_or_text) {
      $("#" + name + "_select option[value=" + selected + "]").attr(
        "selected",
        true
      );
      $("#text-" + name + "_text").val("");
    } else {
      $("#" + name + "_select option[value=none]").attr("selected", true);
      $("#" + name + "_default").hide();
      $("#" + name + "_manual").show();
    }
  } else {
    $("#" + name + "_select option[value=none]").attr("selected", true);
  }

  $("#" + name + "_select").change(function() {
    var value = $("#" + name + "_select").val();
    $("#" + name + "_select option[value=" + value + "]").attr(
      "selected",
      true
    );
  });
}

function post_process_select_events_unit(name, selected) {
  $("." + name + "_toggler").click(function() {
    var value = $("#text-" + name + "_text").val();

    var count = $("#" + name + "_select option").filter(function(i, item) {
      if ($(item).val() == value) return true;
      else return false;
    }).length;

    if (count != 1) {
      $("#" + name + "_select").append(
        $("<option>")
          .val(value)
          .text(value)
      );
    }

    $("#" + name + "_select option")
      .filter(function(i, item) {
        if ($(item).val() == value) return true;
        else return false;
      })
      .prop("selected", true);

    toggleBoth(name);
    $("#text-" + name + "_text").focus();
  });

  // When select a default period, is setted in seconds
  $("#" + name + "_select").change(function() {
    var value = $("#" + name + "_select").val();

    $("." + name).val(value);
    $("#text-" + name + "_text").val(value);
  });

  $("#text-" + name + "_text").keyup(function() {
    var value = $("#text-" + name + "_text").val();
    $("." + name).val(value);
  });
}

function post_process_select_events(name) {
  $("." + name + "_toggler").click(function() {
    var value = $("#text-" + name + "_text").val();

    var count = $("#" + name + "_select option").filter(function(i, item) {
      if (Number($(item).val()) == Number(value)) return true;
      else return false;
    }).length;

    if (count != 1) {
      $("#" + name + "_select").append(
        $("<option>")
          .val(value)
          .text(value)
      );
    }

    $("#" + name + "_select option")
      .filter(function(i, item) {
        if (Number($(item).val()) == Number(value)) return true;
        else return false;
      })
      .prop("selected", true);

    //~ $('#' + name + '_select').val(value);

    toggleBoth(name);
    $("#text-" + name + "_text").focus();
  });

  // When select a default period, is setted in seconds
  $("#" + name + "_select").change(function() {
    var value = $("#" + name + "_select").val();

    $("." + name).val(value);
    $("#text-" + name + "_text").val(value);
  });

  $("#text-" + name + "_text").keyup(function() {
    var value = $("#text-" + name + "_text").val();

    if (isNaN(value)) {
      value = 0;
      $("#text-" + name + "_text").val(value);
    } else {
      $("." + name).val(value);
    }
  });
}

/**
 * Init values for html_extended_select_for_time
 *
 * This function initialize the values of the control
 *
 * @param name string with the name of the select for time
 */
function period_select_init(name) {
  // Manual mode is hidden by default
  $("#" + name + "_manual").hide();
  $("#" + name + "_default").show();

  // If the text input is empty, we put on it 5 minutes by default
  if ($("#text-" + name + "_text").val() == "") {
    $("#text-" + name + "_text").val(300);
    // Set the value in the hidden field too
    $("." + name).val(300);
    if ($("#" + name + "_select option:eq(0)").val() == 0) {
      $("#" + name + "_select option:eq(2)").prop("selected", true);
    } else {
      $("#" + name + "_select option:eq(1)").prop("selected", true);
    }
  } else if ($("#text-" + name + "_text").val() == 0) {
    $("#" + name + "_units option:last").prop("selected", false);
    $("#" + name + "_manual").show();
    $("#" + name + "_default").hide();
  }
}

/**
 * Manage events into html_extended_select_for_time
 *
 * This function has all the events to manage the extended select
 * for time
 *
 * @param name string with the name of the select for time
 */
function period_select_events(name) {
  $("." + name + "_toggler").click(function() {
    toggleBoth(name);
    $("#text-" + name + "_text").focus();
  });

  adjustTextUnits(name);

  // When select a default period, is setted in seconds
  $("#" + name + "_select").change(function() {
    var value = $("#" + name + "_select").val();

    if (value == -1) {
      value = 300;
      toggleBoth(name);
      $("#text-" + name + "_text").focus();
    }

    $("." + name).val(value);
    $("#text-" + name + "_text").val(value);
    adjustTextUnits(name);
  });

  // When select a custom units, the default period changes to
  // 'custom' and the time in seconds is calculated into hidden input
  $("#" + name + "_units").change(function() {
    selectFirst(name);
    calculateSeconds(name);
  });

  // When write any character into custom input, it check to convert
  // it to integer and calculate in seconds into hidden input
  $("#text-" + name + "_text").keyup(function() {
    var cleanValue = parseInt($("#text-" + name + "_text").val());
    if (isNaN(cleanValue)) {
      cleanValue = "";
    }

    $("#text-" + name + "_text").val(cleanValue);

    selectFirst(name + "_select");
    calculateSeconds(name);
  });
}

function period_set_value(name, value) {
  $("#text-" + name + "_text").val(value);
  adjustTextUnits(name);
  calculateSeconds(name);
  selectFirst(name + "_select");
  $("#" + name + "_manual").hide();
  $("#" + name + "_default").show();
}

/**
 *
 * Select first option of a select if is not value=0
 *
 */
function selectFirst(name) {
  if ($("#" + name + " option:eq(0)").val() == 0) {
    $("#" + name + " option:eq(1)").prop("selected", true);
  } else {
    $("#" + name + " option:eq(0)").prop("selected", true);
  }
}

/**
 *
 * Toggle default and manual controls of period control
 * It is done with css function because hide and show do not
 * work properly when the divs are into a hiden div
 *
 */
function toggleBoth(name) {
  if ($("#" + name + "_default").css("display") == "none") {
    $("#" + name + "_default").css("display", "inline");
  } else {
    $("#" + name + "_default").css("display", "none");
  }

  if ($("#" + name + "_manual").css("display") == "none") {
    $("#" + name + "_manual").css("display", "inline");
  } else {
    $("#" + name + "_manual").css("display", "none");
  }
}

/**
 *
 * Calculate the custom time in seconds into hidden input
 *
 */
function calculateSeconds(name) {
  var calculated =
    $("#text-" + name + "_text").val() * $("#" + name + "_units").val();

  $("." + name).val(calculated);
}

/**
 *
 * Update via Javascript an advance selec for time
 *
 */
function period_select_update(name, seconds) {
  $("#text-" + name + "_text").val(seconds);
  adjustTextUnits(name);
  calculateSeconds(name);
  $("#" + name + "_manual").show();
  $("#" + name + "_default").hide();
}

/**
 *
 * Adjust units in the advanced select for time
 *
 */
function adjustTextUnits(name) {
  var restPrev;
  var unitsSelected = false;
  $("#" + name + "_units option").each(function() {
    if ($(this).val() < 0) {
      return;
    }
    var rest = $("#text-" + name + "_text").val() / $(this).val();
    var restInt = parseInt(rest).toString();

    if (rest != restInt && unitsSelected == false) {
      $("#" + name + "_units option:eq(" + ($(this).index() - 1) + ")").prop(
        "selected",
        true
      );
      $("#text-" + name + "_text").val(restPrev);
      unitsSelected = true;
    }

    restPrev = rest;
  });

  if (unitsSelected == false) {
    $("#" + name + "_units option:last").prop("selected", true);
    $("#text-" + name + "_text").val(restPrev);
  }

  if ($("#text-" + name + "_text").val() == 0) {
    selectFirst(name + "_units");
  }
}

/**
 * Sidebar function
 * params:
 * 	menuW: $params['width']
 * 	icon_width: $params['icon_width']
 *  position: $params['position']
 *  top_dist: $params['top']
 *  autotop: $params['autotop']
 *  icon_closed: $params['icon_closed']
 * 	icon_open: $params['icon_open']
 * 	homeurl: $config['homeurl']
 *
 **/
function hidded_sidebar(
  position,
  menuW,
  menuH,
  icon_width,
  top_dist,
  autotop,
  right_dist,
  autoright,
  icon_closed,
  icon_open,
  homeurl,
  vertical_mode
) {
  var defSlideTime = 220;
  var visibleMargin = icon_width + 10;
  var hiddenMarginW = menuW - visibleMargin;
  menuH = parseInt(menuH);
  var hiddenMarginH = menuH - visibleMargin;
  var windowWidth = $(window).width();
  var sideClosed = 1;

  if (top_dist == "auto_over") {
    top_dist = $("#" + autotop).offset().top;
  } else if (top_dist == "auto_below") {
    top_dist = $("#" + autotop).offset().top + $("#" + autotop).height();
    switch (position) {
      case "bottom":
        if (vertical_mode == "in") {
          top_dist -= visibleMargin + 10;
        }
    }
  }

  if (right_dist == "auto_right") {
    right_dist = $("#" + autoright).offset().left + $("#" + autoright).width();
  } else if (right_dist == "auto_left") {
    right_dist = $("#" + autoright).offset().left;
  }

  $(document).ready(function() {
    // SET INITIAL POSITION AND SHOW LAYER
    $("#side_layer").css("top", top_dist);
    switch (position) {
      case "left":
        $("#side_layer").css("left", -hiddenMarginW);
        break;
      case "right":
        $("#side_layer").css("left", windowWidth - visibleMargin - 1);
        $("#side_layer").css("width", visibleMargin + "px");
        break;
      case "bottom":
        $("#side_layer").css("left", right_dist - menuW);
        $("#side_layer").css("height", visibleMargin + "px");
        break;
    }
    $("#side_layer").show();

    $("#graph_menu_arrow").click(function() {
      switch (position) {
        case "right":
          if (sideClosed == 0) {
            $("#side_layer").animate(
              {
                width: "-=" + hiddenMarginW + "px",
                left: "+=" + hiddenMarginW + "px"
              },
              defSlideTime
            );
            $("#graph_menu_arrow").attr("src", homeurl + icon_closed);
          } else {
            $("#side_layer").animate(
              {
                width: "+=" + hiddenMarginW + "px",
                left: "-=" + hiddenMarginW + "px"
              },
              defSlideTime
            );
            $("#graph_menu_arrow").attr("src", homeurl + icon_open);
          }
          break;
        case "left":
          if (sideClosed == 1) {
            $("#side_layer").animate(
              { left: "+=" + hiddenMarginW + "px" },
              defSlideTime
            );

            $("#graph_menu_arrow").attr("src", homeurl + icon_closed);
          } else {
            $("#side_layer").animate(
              { left: "-=" + hiddenMarginW + "px" },
              defSlideTime
            );
            $("#graph_menu_arrow").attr("src", homeurl + icon_open);
          }
          break;
        case "bottom":
          if (sideClosed == 0) {
            $("#side_layer").animate(
              {
                height: "-=" + (hiddenMarginH + 10) + "px",
                top: "+=" + hiddenMarginH + "px"
              },
              defSlideTime
            );
            $("#graph_menu_arrow").attr("src", homeurl + icon_closed);
          } else {
            $("#side_layer").animate(
              {
                height: "+=" + (hiddenMarginH - 10) + "px",
                top: "-=" + hiddenMarginH + "px"
              },
              defSlideTime
            );
            $("#graph_menu_arrow").attr("src", homeurl + icon_open);
          }
          break;
      }

      if (sideClosed == 0) {
        //$('#side_top_text').hide();
        //$('#side_body_text').hide();
        //$('#side_bottom_text').hide();
        sideClosed = 1;
      } else {
        $("#side_top_text").show();
        $("#side_body_text").show();
        $("#side_bottom_text").show();
        sideClosed = 0;
      }
    });
  });

  switch (position) {
    case "right":
    case "bottom":
      // Move the right menu if window is resized
      $(window).resize(function() {
        var newWindowWidth = $(window).width();
        var widthVariation = newWindowWidth - windowWidth;
        $("#side_layer").animate({ left: "+=" + widthVariation + "px" }, 0);

        windowWidth = newWindowWidth;
      });
      break;
  }
}

// Function that recover a previously stored value from php code
function get_php_value(value) {
  return $.parseJSON($("#php_to_js_value_" + value).html());
}

function paint_qrcode(text, where, width, height) {
  if (typeof text == "undefined") {
    text = window.location.href;
  } else {
    //null value
    if (isEmptyObject(text)) {
      text = window.location.href;
    }
  }

  if (typeof where == "undefined") {
    where = $("#qrcode_container_image").get(0);
  } else if (typeof where == "string") {
    where = $(where).get(0);
  }

  if (typeof where == "undefined") {
    where = $("#qrcode_container_image").get(0);
  } else if (typeof where == "string") {
    where = $(where).get(0);
  }

  if (typeof width == "undefined") {
    width = 256;
  } else {
    if (typeof width == "object")
      if (isEmptyObject(width)) {
        //null value
        width = 256;
      }
  }

  if (typeof height == "undefined") {
    height = 256;
  } else {
    if (typeof height == "object")
      if (isEmptyObject(height)) {
        //null value
        height = 256;
      }
  }

  $(where).empty();

  var qrcode = new QRCode(where, {
    text: text,
    width: width,
    height: height,
    colorDark: "#3B6941",
    colorLight: "#ffffff",
    correctLevel: QRCode.CorrectLevel.M
  });
}

function show_dialog_qrcode(dialog, text, where, width, height) {
  if (typeof dialog == "undefined") {
    dialog = "#qrcode_container";
  } else {
    if (typeof dialog == "object")
      if (isEmptyObject(dialog)) {
        //null value
        dialog = "#qrcode_container";
      }
  }

  if (typeof where == "undefined") {
    where = $("#qrcode_container_image").get(0);
  } else if (typeof where == "string") {
    where = $(where).get(0);
  }

  if (typeof width == "undefined") {
    width = 256;
  } else {
    if (typeof width == "object")
      if (isEmptyObject(width)) {
        //null value
        width = 256;
      }
  }

  if (typeof height == "undefined") {
    height = 256;
  } else {
    if (typeof height == "object")
      if (isEmptyObject(height)) {
        //null value
        height = 256;
      }
  }

  paint_qrcode(text, where, 256, 256);

  $(dialog)
    .dialog({ autoOpen: false, modal: true })
    .dialog("open");
}

function openURLTagWindow(url) {
  window.open(
    url,
    "",
    "width=300, height=300, toolbar=no, location=no, directories=no, status=no, menubar=no"
  );
}

function removeTinyMCE(elementID) {
  if (elementID.length > 0 && !isEmptyObject(tinyMCE))
    tinyMCE.EditorManager.execCommand("mceRemoveControl", true, elementID);
}

function addTinyMCE(elementID) {
  if (elementID.length > 0 && !isEmptyObject(tinyMCE))
    tinyMCE.EditorManager.execCommand("mceAddControl", true, elementID);
}

function toggle_full_value(id) {
  $("#hidden_value_module_" + id).dialog({
    resizable: true,
    draggable: true,
    modal: true,
    height: 200,
    width: 400,
    overlay: {
      opacity: 0.5,
      background: "black"
    }
  });
}

function autoclick_profile_users(actual_level, firts_level, second_level) {
  if ($("#checkbox-" + actual_level).is(":checked")) {
    if (typeof firts_level !== "undefined") {
      var is_checked_firts = $("#checkbox-" + firts_level).is(":checked");
      if (!is_checked_firts) {
        $("#checkbox-" + firts_level).prop("checked", true);
      }
      if (second_level !== false) {
        if (!$("#checkbox-" + second_level).is(":checked")) {
          $("#checkbox-" + second_level).prop("checked", true);
        }
      }
    }
  }
}
/**
 * Auto hides an element and shows it
 * when the user moves the mouse over the body.
 *
 * @param element [Element object] Element object to hide.
 * @param hideTime [integer] ms of the hide timeout.
 *
 * @retval void
 */
var autoHideElement = function(element, hideTime) {
  hideTime = hideTime || 3000;
  var timerRef;
  var isHoverElement = false;

  var showElement = function() {
    $(element).show();
  };
  var hideElement = function() {
    $(element).fadeOut();
  };
  var startHideTimeout = function(msec) {
    showElement();
    timerRef = setTimeout(hideElement, msec);
  };
  var cancelHideTimeout = function() {
    clearTimeout(timerRef);
    timerRef = null;
  };

  var handleBodyMove = function(event) {
    if (isHoverElement) return;
    if (timerRef) cancelHideTimeout();
    startHideTimeout(hideTime);
  };
  var handleElementEnter = function(event) {
    isHoverElement = true;
    cancelHideTimeout();
  };
  var handleElementLeave = function(event) {
    isHoverElement = false;
    startHideTimeout(hideTime);
  };

  // Bind event handlers
  $(element)
    .mouseenter(handleElementEnter)
    .mouseleave(handleElementLeave);
  $("body").mousemove(handleBodyMove);

  // Start hide
  startHideTimeout(hideTime);
};

function htmlEncode(value) {
  // Create a in-memory div, set its inner text (which jQuery automatically encodes)
  // Then grab the encoded contents back out. The div never exists on the page.
  return $("<div/>")
    .text(value)
    .html();
}

function htmlDecode(value) {
  return $("<div/>")
    .html(value)
    .text();
}

function pagination_show_more(params, message) {
  //value input hidden for save limit
  var value_offset = $("#hidden-offset").val();
  //For each execution offset + limit
  var offset = parseInt(value_offset) + params["limit"];
  //save new value innput hidden
  $("#hidden-offset").val(offset);
  //add array value offset
  params["offset"] = offset;

  $.ajax({
    type: "POST",
    url: "ajax.php",
    data: params,
    success: function(data) {
      if (data == "") {
        $("#container_error").empty();
        $("#container_error").append("<h4>" + message + "</h4>");
      } else {
        $("#container_pag").append(data);
      }
    },
    datatype: "html"
  });
}

/*
 *function use d3.js for paint graph
 */
function paint_graph_status(
  min_w,
  max_w,
  min_c,
  max_c,
  inverse_w,
  inverse_c,
  error_w,
  error_c,
  legend_normal,
  legend_warning,
  legend_critical,
  message_error_warning,
  message_error_critical
) {
  //Check if they are numbers
  if (isNaN(min_w)) {
    min_w = 0;
  }
  if (isNaN(max_w)) {
    max_w = 0;
  }
  if (isNaN(min_c)) {
    min_c = 0;
  }
  if (isNaN(max_c)) {
    max_c = 0;
  }

  //if haven't errors
  if (error_w == 0 && error_c == 0) {
    //parse element
    min_w = parseFloat(min_w);
    min_c = parseFloat(min_c);
    max_w = parseFloat(max_w);
    max_c = parseFloat(max_c);

    //inicialize var
    var range_min = 0;
    var range_max = 0;
    var range_max_min = 0;
    var range_max_min = 0;

    //Find the lowest possible value
    if (min_w < 0 || min_c < 0) {
      if (min_w < min_c) {
        range_min = min_w - 100;
      } else {
        range_min = min_c - 100;
      }
    } else if (min_w > 0 || min_c > 0) {
      if (min_w > min_c) {
        range_max_min = min_w;
      } else {
        range_max_min = min_c;
      }
    } else {
      if (min_w < min_c) {
        range_min = min_w - 100;
      } else {
        range_min = min_c - 100;
      }
    }

    //Find the maximum possible value
    if (max_w > max_c) {
      range_max = max_w + 100 + range_max_min;
    } else {
      range_max = max_c + 100 + range_max_min;
    }

    //Controls whether the maximum = 0 is infinite
    if ((max_w == 0 || max_w == 0.0) && min_w != 0) {
      max_w = range_max;
    }
    if ((max_c == 0 || max_c == 0.0) && min_c != 0) {
      max_c = range_max;
    }

    //Scale according to the position
    position = 200 / (range_max - range_min);

    //axes
    var yScale = d3.scale
      .linear()
      .domain([range_min, range_max])
      .range([100, -100]);

    var yAxis = d3.svg
      .axis()
      .scale(yScale)
      .orient("left");

    //create svg
    var svg = d3.select("#svg_dinamic");
    //delete elements
    svg.selectAll("g").remove();

    width_x = 101;
    height_x = 50;

    svg
      .append("g")
      .attr("transform", "translate(100, 150)")
      .call(yAxis);

    //legend Normal text
    svg
      .append("g")
      .attr("width", 300)
      .attr("height", 300)
      .append("text")
      .attr("x", width_x)
      .attr("y", height_x - 20)
      .attr("fill", "black")
      .style("font-family", "arial")
      .style("font-weight", "bold")
      .style("font-size", "8pt")
      .html(legend_normal)
      .style("text-anchor", "first")
      .attr("width", 300)
      .attr("height", 300);

    //legend Normal rect
    svg
      .append("g")
      .append("rect")
      .attr("id", "legend_normal")
      .attr("x", width_x + 80)
      .attr("y", height_x - 30)
      .attr("width", 10)
      .attr("height", 10)
      .style("fill", "#82B92E");

    //legend Warning text
    svg
      .append("g")
      .append("text")
      .attr("x", width_x + 100)
      .attr("y", height_x - 20)
      .attr("fill", "black")
      .style("font-family", "arial")
      .style("font-weight", "bold")
      .style("font-size", "8pt")
      .html(legend_warning)
      .style("text-anchor", "first");

    //legend Warning rect
    svg
      .append("g")
      .append("rect")
      .attr("id", "legend_warning")
      .attr("x", width_x + 185)
      .attr("y", height_x - 30)
      .attr("width", 10)
      .attr("height", 10)
      .style("fill", "#ffd731");

    //legend Critical text
    svg
      .append("g")
      .append("text")
      .attr("x", width_x + 205)
      .attr("y", height_x - 20)
      .attr("fill", "black")
      .style("font-family", "arial")
      .style("font-weight", "bold")
      .style("font-size", "8pt")
      .html(legend_critical)
      .style("text-anchor", "first");

    //legend critical rect
    svg
      .append("g")
      .append("rect")
      .attr("id", "legend_critical")
      .attr("x", width_x + 285)
      .attr("y", height_x - 30)
      .attr("width", 10)
      .attr("height", 10)
      .style("fill", "#fc4444");

    //styles for number and axes
    svg
      .selectAll("g .domain")
      .style("stroke-width", 2)
      .style("fill", "none")
      .style("stroke", "black");

    svg
      .selectAll("g .tick text")
      .style("font-size", "9pt")
      .style("font-weight", "initial");

    //estatus normal
    svg
      .append("g")
      .append("rect")
      .attr("id", "status_rect")
      .attr("x", width_x)
      .attr("y", height_x)
      .attr("width", 300)
      .attr("height", 200)
      .style("fill", "#82B92E");

    //controls the inverse warning
    if (inverse_w == 0) {
      svg
        .append("g")
        .append("rect")
        .transition()
        .duration(600)
        .attr("id", "warning_rect")
        .attr("x", width_x)
        .attr(
          "y",
          height_x + (range_max - min_w) * position - (max_w - min_w) * position
        )
        .attr("width", 300)
        .attr("height", (max_w - min_w) * position)
        .style("fill", "#ffd731");
    } else {
      svg
        .append("g")
        .append("rect")
        .transition()
        .duration(600)
        .attr("id", "warning_rect")
        .attr("x", width_x)
        .attr("y", height_x + 200 - (min_w - range_min) * position)
        .attr("width", 300)
        .attr("height", (min_w - range_min) * position)
        .style("fill", "#ffd731");

      svg
        .append("g")
        .append("rect")
        .transition()
        .duration(600)
        .attr("id", "warning_inverse_rect")
        .attr("x", width_x)
        .attr("y", height_x)
        .attr("width", 300)
        .attr(
          "height",
          (range_max - min_w) * position - (max_w - min_w) * position
        )
        .style("fill", "#ffd731");
    }
    //controls the inverse critical
    if (inverse_c == 0) {
      svg
        .append("g")
        .append("rect")
        .transition()
        .duration(600)
        .attr("id", "critical_rect")
        .attr("x", width_x)
        .attr(
          "y",
          height_x + (range_max - min_c) * position - (max_c - min_c) * position
        )
        .attr("width", 300)
        .attr("height", (max_c - min_c) * position)
        .style("fill", "#fc4444");
    } else {
      svg
        .append("g")
        .append("rect")
        .transition()
        .duration(600)
        .attr("id", "critical_rect")
        .attr("x", width_x)
        .attr("y", height_x + 200 - (min_c - range_min) * position)
        .attr("width", 300)
        .attr("height", (min_c - range_min) * position)
        .style("fill", "#fc4444");
      svg
        .append("g")
        .append("rect")
        .transition()
        .duration(600)
        .attr("id", "critical_inverse_rect")
        .attr("x", width_x)
        .attr("y", height_x)
        .attr("width", 300)
        .attr(
          "height",
          (range_max - min_c) * position - (max_c - min_c) * position
        )
        .style("fill", "#fc4444");
    }
  } else {
    d3.select("#svg_dinamic rect").remove();
    //create svg
    var svg = d3.select("#svg_dinamic");
    svg.selectAll("g").remove();

    width_x = 10;
    height_x = 50;

    //message error warning
    if (error_w == 1) {
      $("#text-max_warning").addClass("input_error");
      svg
        .append("g")
        .append("text")
        .attr("x", width_x)
        .attr("y", height_x)
        .attr("fill", "black")
        .style("font-family", "arial")
        .style("font-weight", "bold")
        .style("font-size", 14)
        .style("fill", "red")
        .html(message_error_warning)
        .style("text-anchor", "first");
    }
    //message error critical
    if (error_c == 1) {
      $("#text-max_critical").addClass("input_error");
      svg
        .append("g")
        .append("text")
        .attr("x", width_x)
        .attr("y", height_x)
        .attr("fill", "black")
        .style("font-family", "arial")
        .style("font-weight", "bold")
        .style("font-size", 14)
        .style("fill", "red")
        .html(message_error_critical)
        .style("text-anchor", "first");
    }
  }
}

function round_with_decimals(value, multiplier) {
  // Default values
  if (typeof multiplier === "undefined") multiplier = 1;

  // Return non numeric types without modification
  if (typeof value !== "number") return value;

  if (value * multiplier == 0) return 0;
  if (Math.abs(value) * multiplier >= 1) {
    return Math.round(value * multiplier) / multiplier;
  }
  return round_with_decimals(value, multiplier * 10);
}

/**
 * Display a confirm dialog box
 *
 * @param string Text to display
 * @param string Ok button text
 * @param string Cancel button text
 * @param function Callback to action when ok button is pressed
 */
function display_confirm_dialog(message, ok_text, cancel_text, ok_function) {
  // Clean function to close the dialog
  var clean_function = function() {
    $("#pandora_confirm_dialog_text").hide();
    $("#pandora_confirm_dialog_text").remove();
  };

  // Modify the ok function to close the dialog too
  var ok_function_clean = function() {
    ok_function();
    clean_function();
  };

  var buttons_obj = {};
  buttons_obj[cancel_text] = clean_function;
  buttons_obj[ok_text] = ok_function_clean;

  // Display the dialog
  $("body").append(
    '<div id="pandora_confirm_dialog_text"><h3>' + message + "</h3></div>"
  );
  $("#pandora_confirm_dialog_text").dialog({
    resizable: false,
    draggable: true,
    modal: true,
    dialogClass: "pandora_confirm_dialog",
    overlay: {
      opacity: 0.5,
      background: "black"
    },
    closeOnEscape: true,
    modal: true,
    buttons: buttons_obj
  });
}

function ellipsize(str, max, ellipse) {
  if (max == null) max = 140;
  if (ellipse == null) ellipse = "…";

  return str.trim().length > max ? str.substr(0, max).trim() + ellipse : str;
}

/**
 * Display a dialog with an image
 *
 * @param {string} icon_name The name of the icon you will display
 * @param {string} icon_path The path to the icon
 * @param {Object} incoming_options All options
 * 		grayed: {bool} True to display the background black
 * 		title {string} 'Logo preview' by default
 */
function logo_preview(icon_name, icon_path, incoming_options) {
  // Get the options
  options = {
    grayed: false,
    title: "Logo preview"
  };
  $.extend(options, incoming_options);

  if (icon_name == "") return;

  $dialog = $("<div></div>");
  $image = $('<img src="' + icon_path + '">');
  $image.css("max-width", "500px").css("max-height", "500px");

  try {
    $dialog
      .hide()
      .html($image)
      .dialog({
        title: options.title,
        resizable: true,
        draggable: true,
        modal: true,
        dialogClass: options.grayed ? "dialog-grayed" : "",
        overlay: {
          opacity: 0.5,
          background: "black"
        },
        minHeight: 1,
        width: $image.width,
        close: function() {
          $dialog.empty().remove();
        }
      })
      .show();
  } catch (err) {
    // console.log(err);
  }
}