view admajax.js.php @ 1096:bbc0a3d0b51e

Major renaming / refactor of site messages. Some that were previously modifiable from admin interface are now "hardcoded" in the configuration file. Having these settings made modifiable from there made no sense and just took space in the UI.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 27 Jan 2017 22:15:06 +0200
parents 95b74632cfe2
children 0a2117349f46
line wrap: on
line source

<?php
//
// FAPWeb - Simple Web-based Demoparty Management System
// Party administration page AJAX javascript module
// (C) Copyright 2012-2017 Tecnic Software productions (TNSP)
//
$sessionType = "admin";
header("Content-Type: application/javascript");
require_once "mconfig.inc.php";
require_once "msite.inc.php";
require_once "msession.inc.php";


// Initiate SQL database connection
if (!stConnectSQLDB())
  exit;

// Fetch non-"hardcoded" settings from SQL database
stReloadSettings();

// Check if sessions are enabled
if (!stChkSetting("admPassword") || !stAdmSessionAuth(FALSE))
  exit;


// Output JavaScript settings
echo
  "\n".
  "var jsSettingsArgs = [];\n";

foreach (stExecSQL("SELECT * FROM settings_groups") as $group)
{
  $args = array();
  if (($res = stExecSQL("SELECT * FROM settings WHERE vgroup=".$group["id"])) !== false)
  {
    foreach ($res as $item)
    {
      switch ($item["vtype"])
      {
        case VT_STR:
        case VT_TEXT: $type = 1; break;
        case VT_INT:  $type = 2; break;
        case VT_BOOL: $type = 3; break;
      }
      $args[] = "\"".$item["key"]."\":".$type;
    }
  }

  echo "jsSettingsArgs[".$group["id"]."] = {".implode(",", $args)."};\n";
}

echo
  "\n".
  "function jsUpdateSettings(id)\n".
  "{\n".
  "  if (id in jsSettingsArgs)\n".
  "    jsSendPOSTRequest(\"action=update&type=settings&id=\"+id+\"&\"+jsMakePostArgs(jsSettingsArgs[id], \"st\", \"\"));\n".
  "  return false;\n".
  "}\n".
  "\n";

stCommonAJAX("admajax.php", "admlogout.php");
?>

var activeAttendee = -1, prevAttendee = -1, activeAttendeeTmp = "";
var activeEntry = -1, prevEntry = -1, activeEntryTmp = "";

var registeredTabs = Object();
var activeTabs = Object();


//
// Tab related code
//
function jsUpdateTabList(tabset, extra)
{
  var tabs = "";
  var content = "";

  // Update the tab header list for this tabset
  for (var id in registeredTabs[tabset])
  {
    var thead = registeredTabs[tabset][id];
    var qid = "tabHead" + tabset + id;

    tabs += "<a id=\""+ qid + "\" href=\"#\">"+ thead +"</a> ";
    content += "<div id=\"tabCont"+ tabset + id +"\"></div>";
  }

  // Update the DOM elements
  var item = document.getElementById("tabHeaders"+ tabset);
  if (item) item.innerHTML = tabs + extra;

  item = document.getElementById("tabContents"+ tabset);
  if (item) item.innerHTML = content;

  for (var id in registeredTabs[tabset])
  {
    var velem = document.getElementById("tabHead" + tabset + id);
    velem.vid = id;
    velem.vtabset = tabset;
    velem.addEventListener('click', function (ev) { jsSwitchActiveTab(ev.target.vtabset, ev.target.vid); });
  }
}


function jsRegisterTab(tabset, id, name)
{
  // Create tabset object "array" if it does not exist
  if (!registeredTabs[tabset])
    registeredTabs[tabset] = Object();

  // Register tab
  registeredTabs[tabset][id] = name;
}


