changeset 1:77d78ef45ed2

Lots of work.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 10 Jan 2011 01:44:34 +0200
parents 332b25bb4e36
children 666d475c8f92
files index.php
diffstat 1 files changed, 171 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/index.php	Mon Jan 10 00:16:36 2011 +0200
+++ b/index.php	Mon Jan 10 01:44:34 2011 +0200
@@ -6,7 +6,7 @@
 if (isset($_POST["mode"])) {
   $formMode = intval($_POST["mode"]);
 } else
-  $formMode = 0;
+  $formMode = -1;
 
 
 function getJSArraySegment($arr)
@@ -23,14 +23,31 @@
 }
 
 
-function printInputField($id, $label, $len)
+function printInputField($id, $label, $len, $default = "")
 {
   echo "<label for=\"".$id."\">".htmlentities($label)."</label>\n".
-  "<input type=\"text\" name=\"".$id."\" size=\"".$len."\" id=\"".$id."\" />\n";
+  "<input type=\"text\" name=\"".$id."\" size=\"".$len."\" id=\"".$id."\" value=\"".$default."\" />\n";
+}
+
+
+function printOptionSelect($id, $size, $multi = FALSE)
+{
+  echo "<select ".($multi ? " multiple=\"multiple\"" : "")." size=\"".$size."\" id=\"".$id."\"><option></option></select>";
 }
 
 
-printPageHeader($pageTitle);
+printPageHeader($pageTitle, "
+ <style type=\"text/css\">
+  <!--
+  .buttons { width: 100%; }
+  div.options { display: none; border: 1px solid white; padding: 1em; }
+  
+  #command { display: none; }
+  
+  #status { position: absolute; bottom: 1em; right: 1em; left: 1em; padding: 1pt; margin: 2pt; border: 1px solid white; }
+  -->
+ </style>
+");
 echo "<h1>".$pageTitle."</h1>\n";
 
 if ($formMode == 0) {
@@ -106,6 +123,10 @@
   }
 }
 
+
+/*
+ * Unserialize data from previous step
+ */
 if ($formMode == 2) {
   if (isset($_POST["data"])) {
     $formData = base64_decode($_POST["data"]);
@@ -118,32 +139,58 @@
   }
 }
 
-if ($data !== FALSE && $formMode == 3) {
+
+/*
+ * Interactive editor mode begins here
+ */
+//if ($data !== FALSE && $formMode == 3) {
+
+if ($formMode == -1) {
+
 ?>
 <form id="done" action="<? echo $pageIndex; ?>" method="post">
- <input type="hidden" value="3" name="mode" />
- <p>
- When you are ready, hit <input type="submit" value=" Save and continue " /> to go to command creation step.
+ <p id="create_buttons">
+  <input type="button" value=" Create BatMUD Commands " onclick="createCommands('batmud', this.form);" />
+<!--
+  <input type="button" value=" Create TinyFugue Macros " onclick="createCommands('tf', this.form);" />
+  <input type="button" value=" Create SAVEBLOB " onclick="createCommands('save', this.form);" />
+-->
+  <input type="hidden" value="3" name="mode" />
  </p>
+
+ <div id="options_batmud" class="options">
+  <? printInputField("command_sep", "Command separator", 15, ";"); ?><br />
+  <input type="checkbox" id="autoclose" value="true" />
+  <label for="autoclose">Add commands for automatically opening and closing each chest.</label>
+ </div>
+
+
  <table>
   <tr>
+
    <td>
     <h2>Items pool</h2>
-    <select multiple="multiple" size="10" id="curr_items"></select>
-    <br />
-    <table width="100%">
-     <td width="15%"><input type="button" value=" Delete " onclick="deleteItems(this.form);" /></td>
-     <td width="15%"><input type="button" value=" Add new " onclick="addItems(this.form);" disabled="disabled" /></td>
-     <td width="60%" style="text-align: right;"><input id="move_button" type="button" value=" Move to chest " onclick="moveItems(this.form);" /></td>
+    <? printOptionSelect("curr_items", 10, TRUE); ?>
+    <table class="buttons">
+     <tr>
+      <td><input type="button" value=" Delete " onclick="deleteItems(this.form);" /></td>
+      <td><input type="button" value=" Add new " onclick="addItems(this.form);" disabled="disabled" /></td>
+      <td style="width: 60%; text-align: right;"><input id="move_button" type="button" value=" Move to chest " onclick="moveItems(this.form);" /></td>
+     </tr>
     </table>
    </td>
+
    <td id="chest_editor">
     <h2>Editing chest "<span id="curr_name"></span>"</h2>
-    <select multiple="multiple" size="10" id="curr_chest"></select>
-    <br />
-    <input type="button" value=" Remove selected " onclick="chestRemoveItems(this.form);" />
+    <? printOptionSelect("curr_chest", 10, TRUE); ?>
+    <table class="buttons">
+     <tr>
+      <td><input type="button" value=" Remove selected " onclick="chestRemoveItems(this.form);" /></td>
+     </tr>
+    </table>
    </td>
   </tr>
+
   <tr>
    <td>
     <h2>Create / edit a chest</h2>
@@ -153,17 +200,31 @@
  ?>
     <input type="button" value=" Create " onclick="chestCreate(this.form);" id="create_button" />
    </td>
+
    <td id="chest_list_editor">
-    <h2>Chests</h2>
-    <select size="5" id="chest_list"></select>
-    <br />
-    <input type="button" value=" Edit " onclick="chestEdit(this.form);" />
-    <input type="button" value=" Delete " onclick="chestDelete(this.form);" />
+    <h2>Defined chests</h2>
+    <? printOptionSelect("chest_list", 5, FALSE); ?>
+    <table class="buttons">
+     <tr>
+      <td><input type="button" value=" Switch to " onclick="chestEdit(this.form);" /></td>
+      <td><input type="button" value=" Delete " onclick="chestDelete(this.form);" /></td>
+      <td><input type="button" value=" Edit " onclick="chestEditProps(this.form);" disabled="disabled" /></td>
+     </tr>
+    </table> 
    </td>
+
   </tr>
  </table>
 </form>
-<div style="position: absolute; bottom: 1em; right: 1em; left: 1em; padding: 1pt; margin: 2pt; border: 1px solid white;" id="status">&nbsp;</div>
+
+<!--
+ <div id="commands">
+  <textarea id="command_data" cols="80" rows="10">-</textarea>
+ </div>
+-->
+
+<div id="status">&nbsp;</div>
+
 <script type="text/javascript">
 <!--
 var curr_chest = null;
@@ -213,7 +274,7 @@
   }
 
   this.getItemByIndex = function(id) {
-    if (id < 0 || id > this.items.length) return null;
+    if (id < 0 || id >= this.items.length) return null;
     return this.items[id];
   }
 }
