Cleanup of old code, fixes some errors with folders view and make it a
authorfabien@tzone.org
Wed, 31 Dec 2008 15:41:32 -0500
changeset 74 6784c4350b41
parent 73 c078d8a04d76
child 75 4f6b7b48322f
Cleanup of old code, fixes some errors with folders view and make it a standard action.
.cvsignore
TODO
lib/.cvsignore
lib/actions.py
lib/actions/add.py
lib/actions/bookmark.py
lib/actions/edit.py
lib/actions/edit_prefs.py
lib/actions/editkw.py
lib/actions/folder.py
lib/actions/imp_xbel.py
lib/create_db.sql
lib/db/create_db.sql
lib/db/db.schema
lib/dynamic.py
lib/folders.py
lib/webutils.py
lib/xbelweb.py
templates/add_bk.tmpl
templates/add_confirm.tmpl
templates/edit_bk.tmpl
templates/folders.tmpl
--- a/.cvsignore	Wed Dec 31 01:53:22 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-*.pyc
-*.tmplc
-.htpasswd
--- a/TODO	Wed Dec 31 01:53:22 2008 -0500
+++ b/TODO	Wed Dec 31 15:41:32 2008 -0500
@@ -1,11 +1,10 @@
-* Add test unit.
+* Add more unit testing.
 * Add licences notes to src files.
 * Add synonymous support.
 * Add "new keyword" enlighting, maybe with link to keyword editing.
 * Add similar keywords suggestions.  Otherly said: "Bookmarks which have
-  X keywords also have this keywords. May be some frequency filter will
+  X keywords also have this keywords." May be some frequency filter will
   be needed.
-* Selection based bookmarks editions.
 * Used SQL sequence instead of the db_sequence table.
 * Add CSS.
 * Add Search capabilities.
@@ -19,3 +18,6 @@
 * More user preferences.
 * Clean up of all the code.  This is a real mess currently!
 * Optimization of some code part.
+* Add AJAX support.
+* Add cloud-like selection.
+* Add public/private field.
\ No newline at end of file
--- a/lib/.cvsignore	Wed Dec 31 01:53:22 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-*.pyc
-*.tmplc
--- a/lib/actions.py	Wed Dec 31 01:53:22 2008 -0500
+++ b/lib/actions.py	Wed Dec 31 15:41:32 2008 -0500
@@ -24,11 +24,11 @@
 		
 
 actions = ActionsLoader()
-actions['default'] = ('index', 'do_it')
 actions['index'] = ('index', 'do_it')
-actions['edit'] = ('edit', 'do_it')
 actions['import'] = ('imp_xbel', 'do_it')
-actions['add'] = ('add', 'do_it')
-actions['bookmark'] = ('add', 'do_it')
+actions['bookmark'] = ('bookmark', 'do_it')
 actions['keywords'] = ('editkw', 'do_it')
 actions['prefs'] = ('edit_prefs', 'do_it')
