The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/**
 * LemonLDAP::NG Portal jQuery scripts
 */

/* Used variables
 * - displaytab
 * - choicetab
 * - login
 * - newwindow
 * - antiframe
 */

/* Set newwindow value (default is false) */
if (newwindow.match('1')) {
  newwindow = true;
} else {
  newwindow = false;
}

/* Set antiframe value (default is true) */
if (antiframe.match('0')) {
  antiframe = false;
} else {
  antiframe = true;
}

/* Set activeTimer value (default is true) */
if (activeTimer.match('0')) {
  activeTimer = false;
} else {
  activeTimer = true;
}

/* jQuery */
$(document).ready(function() {

  /* AntiFrame script */
  if (antiframe && top != self) {
    top.location.href = location.href;
  }

  /* Sortable menu */
  $("#appslist").sortable({
    axis: "y",
    cursor: "move",
    opacity: 0.5,
    revert: true,
    items: "> div.category",
    update: function() {
      getOrder();
    }
  });

  restoreOrder();

  /* Display message */
  $("div.message").fadeIn('slow');

  /* Set timezone */
  $("input[name=timezone]").val(-(new Date().getTimezoneOffset() / 60));

  /* Menu tabs */
  var menuTabs = $("#menu").tabs({
    active: 0
  });
  var menuIndex = $('#menu a[href="#' + displaytab + '"]').parent().index();
  if (menuIndex < 0) {
    menuIndex = 0;
  }
  menuTabs.tabs("option", "active", menuIndex);

  /* Authentication choice tabs */
  var authMenuTabs = $("#authMenu").tabs({
    active: 0
  });
  // TODO: cookie
  //$("#authMenu").tabs({cookie: {name: 'lemonldapauthchoice'}});
  if (choicetab) {
    var authMenuIndex = $('#authMenu a[href="#' + choicetab + '"]').parent().index();
    authMenuTabs.tabs("option", "active", authMenuIndex);
  }

  /* Focus on first visible input */
  $("input[type!=hidden]:first").focus();
  if (login) {
    $("input[type=password]:first").focus();
  }

  /* Open links in new windows */
  if (newwindow) {
    $('#appslist a').attr("target", "_blank");
  }

  /* Complete removeOther link */
  if ($("p.removeOther").length) {
    var action = $("form.login").attr("action");
    var method = $("form.login").attr("method");

    var back_url = "";
    if (action.indexOf("?") != -1) {
      back_url = action.substring(0, action.indexOf("?")) + "?";
    } else {
      back_url = action + "?";
    }

    $("form.login input[type=hidden]").each(function(index) {
      back_url = back_url + "&" + $(this).attr("name") + "=" + $(this).val();
    });

    var link = $("p.removeOther a").attr("href");

    link = link + "&method=" + method + "&url=" + $.base64Encode(back_url);

    $("p.removeOther a").attr("href", link);

  }
});

/* Code from http://snipplr.com/view/29434/ */
// set the list selector
var setSelector = "#appslist";
// function that writes the list order to session
function getOrder() {
  // save custom order to persistent session
  $.ajax({
    type: "POST",
    url: scriptname,
    data: {
      storeAppsListOrder: $(setSelector).sortable("toArray").join()
    },
    dataType: 'json'
  });
}

// function that restores the list order from session
function restoreOrder() {
  var list = $(setSelector);
  if (list == null) return;

  // fetch the session value (saved order)
  if (!appslistorder) return;

  // make array from saved order
  var IDs = appslistorder.split(",");

  // fetch current order
  var items = list.sortable("toArray");

  // make array from current order
  var rebuild = new Array();
  for (var v = 0, len = items.length; v < len; v++) {
    rebuild[items[v]] = items[v];
  }

  for (var i = 0, n = IDs.length; i < n; i++) {

    // item id from saved order
    var itemID = IDs[i];

    if (itemID in rebuild) {

      // select item id from current order
      var item = rebuild[itemID];

      // select the item according to current order
      var child = $(setSelector + ".ui-sortable").children("#" + item);

      // select the item according to the saved order
      var savedOrd = $(setSelector + ".ui-sortable").children("#" + itemID);

      // remove all the items
      child.remove();

      // add the items in turn according to saved order
      // we need to filter here since the "ui-sortable"
      // class is applied to all ul elements and we
      // only want the very first! You can modify this
      // to support multiple lists - not tested!
      $(setSelector + ".ui-sortable").filter(":first").append(savedOrd);
    }
  }
}

/* function boolean isHiddenFormValueSet(string option)
 * Check if an hidden option is set
 * @param option Option name
 * @return true if option is set, false else
 */
function isHiddenFormValueSet(option) {
  if ($('#lmhidden_' + option).length) {
    return true;
  } else {
    return false;
  }
}

/* function void ping()
 * Check if session is alive on server side
 * @return nothing
 */
function ping() {
  $.ajax({
    type: "POST",
    url: scriptname,
    data: {
      ping: 1
    },
    dataType: 'json',
    success: function(data) {
      if (!data.auth) {
        location.reload(true);
      }
      else {
        setTimeout('ping();', pingInterval);
      }
    }
  });
}