function jsSwitchActiveTab(tabset, tab)
{
  // Go through all registered tabs to update their state
  for (var id in registeredTabs[tabset])
  {
    var tabContent = document.getElementById("tabCont"+ tabset + id);
    var tabHead = document.getElementById("tabHead"+ tabset + id);
    if (tabContent && tabHead)
    {
      tabContent.style.display = (tab == id) ? "block" : "none";
      tabHead.className = (tab == id) ? "active" : "inactive";
      if (tab == id)
      {
        // Set active tab and refresh contents
        activeTabs[tabset] = id;
        setTimeout(function(qtabset, qid) {
          switch (qtabset)
          {
            case "CM": refreshDispatchCM(qid); break;
            case "CC": refreshDispatchCC(qid); break;
            case "CS": refreshDispatchCS(qid); break;
            default: jsMessageBox("Invalid tabset value: '"+ qtabset +"'.");
          }
        }, 10, tabset, id);
        jsCancelUploadCBS();
      }
      else
      {
        // Clear inactive tabs
        tabContent.innerHTML = "";
      }
    }
  }
}


//
// Admin interface specific popups
//
function jsHandleAdminPopupKeys(ev)
{
  ev = ev || window.event;
  var key = ev.keyCode ? ev.keyCode : ev.which;
  if (key == 27)
  {
    jsCloseAdminPopup();
    return false;
  }
  else
    return true;
}


function jsCloseAdminPopup()
{
  var nitem = document.getElementById("adminPopup");
  if (nitem)
  {
    document.onkeydown = null;

    nitem.innerHTML = "";
    nitem.style.display = "none";
  }
}


function jsOpenAdminPopup(txt)
{
  var nitem = document.getElementById("adminPopup");
  if (nitem)
  {
    document.onkeydown = jsHandleAdminPopupKeys;

    nitem.innerHTML = txt;
    nitem.style.display = "block";
  }
}


//
// Generic element refresh
//
function jsRefreshItems(id,name,extra)
{
  var msuccess = function(txt)
  {
    var nitem = document.getElementById(id);
    if (nitem) nitem.innerHTML = txt;
  }

  jsSendPOSTRequest("action=get&type="+name+extra, msuccess);
}


function jsDeleteItem(id,prefix,type,func,dsc,dsc2)
{
  var msuccess = function(txt)
  {
    var item = document.getElementById(prefix+id);
    item.style.display = "none";
    setTimeout(func, 50);
  }

  // Clearly mark the element when asking confirmation
  var item = document.getElementById(prefix+id);
  var tmp = item.className;
  item.className += " deleteWarning";

  // Ask confirmation for deletion
  var mcb_ok = function (data)
  {
    jsSendPOSTRequest("action=delete&type="+type+"&id="+id, msuccess);
    item.className = tmp;
  }
  
  var mcb_cancel = function (data)
  {
    item.className = tmp;
  }
  
  if (dsc)
    jsConfirmBox("Are you sure you want to delete "+dsc+" #"+id+"?", mcb_ok, mcb_cancel, 0);
  else
    jsConfirmBox(dsc2, mcb_ok, mcb_cancel, 0);
}


function jsRefreshPanels(id, tab, args, set_default)
{
  var msuccess = function(txt)
  {
    var nitem = document.getElementById(tab);
    if (nitem)
    {
      if (nitem.innerHTML == "")
      {
        nitem.innerHTML =
          "<div id=\"tabHeaders"+id+"\" class=\"tabHeadersSub\"></div>" +
          "<div id=\"tabContents"+id+"\" class=\"tabContentsSub\"></div>";
      }

      try {
        var tmp = JSON.parse("{"+ txt +"}");
        registeredTabs[id] = tmp;
        jsUpdateTabList(id, "");
        if (activeTabs[id])
          jsSwitchActiveTab(id, activeTabs[id]);
        else
        if (set_default == "*")
        {
          for (var nid in registeredTabs[id])
          {
            jsSwitchActiveTab(id, nid);
            break;
          }
        }
        else
        if (set_default != "")
          jsSwitchActiveTab(id, set_default);
      }
      catch (err) {
        jsErrorMessageBox("JSON.parse("+ txt +") failure: "+ err);
      }
    }
  }

  jsSendPOSTRequest("action=get&type="+args, msuccess);
}


