0
|
1 <?
|
|
2 // Check if sessions are enabled
|
|
3 if (!stChkSetting("admpass"))
|
|
4 {
|
|
5 echo "<h1>Oh noes, admin configuration not done!</h1>\n".
|
|
6 "<p>Better go and prod that, so you get to use the fine admin interface.</p>\n";
|
|
7 $authState = "error";
|
|
8 }
|
|
9 else
|
|
10 if (stAuthSession())
|
|
11 {
|
|
12 $authState = "ok";
|
|
13 }
|
|
14 else
|
|
15 {
|
|
16 // Perform authentication if we are not in session already
|
|
17 echo "<h1>Party admin login</h1>\n".
|
|
18 "<p>Please use illegal telepathy over HTTP to provide a password to enter the party administration systembolaget.</p>\n".
|
|
19 "<form name=\"admlogin\" action=\"login.php\" method=\"post\">\n".
|
|
20 stGetFormHiddenInput("mode", "check")."\n".
|
|
21 stGetFormHiddenInput("goto", $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"])."\n".
|
|
22 stGetFormPasswordInput("admpass", "pass", "")."\n".
|
|
23 " <input type=\"submit\" value=\" Login \" />\n".
|
|
24 "</form>\n";
|
|
25
|
|
26 $authState = "login";
|
|
27 }
|
|
28
|
|
29 if ($authState == "ok")
|
|
30 {
|
|
31 ?>
|
|
32 <script type="text/javascript">
|
|
33 function statusMsg(msg)
|
|
34 {
|
|
35 document.getElementById("nstatus").innerHTML = msg;
|
|
36 }
|
|
37
|
|
38
|
|
39 function strtrim(str)
|
|
40 {
|
|
41 if (!str || str == null)
|
|
42 return "";
|
|
43 return str.replace(/^\s+|\s+$/g,'')
|
|
44 }
|
|
45
|
|
46
|
|
47 function strencode(str)
|
|
48 {
|
|
49 return encodeURIComponent(escape(str));
|
|
50 }
|
|
51
|
|
52
|
|
53 function createXMLRequest()
|
|
54 {
|
|
55 var req;
|
|
56 if (window.XMLHttpRequest)
|
|
57 {
|
|
58 // Modern browsers
|
|
59 req = new XMLHttpRequest();
|
|
60 }
|
|
61 else
|
|
62 {
|
|
63 // Old IE versions
|
|
64 req = new ActiveXObject("Microsoft.XMLHTTP");
|
|
65 }
|
|
66 return req;
|
|
67 }
|
|
68
|
|
69
|
|
70 function sendPOSTRequest(params, success, failure)
|
|
71 {
|
|
72 var req = createXMLRequest();
|
|
73 req.open("POST", "ajax.php", true);
|
|
74 req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
|
|
75 req.setRequestHeader("Content-length", params.length);
|
|
76 req.setRequestHeader("Connection", "close");
|
|
77
|
|
78 req.onreadystatechange = function()
|
|
79 {
|
|
80 if (req.readyState == 4)
|
|
81 {
|
|
82 if (req.status == 404)
|
|
83 {
|
|
84 window.location = "logout";
|
|
85 }
|
|
86 else
|
|
87 if (req.status == 200)
|
|
88 {
|
|
89 success(req.responseText);
|
|
90 statusMsg(req.statusText);
|
|
91 }
|
|
92 else
|
|
93 {
|
|
94 if (failure)
|
|
95 {
|
|
96 failure(req.status, req.statusText, req.responseText);
|
|
97 }
|
|
98 else
|
|
99 {
|
|
100 statusMsg("["+req.status+" - "+req.statusText+"] "+ req.responseText);
|
|
101 }
|
|
102 }
|
|
103 }
|
|
104 }
|
|
105 req.send(params);
|
|
106 }
|
|
107
|
|
108
|
|
109 function makePostArgs(fields, fprefix, fsuffix)
|
|
110 {
|
|
111 var res = [];
|
|
112 for (var id in fields)
|
|
113 {
|
|
114 var elem = document.getElementById(fprefix + id + fsuffix);
|
|
115 if (!elem)
|
|
116 {
|
|
117 alert("No such DOM element '"+ id +"'.");
|
|
118 return "";
|
|
119 }
|
|
120
|
|
121 switch (fields[id])
|
|
122 {
|
|
123 case 0:
|
|
124 case 1:
|
|
125 {
|
|
126 var str = strtrim(elem.value);
|
|
127 if (fields[id] == 1 && str == "")
|
|
128 {
|
|
129 alert("One or more of the fields are empty.");
|
|
130 return "";
|
|
131 }
|
|
132 res.push(id+"="+strencode(str));
|
|
133 }
|
|
134 break;
|
|
135
|
|
136 case 2:
|
|
137 res.push(id+"="+parseInt(elem.value));
|
|
138 break;
|
|
139
|
|
140 case 3:
|
|
141 res.push(id+"="+(elem.checked ? "1" : "0"));
|
|
142 break;
|
|
143
|
|
144 }
|
|
145 }
|
|
146 return res.join("&");
|
|
147 }
|
|
148
|
|
149
|
|
150 function refreshItems(id,name,msgname)
|
|
151 {
|
|
152 var msuccess = function(txt)
|
|
153 {
|
|
154 var nitem = document.getElementById(id);
|
|
155 nitem.innerHTML = txt;
|
|
156 }
|
|
157
|
|
158 sendPOSTRequest("action=get&type="+name, msuccess);
|
|
159 }
|
|
160
|
|
161
|
|
162 function deleteItem(id,prefix,type,func,dsc)
|
|
163 {
|
|
164 var msuccess = function(txt)
|
|
165 {
|
|
166 var item = document.getElementById(prefix+id);
|
|
167 item.style.display = "none";
|
|
168 setTimeout(func, 550);
|
|
169 }
|
|
170
|
|
171 if (confirm("Are you sure you want to delete "+dsc+" #"+id+"?"))
|
|
172 {
|
|
173 sendPOSTRequest("action=delete&type="+type+"&id="+id, msuccess);
|
|
174 }
|
|
175 }
|
|
176
|
|
177
|
|
178 function refreshNews()
|
|
179 {
|
|
180 refreshItems("nnews", "news", "News list");
|
|
181 }
|
|
182
|
|
183
|
|
184 function refreshAttendees()
|
|
185 {
|
|
186 refreshItems("nattendees", "attendees", "Attendees list");
|
|
187 }
|
|
188
|
|
189
|
|
190 function refreshDump()
|
|
191 {
|
|
192 var msuccess = function(txt)
|
|
193 {
|
|
194 var nitem = document.getElementById("ndump");
|
|
195 nitem.innerHTML = txt;
|
|
196 }
|
|
197
|
|
198 sendPOSTRequest("action=dump&type=attendees", msuccess);
|
|
199 }
|
|
200
|
|
201
|
|
202 function refreshCompos()
|
|
203 {
|
|
204 refreshItems("ncompos", "compos", "Compo list");
|
|
205 }
|
|
206
|
|
207
|
|
208 function refreshEntries()
|
|
209 {
|
|
210 refreshItems("nentries", "entries", "Entry list");
|
|
211 }
|
|
212
|
|
213
|
|
214 function refreshVoters()
|
|
215 {
|
|
216 refreshItems("nvoters", "voters", "Voters list");
|
|
217 }
|
|
218
|
|
219
|
|
220 function addNews()
|
|
221 {
|
|
222 var args = makePostArgs({"title":1,"text":1,"author":1}, "nn", "");
|
|
223
|
|
224 var msuccess = function(txt)
|
|
225 {
|
|
226 setTimeout("refreshNews();", 550);
|
|
227 }
|
|
228
|
|
229 sendPOSTRequest(
|
|
230 "action=add&type=news&"+args,
|
|
231 msuccess);
|
|
232 return false;
|
|
233 }
|
|
234
|
|
235
|
|
236 function deleteNews(id)
|
|
237 {
|
|
238 deleteItem(id, "news", "news", "refreshNews();", "news item");
|
|
239 }
|
|
240
|
|
241
|
|
242 function deleteAttendee(id)
|
|
243 {
|
|
244 deleteItem(id, "attendee", "attendees", "refreshAttendees();", "attendee");
|
|
245 }
|
|
246
|
|
247
|
|
248 function updateAttendee(id)
|
|
249 {
|
|
250 var args = makePostArgs({"oneliner":0,"email":0}, "at", id);
|
|
251
|
|
252 sendPOSTRequest("action=update&type=attendees&id="+id+"&"+args);
|
|
253 }
|
|
254
|
|
255
|
|
256 function addCompo()
|
|
257 {
|
|
258 var args = makePostArgs({"name":1, "description":1}, "nc", "");
|
|
259
|
|
260 var msuccess = function(txt)
|
|
261 {
|
|
262 setTimeout("refreshCompos();", 550);
|
|
263 }
|
|
264
|
|
265 sendPOSTRequest("action=add&type=compo&"+args, msuccess);
|
|
266 return false;
|
|
267 }
|
|
268
|
|
269
|
|
270 function updateCompo(id)
|
|
271 {
|
|
272 var args = makePostArgs({"name":1, "description":1, "enabled":3}, "co", id);
|
|
273
|
|
274 sendPOSTRequest("action=update&type=compo&id="+id+"&"+args);
|
|
275 }
|
|
276
|
|
277
|
|
278 function addEntry(id)
|
|
279 {
|
|
280 var args = makePostArgs({"name":1, "author":1}, "ne", id);
|
|
281
|
|
282 var msuccess = function(txt)
|
|
283 {
|
|
284 setTimeout("refreshEntries();", 550);
|
|
285 }
|
|
286
|
|
287 sendPOSTRequest("action=add&type=entry&compo_id="+id+"&"+args, msuccess);
|
|
288 return false;
|
|
289 }
|
|
290
|
|
291
|
|
292 function updateEntry(id)
|
|
293 {
|
|
294 var args = makePostArgs({"name":1, "author":1}, "en", id);
|
|
295
|
|
296 sendPOSTRequest(
|
|
297 "action=update&type=entry&id="+id+"&"+args);
|
|
298 }
|
|
299
|
|
300
|
|
301 function deleteEntry(id)
|
|
302 {
|
|
303 deleteItem(id, "entry", "entries", "refreshEntries();", "entry");
|
|
304 }
|
|
305
|
|
306
|
|
307 function updateVoter(id)
|
|
308 {
|
|
309 var args = makePostArgs({"enabled":3, "name":0}, "vo", id);
|
|
310
|
|
311 sendPOSTRequest("action=update&type=voter&id="+id+"&"+args);
|
|
312 }
|
|
313
|
|
314
|
|
315 var registeredTabs = Object();
|
|
316
|
|
317
|
|
318 function updateTabList()
|
|
319 {
|
|
320 var item = document.getElementById("pageTabs");
|
|
321 var str = "";
|
|
322 for (var id in registeredTabs)
|
|
323 {
|
|
324 str += "<a href=\"#\" onClick=\"switchActiveTab('"+
|
|
325 id+"')\">"+registeredTabs[id]+"</a>";
|
|
326 }
|
|
327
|
|
328 str += "<a class=\"admin\" href=\"logout\">Logout</a>";
|
|
329
|
|
330 item.innerHTML = str;
|
|
331 }
|
|
332
|
|
333
|
|
334 function registerTab(id, name)
|
|
335 {
|
|
336 registeredTabs[id] = name;
|
|
337 }
|
|
338
|
|
339
|
|
340 function refreshTabs()
|
|
341 {
|
|
342 for (var id in registeredTabs)
|
|
343 {
|
|
344 setTimeout("refresh"+ registeredTabs[id] +"();", 10);
|
|
345 }
|
|
346 }
|
|
347
|
|
348
|
|
349 function switchActiveTab(tab)
|
|
350 {
|
|
351 for (var id in registeredTabs)
|
|
352 {
|
|
353 var ob = document.getElementById(id);
|
|
354 if (ob)
|
|
355 {
|
|
356 ob.style.display = (tab == id) ? "block" : "none";
|
|
357 if (tab == id)
|
|
358 {
|
|
359 setTimeout("refresh"+ registeredTabs[id] +"();", 10);
|
|
360 }
|
|
361 }
|
|
362 }
|
|
363 }
|
|
364 </script>
|
|
365
|
|
366 <div id="nstatus">
|
|
367 -
|
|
368 </div>
|
|
369
|
|
370 <div id="pageTabs">
|
|
371 </div>
|
|
372
|
|
373 <!-- ========================== -->
|
|
374
|
|
375 <div id="ntab0">
|
|
376
|
|
377 <form method="post" action="" onsubmit="return addNews()">
|
|
378 <input id="nntitle" type="text" size="40" /><br />
|
|
379 <textarea id="nntext" rows="5" cols="60"></textarea><br />
|
|
380 <input id="nnauthor" type="text" value="orgaz" />
|
|
381 <input id="nnadd" type="submit" value=" Add post " />
|
|
382 <input type="button" value=" Clear " onClick="this.form.reset()" />
|
|
383 </form>
|
|
384
|
|
385 <hr />
|
|
386
|
|
387 <div id="nnews">
|
|
388 </div>
|
|
389 </div>
|
|
390
|
|
391 <!-- ========================== -->
|
|
392
|
|
393 <div id="ntab1">
|
|
394 <div id="nattendees">
|
|
395 </div>
|
|
396 </div>
|
|
397
|
|
398 <!-- ========================== -->
|
|
399
|
|
400 <div id="ntab2">
|
|
401 <div id="ndump">
|
|
402 </div>
|
|
403 </div>
|
|
404
|
|
405 <!-- ========================== -->
|
|
406
|
|
407 <div id="ntab3">
|
|
408
|
|
409 <form method="post" action="" onsubmit="return addCompo()">
|
|
410 <input id="ncname" type="text" size="64" /><br />
|
|
411 <textarea id="ncdescription" rows="5" cols="60"></textarea><br />
|
|
412 <input id="nccompo" type="submit" value=" Add compo " />
|
|
413 <input type="button" value=" Clear " onClick="this.form.reset()" />
|
|
414 </form>
|
|
415
|
|
416 <hr />
|
|
417 <div id="ncompos">
|
|
418 </div>
|
|
419 </div>
|
|
420
|
|
421 <!-- ========================== -->
|
|
422
|
|
423 <div id="ntab4">
|
|
424 <div id="nentries">
|
|
425 </div>
|
|
426 </div>
|
|
427
|
|
428 <!-- ========================== -->
|
|
429
|
|
430 <div id="ntab5">
|
|
431 <p>
|
|
432 Key entries can only be generated via the shell-utility 'keygen'.
|
|
433 </p>
|
|
434 <div id="nvoters">
|
|
435 </div>
|
|
436 </div>
|
|
437
|
|
438 <!-- ========================== -->
|
|
439
|
|
440 <script type="text/javascript">
|
|
441 registerTab("ntab0", "News");
|
|
442 registerTab("ntab1", "Attendees");
|
|
443 registerTab("ntab2", "Dump");
|
|
444 registerTab("ntab3", "Compos");
|
|
445 registerTab("ntab4", "Entries");
|
|
446 registerTab("ntab5", "Voters");
|
|
447 updateTabList();
|
|
448 switchActiveTab("ntab0");
|
|
449 </script>
|
|
450 <?
|
|
451 }
|
|
452 ?> |