view admin.inc.php @ 61:e85ed35585fc

Work on attendee editing, etc.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 05 Oct 2013 12:33:59 +0300
parents e5e38ed4e837
children 4684336cec09
line wrap: on
line source

<?
$sessionType = "admin";

function stCreateSettingsData()
{
  $args = array();

  if (($res = stExecSQL("SELECT * FROM settings")) !== FALSE)
  {
    foreach ($res as $item)
    {
      switch ($item["vtype"])
      {
        case VT_STR:
        case VT_TEXT: $type = 0; break;
        case VT_INT: $type = 4; break;
        case VT_BOOL: $type = 3; break;
      }
      $args[] = "\"".$item["key"]."\":".$type;
    }
  }

  echo
  "\n".
  "function updateSettings()\n".
  "{\n".
  "  var args = makePostArgs({".implode(",", $args)."}, \"st\", \"\");\n".
  "  sendPOSTRequest(\"action=update&type=settings&\"+args);\n".
  "  return false;\n".
  "}\n";
}

// Check if sessions are enabled
if (!stChkSetting("admPassword"))
{
  echo "<h1>Oh noes, admin configuration not done!</h1>\n".
  "<p>Better go and prod that, so you get to use the fine admin interface.</p>\n";
  $authState = "error";
}
else
if (stAdmSessionAuth())
{
  $authState = "ok";
}
else
{
  // Perform authentication if we are not in session already
  echo
    "<h1>Party admin login</h1>\n".
    "<p>Please use illegal telepathy over HTTP to provide a password to enter the party administration systembolaget.</p>\n".
    stGetFormStart("admlogin", "admlogin.php").
    stGetFormHiddenInput("mode", "check")."\n".
    stGetFormPasswordInput("admpass", "", "")."\n".
    stGetFormSubmitInput("submit", "Login").
    "</form>\n";

  $authState = "login";
}