function refreshDispatchCC(id)
{
  switch (id)
  {
    case "News"      : jsRefreshItems("tabContCCNews", "news", ""); break;
    case "Attendees" : jsRefreshItems("tabContCCAttendees", "attendees", ""); activeAttendee = -1; break;
    case "Voting"    : jsRefreshItems("tabContCCVoting", "voters", ""); break;
    case "Compos"    : jsRefreshItems("tabContCCCompos", "compos", ""); break;
    case "InfoSys"   : jsRefreshItems("tabContCCInfoSys", "infoMain", ""); break;
    case "Settings"  : jsRefreshPanels("CS", "tabContCCSettings", "settingslist", "*"); break;
    case "Entries"   : jsRefreshPanels("CM", "tabContCCEntries", "compolist", ""); break;
    default          : alert("Invalid id: '"+ id +"'.'");
  }
}


function refreshDispatchCS(id)
{
  jsRefreshItems("tabContCS"+ id, "settings", "&id="+ id);
}


function refreshDispatchCM(id)
{
  prevEntry = activeEntry = -1;
  jsRefreshItems("tabContCM"+ id, "entries", "&id="+ id);
}


//
// Site news management
//
function addNews()
{
  var args = jsMakePostArgs({"title":1,"text":1,"author":1}, "nn", "");

  var msuccess = function(txt)
  {
    setTimeout(function () { refreshDispatchCC("News"); }, 50);
  }

  if (args != "")
    jsSendPOSTRequest("action=add&type=news&"+args, msuccess);

  return false;
}


function deleteNews(id)
{
  jsDeleteItem(id, "news", "news", function() { refreshDispatchCC("News"); }, "news item");
}


function updateNews(id)
{
  var args = jsMakePostArgs({"title":1,"text":1,"author":1}, "ne", id);

  var msuccess = function(txt)
  {
    jsRefreshItems("news"+id, "newsitem", "&id="+id);
  }

  if (args != "")
    jsSendPOSTRequest("action=update&type=news&id="+id+"&"+args, msuccess);
}


//
// Visitor/attendee management
//
function addAttendee()
{
  var args = jsMakePostArgs({"name":1,"groups":1,"oneliner":1,"email":1}, "ne", "x");

  var msuccess = function(txt)
  {
    setTimeout(function() { refreshDispatchCC("Attendees"); }, 50);
  }

  if (args != "")
    jsSendPOSTRequest("action=add&type=attendees&"+args, msuccess);

  return false;
}


function deleteAttendee(id)
{
  jsDeleteItem(id, "attendee", "attendees", function () { refreshDispatchCC("Attendees"); }, "attendee");
}


function updateAttendee(id)
{
  var args = jsMakePostArgs({"name":1,"groups":1,"oneliner":1,"email":1,"reghost":1}, "at", id);

  var msuccess = function(txt)
  {
    activateAttendee(-1);
  }

  if (args != "")
    jsSendPOSTRequest("action=update&type=attendees&id="+id+"&"+args, msuccess);
}


function activateAttendee(id)
{
  var msuccess1 = function(txt)
  {
    var nitem = document.getElementById("attendee"+prevAttendee);
    if (nitem)
    {
      nitem.innerHTML = txt;
      nitem.className = activeAttendeeTmp;
    }
  }

  var msuccess2 = function(txt)
  {
    var nitem = document.getElementById("attendee"+activeAttendee);
    if (nitem)
    {
      nitem.innerHTML = txt;
      activeAttendeeTmp = nitem.className;
      nitem.className += " active";
      activeAttendee = id;
    }
  }

  if (activeAttendee != id)
  {
    prevAttendee = activeAttendee;
    activeAttendee = id;

    if (prevAttendee != -1)
      jsSendPOSTRequest("action=get&type=attendee&id="+prevAttendee+"&edit=0", msuccess1);

    if (activeAttendee != -1)
      jsSendPOSTRequest("action=get&type=attendee&id="+activeAttendee+"&edit=1", msuccess2);
  }
}


//
// Compo management
//
function addCompo()
{
  var args = jsMakePostArgs({"name":1, "description":1}, "nc", "");

  var msuccess = function(txt)
  {
    setTimeout(function () { refreshDispatchCC("Compos"); }, 50);
  }

  if (args != "")
    jsSendPOSTRequest("action=add&type=compo&"+args, msuccess);
  return false;
}