+actions['folder'] = ('folder', 'do_it')
+
+actions['default'] = actions['index']
--- a/lib/actions/add.py	Wed Dec 31 01:53:22 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-from templates import Template
-from bkmark import Bookmark
-from webutils import load_index
-from templates import Template
-from keywords import add_unique_keywords
-import os
-
-def get_bk_from_form(form):
-        bk = Bookmark()
-        bk.id = int(form['id'].value)
-        bk.url = form['url'].value
-        if form.has_key('name'):
-                bk.name = form['name'].value
-        if form.has_key('desc'):
-                bk.desc = form['desc'].value
-        return bk
-
-def get_kw_from_form(form):
-        kw = form.getvalue("kw")
-        if not isinstance(kw, type([])):
-                if kw:
-                        kw = [kw]
-                else:
-                        kw = []
-        kw = map(int, kw)
-        return kw
-
-def get_new_kw_from_form(form, sep =','):
-        if form.has_key('newkw'):
-                kw= map(lambda e: e.strip(),
-                        form['newkw'].value.split(','))
-                return filter(lambda x: x != '', kw)
-        else:
-                return []
-
-def get_unique_keywords(form, db):
-      kw = get_kw_from_form(form)
-      kw = set(map(db.get_keyword, kw))
-      return list(kw.union(get_new_kw_from_form(form)))
-
-def edit(db, prefs, form, id):
-    name = url = ""
-    if form.has_key("ctitle"):
-        name = form["ctitle"].value
-    if form.has_key("curl"):
-        url = form["curl"].value
-    kw = db.get_all_keywords()[1:]
-    kw.sort(lambda l,r: cmp(l[1],r[1]))
-    kw = map(lambda elem: {
-         'id' : elem[0],
-         'keyword' : elem[1],
-         'checked' : 0 }, kw)
-    print_edit(id, kw, name, url, prefs)
-
-def confirm(step, bk, kw, prefs):
-    tmpl = Template("add_confirm.tmpl", prefs)
-    confirmation = "Unknown!"
-    if (step == 'delete'):
-    	confirmation = "Delete" 
-    elif (step == 'update'):
-    	confirmation = "Update"
-    tmpl.set("confirmation", confirmation)
-    tmpl.set("step", step)
-    tmpl.set("id", bk.id)
-    tmpl.set("name", bk.name)
-    tmpl.set("url", bk.url)
-    tmpl.set("Keywords", map(lambda x: {'keyword': x }, kw))
-    tmpl.set("desc", bk.desc)
-    print tmpl.process()
-
-def print_edit(id, keywords, title, url, prefs):
-    tmpl = Template("add_bk.tmpl", prefs)
-    tmpl.set('ctitle', title)
-    tmpl.set('curl', url)
-    tmpl.set('desc', '')
-    tmpl.set('bkid', id)
-    tmpl.set('Keywords', keywords)
-    print tmpl.process()
-
-def update_bookmark(db, form):
-	bk = get_bk_from_form(form)
-	id = bk.id
-	if (bk.id == -1):
-		id = db.add_bookmark(bk)
-	else:
-		db.update_bookmark(bk)
-	kw = add_unique_keywords(db, get_unique_keywords(form, db))
-	db.update_keywords(id, kw.values())
-
-def do_it(action, db, prefs, form):
-        if form.has_key('id'):
-                id = int(form['id'].value)
-        else:
-                id = -1;
-        if form.has_key('step'):
-                step = form['step'].value
-        else:
-                step = 'edit'
-        if step == 'edit':
-                edit(db, prefs, form, id)
-	elif step == 'confirm':
-		update_bookmark(db, form)
-                load_index(db, prefs, form, "result", "Bookmark update")
-        elif step == 'cancel' or (action == 'delete' and id == -1):
-                load_index(db, prefs, form, "err", "Operation cancel")
-        else:
-                if step == 'update':
-                        bk = get_bk_from_form(form)
-                        kw = get_unique_keywords(form, db)
-                else:
-                        bk = db.get_bookmarks([id])[0]
-                        (ids, kw) = apply(zip,db.get_keywords([id]))
-                        kw = kw[1:]
-                confirm(step, bk, kw, prefs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/actions/bookmark.py	Wed Dec 31 15:41:32 2008 -0500
@@ -0,0 +1,114 @@
+from templates import Template
+from bkmark import Bookmark
+from webutils import load_index
+from templates import Template
+from keywords import add_unique_keywords
+import os
+
+def get_bk_from_form(form):
+        bk = Bookmark()
+        bk.id = int(form['id'].value)
+        bk.url = form['url'].value
+        if form.has_key('name'):
+                bk.name = form['name'].value
+        if form.has_key('desc'):
+                bk.desc = form['desc'].value
+        return bk
+
+def get_kw_from_form(form):
+        kw = form.getvalue("kw")
+        if not isinstance(kw, type([])):
+                if kw:
+                        kw = [kw]
+                else:
+                        kw = []
+        kw = map(int, kw)
+        return kw
+
+def get_new_kw_from_form(form, sep =','):
+        if form.has_key('newkw'):
+                kw= map(lambda e: e.strip(),
+                        form['newkw'].value.split(','))
+                return filter(lambda x: x != '', kw)
+        else:
+                return []
+
+def get_unique_keywords(form, db):
+      kw = get_kw_from_form(form)
+      kw = set(map(db.get_keyword, kw))
+      return list(kw.union(get_new_kw_from_form(form)))
+
+def edit(db, prefs, form, id):
+    name = url = ""
+    if form.has_key("ctitle"):
+        name = form["ctitle"].value
+    if form.has_key("curl"):
+        url = form["curl"].value
+    kw = db.get_all_keywords()[1:]
+    kw.sort(lambda l,r: cmp(l[1],r[1]))
+    kw = map(lambda elem: {
+         'id' : elem[0],
+         'keyword' : elem[1],
+         'checked' : 0 }, kw)
+    print_edit(id, kw, name, url, prefs)
+
+def confirm(step, bk, kw, prefs):
+    tmpl = Template("add_confirm.tmpl", prefs)
+    confirmation = "Unknown!"
+    if (step == 'delete'):
+    	confirmation = "Delete" 
+    elif (step == 'update'):
+    	confirmation = "Update"
+    tmpl.set("confirmation", confirmation)
+    tmpl.set("step", step)
+    tmpl.set("id", bk.id)
+    tmpl.set("name", bk.name)
+    tmpl.set("url", bk.url)
+    tmpl.set("Keywords", map(lambda x: {'keyword': x }, kw))
+    tmpl.set("desc", bk.desc)
+    print tmpl.process()
+
+def print_edit(id, keywords, title, url, prefs):
+    tmpl = Template("add_bk.tmpl", prefs)
+    tmpl.set('ctitle', title)
+    tmpl.set('curl', url)
+    tmpl.set('desc', '')
+    tmpl.set('bkid', id)
+    tmpl.set('Keywords', keywords)
+    print tmpl.process()
+
+def update_bookmark(db, form):
+	bk = get_bk_from_form(form)
+	id = bk.id
+	if (bk.id == -1):
+		id = db.add_bookmark(bk)
+	else:
+		db.update_bookmark(bk)
+	kw = add_unique_keywords(db, get_unique_keywords(form, db))
+	db.update_keywords(id, kw.values())
+
+def do_it(action, db, prefs, form):
+        if form.has_key('id'):
+                id = int(form['id'].value)
+        else:
+                id = -1;
+        if form.has_key('step'):
+                step = form['step'].value
+        else:
+                step = 'edit'
+        if step == 'edit':
+                edit(db, prefs, form, id)
+	elif step == 'confirm':
+		update_bookmark(db, form)
+                load_index(db, prefs, form, "result", "Bookmark update")
+        elif step == 'cancel' or (action == 'delete' and id == -1):
+                load_index(db, prefs, form, "err", "Operation cancel")
+        else:
+                if step == 'update':
+                        bk = get_bk_from_form(form)
+                        kw = get_unique_keywords(form, db)
+                else:
+                        bk = db.get_bookmarks([id])[0]
+                        (ids, kw) = apply(zip,db.get_keywords([id]))
+                        kw = kw[1:]
+                confirm(step, bk, kw, prefs)
--- a/lib/actions/edit.py	Wed Dec 31 01:53:22 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#!/usr/bin/python
-
-from templates import Template
-
-def main(keywords, bk, prefs):
-    tmpl = Template("add_bk.tmpl", prefs)
-    tmpl.set('ctitle', bk.name)
-    tmpl.set('curl', bk.url)
-    tmpl.set('desc', bk.desc)
-    tmpl.set('bkid', bk.id)
-    tmpl.set('Keywords', keywords)
-    print tmpl.process()
-
-def do_it(action, db, prefs, form):
-    id = int(form["id"].value)
-    bk = db.get_bookmarks([id])[0]
-    kw = db.get_all_keywords()[1:]
-    kw.sort(lambda l,r: cmp(l[1],r[1]))
-    (ids, kws) = apply(zip,db.get_keywords([id]))
-    kw = map(lambda elem: {
-   	 'id' : elem[0],
-   	 'keyword' : elem[1],
-	 'selected' : elem[0] in ids }, kw)
-    main(kw, bk, prefs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/actions/folder.py	Wed Dec 31 15:41:32 2008 -0500
@@ -0,0 +1,26 @@
+from templates import Template
+from folders import do_folders
+
+def add_folder(db, form):
+	keyword = int(form['selection'].value)
+	parent = 0
+	if (form.has_key('folder'):
+		parent = int(form['folder'].value)
+	db.add_folder(keyword, parent)
+
+def remove_folder(db, form):
+	keyword = int(form['selection'].value)
+	db.remove_folders(keyword)
+
+def do_it(action, db, prefs, form):
+	status = 'result'
+	status_msg = 'Unknown action'
+	if form.has_key('step'):
+		step = form['step'].value
+		if (step == 'add'):
+			add_folder(db, form)
+			status_msg = "Folder successfully added."
+		elif (step == 'delete'):
+			remove_folder(db, form)
+			status_msg = "Folder successfully removed."
+	do_folders(db, prefs, form, status, status_msg)
--- a/lib/create_db.sql	Wed Dec 31 01:53:22 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
---
-
-CREATE TABLE users (
-  id int NOT NULL,
-  name varchar(255) DEFAULT '' NOT NULL,
-  full_name varchar(255) DEFAULT '',
-  PRIMARY KEY (id)
-);
-
-CREATE INDEX index_users_name ON users(name);
-
-CREATE TABLE preferences (
-  userid int NOT NULL,
-  keywords_box int DEFAULT 5 not NULL,
-  keywords_sort varchar(31) DEFAULT 'keyword' NOT NULL,
-  keywords_reverse boolean DEFAULT FALSE NOT NULL,
-  default_view int DEFAULT 0 not NULL,
-  PRIMARY KEY (userid)
-);
-
---
--- Table structure for table 'bookmark'
---
-CREATE TABLE bookmarks (
-  id int NOT NULL,
-  userid int NOT NULL,
-  url varchar(1023) DEFAULT '' NOT NULL,
-  name varchar(1023) DEFAULT '' NOT NULL,
-  ldesc varchar(1023) DEFAULT '' NOT NULL,
-  added date DEFAULT '1998-01-01' NOT NULL,
-  PRIMARY KEY (id, userid)
-);
-
-CREATE INDEX index_bookmarks_userid ON bookmarks(userid);
-
---
--- Table structure for table 'keywords'
---
-CREATE TABLE keywords (
-  id int DEFAULT '0' NOT NULL,
-  userid int DEFAULT '0' NOT NULL,
-  name varchar(255) DEFAULT '' NOT NULL,
-  PRIMARY KEY (id, userid)
-);
-
-CREATE INDEX index_keywords_name ON keywords(userid, name);
-
---
--- Cross reference table for linking keywords and bookmarks
---
-
-CREATE TABLE bookmarks_keywords (
-  bookmark int NOT NULL,
-  keyword int DEFAULT '0' NOT NULL,
-  userid int DEFAULT '0' NOT NULL,
-  PRIMARY KEY (bookmark, keyword, userid)
-);
-
-CREATE INDEX index_bkkw_kwuser ON bookmarks_keywords (keyword, userid);
-CREATE INDEX index_bkkw_user ON bookmarks_keywords (userid);
-CREATE INDEX index_bkkw_bkuser ON bookmarks_keywords (bookmark, userid);
-
--- 
--- Folders structure
---
-
-CREATE TABLE folders (
-  id int DEFAULT '0' NOT NULL,
-  userid int DEFAULT '0' NOT NULL,
-  keyword int DEFAULT '0' NOT NULL,
-  parent int DEFAULT '0' NOT NULL,
-  PRIMARY KEY (id, userid)
-);
-
-CREATE INDEX index_folders_parent ON folders (userid, parent);
-
---
--- Table structure for table 'db_sequence'
---
-CREATE TABLE db_sequence (
-  seq_name varchar(30)    DEFAULT '' NOT NULL,
-  userid int DEFAULT '0' NOT NULL,
-  nextid int DEFAULT '0' NOT NULL,
-  PRIMARY KEY (seq_name, userid)
-);
-
-INSERT INTO db_sequence (seq_name, userid, nextid) VALUES ('users' , -1, 0);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/db/create_db.sql	Wed Dec 31 15:41:32 2008 -0500
@@ -0,0 +1,87 @@
+--
+
+CREATE TABLE users (
+  id int NOT NULL,
+  name varchar(255) DEFAULT '' NOT NULL,
+  full_name varchar(255) DEFAULT '',
+  PRIMARY KEY (id)
+);
+
+CREATE INDEX index_users_name ON users(name);
+
+CREATE TABLE preferences (
+  userid int NOT NULL,
+  keywords_box int DEFAULT 5 not NULL,
+  keywords_sort varchar(31) DEFAULT 'keyword' NOT NULL,
+  keywords_reverse boolean DEFAULT FALSE NOT NULL,
+  default_view int DEFAULT 0 not NULL,
+  PRIMARY KEY (userid)
+);
+
+--
+-- Table structure for table 'bookmark'
+--
+CREATE TABLE bookmarks (
+  id int NOT NULL,
+  userid int NOT NULL,
+  url varchar(1023) DEFAULT '' NOT NULL,
+  name varchar(1023) DEFAULT '' NOT NULL,
+  ldesc varchar(1023) DEFAULT '' NOT NULL,
+  added date DEFAULT '1998-01-01' NOT NULL,
+  PRIMARY KEY (id, userid)
+);
+
+CREATE INDEX index_bookmarks_userid ON bookmarks(userid);
+
+--
+-- Table structure for table 'keywords'
+--
+CREATE TABLE keywords (
+  id int DEFAULT '0' NOT NULL,
+  userid int DEFAULT '0' NOT NULL,
+  name varchar(255) DEFAULT '' NOT NULL,
+  PRIMARY KEY (id, userid)
+);
+
+CREATE INDEX index_keywords_name ON keywords(userid, name);
+
+--
+-- Cross reference table for linking keywords and bookmarks
+--
+
+CREATE TABLE bookmarks_keywords (
+  bookmark int NOT NULL,
+  keyword int DEFAULT '0' NOT NULL,
+  userid int DEFAULT '0' NOT NULL,
+  PRIMARY KEY (bookmark, keyword, userid)
+);
+
+CREATE INDEX index_bkkw_kwuser ON bookmarks_keywords (keyword, userid);
+CREATE INDEX index_bkkw_user ON bookmarks_keywords (userid);
+CREATE INDEX index_bkkw_bkuser ON bookmarks_keywords (bookmark, userid);
+
+-- 
+-- Folders structure
+--
+
+CREATE TABLE folders (
+  id int DEFAULT '0' NOT NULL,
+  userid int DEFAULT '0' NOT NULL,
+  keyword int DEFAULT '0' NOT NULL,
+  parent int DEFAULT '0' NOT NULL,
+  PRIMARY KEY (id, userid)
+);
+
+CREATE INDEX index_folders_parent ON folders (userid, parent);
+
+--
+-- Table structure for table 'db_sequence'
+--
+CREATE TABLE db_sequence (
+  seq_name varchar(30)    DEFAULT '' NOT NULL,
+  userid int DEFAULT '0' NOT NULL,
+  nextid int DEFAULT '0' NOT NULL,
+  PRIMARY KEY (seq_name, userid)
+);
+
+INSERT INTO db_sequence (seq_name, userid, nextid) VALUES ('users' , -1, 0);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/db/db.schema	Wed Dec 31 15:41:32 2008 -0500
@@ -0,0 +1,38 @@
+users
+ * id : int
+ + name : string
+ + full_name : string
+
+preferences
+ * userid : int
+ + keywords_box : int
+ + keywords_sort : string
+
+bookmarks
+ * id : int
+ * userid : int
+ + url : string
+ + name : string
+ + ldesc : string
+ + added : date
+
+keywords
+ * id: int
+ * userid : int
+ + name : string
+
+bookmarks_keywords
+ * bookmark : int
+ * keyword : int
+ * userid : int
+
+folders:
+ * id : int
+ * userid : int
+ + keyword : int
+ + parent : int
+
+db_sequence:
+ * seq_name : string
+ * userid : int
+ + nextid : int
\ No newline at end of file
--- a/lib/folders.py	Wed Dec 31 01:53:22 2008 -0500
+++ b/lib/folders.py	Wed Dec 31 15:41:32 2008 -0500
@@ -1,21 +1,5 @@
 from templates import Template
 from keywords import set_selection, sort_keywords
-from __future__ import nested_scopes
-
-def do_folder_action(db, form, folder):
-   if form['action'].value == 'add':
-    	if form.has_key('sel'):
-		keyword = int(form['sel'].value)
-		db.add_folder(keyword, folder)
-		print "<em>Folder successfully add.</em>"
-		return keyword
-   elif form['action'].value == 'delete':
-   	if form.has_key('delete'):
-		keyword = int(form['delete'].value)
-		db.remove_folders(keyword)
-		print "<em>Folder successfully remove.</em>"
-		return keyword
-   return -1
 
 def sort_kw_with_removed(l, r):
 	result = l['removed'] - r['removed']
@@ -39,11 +23,8 @@
 
 def do_folders(db, prefs, form, status, status_msg):
     folder = 0
-    if form:
-    	if form.has_key('folder'):
-    		folder = int(form['folder'].value)
-   	if form.has_key('action'):
-		do_folder_action(db, form, folder)
+    if form.has_key('folder'):
+    	folder = int(form['folder'].value)
     parents = db.get_folder_parents_and_self(folder)
     parents.reverse()
     children = db.get_subfolders(folder)
--- a/templates/add_bk.tmpl	Wed Dec 31 01:53:22 2008 -0500
+++ b/templates/add_bk.tmpl	Wed Dec 31 15:41:32 2008 -0500
@@ -3,7 +3,7 @@
   <body>
     <h1><TMPL_VAR remote_user>'s Edit Bookmark</h1>
     <form action="" method="post" name="add">
-      <input type="hidden" name="action" value="add"/>
+      <input type="hidden" name="action" value="bookmark"/>
       <fieldset class="bookmark">
         <input type="hidden" name="id" value="<TMPL_VAR bkid>"/>
         <label>Nom: <input type="text" name="name"
--- a/templates/add_confirm.tmpl	Wed Dec 31 01:53:22 2008 -0500
+++ b/templates/add_confirm.tmpl	Wed Dec 31 15:41:32 2008 -0500
@@ -3,10 +3,10 @@
   <TMPL_INCLUDE NAME="headers.tmpl">
   <body>
     <h1><TMPL_VAR remote_user>'s Confirmation</h1>
-    <form name="confirmation" method="post" action="?action=add">
+    <form name="confirmation" method="post" action="">
       <fieldset>
         <legend>Bookmark</legend>
-	<input type="hidden" name="action" value="add"/>
+	<input type="hidden" name="action" value="bookmark"/>
 	<input type="hidden" name="id" value="<TMPL_VAR id>"/>
 	<input type="hidden" name="name" value="<TMPL_VAR name>"/>
 	<input type="hidden" name="url" value="<TMPL_VAR url>"/>
--- a/templates/edit_bk.tmpl	Wed Dec 31 01:53:22 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-<html>
-  <TMPL_INCLUDE NAME="headers.tmpl">
-  <body>
-    <h1><TMPL_VAR remote_user>'s Edit Bookmark</h1>
-    <form action="?action=bookmark" method="post" name="edit">
-      <fieldset class="bookmark">
-        <input type="hidden" name="action" value="bookmark"/>
-        <input type="hidden" name="id" value="<TMPL_VAR bkid>"/>
-        <label>Nom: <input type="text" name="name"
-	  value="<TMPL_VAR ctitle>"/></label><br/>
-        <label>URL: <input type="text" name="url"
-	  value="<TMPL_VAR curl>"/></label><br/>
-        <label for="desc">Description: </label><br/>
-        <textarea name="desc" rows="5" cols="40"><TMPL_VAR desc></textarea>
-      </fieldset>
-      <fieldset class="keywords">
-        <legend>Keywords:</legend>
-	<label>Selected:
-	<select multiple name="kw" size="<TMPL_VAR kw_size>">
-	<TMPL_LOOP Keywords>
-	  <option value="<TMPL_VAR id>"
-	  <TMPL_IF selected>selected</TMPL_IF> />
-	  <TMPL_VAR keyword></option>
-	</TMPL_LOOP>
-	</select>
-	<label>New keywords: <input type="text" name="newkw"> (comma
-	separated list)</label><br/>
-	<button type="reset">Reset</button>
-      </fieldset>
-      <button type="submit" name="step" value="update">Submit</button>
-      <button type="submit" name="step" value="delete">Delete</button>
-      <button type="submit" name="step" value="cancel">Cancel</button>
-    </form>
-  </body>
-</html>
-<!--
-vi: syntax=html
--->
--- a/templates/folders.tmpl	Wed Dec 31 01:53:22 2008 -0500
+++ b/templates/folders.tmpl	Wed Dec 31 15:41:32 2008 -0500
@@ -2,7 +2,7 @@
 <html>
   <TMPL_INCLUDE NAME="headers.tmpl">
   <body>
-    <TMPL_INCLUDE "top.tmpl">
+    <TMPL_INCLUDE NAME="top.tmpl">
     <TMPL_IF folder>
       <p>Parents: 
         <TMPL_LOOP Parents>
@@ -15,29 +15,31 @@
     <h2><TMPL_IF folder><TMPL_VAR name><TMPL_ELSE>Main Folder</TMPL_IF>
     (<TMPL_VAR subtotal>/<TMPL_VAR total>)</h2>
     <DIV class="subfolders">
-    <form action="?action=index&view=folder&folder=<TMPL_VAR folder>" method="post" name="edit_folders">
+    <form action="" method="post" name="edit_folders">
+    <input type="hidden" name="action" value="folder"/>
     <input type="hidden" name="folder" value="<TMPL_VAR folder>"/>
     <input type="hidden" name="view" value="folder"/>
-    <input type="hidden" name="action" value="delete"/>
+    <input type="hidden" name="step" value="delete"/>
     <ul>
     <TMPL_LOOP Subfolders>
-      <li><button name="delete" value="<TMPL_VAR id>">Delete</button>
+      <li><button name="selection" value="<TMPL_VAR id>">Delete</button>
       <a href="?action=index&view=folder&folder=<TMPL_VAR id>"><TMPL_VAR name>
       	(<TMPL_VAR count>)</a></li>
     </TMPL_LOOP>
     </ul>
     </form>
     </div>
-    <form action="?action=index&view=folder&folder=<TMPL_VAR folder>" method="post" name="add_folder">
+    <form action="" method="post" name="add_folder">
       <label>Add subfolder with keyword:
+      <input type="hidden" name="action" value="folder"/>
+      <input type="hidden" name="view" value="folder"/>
       <input type="hidden" name="folder" value="<TMPL_VAR folder>"/>
-      <input type="hidden" name="view" value="folder"/>
 	<select name="sel" size="1">
 	<TMPL_LOOP Keywords>
-	  <option value="<TMPL_VAR id>"
+	  <option name="selection" value="<TMPL_VAR id>"
 	    ><TMPL_VAR keyword> (<TMPL_VAR removed>/<TMPL_VAR count>)</option>
 	</TMPL_LOOP></select>
-	<button name="action" value="add">Add</button>
+	<button name="step" value="add">Add</button>
     </form>
     <hr>
     <TMPL_INCLUDE NAME="bkmarks.tmpl">