if ($authState == "ok")
{
?>
<script type="text/javascript">
// <? stCreateSettingsData(); ?>


function statusMsg(msg)
{
  document.getElementById("nstatus").innerHTML = msg;
}


function strtrim(str)
{
  if (!str || str == null)
    return "";
  return str.replace(/^\s+|\s+$/g,'')
}


function strencode(str)
{
  return encodeURIComponent(str);
}


function createXMLRequest()
{
  var req;
  if (window.XMLHttpRequest)
  {
    // Modern browsers
    req = new XMLHttpRequest();
  }
  else
  {
    // Old IE versions
    req = new ActiveXObject("Microsoft.XMLHTTP");
  }
  return req;
}


function sendPOSTRequest(params, success, failure)
{
  var req = createXMLRequest();
  req.open("POST", "ajax.php", true);
  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  req.setRequestHeader("Content-length", params.length);
  req.setRequestHeader("Connection", "close");

  req.onreadystatechange = function()
  {
    if (req.readyState == 4)
    {
      if (req.status == 404)
      {
        window.location = "admlogout.php";
      }
      else
      if (req.status == 200)
      {
        if (success)
        {
          success(req.responseText);
        }
        statusMsg(req.statusText);
      }
      else
      {
        if (failure)
        {
          failure(req.status, req.statusText, req.responseText);
        }
        else
        {
          statusMsg("["+req.status+" - "+req.statusText+"] "+ req.responseText);
        }
      }
    }
  }
  req.send(params);
}


function makePostArgs(fields, fprefix, fsuffix)
{
  var res = [];
  for (var id in fields)
  {
    var elem = document.getElementById(fprefix + id + fsuffix);
    if (!elem)
    {
      alert("No such DOM element '"+ fprefix + id + fsuffix +"'.");
      return "";
    }

    switch (fields[id])
    {
      case 0:
      case 1:
      case 4:
        {
          var str = strtrim(elem.value);
          if ((fields[id] == 1 || fields[id] == 4) && str == "")
          {
            alert("One or more of the required fields are empty.");
            return "";
          }
          if (fields[id] == 4)
            res.push(id+"="+parseInt(elem.value));
          else
            res.push(id+"="+strencode(str));
        }
        break;

      case 2:
        res.push(id+"="+parseInt(elem.value));
        break;

      case 3:
        res.push(id+"="+(elem.checked ? "1" : "0"));
        break;

    }
  }
  return res.join("&");
}


function refreshItems(id,name,msgname)
{
  var msuccess = function(txt)
  {
    var nitem = document.getElementById(id);
    nitem.innerHTML = txt;
  }

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


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

  if (confirm("Are you sure you want to delete "+dsc+" #"+id+"?"))
  {
    sendPOSTRequest("action=delete&type="+type+"&id="+id, msuccess);
  }
}


function refreshSettings()
{
  refreshItems("nsettings", "settings", "General settings");
}


function refreshNews()
{
  refreshItems("nnews", "news", "News list");
}


function refreshAttendees()
{
  refreshItems("nattendees", "attendees", "Attendees list");
}


function refreshDump()
{
  var msuccess = function(txt)
  {
    var nitem = document.getElementById("ndump");
    nitem.innerHTML = txt;
  }

  sendPOSTRequest("action=dump&type=attendees", msuccess);
}


function refreshCompos()
{
  refreshItems("ncompos", "compos", "Compo list");
}


function refreshEntries()
{
  refreshItems("nentries", "entries", "Entry list");
}


function addNews()
{
  var args = makePostArgs({"title":1,"text":1,"author":1}, "nn", "");

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

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

  return false;
}


function deleteNews(id)
{
  deleteItem(id, "news", "news", "refreshNews();", "news item");
}


function addAttendee()
{
  var args = makePostArgs({"name":1,"groups":0,"oneliner":0,"email":0}, "ne", "x");

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

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

  return false;
}


function deleteAttendee(id)
{
  deleteItem(id, "attendee", "attendees", "refreshAttendees();", "attendee");
}


function updateAttendee(id)
{
  var args = makePostArgs({"oneliner":0,"email":0,"active":3}, "at", id);

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

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


function updateAttendee2(id)
{
  var elem = document.getElementById("atactive"+id);
  if (elem && !elem.checked)
  {
    if (confirm("Are you sure you want deactivate vote ID #"+id+"?"))
      updateAttendee(id);
    else
      setTimeout("refreshAttendees();", 50);
  }
  else
    updateAttendee(id);
}


function addCompo()
{
  var args = makePostArgs({"name":1, "description":1}, "nc", "");

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

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


function updateCompo(id)
{
  var args = makePostArgs({"name":1, "description":1, "visible":3, "voting":3, "showAuthors":3}, "co", id);

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


function addEntry(id)
{
  var args = makePostArgs({"name":1, "author":1, "filename":0}, "ne", id);

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

  if (args != "")
    sendPOSTRequest("action=add&type=entry&compo_id="+id+"&"+args, msuccess);
  return false;
}


function updateEntry(id)
{
  var args = makePostArgs({"name":1, "author":1, "filename":0, "compo_id":2}, "en", id);

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

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


function deleteEntry(id)
{
  deleteItem(id, "entry", "entries", "refreshEntries();", "entry");
}


var registeredTabs = Object();


function updateTabList()
{
  var item = document.getElementById("pageTabs");
  var str = "";
  for (var id in registeredTabs)
  {
    str += "<a id=\"cc"+id+
      "\"href=\"#\" onClick=\"switchActiveTab('"+id+
      "')\">"+registeredTabs[id]+"</a>";
  }
  
  str += "<a class=\"admin\" href=\"admlogout.php\">Logout</a>";
  
  item.innerHTML = str;
}


function registerTab(id, name)
{
  registeredTabs[id] = name;
}


function refreshTabs()
{
  for (var id in registeredTabs)
  {
    setTimeout("refresh"+ registeredTabs[id] +"();", 10);
  }
}


function switchActiveTab(tab)
{
  for (var id in registeredTabs)
  {
    var ob = document.getElementById(id);
    var ccob = document.getElementById("cc"+id);
    if (ob && ccob)
    {
      ob.style.display = (tab == id) ? "block" : "none";
      ccob.style.borderTop = (tab == id) ? "4px solid white" : "none";
      if (tab == id)
      {
        setTimeout("refresh"+ registeredTabs[id] +"();", 10);
      }
    }
  }
}
</script>

<!-- ========================== -->

<div id="nstatus">-</div>

<div id="pageTabs"></div>

<!-- ========================== -->

<div id="tabSettings">
  <form method="post" action="" onsubmit="return updateSettings()">
    <div id="nsettings"></div>
  </form>
</div>

<!-- ========================== -->

<div id="tabNews">
  <form method="post" action="" onsubmit="return addNews()">
    <input id="nntitle" type="text" size="40" /><br />
    <textarea id="nntext" rows="5" cols="60"></textarea><br />
    <input id="nnauthor" type="text" value="orgaz" />
    <input id="nnadd" type="submit" value=" Add post " />
    <input type="button" value=" Clear " onClick="this.form.reset()" />
  </form>
  <hr />
  <div id="nnews"></div>
</div>

<!-- ========================== -->

<div id="tabAttendees">
  <div id="nattendees"></div>
</div>

<!-- ========================== -->

<div id="tabDump">
  <div id="ndump"></div>
</div>

<!-- ========================== -->

<div id="tabCompos">
  <form method="post" action="" onsubmit="return addCompo()">
    <input id="ncname" type="text" size="64" /><br />
    <textarea id="ncdescription" rows="5" cols="60"></textarea><br />
    <input id="nccompo" type="submit" value=" Add compo " />
    <input type="button" value=" Clear " onClick="this.form.reset()" />
  </form>
  <hr />
  <div id="ncompos"></div>
</div>

<!-- ========================== -->

<div id="tabEntries">
  <div id="nentries"></div>
</div>

<!-- ========================== -->

<script type="text/javascript">
  registerTab("tabSettings", "Settings");
  registerTab("tabNews", "News");
  registerTab("tabAttendees", "Attendees");
  registerTab("tabDump", "Dump");
  registerTab("tabCompos", "Compos");
  registerTab("tabEntries", "Entries");
  updateTabList();
  switchActiveTab("tabSettings");
</script>
<? } ?>