function updateCompoType(id)
{
  var msuccess = function(txt)
  {
    jsRefreshItems("compo"+id, "compo", "&id="+id);
  }

  jsSendPOSTRequest("action=update&type=compotype&id="+id+"&ctype="+jsGetValue("cotype"+id+"Sel", 4), msuccess);
}


function updateCompoVoting(id)
{
  var msuccess = function(txt)
  {
    jsRefreshItems("covoting"+id, "compovoting", "&id="+id);
  }

  jsSendPOSTRequest("action=update&type=compovoting&id="+id+"&voting="+jsGetValue("covotingbutton"+id, 3), msuccess);
}


function updateCompo(id)
{
  var args = jsMakePostArgs({"name":1, "description":1, "notes":1, "visible":3, "voting":3, "show_authors":3, "cpath":1, "preview_type":4}, "co", id, true);

  var msuccess = function(txt)
  {
    jsRefreshItems("compo"+id, "compo", "&id="+id);
  }

  if (args != "")
    jsSendPOSTRequest("action=update&type=compo&id="+id+"&"+args, msuccess);
}


function deleteCompo(id)
{
  jsDeleteItem(id, "compo", "compo", function () { refreshDispatchCC("Compos"); }, 0, 
    "Are you ABSOLUTELY sure you want to delete compo #"+id+"? "+
    "This will delete all votes AND entries related to it!");
}


//
// Entry management
//
function refreshEntryCompos()
{
  setTimeout(function () { refreshDispatchCC("Entries"); }, 50);
}


function activateEntry(id, force)
{
  var msuccess1 = function(txt)
  {
    var nitem = document.getElementById("entry"+prevEntry);
    if (nitem)
    {
      nitem.innerHTML = txt;
      nitem.className = activeEntryTmp;
    }
  }

  var msuccess2 = function(txt)
  {
    var nitem = document.getElementById("entry"+activeEntry);
    if (nitem)
    {
      nitem.innerHTML = txt;
      activeEntryTmp = nitem.className;
      nitem.className += " active";
      activeEntry = id;
    }
  }

  if (activeEntry != id || force)
  {
    jsCancelUploadCBS();

    prevEntry = activeEntry;
    activeEntry = id;

    if (prevEntry != -1)
      jsSendPOSTRequest("action=get&type=entry&id="+prevEntry+"&edit=0", msuccess1);

    if (activeEntry != -1)
      jsSendPOSTRequest("action=get&type=entry&id="+activeEntry+"&edit=1", msuccess2);
  }
}


function addEntry(id)
{
  var args = jsMakePostArgs({"name":1, "author":1, "filename":1, "info":1, "notes":1, "evalue":2}, "ne", id, true);

  jsCancelUploadCBS();

  var msuccess = function(txt)
  {
    setTimeout(function (qid) { refreshDispatchCM(qid); }, 50, id);
    refreshEntryCompos();
  }

  if (args != "")
    jsSendPOSTRequest("action=add&type=entry&compo_id="+id+"&"+args, msuccess);

  return false;
}


function updateEntry(cid, id, edit)
{
  var args = jsMakePostArgs({"name":1, "author":1, "filename":1, "info":1, "notes":1, "compo_id":4, "evalue":2, "preview_type":4}, "en", id, true);
  var has_id = "compo_id" in lastPostArgs;
  var compo_id = lastPostArgs["compo_id"];

  jsCancelUploadCBS();

  if (!("compo_id" in lastPostArgs))
  {
    args += "&compo_id=" + cid;
    compo_id = cid;
  }

  var msuccess = function(txt)
  {
    if (cid != compo_id)
    {
      var nitem = document.getElementById("entry"+ id);
      if (nitem)
        nitem.style.display = "none";
    }
    else
      activateEntry(edit ? id : -1, true);
    refreshEntryCompos();
  }

  var mcb_ok = function(data)
  {
    jsSendPOSTRequest("action=update&type=entry&id="+id+"&edit="+edit+"&"+args, msuccess);
    refreshEntryCompos();
  }

  var mcb_cancel = function(data)
  {
    activeEntry = -1;
  }

  if (args != "")
  {
    if (cid != compo_id)
    {
      jsConfirmBox("Are you sure you want to change entry #"+id+
        "'s compo from "+cid+" to "+compo_id+"?", mcb_ok, mcb_cancel);
    }
    else
      mcb_ok();
  }
}


