Index: INSTALL.txt
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/INSTALL.txt,v
retrieving revision 1.3.4.1.2.1
diff -u -p -r1.3.4.1.2.1 INSTALL.txt
--- INSTALL.txt	26 Feb 2008 20:00:18 -0000	1.3.4.1.2.1
+++ INSTALL.txt	12 May 2008 22:52:23 -0000
@@ -1,7 +1,7 @@
 Requirements
 ------------
 
-This module requires Drupal 5
+This module requires Drupal 6
 
 Installation
 ------------
Index: nodequeue.actions.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/nodequeue.actions.inc,v
retrieving revision 1.1.2.3
diff -u -p -r1.1.2.3 nodequeue.actions.inc
--- nodequeue.actions.inc	26 Feb 2008 18:44:10 -0000	1.1.2.3
+++ nodequeue.actions.inc	12 May 2008 22:52:23 -0000
@@ -7,141 +7,158 @@
  */
 
 /**
- * Action to add a node to a queue.
+ * Implments hook_action_info... I think.
+ *
  */
-function action_nodequeue_add($op, $edit = array(), $node) {
-  switch($op) {
-    case 'metadata':
-      return array(
-        'description' => t('Add to Node Queues'),
-        'type' => t('node'),
-        'batchable' => true,
-        'configurable' => true,
-      );
-      break;
+function nodequeue_action_info() {
+  return array(
+    'nodequeue_add_action' => array(
+      'description' => t('Add to Node Queues'),
+      'type' => 'node',
+      'batchable' => true,
+      'configurable' => true,
+      'hooks' => array(
+        'nodeapi' => array('insert', 'update'),
+      ),
+    ),
+    'nodequeue_remove_action' => array(
+      'description' => t('Remove from Node Queues'),
+      'type' => 'node',
+      'batchable' => true,
+      'configurable' => true,
+      'hooks' => array(
+        'nodeapi' => array('delete', 'update'),
+      ),
+    ),
+  );
+}
 
-    case 'do':
-      $queues = nodequeue_load_queues($edit['qids']);
-      // Filter out queues by node type. We choose not to use nodequeue_get_qids() because it checks for access control which only matters if we administering a queue.
-      $eligible_queues = array();
-      foreach ($queues as $queue) {
-        if (in_array($node->type, $queue->types)) {
-          $eligible_queues[$queue->qid] = $queue;
-        }
-      }
-      
-      if (!empty($eligible_queues)) {
-        // Remove the node from the eligible queues (if needed).
-        action_nodequeue_remove('do', array('qids' => array_keys($eligible_queues)), $node);
-
-        // Use API to get the eligible subqueues
-        $eligible_subqueues = nodequeue_get_subqueues_by_node($eligible_queues, $node);
-
-        // Add node to each subqueue.
-        foreach ($eligible_subqueues as $subqueue) {
-          nodequeue_subqueue_add($queues[$subqueue->qid], $subqueue, $node->nid);
-        }
-      }
-      break;
-
-    // return an HTML config form for the action
-    case 'form':
-      // default values for form
-      if (!isset($edit['qids'])) $edit['qids'] = '';
-
-      $queues = nodequeue_load_queues(nodequeue_get_all_qids(500));
-      foreach ($queues as $qid => $queue) {
-        $options[$qid] = $queue->title;
-      }
-      $form = array();
-      if (count($options)) {
-        // add form components
-        $form['qids'] = array(
-          '#type' => 'select',
-          '#title' => t("Queue"),
-          '#default_value' => $edit['qids'],
-          '#multiple' => TRUE,
-          '#options' => $options,
-          '#required' => TRUE,
-          '#description' => t('Specify the queues into which the node should be submitted. If the queue is a smartqueue, the node shall be placed into every subqueue for which it is eligible.')
-          );
-      }
-      else {
-        drupal_set_message(t('Please <a href="!url">create</a> a nodequeue first.', array('!url' => url('admin/content/nodequeue'))));
-      }
-      return $form;
-
-     // validate the HTML form
-
-    // process the HTML form to store configuration
-    case 'submit':
-      $params = array(
-        'qids' => $edit['qids']
+/**
+ * Configuration form for the nodequeue_add_action.
+ *
+ * @param array $context
+ *   Context of action - contains previous values
+ * @return array
+ *   Form array.
+ */
+function nodequeue_add_action_form($context) {
+  // default values for form
+  if (!isset($context['qids'])) $context['qids'] = '';
+
+  $queues = nodequeue_load_queues(nodequeue_get_all_qids(500));
+  foreach ($queues as $qid => $queue) {
+    $options[$qid] = $queue->title;
+  }
+  $form = array();
+  if (count($options)) {
+    // add form components
+    $form['qids'] = array(
+      '#type' => 'select',
+      '#title' => t("Queue"),
+      '#default_value' => $context['qids'],
+      '#multiple' => TRUE,
+      '#options' => $options,
+      '#required' => TRUE,
+      '#description' => t('Specify the queues into which the node should be submitted. If the queue is a smartqueue, the node shall be placed into every subqueue for which it is eligible.')
       );
-      return $params;
-      break;
   }
+  else {
+    drupal_set_message(t('Please <a href="!url">create</a> a nodequeue first.', array('!url' => url('admin/content/nodequeue'))));
+  }
+  return $form;
+}
+
+function nodequeue_add_action_submit($form, $form_state) {
+  $params = array(
+    'qids' => $form_state['values']['qids']
+  );
+  return $params;
 }
 
 /**
- * Action to remove a node from a queue.
+ * Action to add a node to a queue.
  */
-function action_nodequeue_remove($op, $edit = array(), $node) {
-  switch($op) {
-    case 'metadata':
-      return array(
-        'description' => t('Remove from Node Queues'),
-        'type' => t('node'),
-        'batchable' => true,
-        'configurable' => true,
-      );
-      break;
+function nodequeue_add_action($context, $node) {
 
-    case 'do':
-      $qids = $edit['qids'];
-      // If a node is being deleted, ensure it's also removed from any queues.
-      $placeholders = implode(',', array_fill(0, count($qids), '%d'));
-      $args = $qids;
-      $args[] = $node->nid;
-      $result = db_query("SELECT * FROM {nodequeue_nodes} WHERE qid IN ($placeholders) AND nid = %d", $args);
-      while ($obj = db_fetch_object($result)) {
-        // This removes by nid, not position, because if we happen to have a
-        // node in a queue twice, the 2nd position would be wrong.
-        nodequeue_subqueue_remove_node($obj->sqid, $node->nid);
-      }
-      break;
-
-    // return an HTML config form for the action
-    case 'form':
-      // default values for form
-      if (!isset($edit['qids'])) $edit['qids'] = array();
-
-      $queues = nodequeue_load_queues(nodequeue_get_all_qids(500));
-      foreach ($queues as $qid => $queue) {
-        $options[$qid] = $queue->title;
-      }
-
-      // add form components
-      $form['qids'] = array(
-        '#type' => 'select',
-        '#title' => t("Queues"),
-        '#default_value' => $edit['qids'],
-        '#multiple' => TRUE,
-        '#decription' => t('Specify the queues from which the node should be removed. If the queue is a smartqueue, the node shall be removed from all subqueues.'),
-        '#required' => TRUE,
-        '#options' => $options,
-      );
-      return $form;
-      break;
+  $queues = nodequeue_load_queues($edit['qids']);
+  // Filter out queues by node type. We choose not to use nodequeue_get_qids() because it checks for access control which only matters if we administering a queue.
+  $eligible_queues = array();
+  foreach ($queues as $queue) {
+    if (in_array($node->type, $queue->types)) {
+      $eligible_queues[$queue->qid] = $queue;
+    }
+  }
+  
+  if (!empty($eligible_queues)) {
+    // Remove the node from the eligible queues (if needed).
+    action_nodequeue_remove('do', array('qids' => array_keys($eligible_queues)), $node);
+
+    // Use API to get the eligible subqueues
+    $eligible_subqueues = nodequeue_get_subqueues_by_node($eligible_queues, $node);
+
+    // Add node to each subqueue.
+    foreach ($eligible_subqueues as $subqueue) {
+      nodequeue_subqueue_add($queues[$subqueue->qid], $subqueue, $node->nid);
+    }
+  }
+}
 
-     // validate the HTML form
+/**
+ * Form for configuring a node removal action
+ *
+ * @param array $context
+ * @return array
+ */
+function nodequeue_remove_action_form($context) {
+  // default values for form
+  if (!isset($context['qids'])) $context['qids'] = array();
+
+  $queues = nodequeue_load_queues(nodequeue_get_all_qids(500));
+  foreach ($queues as $qid => $queue) {
+    $options[$qid] = $queue->title;
+  }
 
-    // process the HTML form to store configuration
-    case 'submit':
-      $params = array(
-        'qids' => $edit['qids']
-      );
-      return $params;
-      break;
+  // add form components
+  $form['qids'] = array(
+    '#type' => 'select',
+    '#title' => t("Queues"),
+    '#default_value' => $context['qids'],
+    '#multiple' => TRUE,
+    '#decription' => t('Specify the queues from which the node should be removed. If the queue is a smartqueue, the node shall be removed from all subqueues.'),
+    '#required' => TRUE,
+    '#options' => $options,
+  );
+  return $form;
+}
+
+/**
+ * Form submit handler for nodequeue_remove_action
+ *
+ * @param unknown_type $form
+ * @param unknown_type $form_state
+ * @return unknown
+ */
+function nodequeue_remove_action_submit($form, $form_state) {
+  $params = array(
+    'qids' => $form_state['values']['qids']
+  );
+  return $params;
+}
+
+/**
+ * Action to remove a node from a queue.
+ */
+function nodequeue_remove_action($op, $edit = array(), $node) {
+  $qids = $edit['qids'];
+  // If a node is being deleted, ensure it's also removed from any queues.
+  $placeholders = db_placeholders($qids, 'int'); //implode(',', array_fill(0, count($qids), '%d'));
+  $args = $qids;
+  $args[] = $node->nid;
+  $result = db_query("SELECT * FROM {nodequeue_nodes} WHERE qid IN ($placeholders) AND nid = %d", $args);
+  while ($obj = db_fetch_object($result)) {
+    // This removes by nid, not position, because if we happen to have a
+    // node in a queue twice, the 2nd position would be wrong.
+    nodequeue_subqueue_remove_node($obj->sqid, $node->nid);
   }
+  break;
 }
Index: nodequeue.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.info,v
retrieving revision 1.1.2.4.2.1
diff -u -p -r1.1.2.4.2.1 nodequeue.info
--- nodequeue.info	2 Aug 2007 02:13:00 -0000	1.1.2.4.2.1
+++ nodequeue.info	12 May 2008 22:52:23 -0000
@@ -2,3 +2,4 @@
 name = Node Queue
 description = Create queues which can contain nodes in arbitrary order
 package = Node Queue
+core = 6.x
Index: nodequeue.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.install,v
retrieving revision 1.3.2.10.2.12
diff -u -p -r1.3.2.10.2.12 nodequeue.install
--- nodequeue.install	26 Feb 2008 19:27:54 -0000	1.3.2.10.2.12
+++ nodequeue.install	12 May 2008 22:52:23 -0000
@@ -1,143 +1,207 @@
 <?php
-// $Id: nodequeue.install,v 1.3.2.10.2.12 2008/02/26 19:27:54 merlinofchaos Exp $
+// $Id: nodequeue.install,v 1.3.2.10.2.10 2008/01/02 00:51:05 merlinofchaos Exp $
 
-function nodequeue_install() {
-  drupal_set_message('Installing nodequeue');
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-        db_query("CREATE TABLE if not exists {nodequeue_queue} (
-          qid int(10) unsigned NOT NULL PRIMARY KEY,
-          title varchar(255) NOT NULL,
-          subqueue_title varchar(255) NOT NULL,
-          size int(3) unsigned default '0',
-          link varchar(255),
-          link_remove varchar(255),
-          owner varchar(255) default 'nodequeue',
-          show_in_ui int(1) default '1',
-          show_in_tab int(1) default '1',
-          show_in_links int(1) default '1',
-          reference varchar(255) default '0',
-          reverse tinyint
-        ) /*!40100 DEFAULT CHARACTER SET utf8 */");
-
-        db_query("CREATE TABLE if not exists {nodequeue_roles} (
-          qid int(10) unsigned NOT NULL,
-          rid int(10) unsigned,
-          KEY {nodequeue_roles}_qid_idx (qid),
-          KEY {nodequeue_roles}_rid_idx (rid)
-        )/*!40100 DEFAULT CHARACTER SET utf8 */");
-
-        db_query("CREATE TABLE if not exists {nodequeue_types} (
-          qid int(10) unsigned NOT NULL,
-          type varchar(255),
-          KEY {nodequeue_types}_qid_idx (qid),
-          KEY {nodequeue_types}_type_idx (type)
-        )/*!40100 DEFAULT CHARACTER SET utf8 */");
-
-        // Subqueues are minor queues that inherit all of the properties of
-        // the parent queue. A parent queue must have at least 1 subqueue
-        // to do anything. Reference is for the use of whatever is creating
-        // the subqueues in order to link it to some other ID easily.
-        db_query("CREATE TABLE if not exists {nodequeue_subqueue} (
-          sqid int(10) unsigned PRIMARY KEY,
-          qid int(10) unsigned NOT NULL,
-          reference varchar(255) default 0,
-          title varchar(255) default '',
-          KEY {nodequeue_subqueue}_qid_idx (qid),
-          KEY {nodequeue_subqueue}_reference_idx (reference),
-          KEY {nodequeue_subqueue}_title_idx (title)
-        )/*!40100 DEFAULT CHARACTER SET utf8 */");
-
-        db_query("CREATE TABLE if not exists {nodequeue_nodes} (
-          qid int(10) unsigned NOT NULL,
-          sqid int(10) unsigned NOT NULL,
-          nid int(10) unsigned,
-          position int(3) unsigned,
-          timestamp int unsigned NOT NULL default '0',
-          KEY {nodequeue_nodes}_sqid_idx (sqid, position),
-          KEY {nodequeue_nodes}_nid_idx (nid)
-        )/*!40100 DEFAULT CHARACTER SET utf8 */");
-      $success = TRUE;
-      break;
-
-    case 'pgsql':
-        db_query("CREATE TABLE {nodequeue_queue} (
-          qid integer NOT NULL PRIMARY KEY,
-          title varchar(255) NOT NULL,
-          size integer default '0',
-          owner varchar(255) default 'nodequeue',
-          show_in_ui integer default '1',
-          show_in_tab integer default '1',
-          link varchar(255),
-          link_remove varchar(255),
-          reverse smallint
-        )");
-
-        db_query("CREATE TABLE {nodequeue_roles} (
-          qid integer NOT NULL,
-          rid integer
-        )");
-        db_query("CREATE INDEX {nodequeue_roles}_qid_idx ON {nodequeue_roles} (qid)");
-        db_query("CREATE INDEX {nodequeue_roles}_rid_idx ON {nodequeue_roles} (rid)");
-
-        db_query("CREATE TABLE {nodequeue_types} (
-          qid integer NOT NULL,
-          type varchar(255)
-        )");
-        db_query("CREATE INDEX {nodequeue_types}_qid_idx ON {nodequeue_types} (qid)");
-
-        db_query("CREATE TABLE {nodequeue_nodes} (
-          sqid integer NOT NULL,
-          qid integer NOT NULL,
-          nid integer,
-          position integer,
-          timestamp integer NOT NULL default '0'
-        )");
-        db_query("CREATE INDEX {nodequeue_nodes}_sqid_idx ON {nodequeue_nodes} (sqid, position)");
-        db_query("CREATE INDEX {nodequeue_nodes}_nid_idx ON {nodequeue_nodes} (nid)");
-
-        db_query("CREATE SEQUENCE nodequeue_queue_qid_seq INCREMENT 1 START 1");
-      $success = TRUE;
-      break;
-  }
-  if ($success) {
-    drupal_set_message(t('Nodequeue module installed tables successfully.'));
-  }
-  else {
-    drupal_set_message(t('The installation of nodequeue module was unsuccessful.'),
-'error');
-  }
-}
-
-function nodequeue_uninstall() {
-  $tables = array(
-    'nodequeue_queue',
-    'nodequeue_subqueue',
-    'nodequeue_roles',
-    'nodequeue_types',
-    'nodequeue_nodes',
-  );
-  foreach ($tables as $table) {
-    if (db_table_exists($table)) {
-      db_query("DROP TABLE {$table}");
-    }
-  }
-
-  if ($GLOBALS['db_type'] == 'pgsql') {
-    db_query("DROP SEQUENCE nodequeue_queue_qid_seq;");
-  }
-  else {
-    $names = array(
-      'nodequeue_queue_qid',
-      'nodequeue_subqueue_sqid',
-    );
-    foreach ($names as $name) {
-      db_query("DELETE FROM {sequences} WHERE name = '%s'", $name);
-    }
-  }
+function nodequeue_schema() {
+  $schema['nodequeue_queue'] = array(
+    'description' => t('Base table for queues, storing global information for each queue'),
+    'fields' => array(
+      'qid' => array(
+        'description' => t('The primary identifier for a queue.'),
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE
+      ),
+      'title' => array(
+        'description' => t('Title of a queue.'),
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'subqueue_title' => array(
+        'description' => '',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'size' => array(
+        'description' => t('How many nodes this queue will hold'),
+        'type' => 'int',
+        'default' => 0,
+      ),
+      'link' => array(
+        'description' => t('The link text to show under a node to add it to the queue.'),
+        'type' => 'varchar',
+        'length' => 40,
+      ),
+      'link_remove' => array(
+        'description' => t('The link text to show under a node to remove it from the queue.'),
+        'type' => 'varchar',
+        'length' => 40,
+      ),
+      'owner' => array(
+        'description' => '',
+        'type' => 'varchar',
+        'length' => 255,
+      ),
+      'show_in_ui' => array(
+        'description' => '',
+        'type' => 'int',
+        'size' => 'tiny',
+        'default' => 1,
+      ),
+      'show_in_tab' => array(
+        'description' => '',
+        'type' => 'int',
+        'size' => 'tiny',
+        'default' => 1,
+      ),
+      'show_in_links' => array(
+        'description' => '',
+        'type' => 'int',
+        'size' => 'tiny',
+        'default' => 1,
+      ),
+      'reference' => array(
+        'description' => '',
+        'type' => 'varchar',
+        'length' => 255,
+        'default' => '0',
+      ),
+      'reverse' => array(
+        'description' => '',
+        'type' => 'int',
+        'size' => 'tiny',
+      ),
+    ), // fields
+    'primary key' => array('qid'),
+  ); // nodequeue_queue.
+  $schema['nodequeue_roles'] = array(
+    'description' => t('Defines the roles which are allowed to use a particular nodequeue.'),
+    'fields' => array(
+      'qid' => array(
+        'description' => t('Primary key for {nodequeue_queue}'),
+        'type' => 'int',
+        'size' => 'big',
+        'unsigned' => TRUE,
+        'not null' => TRUE
+      ),
+      'rid' => array(
+        'description' => t('Primary key for roles'),
+        'type' => 'int',
+        'size' => 'big',
+        'unsigned' => TRUE,
+      ),
+    ), // fields
+    'indexes' => array(
+      '{nodequeue_roles}_qid_idx' => array('qid'),
+      '{nodequeue_roles}_rid_idx' => array('rid'),
+    ), // indexes
+  ); // nodequeue_roles
+  $schema['nodequeue_types'] = array(
+    'description' => t('Defines the node types which are allowed in each queue'),
+    'fields' => array(
+      'qid' => array(
+        'description' => t('Primary key for {nodequeue_queue}'),
+        'type' => 'int',
+        'size' => 'big',
+        'unsigned' => TRUE,
+        'not null' => TRUE
+      ),
+      'type' => array(
+        'description' => t('Node Type'),
+        'type' => 'varchar',
+        'length' => 255,
+      ),
+    ), // fields
+    'indexes' => array(
+      '{nodequeue_types}_qid_idx' => array('qid'),
+      '{nodequeue_types}_type_idx' => array('type'),
+    ), // indexes
+  ); // nodequeue_types
+  
+  // Subqueues are minor queues that inherit all of the properties of
+  // the parent queue. A parent queue must have at least 1 subqueue
+  // to do anything. Reference is for the use of whatever is creating
+  // the subqueues in order to link it to some other ID easily.
+  $schema['nodequeue_subqueue'] = array(
+    'description' => t('Subqueues are minor queues that inherit all of the properties of the parent queue. A parent queue must have at least 1 subqueue to do anything. Reference is for the use of whatever is creating the subqueues in order to link it to some other ID easily.'),
+    'fields' => array(
+      'sqid' => array(
+        'description' => t('Subqueue identifier'),
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'qid' => array(
+        'description' => t('Queue identifier.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'reference' => array(
+        'description' => '',
+        'type' => 'varchar',
+        'length' => 255,
+        'default' => '0',
+      ),
+      'title' => array(
+        'description' => '',
+        'type' => 'varchar',
+        'length' => 255,
+        'default' => '',
+      ),
+    ), // fields
+    'primary key' => array('sqid'),
+    'indexes' => array(
+      '{nodequeue_subqueue}_qid_idx' => array('qid'),
+      '{nodequeue_subqueue}_reference_idx' => array('reference'),
+      '{nodequeue_subqueue}_title_idx' => array('title'),
+    ), // indexes
+  ); // nodequeue_subqueue
+
+  $schema['nodequeue_nodes'] = array(
+    'description' => t('Indicates which nodes are in which queues/subqueues.'),
+    'fields' => array(
+      'qid' => array(
+        'description' => t('Queue id'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'sqid' => array(
+        'description' => t('Subqueue this node is in'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'nid' => array(
+        'description' => t('Node id in this subqueue'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+      ),
+      'position' => array(
+        'description' => t('The position of the node in this subqueue.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+      ),
+      'timestamp' => array(
+        'description' => t(''),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ), // fields
+    'indexes' => array(
+      '{nodequeue_nodes}_sqid_idx' => array('sqid', 'position'),
+      '{nodequeue_subqueue}_nid_idx' => array('nid'),
+    ), // indexes
+  ); // nodequeue_nodes
+  
+  return $schema;
 }
 
+// TODO: Figure out what to fix here?
 function nodequeue_update_1() {
   if ($GLOBALS['db_type'] == 'pgsql') {
     db_query("CREATE SEQUENCE nodequeue_queue_qid_seq INCREMENT 1 START 1");
@@ -148,22 +212,38 @@ function nodequeue_update_5000() {
   $ret = array();
   $ret[] = t(array('success' => TRUE, 'query' => 'Some of the following queries may appear to fail. This is not a problem.'));
 
-  $ret[] = update_sql("ALTER TABLE {nodequeue_queue} ADD COLUMN link VARCHAR(40) DEFAULT '' NOT NULL");
-  $ret[] = update_sql("ALTER TABLE {nodequeue_queue} ADD COLUMN link_remove VARCHAR(40) DEFAULT '' NOT NULL");
-
-  $ret[] = update_sql("CREATE INDEX {nodequeue_roles}_qid_idx ON {nodequeue_roles} (qid)");
-  $ret[] = update_sql("CREATE INDEX {nodequeue_roles}_rid_idx ON {nodequeue_roles} (rid)");
-  $ret[] = update_sql("CREATE INDEX {nodequeue_types}_qid_idx ON {nodequeue_types} (qid)");
-  $ret[] = update_sql("CREATE INDEX {nodequeue_nodes}_qid_idx ON {nodequeue_nodes} (qid, position)");
-  $ret[] = update_sql("CREATE INDEX {nodequeue_nodes}_nid_idx ON {nodequeue_nodes} (nid)");
+  db_add_field($ret, "nodequeue_queue", "link", array(
+        'description' => t('The link text to show under a node to add it to the queue.'),
+        'type' => 'varchar',
+        'length' => 40,
+      ));
+  db_add_field($ret, "nodequeue_queue", "link_remove", array(
+        'description' => t('The link text to show under a node to remove it from the queue.'),
+        'type' => 'varchar',
+        'length' => 40,
+      ));
+  //$ret[] = update_sql("ALTER TABLE {nodequeue_queue} ADD COLUMN link VARCHAR(40) DEFAULT '' NOT NULL");
+  //$ret[] = update_sql("ALTER TABLE {nodequeue_queue} ADD COLUMN link_remove VARCHAR(40) DEFAULT '' NOT NULL");
+
+  db_add_index($ret, 'nodequeue_roles', "{nodequeue_roles}_qid", array('qid'));
+  db_add_index($ret, "nodequeue_roles", "{nodequeue_roles}_rid", array('rid'));
+  db_add_index($ret, "nodequeue_types", "{nodequeue_types}_qid", array('qid'));
+  db_add_index($ret, "nodequeue_nodes", "{nodequeue_nodes}_qid", array('qid', 'position'));
+  db_add_index($ret, "nodequeue_nodes", "{nodequeue_nodes}_nid", array('nid'));
+  //$ret[] = update_sql("CREATE INDEX {nodequeue_roles}_qid_idx ON {nodequeue_roles} (qid)");
+  //$ret[] = update_sql("CREATE INDEX {nodequeue_roles}_rid_idx ON {nodequeue_roles} (rid)");
+  //$ret[] = update_sql("CREATE INDEX {nodequeue_types}_qid_idx ON {nodequeue_types} (qid)");
+  //$ret[] = update_sql("CREATE INDEX {nodequeue_nodes}_qid_idx ON {nodequeue_nodes} (qid, position)");
+  //$ret[] = update_sql("CREATE INDEX {nodequeue_nodes}_nid_idx ON {nodequeue_nodes} (nid)");
 
-  $ret[] = _system_update_utf8(array('nodequeue_queue', 'nodequeue_roles', 'nodequeue_types', 'nodequeue_nodes'));
+  // TODO: Figure out how to fix this?
+  //$ret[] = _system_update_utf8(array('nodequeue_queue', 'nodequeue_roles', 'nodequeue_types', 'nodequeue_nodes'));
   return $ret;
 }
 
 function nodequeue_update_5001() {
   $ret = array();
-  switch ($GLOBALS['db_type']) {
+  /*switch ($GLOBALS['db_type']) {
     case 'mysql':
     case 'mysqli':
       $ret[] = update_sql("ALTER TABLE {nodequeue_nodes} ADD COLUMN timestamp int DEFAULT '0' NOT NULL");
@@ -171,95 +251,109 @@ function nodequeue_update_5001() {
     case 'pgsql':
       db_add_column($ret, 'nodequeue_nodes', 'timestamp', 'integer', array('default' => 0, 'not null' => TRUE));
       break;
-  }
+  }*/
+  db_add_column($ret, 'nodequeue_nodes', 'timestamp', array('type' => 'int', 'default' => 0, 'not null' => TRUE));
   return $ret;
 }
 
 function nodequeue_update_5201() {
   $ret = array();
   // Add new columns to the nodequeue_queue table.
-  db_add_column($ret, 'nodequeue_queue', 'owner', 'varchar(255)', array('default' => "'nodequeue'"));
-  db_add_column($ret, 'nodequeue_queue', 'show_in_ui', 'integer', array('default' => 1));
-  db_add_column($ret, 'nodequeue_queue', 'show_in_tab', 'integer', array('default' => 1));
-  db_add_column($ret, 'nodequeue_queue', 'show_in_links', 'integer', array('default' => 1));
-  db_add_column($ret, 'nodequeue_queue', 'reference', 'varchar(255)', array('default' => 0));
+  db_add_column($ret, 'nodequeue_queue', 'owner', array('type' => 'varchar', 'length' => 255, 'default' => "'nodequeue'"));
+  db_add_column($ret, 'nodequeue_queue', 'show_in_ui', array('type' => 'int', 'default' => 1));
+  db_add_column($ret, 'nodequeue_queue', 'show_in_tab', array('type' => 'int', 'default' => 1));
+  db_add_column($ret, 'nodequeue_queue', 'show_in_links', array('type' => 'int', 'default' => 1));
+  db_add_column($ret, 'nodequeue_queue', 'reference', array('type' => 'varchar', 'length' => 255, 'default' => 0));
 
   // Create the nodequeue_subqueue table.
   $ret[] = update_sql("UPDATE {nodequeue_queue} SET owner = 'nodequeue', show_in_ui = 1, show_in_tab = 1, show_in_links = 1, reference = 0");
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      $ret[] = update_sql("CREATE TABLE if not exists {nodequeue_subqueue} (
-          sqid int(10) unsigned PRIMARY KEY,
-          qid int(10) unsigned NOT NULL,
-          reference varchar(255) default 0,
-          title varchar(255) default '',
-          KEY {nodequeue_subqueue}_qid_idx (qid),
-          KEY {nodequeue_subqueue}_reference_idx (reference),
-          KEY {nodequeue_subqueue}_title_idx (title)
-        )/*!40100 DEFAULT CHARACTER SET utf8 */");
-      break;
-    case 'pgsql':
-      break;
-  }
+  
+  db_add_table($ret, 'nodequeue_subqueue', array(
+    'description' => t('Subqueues are minor queues that inherit all of the properties of the parent queue. A parent queue must have at least 1 subqueue to do anything. Reference is for the use of whatever is creating the subqueues in order to link it to some other ID easily.'),
+    'fields' => array(
+      'sqid' => array(
+        'description' => t('Subqueue identifier'),
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'qid' => array(
+        'description' => t('Queue identifier.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'reference' => array(
+        'description' => '',
+        'type' => 'varchar',
+        'length' => 255,
+        'default' => '0',
+      ),
+      'title' => array(
+        'description' => '',
+        'type' => 'varchar',
+        'length' => 255,
+        'default' => '',
+      ),
+    ), // fields
+    'primary key' => array('sqid'),
+    'indexes' => array(
+      '{nodequeue_subqueue}_qid_idx' => array('qid'),
+      '{nodequeue_subqueue}_reference_idx' => array('reference'),
+      '{nodequeue_subqueue}_title_idx' => array('title'),
+    ), // indexes
+  ));
 
   // Populate the nodequeue_subqueue table.
   $result = db_query("SELECT * FROM {nodequeue_queue}");
   while ($queue = db_fetch_object($result)) {
     // Keep the qid so that we can update our sequence table later on.
     $last_qid = $queue->qid;
-    $ret[] = update_sql("INSERT INTO {nodequeue_subqueue} (sqid, qid, reference, title) VALUES ($queue->qid, $queue->qid, $queue->qid, '$queue->title')");
-  }
-
-  if (isset($last_qid)) {
-    // Fix the sequences
-    switch ($GLOBALS['db_type']) {
-      case 'mysql':
-      case 'mysqli':
-        $ret[] = update_sql("INSERT INTO {sequences} (name, id) VALUES ('{nodequeue_subqueue}_sqid', $last_qid)");
-        break;
-      case 'pgsql':
-        // I don't believe we need to do anything here.
-        break;
-    }
+    $ret[] = update_sql("INSERT INTO {nodequeue_subqueue} (sqid, qid, reference, title) VALUES (%d, %d, %d, '%s')", $queue->qid, $queue->qid, $queue->qid, $queue->title);
   }
 
   // Transform the nodequeue_nodes table.
-  db_add_column($ret, 'nodequeue_nodes', 'sqid', 'integer');
+  db_add_field($ret, 'nodequeue_nodes', 'sqid', array('type' => 'int'));
   $ret[] = update_sql("UPDATE {nodequeue_nodes} SET sqid = qid");
-  $ret[] = update_sql("CREATE INDEX {nodequeue_nodes}_sqid_idx ON {nodequeue_nodes} (sqid, position)");
+  db_add_index($ret, 'nodequeue_nodes', '{nodequeue_nodes}_sqid', array('sqid', 'position'));
+  //$ret[] = update_sql("CREATE INDEX {nodequeue_nodes}_sqid_idx ON {nodequeue_nodes} (sqid, position)");
 
   return $ret;
 }
 
 function nodequeue_update_5202() {
   $ret = array();
-  db_add_column($ret, 'nodequeue_queue', 'subqueue_title', 'varchar(255)');
+  db_add_field($ret, 'nodequeue_queue', 'subqueue_title', array('type' => 'varchar', 'length' => 255));
   return $ret;
 }
 
 function nodequeue_update_5203() {
   $ret = array();
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_add_column($ret, 'nodequeue_queue', 'reverse', 'int(1)');
-      break;
-    // This update was broken on PgSQL, but is fixed in 5204 below.
-  }
+  db_add_field($ret, 'nodequeue_queue', 'reverse', array(type => 'int'));
   return $ret;
 }
 
 function nodequeue_update_5204() {
   $ret = array();
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      $ret[] = update_sql("ALTER TABLE {nodequeue_queue} MODIFY COLUMN reverse tinyint");
-      break;
-    case 'pgsql':
-      db_add_column($ret, 'nodequeue_queue', 'reverse', 'smallint');
-      break;
-  }
+  db_change_field($ret, 'nodequeue_queue', 'reverse', 'reverse', array('type' => 'int', 'size' => 'tiny'));
+  return $ret;
+}
+
+/**
+ * There was a discrepancy between the link/link_remove fields created with node_install/node_schema, and the ones created with nodequeue_update_5000.  This forces everyone to 40 characters.
+ *
+ */
+function nodequeue_update_6000() {
+  $ret = array();
+  db_change_field($ret, 'nodequeue_queue', 'link', 'link', array('type' => 'varchar', 'length' => 40));
+  db_change_field($ret, 'nodequeue_queue', 'link_remove', 'link_remove', array('type' => 'varchar', 'length' => 40));
   return $ret;
 }
+
+function nodequeue_install() {
+  drupal_install_schema('nodequeue');
+}
+
+function nodequeue_uninstall() {
+  drupal_uninstall_schema('nodequeue');
+}
\ No newline at end of file
Index: nodequeue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.module,v
retrieving revision 1.39.2.28.2.30
diff -u -p -r1.39.2.28.2.30 nodequeue.module
--- nodequeue.module	26 Feb 2008 19:27:54 -0000	1.39.2.28.2.30
+++ nodequeue.module	12 May 2008 22:52:24 -0000
@@ -8,7 +8,7 @@
  * Implementation of hook_perm
  */
 function nodequeue_perm() {
-  return array ('manipulate queues', 'administer nodequeue', 'manipulate all queues');
+  return array('manipulate queues', 'administer nodequeue', 'manipulate all queues');
 }
 
 /**
@@ -17,222 +17,200 @@ function nodequeue_perm() {
  * Loads subsidiary includes for other modules.
  */
 function nodequeue_init() {
-  if (module_exists('actions')) {
-    include_once drupal_get_path('module', 'nodequeue') . '/nodequeue.actions.inc';
-  }
+  include_once drupal_get_path('module', 'nodequeue') .'/nodequeue.actions.inc';
 
   if (module_exists('views')) {
-    include_once drupal_get_path('module', 'nodequeue') . '/nodequeue.views.inc';
+    include_once drupal_get_path('module', 'nodequeue') .'/nodequeue.views.inc';
   }
 }
 
 /**
+ * Helper function - since hook_menu now takes a function instead of a boolean, this function is used to compute the user's access.
+ *
+ * @return boolean
+ */
+function _nodequeue_access_admin_or_manipulate() {
+  return user_access('administer nodequeue') || user_access('manipulate queues');
+}
+
+/**
  * Implementation of hook_menu
  */
-function nodequeue_menu($may_cache) {
+function nodequeue_menu() {
   $items = array();
-  global $user;
+  
+  $admin_access = array('administer nodequeue');
+  $access = array('manipulate queues');
 
-  $admin_access = user_access('administer nodequeue');
-  $access = user_access('manipulate queues');
-
-  if ($may_cache) {
-    $manipulate = user_access('manipulate all queues');
-    // administrative items
-    $items[] = array(
-      'path' => 'admin/content/nodequeue',
-      'title' => t('Node queue'),
-      'access' => $admin_access || $access,
-      'callback' => 'nodequeue_view_queues',
-      'description' => t('Create and maintain simple node queues.'),
-      'type' => MENU_NORMAL_ITEM
-    );
-    $items[] = array(
-      'path' => 'admin/content/nodequeue/list',
-      'title' => t('List'),
-      'access' => $admin_access || $access,
-      'callback' => 'nodequeue_view_queues',
-      'weight' => -1,
-      'type' => MENU_DEFAULT_LOCAL_TASK
-    );
-    $items[] = array(
-      'path' => 'admin/content/nodequeue/settings',
-      'title' => t('Settings'),
-      'access' => $admin_access,
-      'callback' => 'drupal_get_form',
-      'callback arguments' => array('nodequeue_admin_settings'),
+  // administrative items  
+  $items['admin/content/nodequeue'] = array(
+    'title' => t('Node queue'),
+    'access callback' => '_nodequeue_access_admin_or_manipulate',
+    'page callback' => 'nodequeue_view_queues',
+    'description' => t('Create and maintain simple node queues.'),
+    'type' => MENU_NORMAL_ITEM
+  );
+  $items['admin/content/nodequeue/list'] = array(
+    'title' => t('List'),
+    'access callback' => '_nodequeue_access_admin_or_manipulate',
+    'page callback' => 'nodequeue_view_queues',
+    'weight' => -1,
+    'type' => MENU_DEFAULT_LOCAL_TASK
+  );
+  $items['admin/content/nodequeue/settings'] = array(
+    'title' => t('Settings'),
+    'access arguments' => $admin_access,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('nodequeue_admin_settings'),
+    'type' => MENU_LOCAL_TASK
+  );
+  $items['nodequeue/autocomplete'] = array(
+    'title' => t('Autocomplete'),
+    'access arguments' => $access,
+    'page callback' => 'nodequeue_autocomplete',
+    'type' => MENU_CALLBACK
+  );
+  $items['nodequeue/ajax/add'] = array(
+    'title' => t('ajax add'),
+    'access arguments' => $access,
+    'page callback' => 'nodequeue_ajax_add',
+    'type' => MENU_CALLBACK
+  );
+  // Add a new nodequeue of a given type
+  $info = nodequeue_api_info();
+  foreach ($info as $key => $data) {
+    $items['admin/content/nodequeue/add/'. $key] = array(
+      'title' => t('Add @type', array('@type' => strtolower($data['title']))),
+      'access arguments' => $admin_access,
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('nodequeue_edit_queue_form', $key),
       'type' => MENU_LOCAL_TASK
     );
-    $items[] = array(
-      'path' => 'nodequeue/autocomplete',
-      'title' => t('Autocomplete'),
-      'access' => $access,
-      'callback' => 'nodequeue_autocomplete',
-      'type' => MENU_CALLBACK
-    );
-    $items[] = array(
-      'path' => 'nodequeue/ajax/add',
-      'title' => t('ajax add'),
-      'access' => $access,
-      'callback' => 'nodequeue_ajax_add',
-      'type' => MENU_CALLBACK
-    );
-    $info = nodequeue_api_info();
-    foreach ($info as $key => $data) {
-      $items[] = array(
-        'path' => 'admin/content/nodequeue/add/' . $key,
-        'title' => t('Add @type', array('@type' => strtolower($data['title']))),
-        'access' => $admin_access,
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('nodequeue_edit_queue_form', $key),
-        'type' => MENU_LOCAL_TASK
-      );
-    }
   }
-  else {
-    if ($user && arg(0) == 'node' && is_numeric(arg(1)) && arg(1) > 0 && $access && variable_get('nodequeue_use_tab', 1)) {
-      $node = node_load(arg(1));
-      // nodequeue tab for a node.
-      if ($node && $queues = nodequeue_load_queues_by_type($node->type, 'tab')) {
-        $items[] = array(
-          'path' => 'node/' . arg(1) . '/nodequeue',
-          'title' => variable_get('nodequeue_tab_name', t('Node queue')),
-          'access' => $access,
-          'callback' => 'nodequeue_node_tab',
-          'callback arguments' => array($node, $queues),
-          'type' => MENU_LOCAL_TASK,
-          'weight' => 5
-        );
-      }
-    }
 
-    // Administrative items for an individual queue.
-    if ($access &&
-        arg(0) == 'admin' &&
-        arg(1) == 'content' &&
-        arg(2) == 'nodequeue' &&
-        is_numeric(arg(3)) &&
-        $queue = nodequeue_load(arg(3))) {
-
-      $access = nodequeue_queue_access($queue);
-      drupal_set_title(t("Nodequeue '@title'", array('@title' => $queue->title)));
-      $items[] = array(
-        'path' => 'admin/content/nodequeue/' . $queue->qid,
-        'access' => $access,
-        'callback' => 'nodequeue_admin_view',
-        'callback arguments' => array($queue),
-        'type' => MENU_CALLBACK
-      );
-      $items[] = array(
-        'path' => 'admin/content/nodequeue/' . $queue->qid . '/view',
-        'title' => t('View'),
-        'access' => $access,
-        'callback' => 'nodequeue_admin_view',
-        'callback arguments' => array($queue),
-        'weight' => -10,
-        'type' => MENU_DEFAULT_LOCAL_TASK
-      );
-      // Actual administrative items.
-      $items[] = array(
-        'path' => 'admin/content/nodequeue/' . $queue->qid . '/edit',
-        'title' => t('Edit'),
-        'access' => $admin_access,
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('nodequeue_edit_queue_form', $queue),
-        'type' => MENU_LOCAL_TASK
-      );
-      $items[] = array(
-        'path' => 'admin/content/nodequeue/' . $queue->qid . '/delete',
-        'title' => t('Delete'),
-        'access' => $admin_access,
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('nodequeue_admin_delete', $queue),
-        'weight' => 5,
-        'type' => MENU_CALLBACK
-      );
+  // Note: This path used to set up with a call to nodequeue_load_queues_by_type, passing the result in.  Now, that function is called inside of nodequeue_node_tab.
+  $items['node/%node/nodequeue'] = array(
+    'title' => variable_get('nodequeue_tab_name', t('Node queue')),
+    'access callback' => 'user_access',
+    'access arguments' => $access,
+    'page callback' => 'nodequeue_node_tab',
+    'page arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 5
+  );
+
+  // Administrative items for an individual queue.
+  $items['admin/content/nodequeue/%nodequeue'] = array(
+    'access arguments' => array(3),
+    'access callback' => 'nodequeue_queue_access',
+    'page callback' => 'nodequeue_admin_view',
+    'page arguments' => array(3),
+    'type' => MENU_CALLBACK
+  );
+  $items['admin/content/nodequeue/%nodequeue/view'] = array(
+    'title' => t('View'),
+    'access arguments' => array(3),
+    'access callback' => 'nodequeue_queue_access',
+    'page callback' => 'nodequeue_admin_view',
+    'page arguments' => array(3),
+    'weight' => -10,
+    'type' => MENU_DEFAULT_LOCAL_TASK
+  );
+  // Actual administrative items.
+  $items['admin/content/nodequeue/%nodequeue/edit'] = array(
+    'title' => t('Edit'),
+    'access arguments' => $admin_access,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('nodequeue_edit_queue_form', 3),
+    'type' => MENU_LOCAL_TASK
+  );
+  $items['admin/content/nodequeue/%nodequeue/delete'] = array(
+    'title' => t('Delete'),
+    'access arguments' => $admin_access,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('nodequeue_admin_delete', 3),
+    'weight' => 5,
+    'type' => MENU_CALLBACK
+  );
 
-      $sqid = arg(5);
+      /*$sqid = arg(5);
       if (is_numeric($sqid) && $subqueue = nodequeue_load_subqueue($sqid)) {
         // The following operations require a sqid and a nid.
         $nid = arg(6);
         if (in_array(arg(4), array('add', 'remove-node')) &&
             is_numeric($nid)) {
           $node = node_load($nid);
-        }
+        }*/
+
+
+  $items["admin/content/nodequeue/%nodequeue/add/%/%node"] = array(
+    'access arguments' => array(6, 3),
+    'access callback' => 'nodequeue_node_and_queue_access',
+    'page callback' => 'nodequeue_admin_add_node',
+    'page arguments' => array(3, 5, 6),
+    'type' => MENU_CALLBACK
+  );
+  $items["admin/content/nodequeue/%nodequeue/remove-node/%/%node"] = array(
+    'access arguments' => array(6, 3),
+    'access callback' => 'nodequeue_node_and_queue_access',
+    'page callback' => 'nodequeue_admin_remove_node',
+    'page arguments' => array(3, 5, 6),
+    'type' => MENU_CALLBACK
+  );
+
+  // NB: For the following menu paths, the value in spot 6 is the position, not the nid.
+  $items["admin/content/nodequeue/%nodequeue/up/%/%"] = array(
+    'access arguments' => array(3),
+    'access callback' => 'nodequeue_queue_access',
+    'page callback' => 'nodequeue_admin_up',
+    'page arguments' => array(3, 5, 6),
+    'type' => MENU_CALLBACK
+  );
+  $items["admin/content/nodequeue/%nodequeue/down/%/%"] = array(
+    'access arguments' => array(3),
+    'access callback' => 'nodequeue_queue_access',
+    'page callback' => 'nodequeue_admin_down',
+    'page arguments' => array(3, 5, 6),
+    'type' => MENU_CALLBACK
+  );
+  $items["admin/content/nodequeue/%nodequeue/front/%/%"] = array(
+    'access arguments' => array(3),
+    'access callback' => 'nodequeue_queue_access',
+    'page callback' => 'nodequeue_admin_front',
+    'page arguments' => array(3, 5, 6),
+    'type' => MENU_CALLBACK
+  );
+  $items["admin/content/nodequeue/%nodequeue/back/%/%"] = array(
+    'access arguments' => array(3),
+    'access callback' => 'nodequeue_queue_access',
+    'page callback' => 'nodequeue_admin_back',
+    'page arguments' => array(3, 5, 6),
+    'type' => MENU_CALLBACK
+  );
+  $items["admin/content/nodequeue/%nodequeue/remove/%/%"] = array(
+    'access arguments' => array(3),
+    'access callback' => 'nodequeue_queue_access',
+    'page callback' => 'nodequeue_admin_remove',
+    'page arguments' => array(3, 5, 6),
+    'type' => MENU_CALLBACK
+  );
+
+  $items["admin/content/nodequeue/%nodequeue/clear/%"] = array(
+    'title' => t('Clear'),
+    'access arguments' => array(3),
+    'access callback' => 'nodequeue_queue_access',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('nodequeue_clear_confirm', 3, 5),
+    'type' => MENU_CALLBACK
+  );
 
-        if ($node && nodequeue_node_access($node->type)) {
-          $items[] = array(
-            'path' => "admin/content/nodequeue/$queue->qid/add/$sqid/$nid",
-            'access' => $access,
-            'callback' => 'nodequeue_admin_add_node',
-            'callback arguments' => array($queue, $subqueue, $node),
-            'type' => MENU_CALLBACK
-          );
-          $items[] = array(
-            'path' => "admin/content/nodequeue/$queue->qid/remove-node/$sqid/$nid",
-            'access' => $access,
-            'callback' => 'nodequeue_admin_remove_node',
-            'callback arguments' => array($queue, $subqueue, $node),
-            'type' => MENU_CALLBACK
-          );
-        }
-
-        if (is_numeric($nid)) {
-          // IN this case, $nid is actually $pos but why rename the var?
-          $items[] = array(
-            'path' => "admin/content/nodequeue/$queue->qid/up/$sqid",
-            'access' => $access,
-            'callback' => 'nodequeue_admin_up',
-            'callback arguments' => array($queue, $subqueue, $nid),
-            'type' => MENU_CALLBACK
-          );
-          $items[] = array(
-            'path' => "admin/content/nodequeue/$queue->qid/down/$sqid",
-            'access' => $access,
-            'callback' => 'nodequeue_admin_down',
-            'callback arguments' => array($queue, $subqueue, $nid),
-            'type' => MENU_CALLBACK
-          );
-          $items[] = array(
-            'path' => "admin/content/nodequeue/$queue->qid/front/$sqid",
-            'access' => $access,
-            'callback' => 'nodequeue_admin_front',
-            'callback arguments' => array($queue, $subqueue, $nid),
-            'type' => MENU_CALLBACK
-          );
-          $items[] = array(
-            'path' => "admin/content/nodequeue/$queue->qid/back/$sqid",
-            'access' => $access,
-            'callback' => 'nodequeue_admin_back',
-            'callback arguments' => array($queue, $subqueue, $nid),
-            'type' => MENU_CALLBACK
-          );
-          $items[] = array(
-            'path' => "admin/content/nodequeue/$queue->qid/remove/$sqid",
-            'access' => $access,
-            'callback' => 'nodequeue_admin_remove',
-            'callback arguments' => array($queue, $subqueue, $nid),
-            'type' => MENU_CALLBACK
-          );
-        }
-        $items[] = array(
-          'path' => "admin/content/nodequeue/$queue->qid/clear/$sqid",
-          'title' => t('Clear'),
-          'access' => $access,
-          'callback' => 'drupal_get_form',
-          'callback arguments' => array('nodequeue_clear_confirm', $queue, $subqueue),
-          'type' => MENU_CALLBACK
-        );
-      }
-    }
-  }
   return $items;
 }
 /**
  * Implementation of hook_nodeapi
  */
 function nodequeue_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
-  switch($op) {
+  switch ($op) {
     case 'delete':
       // If a node is being deleted, ensure it's also removed from any queues.
       $result = db_query("SELECT * FROM {nodequeue_nodes} WHERE nid = %d", $node->nid);
@@ -247,7 +225,7 @@ function nodequeue_nodeapi(&$node, $op, 
 
 /**
  * Implementation of hook_link
- */
+ */ 
 function nodequeue_link($type, $node = NULL, $teaser = FALSE) {
   if ($type == 'node' &&
       variable_get('nodequeue_links', FALSE) &&
@@ -269,19 +247,20 @@ function nodequeue_link($type, $node = N
     }
 
     nodequeue_set_subqueue_positions($subqueues, $node->nid);
+    //drupal_set_message(dprint_r($subqueues, true));
 
     foreach ($subqueues as $subqueue) {
       $queue = $queues[$subqueue->qid];
       $query_string = nodequeue_get_query_string($node->nid, TRUE);
       if (!isset($subqueue->position)) {
-        $links['nodequeue-ajax-toggle-' . $subqueue->sqid] = array(
+        $links['nodequeue-ajax-toggle-'. $subqueue->sqid] = array(
           'title' => nodequeue_title_substitute($queue->link, $queue, $subqueue),
           'href' => "admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid",
           'attributes' => array('class' => 'nodequeue-ajax-toggle'),
           'query' => $query_string);
       }
       else if ($queue->link_remove) {
-        $links['nodequeue-ajax-toggle-' . $subqueue->sqid] = array(
+        $links['nodequeue-ajax-toggle-'. $subqueue->sqid] = array(
           'title' => nodequeue_title_substitute($queue->link_remove, $queue, $subqueue),
           'href' => "admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid",
           'attributes' => array('class' => 'nodequeue-ajax-toggle'),
@@ -292,7 +271,7 @@ function nodequeue_link($type, $node = N
     drupal_add_css(drupal_get_path('module', 'nodequeue') .'/nodequeue.css');
   }
   return $links;
-}
+} 
 
 // --------------------------------------------------------------------------
 // Nodequeue Admin operations
@@ -312,9 +291,7 @@ function nodequeue_js_output($label, $hr
     $return->sqid = $sqid;
   }
 
-  // let the world know this isn't normal output.
-  drupal_set_header('Content-type: text/javascript');
-  print drupal_to_js($return);
+  drupal_json($return);
   exit;
 }
 
@@ -322,23 +299,23 @@ function nodequeue_js_output($label, $hr
  * Page callback to add a node to a queue.
  */
 function nodequeue_admin_add_node($queue, $subqueue, $node) {
-  if (!nodequeue_check_token($node->nid)) {
+  if (!is_numeric($subqueue) || !nodequeue_check_token($node->nid)) {
     return drupal_goto();
   }
-
+  $subqueue = nodequeue_load_subqueue($subqueue);
   nodequeue_subqueue_add($queue, $subqueue, $node->nid);
 
   // Provide a response if this is javascript.
   if (!empty($_POST['js'])) {
     if (isset($_GET['tab'])) {
       nodequeue_js_output(t('Remove from queue'),
-        url("admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid", nodequeue_get_query_string($node->nid, TRUE, array('tab'))),
+        url("admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid", array('query' => nodequeue_get_query_string($node->nid, TRUE, array('tab')))),
         nodequeue_subqueue_size_text($queue->size, $queue->size ? min($subqueue->count + 1, $queue->size) : $subqueue->count + 1, FALSE),
         $subqueue->sqid);
     }
     else {
       nodequeue_js_output(nodequeue_title_substitute($queue->link_remove, $queue, $subqueue),
-        url("admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid", nodequeue_get_query_string($node->nid, TRUE)));
+        url("admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid", array('query' => nodequeue_get_query_string($node->nid, TRUE))));
     }
   }
 
@@ -350,23 +327,23 @@ function nodequeue_admin_add_node($queue
  * Page callback to remove a node from a queue.
  */
 function nodequeue_admin_remove_node($queue, $subqueue, $node) {
-  if (!nodequeue_check_token($node->nid)) {
+  if (!is_numeric($subqueue) || !nodequeue_check_token($node->nid)) {
     return drupal_goto();
   }
-
+  $subqueue = nodequeue_load_subqueue($subqueue);
   nodequeue_subqueue_remove_node($subqueue->sqid, $node->nid);
 
   // Provide a response if this is javascript.
   if (!empty($_POST['js'])) {
     if (isset($_GET['tab'])) {
       nodequeue_js_output(t('Add to queue'),
-        url("admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid", nodequeue_get_query_string($node->nid, TRUE, array('tab'))),
+        url("admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid", array('query' => nodequeue_get_query_string($node->nid, TRUE, array('tab')))),
         nodequeue_subqueue_size_text($queue->size, $subqueue->count - 1, FALSE),
         $subqueue->sqid);
     }
     else {
       nodequeue_js_output(nodequeue_title_substitute($queue->link, $queue, $subqueue),
-        url("admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid", nodequeue_get_query_string($node->nid, TRUE)));
+        url("admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid", array('query' => nodequeue_get_query_string($node->nid, TRUE))));
     }
   }
 
@@ -379,10 +356,13 @@ function nodequeue_admin_remove_node($qu
  *
  * @param $node
  *   The loaded $node; will be loaded by the hook_menu.
- * @param $queues
- *   The list of queues. Loaded by the menu in order to test access control.
  */
-function nodequeue_node_tab($node, $queues) {
+function nodequeue_node_tab($node) {
+  // moved from hook_menu due to architecture change.  This function seems to only be called from menu anyway...
+  $queues = nodequeue_load_queues_by_type($node->type, 'tab');
+  if (!$queues) {
+    return false;
+  }
   $header = array();
   $header[] = array('data' => t('Title'), 'class' => 'nodequeue-title');
   if (variable_get('nodequeue_tab_display_max', 1)) {
@@ -401,16 +381,16 @@ function nodequeue_node_tab($node, $queu
       $op = l(
         t('Add to queue'),
         "admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid",
-        array('class' => 'nodequeue-ajax-toggle'),
-        drupal_get_destination() .'&tab&'. nodequeue_get_token($node->nid)
+        array('attributes' => array('class' => 'nodequeue-ajax-toggle'),
+          'query' => drupal_get_destination() .'&tab&'. nodequeue_get_token($node->nid))
       );
     }
     else {
       $op = l(
         t('Remove from queue'),
         "admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid",
-        array('class' => 'nodequeue-ajax-toggle'),
-        drupal_get_destination() .'&tab&'. nodequeue_get_token($node->nid)
+        array('attributes' => array('class' => 'nodequeue-ajax-toggle'),
+          'query' => drupal_get_destination() .'&tab&'. nodequeue_get_token($node->nid))
       );
     }
     $row = array();
@@ -422,7 +402,7 @@ function nodequeue_node_tab($node, $queu
       $row[] = array('class' => 'nodequeue-max-nodes', 'data' => $queue->size ? $queue->size : t('Infinite'));
     }
     $row[] = array(
-      'id' => 'nodequeue-count-' . $subqueue->sqid,
+      'id' => 'nodequeue-count-'. $subqueue->sqid,
       'class' => 'nodequeue-in-queue',
       'data' => nodequeue_subqueue_size_text($queue->size, $subqueue->count, FALSE)
     );
@@ -467,7 +447,7 @@ function nodequeue_view_queues() {
   foreach ($queues as $queue) {
     $sub_text = $queue->subqueues;
     if ($sub_text == 1) {
-      $sub_text .= " (" . nodequeue_subqueue_size_text($queue->size, $queue->subqueue->count) . ")";
+      $sub_text .= " (". nodequeue_subqueue_size_text($queue->size, $queue->subqueue->count) .")";
     }
 
     $operations = array(l(t('View'), "admin/content/nodequeue/$queue->qid/view"));
@@ -509,7 +489,7 @@ function nodequeue_view_subqueues($queue
     );
   }
 
-  $output = '<p>' . t('Max nodes in queue: @size', array('@size' => $queue->size ? $queue->size : t("Infinite"))) . '</p>';
+  $output = '<p>'. t('Max nodes in queue: @size', array('@size' => $queue->size ? $queue->size : t("Infinite"))) .'</p>';
   $output .= theme('table', $header, $rows);
   $output .= theme('pager', NULL, 20);
 
@@ -519,14 +499,23 @@ function nodequeue_view_subqueues($queue
 /**
  * Add or edit a queue.
  */
-function nodequeue_edit_queue_form($queue) {
+function nodequeue_edit_queue_form(&$form_state, $queue) {
+  $info = nodequeue_api_info();
+  
   // For adding queues.
   if (is_string($queue)) {
+    // If the $queue is a string - name of a queue type, basically - then we test that it's a valid queue type.
+    $queue = strtolower($queue);
+    if (!isset($info[$queue])) {
+      return false; 
+    }
+    drupal_set_title(t('Add @type', array('@type' => strtolower($info[$queue]['title']))));
     $queue = new nodequeue_queue($queue);
+  } 
+  else {
+    drupal_set_title(t("Nodequeue '@title'", array('@title' => $queue->title)));
   }
 
-  $info = nodequeue_api_info();
-
   $form['description'] = array(
     '#type' => 'fieldset',
     '#title' => $info[$queue->owner]['title'],
@@ -588,6 +577,7 @@ function nodequeue_edit_queue_form($queu
     '#description' => t('Enter the text for the corresponding link to remove a node from a queue. This may be blank (in which case no link will appear) but a remove link will only appear if link, above, is set.'),
   );
 
+  
   $result = db_query("SELECT r.* FROM {role} r LEFT JOIN {permission} p ON p.rid = r.rid WHERE p.perm LIKE '%manipulate queues%' ORDER BY r.name");
   while ($role = db_fetch_object($result)) {
     $roles[$role->rid] = $role->name;
@@ -596,7 +586,7 @@ function nodequeue_edit_queue_form($queu
   $form['roles'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Roles'),
-    '#default_value' => $queue->roles,
+    '#default_value' => is_array($queue->roles) ? $queue->roles : array(),
     '#options' => $roles,
     '#description' => t('Check each role that can add nodes to the queue. Be sure that roles you want to appear here have "manipulate queues" access in the main access control panel.'),
   );
@@ -652,6 +642,8 @@ function nodequeue_edit_queue_form($queu
     $form[] = array(
       '#type' => 'submit',
       '#value' => t('Delete'),
+      '#validate' => array('nodequeue_edit_queue_form_delete_validate'),
+      '#submit' => array('nodequeue_edit_queue_form_delete_submit'),
     );
     $form['qid'] = array(
       '#type' => 'value',
@@ -669,13 +661,10 @@ function nodequeue_edit_queue_form($queu
 }
 
 /**
- * Submit function for the nodequeue_queue form.
+ * Validate function for the nodequeue_queue form.
  */
-function nodequeue_edit_queue_form_validate($formid, $form_values, &$form) {
-  if ($form_values['op'] == t('Delete')) {
-    return;
-  }
-  $queue = (object) $form_values;
+function nodequeue_edit_queue_form_validate($form, &$form_state) {
+  $queue = (object) $form_state['values'];
   // fix checkboxes
   $queue->roles = array_keys(array_filter($queue->roles));
   $queue->types = array_keys(array_filter($queue->types));
@@ -684,18 +673,14 @@ function nodequeue_edit_queue_form_valid
     $queue->new = TRUE;
   }
 
-  nodequeue_api_queue_form_validate($queue, $form_values, $form);
+  nodequeue_api_queue_form_validate($queue, $form_state, $form);
 }
 
 /**
  * Submit function for the nodequeue_queue form.
  */
-function nodequeue_edit_queue_form_submit($formid, $form) {
-  if ($form['op'] == t('Delete')) {
-    return "admin/content/nodequeue/$form[qid]/delete";
-  }
-
-  $queue = (object) $form;
+function nodequeue_edit_queue_form_submit($formid, &$form_state) {
+  $queue = (object) $form_state['values'];
   // fix checkboxes
   $queue->roles = array_keys(array_filter($queue->roles));
   $queue->types = array_keys(array_filter($queue->types));
@@ -707,11 +692,11 @@ function nodequeue_edit_queue_form_submi
   // Modify show_in_links based on whether or not links are available.
   $queue->show_in_links = !empty($queue->link) && !empty($queue->link_remove);
 
-  nodequeue_api_queue_form_submit($queue, $form);
+  nodequeue_api_queue_form_submit($queue, $form_state);
 
-  $qid = nodequeue_save($queue);
+  $qid = nodequeue_save($queue); // sets $queue->qid if needed.
 
-  nodequeue_api_queue_form_submit_finish($queue, $form);
+  nodequeue_api_queue_form_submit_finish($queue, $form_state);
 
   nodequeue_check_subqueue_sizes($queue);
 
@@ -721,13 +706,28 @@ function nodequeue_edit_queue_form_submi
   else {
     drupal_set_message(t('The queue has been updated.'));
   }
-  return 'admin/content/nodequeue';
+  $form_state['redirect'] = 'admin/content/nodequeue';
+}
+
+/**
+ * Delete-validate function for the nodequeue_queue form.
+ */
+function nodequeue_edit_queue_form_delete_validate($form, &$form_state) {
+  // No validation for delete step!  But we need to have this so the default validation isn't called.
+}
+
+/**
+ * Delete-submit function for the nodequeue_queue form.
+ */
+function nodequeue_edit_queue_form_delete_submit($formid, &$form_state) {
+  $form_state['redirect'] = "admin/content/nodequeue/". $form_state['values']['qid'] ."/delete";
 }
 
 /**
  * Confirm form to delete a queue
  */
-function nodequeue_admin_delete($queue) {
+function nodequeue_admin_delete(&$form_state, $queue) {
+  drupal_set_title(t("Nodequeue '@title'", array('@title' => $queue->title)));
   $form['qid'] = array('#type' => 'value', '#value' => $queue->qid);
   return confirm_form($form,
     t('Are you sure you want to delete "%title"?', array('%title' => $queue->title)),
@@ -740,18 +740,19 @@ function nodequeue_admin_delete($queue) 
 /**
  * Submit function for nodequeue delete
  */
-function nodequeue_admin_delete_submit($formid, $form) {
-  if ($form['confirm']) {
-    nodequeue_delete($form['qid']);
+function nodequeue_admin_delete_submit($formid, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    nodequeue_delete($form_state['values']['qid']);
     drupal_set_message("The queue has been deleted.");
   }
-  return 'admin/content/nodequeue';
+  $form_state['redirect'] = 'admin/content/nodequeue';
 }
 
 /**
  * Page callback to view a queue.
  */
 function nodequeue_admin_view($queue, $sqid = NULL) {
+  drupal_set_title(t("Nodequeue '@title'", array('@title' => $queue->title)));
   $qid = $queue->qid;
 
   // If the queue has just one subqueue, it gets special treatment.
@@ -788,44 +789,44 @@ function nodequeue_arrange_subqueue_entr
   $buttons = l(
     theme('image', drupal_get_path('module', 'nodequeue') .'/images/go-up.png', t('Move up')),
     "admin/content/nodequeue/$qid/up/$sqid/$node->position",
-    array(
+    array('attributes' => array(
       'title' => t('Move up'),
       'class' => 'nodequeue-move-up',
-    ), $query_string, NULL, FALSE, TRUE);
+    ), 'query' => $query_string, 'html' => TRUE));
   $buttons .= l(
     theme('image', drupal_get_path('module', 'nodequeue') .'/images/go-down.png', t('Move down')),
     "admin/content/nodequeue/$qid/down/$sqid/$node->position",
-    array(
+    array('attributes' => array(
       'title' => t('Move down'),
       'class' => 'nodequeue-move-down',
-    ), $query_string, NULL, FALSE, TRUE);
+    ), 'query' => $query_string, 'html' => TRUE));
   $buttons .= l(
     theme('image', drupal_get_path('module', 'nodequeue') .'/images/go-top.png', t('Move to front')),
     "admin/content/nodequeue/$qid/front/$sqid/$node->position",
-    array(
+    array('attributes' => array(
       'title' => t('Move to front'),
       'class' => 'nodequeue-move-front',
-    ), $query_string, NULL, FALSE, TRUE);
+    ), 'query' => $query_string, 'html' => TRUE));
   $buttons .= l(
     theme('image', drupal_get_path('module', 'nodequeue') .'/images/go-bottom.png', t('Move to back')),
     "admin/content/nodequeue/$qid/back/$sqid/$node->position",
-    array(
+    array('attributes' => array(
       'title' => t('Move to back'),
       'class' => 'nodequeue-move-back',
-    ), $query_string, NULL, FALSE, TRUE);
+    ), 'query' => $query_string, 'html' => TRUE));
   $buttons .= l(
     theme('image', drupal_get_path('module', 'nodequeue') .'/images/delete.png', t('Remove from queue')),
     "admin/content/nodequeue/$qid/remove/$sqid/$node->position",
-    array(
+    array('attributes' => array(
       'title' => t('Remove from queue'),
       'class' => 'nodequeue-remove',
-    ), $query_string, NULL, FALSE, TRUE);
+    ), 'query' => $query_string, 'html' => TRUE));
 
-  $output = '<tr id="nodequeue-row-' . $node->position . '" class="nodequeue-row ' . ($node->position % 2 ? 'odd' : 'even') . '">';
-  $output .= '<td>' . l($node->title, "node/$node->nid") . '</td>';
-  $output .= '<td>' . theme('username', $node) . '</td>';
-  $output .= '<td>' . format_date($node->created) . '</td>';
-  $output .= '<td>' . $buttons . '</td>';
+  $output = '<tr id="nodequeue-row-'. $node->position .'" class="nodequeue-row '. ($node->position % 2 ? 'odd' : 'even') .'">';
+  $output .= '<td>'. l($node->title, "node/$node->nid") .'</td>';
+  $output .= '<td>'. theme('username', $node) .'</td>';
+  $output .= '<td>'. format_date($node->created) .'</td>';
+  $output .= '<td>'. $buttons .'</td>';
   $output .= '</tr>';
   return $output;
 }
@@ -849,7 +850,7 @@ function nodequeue_arrange_subqueue($que
     $body .= nodequeue_arrange_subqueue_entry($queue, $subqueue, $node);
   }
 
-  $output = '<p>' . t('Max nodes in queue: @size', array('@size' => $queue->size ? $queue->size : t("Infinite"))) . '</p>';
+  $output = '<p>'. t('Max nodes in queue: @size', array('@size' => $queue->size ? $queue->size : t("Infinite"))) .'</p>';
 
   $output .= '<p class="nodequeue-hide-if-not-js nodequeue-warning">';
   $output .= t('Changes made to the queue order and queue removals will not be active until you click Save, below. If you add more nodes than the queue can hold, they will be removed from the @end when you save!', array('@end' => $queue->reverse ? t('bottom') : t('top')));
@@ -858,12 +859,12 @@ function nodequeue_arrange_subqueue($que
   $output .= '<table id="nodequeue-table">';
   $output .= '<thead>';
   $output .= '<tr>';
-  $output .= '<th class="nodequeue-node">' . t('Node') . '</th>';
-  $output .= '<th class="nodequeue-author">' . t('Author') . '</th>';
-  $output .= '<th class="nodequeue-date">' . t('Date') . '</th>';
-  $output .= '<th class="nodequeue-operation">' . t('Operation') . '</th>';
+  $output .= '<th class="nodequeue-node">'. t('Node') .'</th>';
+  $output .= '<th class="nodequeue-author">'. t('Author') .'</th>';
+  $output .= '<th class="nodequeue-date">'. t('Date') .'</th>';
+  $output .= '<th class="nodequeue-operation">'. t('Operation') .'</th>';
   $output .= '</thead>';
-  $output .= '<tbody>' . $body . '</tbody>';
+  $output .= '<tbody>'. $body .'</tbody>';
   $output .= '</table>';
 
   $output .= drupal_get_form('nodequeue_arrange_subqueue_form', $queue, $sqid, $nids);
@@ -875,7 +876,8 @@ function nodequeue_arrange_subqueue($que
 /**
  * Form used for arranging a queue
  */
-function nodequeue_arrange_subqueue_form($queue, $sqid, $nids) {
+//TODO: Form - Revise for D6
+function nodequeue_arrange_subqueue_form($form_state, $queue, $sqid, $nids) {
   $form['qid'] = array(
     '#type' => 'value',
     '#value' => $queue->qid,
@@ -909,30 +911,36 @@ function nodequeue_arrange_subqueue_form
     '#type' => 'submit',
     '#attributes' => array('class' => 'nodequeue-add'),
     '#value' => t('Add'),
+    '#validate' => array('nodequeue_arrange_subqueue_form_add_validate'),
+    '#submit' => array('nodequeue_arrange_subqueue_form_add_submit'),
   );
 
   $form['save'] = array(
     '#type' => 'submit',
     '#attributes' => array('class' => 'nodequeue-hide-if-not-js-hide nodequeue-save'),
     '#value' => t('Save'),
+    '#validate' => array('nodequeue_arrange_subqueue_form_save_validate'),
   );
 
   $form['clear'] = array(
     '#type' => 'submit',
     '#attributes' => array('class' => 'nodequeue-clear'),
     '#value' => t('Clear'),
+    '#submit' => array('nodequeue_arrange_subqueue_form_clear_submit'),
   );
 
   $form['reverse_click'] = array(
     '#type' => 'submit',
     '#attributes' => array('class' => 'nodequeue-reverse'),
     '#value' => t('Reverse'),
+    '#submit' => array('nodequeue_arrange_subqueue_form_submit'),
   );
 
   $form['shuffle'] = array(
     '#type' => 'submit',
     '#attributes' => array('class' => 'nodequeue-shuffle'),
     '#value' => t('Shuffle'),
+    '#submit' => array('nodequeue_arrange_subqueue_form_shuffle_submit'),
   );
 
   // Store the original order.
@@ -966,7 +974,7 @@ function nodequeue_arrange_subqueue_form
       // Path for js to reverse the queue
       'reverse' => 'input.nodequeue-reverse',
       // Path for ajax on adding an item
-      'path' => url('nodequeue/ajax/add', NULL, NULL, TRUE),
+      'path' => url('nodequeue/ajax/add', array('absolute' => TRUE)),
       // Which items to post when adding
       'post' => array('#edit-sqid', '#edit-add'),
       // Where to get the id of an item
@@ -990,6 +998,29 @@ function nodequeue_arrange_subqueue_form
   return $form;
 }
 
+/**
+ * Implements hook_theme.
+ *
+ * @return unknown
+ */
+function nodequeue_theme() {
+  return array(
+    'nodequeue_arrange_subqueue_form' => array(
+      'arguments' => array('form'),
+    ),
+    'nodequeue_subqueue_empty_text' => array(
+      'arguments' => array(),
+    ),
+    'nodequeue_subqueue_full_text' => array(
+      'arguments' => array(),
+    ),
+    'nodequeue_subqueue_count_text' => array(
+      'arguments' => array(),
+    ),
+  );
+}
+
+//TODO: Theme function for Form - do we need to revise?
 function theme_nodequeue_arrange_subqueue_form($form) {
   $header = array(
     check_plain($form['add']['#title']),
@@ -1010,70 +1041,90 @@ function theme_nodequeue_arrange_subqueu
 /**
  * Validate handler for nodequeue_arrange_subqueue_form
  */
-function nodequeue_arrange_subqueue_form_validate($form_id, $form_values, $form) {
-  if ($form_values['op'] == t('Add')) {
-    $queue = nodequeue_load($form_values['qid']);
-    $subqueue = nodequeue_load($form_values['sqid']);
-    $nodes = nodequeue_api_autocomplete($queue, $subqueue, $form_values['add']);
-    if (empty($nodes) || !is_array($nodes)) {
-      form_error($form['add'], t('Invalid node'));
-      return;
-    }
-    if (count($nodes) > 1) {
-      form_error($form['add'], t('That matches too many nodes'));
-      return;
-    }
-    $keys = array_keys($nodes);
-    $nid = array_pop($keys);
-    form_set_value($form['nid'], $nid);
+function nodequeue_arrange_subqueue_form_validate($form, &$form_state) {
+  // Default Validator - does nothing
+}
+
+/**
+ * Validate handler for nodequeue_arrange_subqueue_form for 'Add' button.
+ *
+ * @param unknown_type $form_id
+ * @param unknown_type $form_state
+ * @param unknown_type $form
+ */
+function nodequeue_arrange_subqueue_form_add_validate($form, &$form_state) {
+  $queue = nodequeue_load($form_state['values']['qid']);
+  $subqueue = nodequeue_load($form_state['values']['sqid']);
+  $nodes = nodequeue_api_autocomplete($queue, $subqueue, $form_state['values']['add']);
+  if (empty($nodes) || !is_array($nodes)) {
+    form_error($form['add'], t('Invalid node'));
+    return;
+  }
+  if (count($nodes) > 1) {
+    form_error($form['add'], t('That matches too many nodes'));
     return;
   }
+  $keys = array_keys($nodes);
+  $nid = array_pop($keys);
+  form_set_value($form['nid'], $nid, $form_state);
+}
 
-  if ($form_values['op'] == t('Save')) {
-    $nids = $form_values['nids'];
+/**
+ * Validate handler for nodequeue_arrange_subqueue_form for 'Save' button.
+ *
+ * @param unknown_type $form_id
+ * @param unknown_type $form_state
+ * @param unknown_type $form
+ */
+function nodequeue_arrange_subqueue_form_save_validate($form, &$form_state) {
+  $nids = $form_state['values']['nids'];
 
-    // We can't use array_merge because it'll reset our keys and we can't
-    // use + because it will overwrite.
-    if ($form_values['added_nids']) {
-      foreach (explode(',', $form_values['added_nids']) as $nid) {
-        if (empty($nids)) {
-          $nids[1] = $nid;
-        }
-        else {
-          $nids[max(array_keys($nids)) + 1] = $nid;
-        }
+  // We can't use array_merge because it'll reset our keys and we can't
+  // use + because it will overwrite.
+  if ($form_state['values']['added_nids']) {
+    foreach (explode(',', $form_state['values']['added_nids']) as $nid) {
+      if (empty($nids)) {
+        $nids[1] = $nid;
+      }
+      else {
+        $nids[max(array_keys($nids)) + 1] = $nid;
       }
     }
-    form_set_value($form['nids'], $nids);
   }
+  form_set_value($form['nids'], $nids, $form_state);
 }
 
 /**
- * Submit function for nodequeue_arrange_subqueue_form
+ * Submit function for nodequeue_arrange_subqueue_form on 'Reverse' button.
+ * 
+ * Yeah, this just calls the below function with a different parameter, but in D6 we're not supposed to use the $form['ops'].
  */
-function nodequeue_arrange_subqueue_form_submit($form_id, $form_values) {
-  // Add a node to the queue if that's the intention.
-  if ($form_values['op'] == t('Clear')) {
-    return 'admin/content/nodequeue/' . $form_values['qid'] . '/clear/' . $form_values['sqid'];
-  }
+function nodequeue_arrange_subqueue_form_reverse_submit($form, &$form_state) {
+  nodequeue_arrange_subqueue_form_submit($form, $form_state, TRUE, FALSE);
+}
 
-  $queue = nodequeue_load($form_values['qid']);
-  $subqueue = nodequeue_load_subqueue($form_values['sqid']);
+function nodequeue_arrange_subqueue_form_shuffle_submit($form, &$form_state) {
+  nodequeue_arrange_subqueue_form_submit($form, $form_state, FALSE, TRUE);
+}
 
-  if ($form_values['op'] == t('Add')) {
-    nodequeue_subqueue_add($queue, $subqueue, $form_values['nid']);
-    return;
-  }
+/**
+ * Submit function for nodequeue_arrange_subqueue_form
+ */
+//TODO: Form Submit - Revise for D6
+function nodequeue_arrange_subqueue_form_submit($form, &$form_state, $reverse=FALSE, $shuffle=FALSE) {
+  // Add a node to the queue if that's the intention.
+  $queue = nodequeue_load($form_state['values']['qid']);
+  $subqueue = nodequeue_load_subqueue($form_state['values']['sqid']);
 
-  db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d", $form_values['sqid']);
-  if ($form_values['order']) {
+  db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d", $form_state['values']['sqid']);
+  if ($form_state['values']['order']) {
     $now = time();
     $sql = '';
     $args = array();
-    $nids = $form_values['nids'];
+    $nids = $form_state['values']['nids'];
     $subqueue->count = 0;
-    $order = explode(',', $form_values['order']);
-    if ($queue->reverse xor $form_values['op'] == t('Reverse')) {
+    $order = explode(',', $form_state['values']['order']);
+    if ($queue->reverse xor $reverse) {
       $order = array_reverse($order);
     }
 
@@ -1082,8 +1133,8 @@ function nodequeue_arrange_subqueue_form
         $sql .= ', ';
       }
       $sql .= ' (%d, %d, %d, %d, %d)';
-      $args[] = $form_values['sqid'];
-      $args[] = $form_values['qid'];
+      $args[] = $form_state['values']['sqid'];
+      $args[] = $form_state['values']['qid'];
       $args[] = $nids[$old_pos];
 
       // $new_pos starts from 0 but we start from 1.
@@ -1097,26 +1148,38 @@ function nodequeue_arrange_subqueue_form
         // 0 means infinity so never do this if false
         nodequeue_check_subqueue_size($queue, $subqueue);
     }
-    if ($form_values['op'] == t('Shuffle')) {
+    if ($shuffle) { //$form_values['op'] == t('Shuffle')) {
       nodequeue_subqueue_shuffle($subqueue);
     }
   }
   drupal_set_message(t('The queue has been updated'));
 }
 
+function nodequeue_arrange_subqueue_form_clear_submit($form, &$form_state) {
+  $form_state['redirect'] = 'admin/content/nodequeue/'. $form_state['values']['qid'] .'/clear/'. $form_state['values']['sqid'];
+}
+
+function nodequeue_arrange_subqueue_form_add_submit($form, &$form_state) {
+  $queue = nodequeue_load($form_state['values']['qid']);
+  $subqueue = nodequeue_load_subqueue($form_state['values']['sqid']);
+  
+  nodequeue_subqueue_add($queue, $subqueue, $form_state['values']['nid']);
+}
+
 /**
  * Page callback to move an item up in a queue. This will be used only if
  * javascript is disabled in the client, and is a fallback technique.
  */
 function nodequeue_admin_up($queue, $subqueue, $pos) {
-  if (!nodequeue_check_token($pos)) {
+  if (!is_numeric($pos) || !is_numeric($subqueue) || !nodequeue_check_token($pos)) {
     return drupal_goto();
   }
-
+  $subqueue = nodequeue_load_subqueue($subqueue);
   // This function is safe if $pos is out of bounds.
   if (!$queue->reverse) {
     nodequeue_queue_up($subqueue, $pos);
-  } else {
+  } 
+  else {
     nodequeue_queue_down($subqueue, $pos);
   }
 
@@ -1128,14 +1191,15 @@ function nodequeue_admin_up($queue, $sub
  * javascript is disabled in the client, and is a fallback technique.
  */
 function nodequeue_admin_down($queue, $subqueue, $pos) {
-  if (!nodequeue_check_token($pos)) {
+  if (!is_numeric($pos) || !is_numeric($subqueue) || !nodequeue_check_token($pos)) {
     return drupal_goto();
   }
-
+  $subqueue = nodequeue_load_subqueue($subqueue);
   // This function is safe if $pos is out of bounds.
   if ($queue->reverse) {
     nodequeue_queue_up($subqueue, $pos);
-  } else {
+  } 
+  else {
     nodequeue_queue_down($subqueue, $pos);
   }
 
@@ -1147,14 +1211,15 @@ function nodequeue_admin_down($queue, $s
  * only if javascript is disabled in the client, and is a fallback technique.
  */
 function nodequeue_admin_front($queue, $subqueue, $pos) {
-  if (!nodequeue_check_token($pos)) {
+  if (!is_numeric($pos) || !is_numeric($subqueue) || !nodequeue_check_token($pos)) {
     return drupal_goto();
   }
-
+  $subqueue = nodequeue_load_subqueue($subqueue);
   // This function is safe if $pos is out of bounds.
   if (!$queue->reverse) {
     nodequeue_queue_front($subqueue, $pos);
-  } else {
+  } 
+  else {
     nodequeue_queue_back($subqueue, $pos);
   }
 
@@ -1166,14 +1231,15 @@ function nodequeue_admin_front($queue, $
  * only if javascript is disabled in the client, and is a fallback technique.
  */
 function nodequeue_admin_back($queue, $subqueue, $pos) {
-  if (!nodequeue_check_token($node->nid)) {
+  if (!is_numeric($pos) || !is_numeric($subqueue) || !nodequeue_check_token($node->nid)) {
     return drupal_goto();
   }
-
+  $subqueue = nodequeue_load_subqueue($subqueue);
   // This function is safe if $pos is out of bounds.
   if ($queue->reverse) {
     nodequeue_queue_front($subqueue, $pos);
-  } else {
+  } 
+  else {
     nodequeue_queue_back($subqueue, $pos);
   }
 
@@ -1188,11 +1254,11 @@ function nodequeue_admin_back($queue, $s
  * multiple times.
  */
 function nodequeue_admin_remove($queue, $subqueue, $pos) {
-  if (!nodequeue_check_token($node->nid)) {
+  if (!is_numeric($pos) || !is_numeric($subqueue) || !nodequeue_check_token($node->nid)) {
     return drupal_goto();
   }
-
-  nodequeue_subqueue_remove($subqueue->sqid, $pos);
+  
+  nodequeue_subqueue_remove($subqueue, $pos);
 
   drupal_goto();
 }
@@ -1200,7 +1266,12 @@ function nodequeue_admin_remove($queue, 
 /**
  * Confirm form to clear a queue.
  */
-function nodequeue_clear_confirm($queue, $subqueue) {
+//TODO: Form - Revise for D6.
+function nodequeue_clear_confirm(&$form_state, $queue, $subqueue) {
+  if (!is_numeric($subqueue)) {
+    return false;
+  }
+  drupal_set_title(t("Nodequeue '@title'", array('@title' => $queue->title)));
   $form['sqid'] = array('#type' => 'value', '#value' => $subqueue->sqid);
   $form['qid'] = array('#type' => 'value', '#value' => $queue->qid);
   return confirm_form($form,
@@ -1214,10 +1285,11 @@ function nodequeue_clear_confirm($queue,
 /**
  * Submit function for nodequeue clear confirm
  */
-function nodequeue_clear_confirm_submit($formid, $form) {
-  if ($form['confirm']) {
-    nodequeue_queue_clear($form['sqid']);
-    return "admin/content/nodequeue/$form[qid]/view/$form[sqid]";
+//TODO: Form Submit - Revise for D6
+function nodequeue_clear_confirm_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    nodequeue_queue_clear($form_state['values']['sqid']);
+    $form_state['redirect'] = "admin/content/nodequeue/". $form_state['values']['qid'] ."/view/". $form_state['values']['sqid'];
   }
 }
 
@@ -1227,9 +1299,7 @@ function nodequeue_clear_confirm_submit(
 function nodequeue_autocomplete($sqid = NULL, $string = NULL) {
   $output = _nodequeue_autocomplete($sqid, $string);
 
-  // let the world know this isn't normal output.
-  drupal_set_header('Content-type: text/javascript');
-  print drupal_to_js(drupal_map_assoc($output));
+  drupal_json($drupal_map_assoc($output));
   exit;
 }
 
@@ -1263,8 +1333,7 @@ function nodequeue_ajax_add() {
   $string = $_POST['add'];
   $output = _nodequeue_ajax_add($sqid, $position, $string);
   // let the world know this isn't normal output.
-  drupal_set_header('Content-type: text/javascript');
-  print drupal_to_js($output);
+  drupal_json($output);
   exit;
 }
 
@@ -1380,6 +1449,19 @@ function nodequeue_load_queues_by_type($
 }
 
 /**
+ * Used by menu system to determine access to the node and the queue in question.  
+ * 
+ * No, this isn't some odd hook_access implementation.
+ *
+ * @param unknown_type $node
+ * @param unknown_type $queue
+ * @return unknown
+ */
+function nodequeue_node_and_queue_access($node, $queue) {
+  return nodequeue_node_access($node->type) && nodequeue_queue_access($queue);
+}
+
+/**
  * Return TRUE if $user can queue(s) for this node.
  *
  * @param $type
@@ -1446,15 +1528,14 @@ function nodequeue_get_qids($type, $acco
     if (!user_access('manipulate all queues', $account)) {
       $roles_join = "INNER JOIN {nodequeue_roles} nr ON nr.qid = nq.qid ";
       $roles = array_keys((array) $account->roles) + array(DRUPAL_AUTHENTICATED_RID);
-      $role_args = array_fill(0, count($roles), '%d');
 
-      $roles_where .= "AND nr.rid IN (". implode(',', $role_args) .")";
+      $roles_where .= "AND nr.rid IN (". db_placeholders($role_args, 'int') .")";
     }
 
-    $sql = 'SELECT nq.qid, nq.show_in_tab, nq.show_in_links, show_in_ui ' .
-      'FROM {nodequeue_queue} nq ' .
-      'INNER JOIN {nodequeue_types} nt ON nt.qid = nq.qid ' . $roles_join .
-      "WHERE nt.type = '%s' " . $roles_where;
+    $sql = 'SELECT nq.qid, nq.show_in_tab, nq.show_in_links, show_in_ui '.
+      'FROM {nodequeue_queue} nq '.
+      'INNER JOIN {nodequeue_types} nt ON nt.qid = nq.qid '. $roles_join .
+      "WHERE nt.type = '%s' ". $roles_where;
     $result = db_query($sql, array_merge(array($type), $roles));
 
     $qids = array();
@@ -1483,8 +1564,8 @@ function nodequeue_get_qids($type, $acco
 function nodequeue_get_all_qids($page_size = 25, $pager_element = 0) {
   static $cache = NULL;
   if (!isset($cache)) {
-    $sql = 'SELECT nq.qid ' .
-           'FROM {nodequeue_queue} nq ' .
+    $sql = 'SELECT nq.qid '.
+           'FROM {nodequeue_queue} nq '.
            'WHERE nq.show_in_ui = 1 ';
     $count_sql = 'SELECT COUNT(q.qid) FROM {nodequeue_queue} q WHERE q.show_in_ui = 1 ';
     if ($page_size) {
@@ -1525,18 +1606,18 @@ function nodequeue_load_queues($qids) {
   }
 
   if (!empty($to_load)) {
-    $load_text = implode(', ', $to_load);
-    $result = db_query("SELECT q.*, COUNT(s.sqid) AS subqueues FROM {nodequeue_queue} q LEFT JOIN {nodequeue_subqueue} s ON q.qid = s.qid WHERE q.qid IN (%s) GROUP BY q.qid", $load_text);
+    $placeholders = db_placeholders($to_load, 'int');
+    $result = db_query("SELECT q.*, COUNT(s.sqid) AS subqueues FROM {nodequeue_queue} q LEFT JOIN {nodequeue_subqueue} s ON q.qid = s.qid WHERE q.qid IN ($placeholders) GROUP BY q.qid", $to_load);
     while ($queue = db_fetch_object($result)) {
       $cache[$queue->qid] = $queue;
     }
 
-    $result = db_query("SELECT * FROM {nodequeue_roles} WHERE qid IN (%s)", $load_text);
+    $result = db_query("SELECT qid, rid FROM {nodequeue_roles} WHERE qid IN ($placeholders)", $to_load);
     while ($obj = db_fetch_object($result)) {
       $cache[$obj->qid]->roles[] = $obj->rid;
     }
 
-    $result = db_query("SELECT * FROM {nodequeue_types} WHERE qid IN (%s)", $load_text);
+    $result = db_query("SELECT qid, type FROM {nodequeue_types} WHERE qid IN ($placeholders)", $to_load);
     while ($obj = db_fetch_object($result)) {
       $cache[$obj->qid]->types[] = $obj->type;
     }
@@ -1583,9 +1664,9 @@ function nodequeue_load_subqueues($sqids
   }
 
   if (!empty($to_load)) {
-    $load_text = implode(', ', $to_load);
+    $placeholders = db_placeholders($to_load, 'int');
 
-    $result = db_query("SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.sqid IN (%s) GROUP BY s.sqid", $load_text);
+    $result = db_query("SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.sqid IN ($placeholders) GROUP BY s.sqid", $to_load);
     while ($obj = db_fetch_object($result)) {
       // Sometimes we want to get to subqueues by reference, sometimes by sqid.
       // sqid is always unique, but reference is sometimes more readily available.
@@ -1636,7 +1717,7 @@ function nodequeue_load_subqueues_by_que
     return array();
   }
 
-  $query = "SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.qid IN (" . implode(', ', array_fill(0, count($qids), '%d')) . ") GROUP BY s.sqid";
+  $query = "SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.qid IN (". db_placeholders($qids, 'int') .") GROUP BY s.sqid";
   if ($page_size) {
     $result = pager_query($query, $page_size, 0, $qids);
   }
@@ -1679,8 +1760,8 @@ function nodequeue_load_subqueues_by_ref
         $subqueues[$cache[$qid][$reference]->sqid] = $cache[$qid][$reference];
       }
       else {
-        $keys[$qid][] = "'%s'";
-        $qid_values[] = $reference;
+        $keys[$qid][] = "'%s'"; // Substitution strings
+        $qid_values[] = $reference; // Values to substitute
       }
     }
     if (!empty($keys[$qid])) {
@@ -1697,7 +1778,7 @@ function nodequeue_load_subqueues_by_ref
       if ($where) {
         $where .= ' OR ';
       }
-      $where .= 's.qid = %d AND s.reference IN (' . implode(', ', $key_list) . ')';
+      $where .= 's.qid = %d AND s.reference IN ('. implode(', ', $key_list) .')';
     }
 
     $result = db_query("SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE $where GROUP BY s.sqid", $values);
@@ -1715,8 +1796,8 @@ function nodequeue_load_subqueues_by_ref
  */
 function nodequeue_save(&$queue) {
   if (!isset($queue->qid)) {
-    $queue->qid = db_next_id("{nodequeue_queue}_qid");
-    db_query("INSERT INTO {nodequeue_queue} (qid, title, subqueue_title, size, link, link_remove, owner, show_in_links, show_in_tab, show_in_ui, reverse, reference) VALUES (%d, '%s', '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d, '%s')", $queue->qid, $queue->title, $queue->subqueue_title, $queue->size, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->reverse, $queue->reference);
+    db_query("INSERT INTO {nodequeue_queue} (title, subqueue_title, size, link, link_remove, owner, show_in_links, show_in_tab, show_in_ui, reverse, reference) VALUES ('%s', '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d, '%s')", $queue->title, $queue->subqueue_title, $queue->size, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->reverse, $queue->reference);
+    $queue->qid = db_last_insert_id('nodequeue_queue', 'qid'); 
     if (function_exists('views_invalidate_cache')) {
       views_invalidate_cache();
     }
@@ -1731,17 +1812,17 @@ function nodequeue_save(&$queue) {
   }
 
   if (is_array($queue->roles)) {
-    foreach($queue->roles as $rid)
+    foreach ($queue->roles as $rid)
       db_query("INSERT INTO {nodequeue_roles} (qid, rid) VALUES (%d, %d)", $queue->qid, $rid);
   }
 
   if (is_array($queue->types)) {
-    foreach($queue->types as $type)
-    db_query("INSERT INTO {nodequeue_types} (qid, type) VALUES (%d, '%s')", $queue->qid, $type);
+    foreach ($queue->types as $type)
+      db_query("INSERT INTO {nodequeue_types} (qid, type) VALUES (%d, '%s')", $queue->qid, $type);
   }
 
   // set our global that tells us whether or not we need to activate hook_link
-  if (db_result(db_query("SELECT COUNT(*) FROM {nodequeue_queue} WHERE link != ''"))) {
+  if (db_result(db_query("SELECT COUNT(*) FROM {nodequeue_queue} WHERE link <> ''"))) {
     variable_set('nodequeue_links', TRUE);
   }
   else {
@@ -1783,18 +1864,27 @@ function nodequeue_delete($qid) {
  *   be assigned to the sqid.
  */
 function nodequeue_add_subqueue(&$queue, $title, $reference = NULL) {
-  $sqid = db_next_id('{nodequeue_subqueue}_sqid');
   if (empty($reference)) {
-    $reference = $sqid;
+    $insert_reference = "";
+  }
+  else {
+    $insert_reference = $reference;
   }
 
-  $subqueue = new stdClass();
-  $subqueue->sqid = $sqid;
+  $subqueue = new stdClass();;
   $subqueue->reference = $reference;
   $subqueue->qid = $queue->qid;
   $subqueue->title = $title;
 
-  db_query("INSERT INTO {nodequeue_subqueue} (qid, sqid, reference, title) VALUES (%d, %d, '%s', '%s')", $queue->qid, $sqid, $reference, $title);
+  db_query("INSERT INTO {nodequeue_subqueue} (qid, reference, title) VALUES (%d, '%s', '%s')", $queue->qid, $insert_reference, $title);
+  
+  $subqueue->sqid = db_last_insert_id('nodequeue_subqueue', 'sqid');
+  
+  // If somehow the $reference is null, here we set it to the sqid.  
+  // We have to do it here, because before the insert we don't know what the sqid will be.
+  if (empty($reference)) {
+    db_query("UPDATE {nodequeue_subqueue} SET reference = '%s' WHERE sqid = %d", $subqueue->sqid, $subqueue->sqid);
+  }
 
   return $subqueue;
 }
@@ -2004,7 +2094,10 @@ function nodequeue_get_subqueue_position
  * Get the position of a node in several subqueues.
  */
 function nodequeue_set_subqueue_positions(&$subqueues, $nid) {
-  $result = db_query("SELECT sqid, MIN(position) AS position FROM {nodequeue_nodes} WHERE sqid IN (%s) AND nid = %d GROUP BY sqid", implode(', ', array_keys($subqueues)), $nid);
+  $placeholders = db_placeholders($subqueues, 'int');
+  $args = array_keys($subqueues);
+  $args[] = $nid;
+  $result = db_query("SELECT sqid, MIN(position) AS position FROM {nodequeue_nodes} WHERE sqid IN ($placeholders) AND nid = %d GROUP BY sqid", $args);
   while ($obj = db_fetch_object($result)) {
     $subqueues[$obj->sqid]->position = $obj->position;
   }
@@ -2069,7 +2162,7 @@ function theme_nodequeue_subqueue_count_
 }
 
 /**
- * Substitute the subqueue title into some others tring.
+ * Substitute the subqueue title into some other string.
  *
  * This function does NOT check_plain the title! The output MUST be checked
  * after this is complete.
@@ -2125,7 +2218,7 @@ function nodequeue_nodequeue_info() {
 /**
  * Implementation of hook_nodequeue_form_submit()
  */
-function nodequeue_nodequeue_form_submit(&$queue, $form) {
+function nodequeue_nodequeue_form_submit(&$queue, $form_submit) {
   // This will add a single subqueue to our new queue.
   if (!isset($queue->qid) && !isset($queue->add_subqueue)) {
     // A 0 will set the reference to the sqid of the queue.
@@ -2193,7 +2286,7 @@ function nodequeue_subqueue_position($sq
  * subqueue or the results of this function will be unpredictable.
  */
 function nodequeue_queue_position($qid, $nid) {
-  $sqid = db_result(db_query("SELECT sqid FROM {nodequeue_subqueue} WHERE qid = %d LIMIT 1", $qid));
+  $sqid = db_result(db_query_range("SELECT sqid FROM {nodequeue_subqueue} WHERE qid = %d", $qid, 0, 1));
   return nodequeue_subqueue_position($sqid, $nid);
 }
 
@@ -2208,8 +2301,9 @@ function nodequeue_queue_position($qid, 
  * @param &$form
  *   The form. This may be modified.
  */
+//TODO: Form modifying code - Modify for D6?
 function nodequeue_api_queue_form($queue, &$form) {
-  $function = $queue->owner . "_nodequeue_form";
+  $function = $queue->owner ."_nodequeue_form";
   if (function_exists($function)) {
     $function($queue, $form);
   }
@@ -2225,10 +2319,10 @@ function nodequeue_api_queue_form($queue
  * @param &$form
  *   The actual form object. This may be modified.
  */
-function nodequeue_api_queue_form_validate($queue, $form_values, &$form) {
-  $function = $queue->owner . "_nodequeue_form_validate";
+function nodequeue_api_queue_form_validate($queue, &$form_state, &$form) {
+  $function = $queue->owner ."_nodequeue_form_validate";
   if (function_exists($function)) {
-    $function($queue, $form_values, $form);
+    $function($queue, $form_state, $form);
   }
 }
 
@@ -2241,10 +2335,10 @@ function nodequeue_api_queue_form_valida
  * @param $form_values
  *   The form values that were submitted.
  */
-function nodequeue_api_queue_form_submit(&$queue, $form_values) {
-  $function = $queue->owner . "_nodequeue_form_submit";
+function nodequeue_api_queue_form_submit(&$queue, &$form_submit) {
+  $function = $queue->owner ."_nodequeue_form_submit";
   if (function_exists($function)) {
-    $function($queue, $form_values);
+    $function($queue, $form_submit);
   }
 }
 
@@ -2258,10 +2352,10 @@ function nodequeue_api_queue_form_submit
  * @param $form_values
  *   The form values that were submitted.
  */
-function nodequeue_api_queue_form_submit_finish($queue, $form_values) {
-  $function = $queue->owner . "_nodequeue_form_submit_finish";
+function nodequeue_api_queue_form_submit_finish($queue, &$form_submit) {
+  $function = $queue->owner ."_nodequeue_form_submit_finish";
   if (function_exists($function)) {
-    $function($queue, $form_values);
+    $function($queue, $form_submit);
   }
 }
 
@@ -2278,7 +2372,7 @@ function nodequeue_api_queue_form_submit
  *   An array of subqueues. This will be keyed by $sqid.
  */
 function nodequeue_api_subqueues(&$queue, $node) {
-  $function = $queue->owner . "_nodequeue_subqueues";
+  $function = $queue->owner ."_nodequeue_subqueues";
   // This will return an array of references.
   if (function_exists($function)) {
     return $function($queue, $node);
@@ -2309,7 +2403,7 @@ function nodequeue_api_autocomplete($que
   }
 
 
-  $where = "n.type IN (" . implode(', ', array_fill(0, count($queue->types), "'%s'")) . ')';
+  $where = "n.type IN (". db_placeholders($queue->types, 'varchar') .')';
   $where_args = $queue->types;
 
   // Run a match to see if they're specifying by nid.
@@ -2331,14 +2425,14 @@ function nodequeue_api_autocomplete($que
   }
 
   // Call to the API.
-  $function = $queue->owner . "_nodequeue_autocomplete";
+  $function = $queue->owner ."_nodequeue_autocomplete";
   if (function_exists($function)) {
     return $function($queue, $subqueue, $string, $where, $where_args);
   }
   else {
     $result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title FROM {node} n WHERE $where"), $where_args, 0, 10);
     while ($node = db_fetch_object($result)) {
-      $matches[$node->nid] = check_plain($node->title) . " [nid: $node->nid]";
+      $matches[$node->nid] = check_plain($node->title) ." [nid: $node->nid]";
     }
   }
 
@@ -2346,7 +2440,7 @@ function nodequeue_api_autocomplete($que
 }
 
 /**
- * Collect info about all of the possible nodequeue tyeps from owning
+ * Collect info about all of the possible nodequeue types from owning
  * modules.
  */
 function nodequeue_api_info() {
@@ -2408,7 +2502,7 @@ function nodequeue_get_query_string($see
  * Get a private token used to protect nodequeue's links from spoofing.
  */
 function nodequeue_get_token($nid) {
-  return 'token=' . drupal_get_token($nid);
+  return 'token='. drupal_get_token($nid);
 }
 
 /**
@@ -2417,13 +2511,3 @@ function nodequeue_get_token($nid) {
 function nodequeue_check_token($seed) {
   return drupal_get_token($seed) == $_GET['token'];
 }
-
-/**
- * Implementation of hook_simpletest().
- *
- */
-function nodequeue_simpletest() {
-  $dir = drupal_get_path('module', 'nodequeue') .'/tests';
-  $tests = file_scan_directory($dir, '\.test$');
-  return array_keys($tests);
-}
Index: nodequeue.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/nodequeue.views.inc,v
retrieving revision 1.1.2.17
diff -u -p -r1.1.2.17 nodequeue.views.inc
--- nodequeue.views.inc	26 Feb 2008 19:12:22 -0000	1.1.2.17
+++ nodequeue.views.inc	12 May 2008 22:52:24 -0000
@@ -27,7 +27,7 @@ function nodequeue_views_tables() {
         'sortable' => true,
         'handler' => views_handler_field_dates(),
         'option' => 'string',
-        'help' => t('Display the time the node was added to a given node queue.').' '.
+        'help' => t('Display the time the node was added to a given node queue.') .' '.
                   t('The option field may be used to specify the custom date format as it\'s required by the date() function or if "as time ago" has been chosen to customize the granularity of the time interval.'),
       ),
       'ajaxtoggle' => array(
@@ -225,7 +225,7 @@ function nodequeue_views_default_views()
     $view->page_empty = '';
     $view->page_empty_format = '1';
     $view->page_type = 'teaser';
-    $view->url = 'nodequeue/' . $queue->qid;
+    $view->url = 'nodequeue/'. $queue->qid;
     $view->use_pager = TRUE;
     $view->nodes_per_page = '10';
     $view->block = TRUE;
@@ -242,18 +242,18 @@ function nodequeue_views_default_views()
     $view->block_use_page_header = FALSE;
     $view->block_use_page_footer = FALSE;
     $view->block_use_page_empty = FALSE;
-    $view->sort = array (
-      array (
+    $view->sort = array(
+      array(
         'tablename' => 'nodequeue_nodes',
         'field' => 'position',
         'sortorder' => 'ASC',
         'options' => '',
       ),
     );
-    $view->argument = array (
+    $view->argument = array(
     );
-    $view->field = array (
-      array (
+    $view->field = array(
+      array(
         'tablename' => 'node',
         'field' => 'title',
         'label' => '',
@@ -261,11 +261,11 @@ function nodequeue_views_default_views()
         'options' => 'link',
       ),
     );
-    $view->exposed_filter = array (
+    $view->exposed_filter = array(
     );
     $view->requires = array('nodequeue_nodes', 'node');
-    $view->filter = array (
-      array (
+    $view->filter = array(
+      array(
         'tablename' => 'nodequeue_nodes',
         'field' => 'qid',
         'operator' => 'OR',
@@ -314,7 +314,7 @@ function nodequeue_handler_subqueuelist(
 }
 
 function nodequeue_handler_arg_qid($op, &$query, $argtype, $arg = '') {
-  switch($op) {
+  switch ($op) {
     case 'summary':
       $query->ensure_table('nodequeue_queue', true);
       $query->add_field('title', 'nodequeue_queue');
@@ -340,7 +340,7 @@ function nodequeue_handler_arg_qid($op, 
 }
 
 function nodequeue_handler_arg_qtitle($op, &$query, $argtype, $arg = '') {
-  switch($op) {
+  switch ($op) {
     case 'summary':
       $query->ensure_table('nodequeue_subqueue', true);
       $query->add_field('title', 'nodequeue_subqueue');
@@ -373,7 +373,7 @@ function nodequeue_handler_arg_qtitle($o
 }
 
 function nodequeue_handler_arg_sqid($op, &$query, $argtype, $arg = '') {
-  switch($op) {
+  switch ($op) {
     case 'summary':
       $query->ensure_table('nodequeue_subqueue', true);
       $query->add_field('title', 'nodequeue_subqueue');
@@ -404,7 +404,7 @@ function nodequeue_handler_arg_sqid($op,
 }
 
 function nodequeue_handler_arg_reference($op, &$query, $argtype, $arg = '') {
-  switch($op) {
+  switch ($op) {
     case 'summary':
       // $arg == $option
       $query->ensure_table('nodequeue_subqueue', true);
Index: nodequeue_generate.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/nodequeue_generate.info,v
retrieving revision 1.1.2.1
diff -u -p -r1.1.2.1 nodequeue_generate.info
--- nodequeue_generate.info	1 Jan 2008 23:52:39 -0000	1.1.2.1
+++ nodequeue_generate.info	12 May 2008 22:52:24 -0000
@@ -2,3 +2,5 @@
 name = Node Queue Generate
 description = Bulk assign nodes into queues for quickly populating a site.
 package = Development
+dependencies[] = nodequeue
+core = 6.x
Index: nodequeue_generate.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/nodequeue_generate.module,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 nodequeue_generate.module
--- nodequeue_generate.module	26 Feb 2008 18:48:02 -0000	1.1.2.2
+++ nodequeue_generate.module	12 May 2008 22:52:24 -0000
@@ -1,16 +1,14 @@
 <?php
 
-function nodequeue_generate_menu($may_cache) {
-  if ($may_cache) {
-    $items[] = array(
-        'path' => 'admin/content/generate_nodequeue',
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('nodequeue_generate_form'),
-        'description' => t('Bulk add nodes into queues'),
-        'title' => t('Generate node queue assignments'),
-        'access' => user_access('manipulate all queues'),
-    );
-  }
+function nodequeue_generate_menu() {
+  $items['admin/content/generate_nodequeue'] = array(
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('nodequeue_generate_form'),
+    'description' => t('Bulk add nodes into queues'),
+    'title' => t('Generate node queue assignments'),
+    'access callback' => 'user_access',
+    'access arguments' => array('manipulate all queues'),
+  );
   return $items;
 }
 
@@ -58,6 +56,19 @@ function nodequeue_generate_form() {
   return $form;
 }
 
+/**
+ * Implements hook_theme
+ *
+ * @return unknown
+ */
+function nodequeue_generate_theme() {
+  return array(
+    'nodequeue_generate_form' => array(
+      'arguments' => array('form' => NULL),
+    ),
+  );
+}
+
 function theme_nodequeue_generate_form($form) {
   $output = drupal_render($form['help']);
   $children = element_children($form['rows']);
@@ -78,8 +89,8 @@ function theme_nodequeue_generate_form($
   return $output;
 }
 
-function nodequeue_generate_form_submit($form_id, $form_values) {
-  $qids = array_keys(array_filter($form_values['rows']['cb']));
+function nodequeue_generate_form_submit($form, $form_state) {
+  $qids = array_keys(array_filter($form_state['values']['rows']['cb']));
   // Empty the queue
   $placeholders = implode(', ', array_fill(0, count($qids), '%d'));
   db_query("DELETE FROM {nodequeue_nodes} WHERE qid IN ($placeholders)", $qids);
@@ -99,7 +110,7 @@ function nodequeue_generate_form_submit(
     // smartqueue_taxonomy pulls nodes from the proper terms. nodequeue type queues don't care about taxo.
     if ($queues[$subqueue->qid]->owner == 'nodequeue') {
       $sql = "SELECT n.nid FROM {node} n WHERE n.status = 1 AND n.type IN ($placeholders) ORDER BY RAND()";
-      $result = db_query_range($sql, $args, 0, $form_values['rows'][$subqueue->qid]['limit']);
+      $result = db_query_range($sql, $args, 0, $form_state['values']['rows'][$subqueue->qid]['limit']);
       while ($row = db_fetch_object($result)) {
         nodequeue_subqueue_add($subqueue, $subqueue, $row->nid);
       }
@@ -107,7 +118,7 @@ function nodequeue_generate_form_submit(
     elseif ($queues[$subqueue->qid]->owner == 'smartqueue_taxonomy') {
       $args[] = $subqueue->reference;
       $sql = "SELECT tn.nid FROM {term_node} tn INNER JOIN {node} n ON tn.nid=n.nid WHERE n.status = 1 AND n.type IN ($placeholders) AND tn.tid = %d ORDER BY RAND()";
-      $result = db_query_range($sql, $args, 0, $form_values['rows'][$subqueue->qid]['limit']);
+      $result = db_query_range($sql, $args, 0, $form_state['values']['rows'][$subqueue->qid]['limit']);
       while ($row = db_fetch_object($result)) {
         nodequeue_subqueue_add($subqueue, $subqueue, $row->nid);
       }
Index: smartqueue.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/smartqueue.info,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 smartqueue.info
--- smartqueue.info	2 Jan 2008 01:00:08 -0000	1.1.2.2
+++ smartqueue.info	12 May 2008 22:52:24 -0000
@@ -1,6 +1,7 @@
-; $Id: smartqueue.info,v 1.1.2.2 2008/01/02 01:00:08 merlinofchaos Exp $
+; $Id$
 name = Smart Queue Taxonomy
 description = Creates a node queue for each taxonomy vocabulary
 package = Node Queue
-dependencies = nodequeue taxonomy
-
+core = 6.x
+dependencies[] = nodequeue 
+dependencies[] = taxonomy
Index: smartqueue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/smartqueue.module,v
retrieving revision 1.1.2.8
diff -u -p -r1.1.2.8 smartqueue.module
--- smartqueue.module	25 Apr 2008 19:50:19 -0000	1.1.2.8
+++ smartqueue.module	12 May 2008 22:52:24 -0000
@@ -1,5 +1,5 @@
 <?php
-// $Id: smartqueue.module,v 1.1.2.8 2008/04/25 19:50:19 merlinofchaos Exp $
+// $Id: smartqueue.module,v 1.1.2.7 2008/01/02 00:38:07 merlinofchaos Exp $
 
 /**
  * Implementation of hook_nodequeue_info()
@@ -12,7 +12,7 @@ function smartqueue_nodequeue_info() {
 }
 
 /**
- * Implementation of hook_nodequeue()
+ * Implementation of hook_nodequeue_form()
  */
 function smartqueue_taxonomy_nodequeue_form($queue, &$form) {
   foreach (taxonomy_get_vocabularies() as $vid => $vocabulary) {
@@ -42,17 +42,17 @@ function smartqueue_taxonomy_nodequeue_f
 }
 
 /**
- * Implementation of hook_nodequeue()
+ * Implementation of hook_nodequeue_form_validate()
  */
-function smartqueue_taxonomy_nodequeue_form_validate($queue, $form_values, &$form) {
+function smartqueue_taxonomy_nodequeue_form_validate($queue, &$form_state, &$form) {
   if (!isset($queue->qid)) {
-    $vids = array_keys(array_filter($form_values['vocabularies']));
+    $vids = array_keys(array_filter($form_state['values']['vocabularies']));
     if (empty($vids)) {
       form_error($form['placeholder']['vocabularies'], t('You must select at least one vocabulary.'));
     }
 
     // Convert this to our reference.
-    form_set_value($form['reference'], implode('-', $vids));
+    form_set_value($form['reference'], implode('-', $vids), $form_state);
   }
 }
 
@@ -91,7 +91,9 @@ function smartqueue_taxonomy_nodequeue_s
     if (!empty($tids)) {
       $empty = FALSE;
     }
-    $vids[$vid][] = 0;
+    if (!count($vids[$vid])) {
+      $vids[$vid][] = 0;
+    }
   }
 
   if ($empty) {
@@ -100,7 +102,7 @@ function smartqueue_taxonomy_nodequeue_s
 
   $references = smartqueue_build_string(array_filter($vids));
   // Because of how we built this, the last one will always be all zeros. Lose it.
-  array_pop($references);
+  //array_pop($references);
 
   // We're returning an array of references for efficiency, but we also have
   // to check to see if the references we've generated exist. If they don't,
@@ -145,7 +147,6 @@ function smartqueue_build_string($arrays
 function smartqueue_taxonomy_nodequeue_subqueue_title($queue, $reference) {
   $vids = explode('-', $queue->reference);
   $tids = explode('-', $reference);
-  $titles = array();
   foreach ($vids as $vid) {
     $tid = array_shift($tids);
     // $tid can be 0, specifically meaning this term is unset.