@@ -235,7 +296,7 @@
 
 echo
 "var list_chests = [".$str."];\n".
-"var list_items = ".getChestObject("items", 10000, $data["items"]).";\n";
+"var list_items = ".(isset($data["items"]) ? getChestObject("items", 10000, $data["items"]) : "null").";\n";
 ?>
 <!-- #kludge --><!--
 
@@ -260,7 +321,7 @@
 function updatePage()
 {
   // List of items
-  if (list_items.changed)
+  if (list_items != null && list_items.changed)
     setListData("curr_items", list_items.items);
 
   // List of chests
@@ -314,8 +375,8 @@
   var name = f.elements['chest_name'].value;
   var slots = parseInt(f.elements['chest_slots'].value, 10);
 
-  if (isNaN(slots) || slots < 1 || slots > 50) {
-    statusMsg("Invalid number of slots.");
+  if (isNaN(slots) || slots < 1) {
+    statusMsg("Number of slots not set or is invalid.");
     return;
   }
 
@@ -323,10 +384,15 @@
     statusMsg("Empty chest name "+name+".");
     return;
   }
+
+  if (name.match(/[^a-z0-9_]/i)) {
+    statusMsg("Invalid chest name, only alphanumerics and underscore are allowed.");
+    return;
+  }
   
   for (var i = 0; i < list_chests.length; i++) {
     if (list_chests[i].name == name) {
-      statusMsg("Chest with identifier <b>'"+name+"'</b> already exists!");
+      statusMsg("Chest with identifier '<b>"+name+"</b>' already exists!");
       return;
     }
   }
@@ -335,14 +401,64 @@
   list_chests.push(curr_chest);
 
   clearForm(f);
-  statusMsg("OK, created new chest.");
+  statusMsg("OK, created new chest '<b>"+name+"</b>' with <b>"+slots+"</b> slots.");
   updatePage();
 }
 
 
+function chestCheckSelected(f)
+{
+  var id = f.elements['chest_list'].selectedIndex;
+  
+  if (id < 0 || id >= list_chests.length) {
+    statusMsg("Invalid chest, internal error!");
+    return -1;
+  }
+
+  return {id: id, chest: list_chests[id]};
+}
+
+
+// Delete a chest from chest list
 function chestDelete(f)
 {
-  statusMsg("Deleted chest '"+name+"', items returned to pool.");
+  var ret = chestCheckSelected(f);
+  if (ret.id < 0 || ret.chest == null) return;
+
+  var name = ret.chest.name;
+  var len = ret.chest.items.length;
+
+  var answer = confirm("Really delete selected chest '"+name+"' and move "+len+" items back to pool?");
+  if (!answer) {
+    statusMsg("Delete operation cancelled.");
+    return;
+  }
+
+  if (curr_chest == ret.chest)
+    curr_chest = null;
+
+  for (var i = 0; i < len; i++)
+    ret.chest.moveItemById(list_items, i);
+
+  list_chests.splice(ret.id, 1);
+      
+  if (len > 0) {
+    statusMsg("Deleted chest '"+name+"', "+len+" items returned to pool.");
+  } else {
+    statusMsg("Deleted empty chest '"+name+"'.");
+  }
+  updatePage();
+}
+
+
+// Change currently edited chest to another
+function chestEdit(f)
+{
+  var ret = chestCheckSelected(f);
+  if (ret.id < 0 || ret.chest == null) return;
+
+  curr_chest = ret.chest;
+  statusMsg("Switched to chest '"+ret.chest.name+"'.");
   updatePage();
 }
 
@@ -432,6 +548,30 @@
   }
 }
 
+
+function createCommands(mode, f)
+{
+  if (list_chests.length == 0) {
+    statusMsg("No chest configurations created!");
+    return;
+  }
+  
+  var str = "";
+  for (var i = 0; i < list_chests.length; i++) {
+    var chest = list_chests[i];
+    for (var n = 0; n < chest.items.length; n++) {
+      if (mode == "batmud") {
+        str += "" + chest.items[n] +"";
+      }
+    }
+  }
+
+  var o = document.getElementById("commands");
+  o.style.display = "block";
+  o.innerHTML = str;
+}
+
+
 updatePage();
 -->
 </script>