function deleteEntry(cid, id)
{
  jsCancelUploadCBS();
  jsDeleteItem(id, "entry", "entries", function() { refreshDispatchCM(cid); refreshEntryCompos(); }, "entry");
}


//
// Userkey management
//
function userKeyInfoRefresh()
{
  jsRefreshItems("vkeyInfo", "userkey", "info");
}


function userKeyRefresh(id)
{
  var msuccess2 = function(txt)
  {
    var nitem = document.getElementById("vkey"+id);
    if (nitem)
      nitem.className = txt;
    userKeyInfoRefresh();
  }

  var msuccess1 = function(txt)
  {
    var nitem = document.getElementById("vkey"+id);
    if (nitem)
      nitem.innerHTML = txt;
    userKeyInfoRefresh();
  }

  jsSendPOSTRequest("action=get&type=userkey&id="+id, msuccess1);
  jsSendPOSTRequest("action=get&type=userkeyclass&id="+id, msuccess2);
}


function userKeyUpdate(id, type, args)
{
  var msuccess = function(txt)
  {
    userKeyRefresh(id);
    userKeyInfoRefresh();
  }

  jsSendPOSTRequest("action=userkey&type="+type+"&id="+id+"&"+args, msuccess);
}


function userKeySetActive(id)
{
  var args = jsMakePostArgs({"active":3}, "vk", id);

  var mcb_ok = function (data)
  {
    userKeyUpdate(id, "active", args);
  }

  var mcb_cancel = function (data)
  {
    userKeyRefresh(id);
  }
  
  if (lastPostArgs["active"] == 0)
    jsConfirmBox("Are you sure you want to deactivate vote key #"+id+"?", mcb_ok, mcb_cancel, 0);
  else
    mcb_ok(0);
}


function userKeyAssign(id, mode)
{
  var args = jsMakePostArgs({"key_id":2}, "vk", id);

  var mcb_ok = function (data)
  {
    userKeyUpdate(id, (mode ? "assign" : "clear"), args);
  }
  
  if (mode == 0)
    jsConfirmBox("Are you sure you want to clear vote key assign #"+id+"?", mcb_ok, 0, 0);
  else
    mcb_ok(0);
}


//
// Misc functions
//
function showScreenCmd(str)
{
  jsSendPOSTRequest("action=screencmd&cmd="+str);
}


function performSystemCheck()
{
  jsSendPOSTRequest("action=check", jsMessageBox);
}


function generateEntryPositions(id, patch)
{
  var msuccess = function (data)
  {
    refreshDispatchCM(id);
    refreshCurrEntryData();
    refreshCurrEntryListData();
  }

  var mcb_ok = function (data)
  {
    if (id == 0)
      jsSendPOSTRequest("action=randomize&type=all&patch="+patch, msuccess);
    else
      jsSendPOSTRequest("action=randomize&type=compo&id="+id+"&patch="+patch, msuccess);
  }
  
  if (patch == 0)
  {
    jsConfirmBox("Are you <b>ABSOLUTELY CERTAIN</b> you want to delete and regenerate entry show positions "+
      (id == 0 ? "for ALL compos" : "for this compo") +"? "+
      "<b>This will completely annihilate current show position numbers! AND FUCK UP YOUR EXPORTED FILE ORDER (ask ccr to know what that means.)</b>", mcb_ok, 0, 0);
  }
  else
    mcb_ok(0);
}


//
// Competition control
//
function setShowMode(mode)
{
  jsSendPOSTRequest("action=ctrl&type=setShowMode&mode="+mode);
}


function refreshCurrEntryData()
{
  jsRefreshItems("ctrlCurrCompoData", "infoCurrCompoData", "");
}


