Mercurial > hg > fapweb
view admin.php @ 407:eaea1ae2bc3d
Moar work.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 05 Dec 2013 16:57:38 +0200 |
parents | d454f7eebddd |
children | db85700cb258 |
line wrap: on
line source
<? // // FAPWeb Simple Demoparty System // Party administration page frontend module // (C) Copyright 2012-2013 Tecnic Software productions (TNSP) // $sessionType = "admin"; require_once "mconfig.inc.php"; require_once "msite.inc.php"; require_once "msession.inc.php"; require_once "majax.inc.php"; 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 = 1; break; case VT_INT: $type = 2; break; case VT_BOOL: $type = 3; break; } $args[] = "\"".$item["key"]."\":".$type; } } echo "\n". "function updateSettings()\n". "{\n". " var args = jsMakePostArgs({".implode(",", $args)."}, \"st\", \"\");\n". " jsSendPOSTRequest(\"action=update&type=settings&\"+args);\n". " return false;\n". "}\n"; } function stAdminContent() { echo "<div id=\"adminContent\">\n"; } // Switch to https first, if needed if (!stCheckHTTPS()) { header("Location: https://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]); exit; } // Start output $pageCSS["admin.css"] = ""; cmLocaleInit(); cmPrintPageHeader("FAPWeb Administration", " <meta http-equiv=\"Pragma\" content=\"no-cache\" />\n", FALSE); // Initiate SQL database connection if (!stConnectSQLDB()) { // Error occured, bail out early cmPrintPageFooter(); exit; } // Fetch non-"hardcoded" settings from SQL database stReloadSettings(); // Check if sessions are enabled if (!stChkSetting("admPassword")) { stAdminContent(); 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"; cmPrintPageFooter(); exit; } else if (!stAdmSessionAuth(FALSE)) { // Perform authentication if we are not in session already stAdminContent(); 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", "", "", "autofocus=\"autofocus\"")."\n". " ".stGetFormSubmitInput("submit", "Login")."\n". " </form>\n"; cmPrintPageFooter(); exit; } else { ?> <script type="text/javascript"> // <? stCreateSettingsData(); stCommonAJAX("admajax.php", "admlogout.php", FALSE); ?> var activeAttendee = -1, prevAttendee = -1; var activeTmp = ""; var registeredTabs = Object(); var activeTabs = Object(); 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) { 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.style.background; item.style.background = "red"; // Ask confirmation for deletion var mcb_ok = function (data) { jsSendPOSTRequest("action=delete&type="+type+"&id="+id, msuccess); item.style.background = tmp; } var mcb_cancel = function (data) { item.style.background = tmp; } jsConfirmBox("Are you sure you want to delete "+dsc+" #"+id+"?", mcb_ok, mcb_cancel, 0); } function refreshDispatchCC(id) { switch (id) { case "Settings": jsRefreshItems("tabContCCSettings", "settings", ""); break; case "News": jsRefreshItems("tabContCCNews", "news", ""); break; case "Attendees": jsRefreshItems("tabContCCAttendees", "attendees", ""); break; case "Voting": jsRefreshItems("tabContCCVoting", "voters", ""); break; case "Compos": jsRefreshItems("tabContCCCompos", "compos", ""); break; case "InfoSys": jsRefreshItems("tabContCCInfoSys", "info", ""); break; case "Entries": refreshCCEntries(); break; } } function refreshCCAttendee(id) { jsRefreshItems("attendee"+ id, "attendee", "&id="+ id); } function refreshCCEntries() { var msuccess = function(txt) { var nitem = document.getElementById("tabContCCEntries"); if (nitem) { if (nitem.innerHTML == "") { nitem.innerHTML = "<div id=\"tabHeadersCM\" class=\"tabHeadersSub\"></div>" + "<div id=\"tabContentsCM\" class=\"tabContentsSub\"></div>"; } try { var tmp = JSON.parse("{"+ txt +"}"); registeredTabs["CM"] = tmp; updateTabList("CM", ""); if (activeTabs["CM"]) switchActiveTab("CM", activeTabs["CM"]); } catch (err) { jsMessageBox("JSON.parse("+ txt +") failure: "+ err); } } } jsSendPOSTRequest("action=get&type=compolist", msuccess); } function refreshCMEntry(id) { jsRefreshItems("entry"+ id, "entry", "&id="+ id); } function refreshDispatchCM(id) { jsRefreshItems("tabContCM"+ id, "entries", "&id="+ id); } function addNews() { var args = jsMakePostArgs({"title":1,"text":1,"author":1}, "nn", ""); var msuccess = function(txt) { setTimeout("refreshDispatchCC('News');", 50); } if (args != "") jsSendPOSTRequest("action=add&type=news&"+args, msuccess); return false; } function deleteNews(id) { jsDeleteItem(id, "news", "news", "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); } function addAttendee() { var args = jsMakePostArgs({"name":1,"groups":1,"oneliner":1,"email":1}, "ne", "x"); var msuccess = function(txt) { setTimeout("refreshDispatchCC('Attendees');", 50); } if (args != "") jsSendPOSTRequest("action=add&type=attendees&"+args, msuccess); return false; } function deleteAttendee(id) { jsDeleteItem(id, "attendee", "attendees", "refreshDispatchCC('Attendees');", "attendee"); } function updateAttendee(id) { var args = jsMakePostArgs({"name":1,"groups":1,"oneliner":1,"email":1}, "at", id); var msuccess = function(txt) { jsRefreshItems("attendee"+id, "attendee", "&id="+id+"&edit=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.style.background = activeTmp; } } var msuccess2 = function(txt) { var nitem = document.getElementById("attendee"+id); if (nitem) { nitem.innerHTML = txt; activeTmp = nitem.style.background; nitem.style.background = "green"; activeAttendee = id; } } if (activeAttendee != id) { prevAttendee = activeAttendee; activeAttendee = id; if (prevAttendee != -1) jsSendPOSTRequest("action=get&type=attendee&id="+prevAttendee+"&edit=0", msuccess1); jsSendPOSTRequest("action=get&type=attendee&id="+id+"&edit=1", msuccess2); } } function addCompo() { var args = jsMakePostArgs({"name":1, "description":1}, "nc", ""); var msuccess = function(txt) { setTimeout("refreshDispatchCC('Compos');", 50); } if (args != "") jsSendPOSTRequest("action=add&type=compo&"+args, msuccess); return false; } function updateCompo(id) { var args = jsMakePostArgs({"name":1, "description":1, "visible":3, "voting":3, "showAuthors":3}, "co", id); var msuccess = function(txt) { jsRefreshItems("compo"+id, "compo", "&id="+id); } if (args != "") jsSendPOSTRequest("action=update&type=compo&id="+id+"&"+args, msuccess); } function addEntry(id) { var args = jsMakePostArgs({"name":1, "author":1, "filename":1, "info":1}, "ne", id); var msuccess = function(txt) { setTimeout("refreshDispatchCM("+ id +");", 50); } if (args != "") jsSendPOSTRequest("action=add&type=entry&compo_id="+id+"&"+args, msuccess); return false; } function updateEntry(cid, id) { var args = jsMakePostArgs({"name":1, "author":1, "filename":1, "info":1, "compo_id":2}, "en", id); var compo_id = lastPostArgs["compo_id"]; var msuccess = function(txt) { if (cid != compo_id) { var nitem = document.getElementById("entry"+ id); if (nitem) nitem.style.display = "none"; } else setTimeout("refreshCMEntry("+ id +");", 50); } if (args != "") jsSendPOSTRequest("action=update&type=entry&id="+id+"&"+args, msuccess); } function deleteEntry(cid, id) { jsDeleteItem(id, "entry", "entries", "refreshDispatchCM("+ cid +");", "entry"); } function voteKeyRefresh(id) { var msuccess2 = function(txt) { var nitem = document.getElementById("vkey"+id); if (nitem) nitem.className = txt; } var msuccess1 = function(txt) { var nitem = document.getElementById("vkey"+id); if (nitem) nitem.innerHTML = txt; } jsSendPOSTRequest("action=get&type=votekey&id="+id, msuccess1); jsSendPOSTRequest("action=get&type=votekeyclass&id="+id, msuccess2); } function voteKeyUpdate(id, mode, args) { var msuccess = function(txt) { voteKeyRefresh(id); } jsSendPOSTRequest("action=update&type=votekey&mode="+mode+"&id="+id+"&"+args, msuccess); } function voteKeySetActive(id) { var args = jsMakePostArgs({"active":3}, "vk", id); var mcb_ok = function (data) { voteKeyUpdate(id, "active", args); } var mcb_cancel = function (data) { voteKeyRefresh(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 voteKeyAssign(id, mode) { var args = jsMakePostArgs({"key_id":2}, "vk", id); var mcb_ok = function (data) { voteKeyUpdate(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); } function performSystemCheck() { jsSendPOSTRequest("action=check", jsMessageBox); } function generateEntryPositions(id, patch) { var msuccess = function (data) { refreshDispatchCM(id); } var mcb_ok = function (data) { if (id == 0) jsSendPOSTRequest("action=randomize&type=all&patch="+patch); else jsSendPOSTRequest("action=randomize&type=compo&id="+id+"&patch="+patch, msuccess); } if (patch == 0) { jsConfirmBox("Are you <b>sure</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!</b>", mcb_ok, 0, 0); } else mcb_ok(0); } function setShowMode(mode) { jsSendPOSTRequest("action=ctrl&type=setShowMode&mode="+mode); } function refreshCurrEntryData() { jsRefreshItems("ctrlCurrEntryData", "infoCurrEntryData", ""); } function refreshCurrEntryListData() { jsRefreshItems("ctrlEntryList", "infoCurrEntryList", ""); refreshCurrEntryData(); } function activateCompo() { jsSendPOSTRequest("action=ctrl&type=setCompoID&id="+jsGetValue("ctrlCompoListSel", 4), refreshCurrEntryListData); jsSendPOSTRequest("action=ctrl&type=setCompoID&id="+jsGetValue("ctrlCompoList", 4), msuccess); } function updateTabList(tabset, extra) { var tabs = ""; var content = ""; for (var id in registeredTabs[tabset]) { var thead = registeredTabs[tabset][id]; tabs += "<a id=\"tabHead"+ tabset + id + "\"href=\"#\" onClick=\"switchActiveTab('"+tabset+"', '"+id+ "')\">"+ thead.replace(/\s/g, " ") +"</a> "; content += "<div id=\"tabCont"+ tabset + id +"\"></div>"; } var item = document.getElementById("tabHeaders"+ tabset); if (item) item.innerHTML = tabs + extra; item = document.getElementById("tabContents"+ tabset); if (item) item.innerHTML = content; } function registerTab(tabset, id, name) { if (!registeredTabs[tabset]) registeredTabs[tabset] = Object(); registeredTabs[tabset][id] = name; } function switchActiveTab(tabset, tab) { 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.style.borderTop = (tab == id) ? "4px solid white" : "none"; if (tab == id) { activeTabs[tabset] = id; setTimeout("refreshDispatch"+ tabset +"('"+ id +"');", 10); } } } } </script> <!-- ========================== --> <div id="adminContent"> <div id="nstatus">-</div> <div id="tabHeadersCC" class="tabHeaders"></div> <div id="tabContentsCC" class="tabContents"></div> <script type="text/javascript"> registerTab("CC", "Settings", "Settings"); registerTab("CC", "News", "News"); registerTab("CC", "Attendees", "Attendees"); registerTab("CC", "Voting", "Voting"); registerTab("CC", "Compos", "Compos"); registerTab("CC", "Entries", "Entries"); registerTab("CC", "InfoSys", "Infosystem"); updateTabList("CC", "<a class=\"admin\" href=\"admlogout.php\">Logout</a> " + "<a class=\"admin\" href=\"about\">Mainpage</a>"); switchActiveTab("CC", "Settings"); </script> <? } cmPrintPageFooter(); ?>