function refreshCurrEntryListData()
{
  jsRefreshItems("ctrlEntryList", "infoCurrEntryList", "");
  refreshCurrEntryData();
}


function activateCompo()
{
  jsSendPOSTRequest("action=ctrl&type=setCompoID&id="+jsGetValue("ctrlCompoListSel", 4), refreshCurrEntryListData);
}


function setSelectedEntry()
{
  jsSendPOSTRequest("action=ctrl&type=setEntry&index="+jsGetValue("ctrlEntryListSel", 4), refreshCurrEntryData);
}


function switchEntry(dir)
{
  jsSendPOSTRequest("action=ctrl&type="+ (dir < 0 ? "prevEntry" : "nextEntry"), refreshCurrEntryListData);
}


//
// Rotation list editing and handling
//
function refreshRotationListSel()
{
  jsRefreshItems("ctrlRotationListsSel", "infoRotationLists", "");
}


function refreshRotationListEdit(id)
{
  jsRefreshItems("ctrlRotationListEdit", "infoRotationListEdit", "&id="+id+"&full=0");
  refreshRotationListSel();
}


function refreshActiveRotationList()
{
  jsRefreshItems("ctrlActiveRotationList", "infoActiveRotationList", "");
}


function setRotateDuration()
{
  var duration = jsGetValue("ctrlRotSlideDuration", 2);
  jsSendPOSTRequest("action=ctrl&type=setRotateDuration&duration="+duration);
}


function setActiveRotationList()
{
  var id = jsGetValue("ctrlRotationListsSel", 4);
  if (id > 0)
    jsSendPOSTRequest("action=ctrl&type=setActiveRotationList&id="+id, refreshActiveRotationList);
  else
    jsErrorMessageBox("No rotation list selected?");
}


function updateRotationList(id)
{
  var name = jsGetValue("ctrlEDRotationListName", 1);
  jsSendPOSTRequest("action=ctrl&type=updateRotationList&id="+id+"&name="+name, refreshRotationListSel);
}


function moveRotationListSlide(list_id, dir)
{
  var msuccess = function(txt)
  {
    refreshRotationListEdit(list_id);
  }

  var slide = jsGetValue("ctrlEDRotationListSel", 4);
  if (slide)
  {
    var str = slide.split("_");
    jsSendPOSTRequest("action=ctrl&type=moveRotationListSlide&list_id="+list_id+
      "&slide_id="+parseInt(str[0])+"&order_num="+parseInt(str[1])+"&dir="+dir, msuccess);
  }
  else
    jsErrorMessageBox("No slide selected?");
}


function addRotationListSlide(list_id)
{
  var msuccess = function(txt)
  {
    refreshRotationListEdit(list_id);
  }

  var slide_id = jsGetValue("ctrlEDDisplaySlidesSel", 4);
  if (slide_id > 0)
    jsSendPOSTRequest("action=ctrl&type=addRotationListSlide&list_id="+list_id+"&slide_id="+slide_id, msuccess);
  else
    jsErrorMessageBox("No slide selected?");
}


function removeRotationListSlide(list_id)
{
  var msuccess = function(txt)
  {
    refreshRotationListEdit(list_id);
  }

  var slide = jsGetValue("ctrlEDRotationListSel", 4);
  if (slide)
  {
    var str = slide.split("_");
    jsSendPOSTRequest("action=ctrl&type=removeRotationListSlide&list_id="+list_id+
      "&slide_id="+parseInt(str[0])+"&order_num="+parseInt(str[1]), msuccess);
  }
  else
    jsErrorMessageBox("No slide selected?");
}


function editRotationList()
{
  var id = jsGetValue("ctrlRotationListsSel", 4);
  if (id > 0)
    jsSendPOSTRequest("action=get&type=infoRotationListEdit&id="+id, jsOpenAdminPopup);
  else
    jsErrorMessageBox("No rotation list selected?");
}


function newRotationList()
{
  var msuccess = function(txt)
  {
    refreshRotationListSel();
    jsOpenAdminPopup(txt);
  }

  jsSendPOSTRequest("action=ctrl&type=newRotationList", msuccess);
}


function deleteRotationList()
{
  var mcb_ok = function(txt)
  {
    jsSendPOSTRequest("action=ctrl&type=deleteRotationList&id="+id, refreshRotationListSel);
  }

  var id = jsGetValue("ctrlRotationListsSel", 4);
  if (id > 0)
  {
    jsConfirmBox("Are you <b>sure</b> you want to delete rotation list #"+id+"?",
      mcb_ok, 0, 0);
  }
  else
    jsErrorMessageBox("No rotation list selected?");
}


//
// Display slide editing and handling
//
function refreshDisplaySlideListSel()
{
  jsRefreshItems("ctrlDisplaySlidesSel", "infoDisplaySlides", "");
}


function updateDisplaySlide(id)
{
  var vtitle = jsGetValue("ctrlDisplaySlideTitle", 1);
  var vtext = jsGetValue("ctrlDisplaySlideText", 1);
  jsSendPOSTRequest("action=ctrl&type=updateDisplaySlide&id="+id+"&title="+vtitle+"&text="+vtext, refreshDisplaySlideListSel);
  jsCloseAdminPopup();
  return false;
}


function editDisplaySlide()
{
  var id = jsGetValue("ctrlDisplaySlidesSel", 4);
  if (id > 0)
    jsSendPOSTRequest("action=get&type=infoDisplaySlideEdit&id="+id, jsOpenAdminPopup);
  else
    jsErrorMessageBox("No display slide selected?");
}


function copyDisplaySlide()
{
  var msuccess = function(txt)
  {
    refreshDisplaySlideListSel();
    jsOpenAdminPopup(txt);
  }

  var id = jsGetValue("ctrlDisplaySlidesSel", 4);
  if (id > 0)
    jsSendPOSTRequest("action=ctrl&type=copyDisplaySlide&id="+id, msuccess);
  else
    jsErrorMessageBox("No display slide selected?");
}


function newDisplaySlide()
{
  var msuccess = function(txt)
  {
    refreshDisplaySlideListSel();
    jsOpenAdminPopup(txt);
  }

  jsSendPOSTRequest("action=ctrl&type=newDisplaySlide", msuccess);
}


function deleteDisplaySlide()
{
  var msuccess = function(txt)
  {
    refreshDisplaySlideListSel();
    refreshRotationListSel();
  }

  var mcb_ok = function(txt)
  {
    jsSendPOSTRequest("action=ctrl&type=deleteDisplaySlide&id="+id, msuccess);
  }

  var id = jsGetValue("ctrlDisplaySlidesSel", 4);
  if (id > 0)
  {
    jsConfirmBox("Are you <b>sure</b> you want to delete slide list #"+id+"?",
      mcb_ok, 0, 0);
  }
  else
    jsErrorMessageBox("No display slide selected?");
}


function activateTempSlide()
{
  var id = jsGetValue("ctrlDisplaySlidesSel", 4);
  var duration = jsGetValue("ctrlTempSlideDuration", 2);
  if (id > 0)
    jsSendPOSTRequest("action=ctrl&type=setTempSlide&id="+id+"&duration="+duration, jsMessageBox);
  else
    jsErrorMessageBox("No slide selected?");
}


function skipToNextSlide()
{
  jsSendPOSTRequest("action=ctrl&type=skipToNextSlide");
}


document.addEventListener("DOMContentLoaded",
function ()
{
  jsRegisterTab("CC", "Settings", "Settings");
  jsRegisterTab("CC", "News", "News");
  jsRegisterTab("CC", "Attendees", "Attendees");
  jsRegisterTab("CC", "Voting", "Voting");
  jsRegisterTab("CC", "Compos", "Compos");
  jsRegisterTab("CC", "Entries", "Entries");
  jsRegisterTab("CC", "InfoSys", "Infosystem");
  jsUpdateTabList("CC",
    "<a class=\"admin\" href=\"admlogout.php\">Logout</a> " +
    "<a class=\"admin\" href=\"about\">Mainpage</a>");
  jsSwitchActiveTab("CC", "Settings");
});