From 43253222a0a069e1de71de037884ec3a44096832 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Fri, 1 Jul 2011 00:54:14 +0300
Subject: [PATCH 01/24] Issue #983024 by slashrsm, marcvangend and amateescu:
 Port Smartqueue Taxonomy to D7.

---
 smartqueue.module |  256 ++++++++++++++++++++++++++---------------------------
 1 files changed, 124 insertions(+), 132 deletions(-)

diff --git a/smartqueue.module b/smartqueue.module
index eeb7a48..93dce88 100644
--- a/smartqueue.module
+++ b/smartqueue.module
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Implementation of hook_nodequeue_info()
+ * Implements hook_nodequeue_info().
  */
 function smartqueue_nodequeue_info() {
   return array('smartqueue_taxonomy' => array(
@@ -11,16 +11,22 @@ function smartqueue_nodequeue_info() {
 }
 
 /**
- * Implementation of hook_nodequeue_form()
+ * Implements hook_nodequeue_form().
  */
 function smartqueue_taxonomy_nodequeue_form($queue, &$form) {
-  foreach (taxonomy_get_vocabularies() as $vid => $vocabulary) {
-    $options[$vid] = check_plain($vocabulary->name);
+  // Load data about taxonomy_term_reference fields.
+  $options = array();
+  $fields = field_info_fields();
+  foreach ($fields as $field_name => $field) {
+    if ($field['type'] == 'taxonomy_term_reference') {
+      $options[$field['id']] = t('Field %field-name, selecting terms from vocabulary %vocabulary.', array('%field-name' => $field_name, '%vocabulary' => $field['settings']['allowed_values'][0]['vocabulary']));
+    }
   }
-  $form['placeholder']['vocabularies'] = array(
+
+  $form['placeholder']['taxonomy_fields'] = array(
     '#type' => 'checkboxes',
-    '#title' => t('Vocabularies'),
-    '#description' => t('Select which vocabularies to use; each unique combination of terms from all of these vocabularies will have a subqueue. This selection cannot be changed after the queue is created.'),
+    '#title' => t('Taxonomy fields'),
+    '#description' => t('Select which taxonomy term reference fields to use; each unique combination of terms from all of these fields will have a subqueue.'),
     '#options' => $options,
   );
 
@@ -40,83 +46,99 @@ function smartqueue_taxonomy_nodequeue_form($queue, &$form) {
     '#description' => t('What to display for the subqueue title; use %subqueue to embed the actual subqueue title. This is used to distinguish multiple nodequeues with subqueues from each other, as internal subqueue title is filled automatically.'),
   );
 
+  // Fields can be selected just when creating new taxonomy smartqueue.
+  // Disable it after that.
   if (!empty($queue->qid)) {
-    $form['placeholder']['vocabularies']['#disabled'] = TRUE;
-    $form['placeholder']['vocabularies']['#default_value'] = explode('-', $queue->reference);
+    $form['placeholder']['taxonomy_fields']['#disabled'] = TRUE;
+    $form['placeholder']['taxonomy_fields']['#default_value'] = explode('-', $queue->reference);
   }
 }
 
 /**
- * Implementation of hook_nodequeue_form_validate()
+ * Implements hook_nodequeue_form_validate().
  */
 function smartqueue_taxonomy_nodequeue_form_validate($queue, &$form_state, &$form) {
   if (!isset($queue->qid)) {
-    $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.'));
+    $field_ids = array_keys(array_filter($form_state['values']['taxonomy_fields']));
+    if (empty($field_ids)) {
+      form_error($form['placeholder']['taxonomy_fields'], t('You must select at least one field.'));
     }
 
     // Convert this to our reference.
-    form_set_value($form['reference'], implode('-', $vids), $form_state);
+    form_set_value($form['reference'], implode('-', $field_ids), $form_state);
   }
 }
 
 /**
- * Implementation of hook_nodequeue_form_submit_finish()
+ * Implements hook_nodequeue_form_submit_finish().
  */
 function smartqueue_taxonomy_nodequeue_form_submit_finish($queue, $form_state) {
-  $qid = db_query('SELECT qid FROM {smartqueue} WHERE qid = %d', $queue->qid)->fetchField();
+  // Check if queue already exists.
+  $qid = db_select('smartqueue', 's')
+    ->fields('s', array('qid'))
+    ->condition('qid', $queue->qid)
+    ->execute()
+    ->fetchField();
+
   if ($qid) {
-    db_query('UPDATE {smartqueue} SET use_parents = %d  WHERE qid = %d', $form_state['values']['use_parents'], $queue->qid);
+    // Update existing queue.
+    db_update('smartqueue')
+      ->fields(array(
+        'use_parents' => $form_state['values']['use_parents'],
+      ))
+      ->condition('qid', $queue->qid)
+      ->execute();
   }
   else {
-    db_query('INSERT INTO {smartqueue} (qid, use_parents) VALUES (%d, %d)', $queue->qid, $form_state['values']['use_parents']);
+    // Insert new queue.
+    db_insert('smartqueue')
+      ->fields(array(
+        'qid' => $queue->qid,
+        'use_parents' => $form_state['values']['use_parents'],
+      ))
+      ->execute();
   }
 }
 
 /**
- * Implementation of hook_nodequeue_subqueues()
+ * Implements hook_nodequeue_subqueues().
+ *
+ * Returns list of references for subqueues that can host a given node.
  */
 function smartqueue_taxonomy_nodequeue_subqueues(&$queue, $node) {
-  foreach (explode('-', $queue->reference) as $vid) {
-    $vids[$vid] = array();
-  }
+  $field_ids = array();
 
-  foreach ($node->taxonomy as $key => $value) {
-    // This unfortunate scar is needed because $node->taxonomy looks different when saving a node versus loading.
-    if (!is_object($value)) {
-      // $node comes from a node form submission
-      foreach ((array) $value as $tid) {
-        if (isset($vids[$key])) {
-          $vids[$key][] = $tid;
-        }
-      }
-    }
-    else {
-      // $node comes from node_load()
-      if (isset($vids[$value->vid])) {
-        $vids[$value->vid][] = $value->tid;
+  // Check if at least one supported field exists in node and load
+  // selected tids.
+  foreach (explode('-', $queue->reference) as $field_id) {
+    // Load field data.
+    $field = field_info_field_by_id($field_id);
+
+    // Save tids.
+    if ($field_values = field_get_items('node', $node, $field['field_name'])) {
+      $field_ids[$field_id] = array();
+      foreach ($field_values as $field_value) {
+        $field_ids[$field_id][] = $field_value['tid'];
       }
     }
   }
 
-  if ($queue->use_parents) {
-    // Replace taxonomy IDs by their parents'
-    foreach ($vids as $vid => &$tids) {
+  if (!empty($field_ids) && $queue->use_parents) {
+    // Replace taxonomy IDs with their parents'.
+    foreach ($field_ids as $field_id => &$tids) {
       $tids = smartqueue_taxonomy_get_parents($tids);
     }
   }
 
   // Forbid NO terms being set, but allow
   // various non-terms to be set.
-
   $empty = TRUE;
-  foreach ($vids as $vid => $tids) {
+  foreach ($field_ids as $field_id => $tids) {
     if (!empty($tids)) {
       $empty = FALSE;
     }
-    if (!count($vids[$vid])) {
-      $vids[$vid][] = 0;
+    if (!count($field_ids[$field_id])) {
+      $field_ids[$field_id][] = 0;
     }
   }
 
@@ -124,9 +146,8 @@ function smartqueue_taxonomy_nodequeue_subqueues(&$queue, $node) {
     return;
   }
 
-  $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);
+  // Build reference strings for all subqueues.
+  $references = smartqueue_build_string(array_filter($field_ids));
 
   // 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,
@@ -137,16 +158,18 @@ function smartqueue_taxonomy_nodequeue_subqueues(&$queue, $node) {
     $exists[$subqueue->reference] = TRUE;
   }
 
+  // Create subqueues if needed.
   foreach ($references as $reference) {
     if (empty($exists[$reference])) {
       nodequeue_add_subqueue($queue, smartqueue_taxonomy_nodequeue_subqueue_title($queue, $reference), $reference);
     }
   }
+
   return $references;
 }
 
 /**
- * Implementation of hook_nodequeue_alter
+ * Implements hook_nodequeue_alter().
  */
 function smartqueue_nodequeue_alter(&$data, $type) {
   switch ($type) {
@@ -162,7 +185,7 @@ function smartqueue_nodequeue_alter(&$data, $type) {
 
 /**
  * Build an array of strings that represents all of the possible term
- * combinations
+ * combinations.
  */
 function smartqueue_build_string($arrays) {
   $array = array_shift($arrays);
@@ -183,92 +206,72 @@ function smartqueue_build_string($arrays) {
   return $strings;
 }
 
+/**
+ * Form title for a new taxonomy subqueue.
+ *
+ * @param $queue Queue object.
+ * @param $reference Subqueue reference string (tids imploded with '-').
+ */
 function smartqueue_taxonomy_nodequeue_subqueue_title($queue, $reference) {
-  $vids = explode('-', $queue->reference);
   $tids = explode('-', $reference);
-  foreach ($vids as $vid) {
-    $tid = array_shift($tids);
+  foreach ($tids as $tid) {
     // $tid can be 0, specifically meaning this term is unset.
     if ($tid) {
-      $terms = smartqueue_taxonomy_get_terms($vid);
-      $titles[$tid] = $terms[$tid];
+      $titles[$tid] = taxonomy_term_load($tid)->name;
     }
   }
+
+  // Create name using names of all term names. This could be
+  // done better, but is OK for now.
   return implode('-', $titles);
 }
 
 /**
- * Get a list of terms
+ * Implements hook_taxonomy_term_update().
+ *
+ * Updates subqueue title if term name changes.
  */
-function smartqueue_taxonomy_get_terms($vid) {
-  static $cache = array();
-  if (!isset($cache[$vid])) {
-    $cache[$vid] = array();
-    $result = db_query("SELECT tid, name FROM {term_data} WHERE vid = :vid", array(':vid' => $vid));
-    foreach ($result as $tern) {
-      $cache[$vid][$term->tid] = $term->name;
-    }
+function smartqueue_taxonomy_term_update($term) {
+  // Find subqueues that contain this term.
+  $result = db_query(
+    "SELECT nq.reference AS reference, sq.reference AS sqref, sq.sqid
+    FROM {nodequeue_queue} nq
+    INNER JOIN {nodequeue_subqueue} sq ON nq.qid = sq.qid
+    WHERE nq.owner = 'smartqueue_taxonomy'
+    AND (sq.reference = ?
+      OR sq.reference LIKE ?
+      OR sq.reference LIKE ?
+      OR sq.reference LIKE ?)",
+    array($term->tid, '%-' . $term->tid, $term->tid . '-%', '%-' . $term->tid . '-%')
+  )->fetchAll();
+
+  foreach ($result as $row) {
+    // Note that $row already contains the needed $row->reference.
+    $title = smartqueue_taxonomy_nodequeue_subqueue_title($row, $row->sqref);
+    nodequeue_subqueue_update_title($row->sqid, $title);
   }
-  return $cache[$vid];
 }
 
-
-// TODO:
-// * Handle vocabulary changes (maybe?)
 /**
- * Implementation of hook_taxonomy.
+ * Implements hook_taxonomy_term_delete().
+ *
+ * Deletes subqueue if term is removed
  */
-function smartqueue_taxonomy($op, $type, $array = NULL) {
-  switch ($type) {
-    case 'term':
-      switch ($op) {
-        // If a term was updated, we need to update any relevant nodequeue titles.
-        case 'update':
-          $tid = $array['tid'];
-          // Find subqueues that contain this term.
-          $result = db_query(
-            "SELECT nq.reference AS reference, sq.reference AS sqref, sq.sqid
-            FROM {nodequeue_queue} nq
-            INNER JOIN {nodequeue_subqueue} sq ON nq.qid = sq.qid
-            WHERE nq.owner = 'smartqueue_taxonomy'
-            AND (sq.reference = '%d'
-              OR sq.reference LIKE '%%-%d'
-              OR sq.reference LIKE '%d-%%'
-              OR sq.reference LIKE '%%-%d-%%')",
-            $tid, $tid, $tid, $tid
-          );
-          foreach ($result as $row) {
-            // Note that $row already contains the needed $row->reference.
-            $title = smartqueue_taxonomy_nodequeue_subqueue_title($row, $row->sqref);
-            nodequeue_subqueue_update_title($row->sqid, $title);
-          }
-          break;
-
-          // If a term was deleted, we need to delete any subqueues containing it.
-        case 'delete':
-          $tid = $array['tid'];
-          if (empty($tid)) {
-            // Don't proceed and delete all subqueues.
-            return;
-          }
-          // Find subqueues that contain this term.
-          $result = db_query(
-            "SELECT sq.sqid FROM {nodequeue_subqueue} sq
-            INNER JOIN {nodequeue_queue} nq ON sq.qid = nq.qid
-            WHERE nq.owner = 'smartqueue_taxonomy'
-            AND (sq.reference = '%d'
-              OR sq.reference LIKE '%%-%d'
-              OR sq.reference LIKE '%d-%%'
-              OR sq.reference LIKE '%%-%d-%%')",
-            $tid, $tid, $tid, $tid
-          );
-          foreach ($result as $row) {
-            nodequeue_remove_subqueue($row->sqid);
-          }
-          break;
-      }
-    case 'vocabulary':
-      break;
+function smartqueue_taxonomy_term_delete($term) {
+  // Find subqueues that contain this term.
+  $result = db_query(
+    "SELECT sq.sqid FROM {nodequeue_subqueue} sq
+    INNER JOIN {nodequeue_queue} nq ON sq.qid = nq.qid
+    WHERE nq.owner = 'smartqueue_taxonomy'
+    AND (sq.reference = ?
+      OR sq.reference LIKE ?
+      OR sq.reference LIKE ?
+      OR sq.reference LIKE ?)",
+    array($term->tid, '%-' . $term->tid, $term->tid . '-%', '%-' . $term->tid . '-%')
+  )->fetchAll();
+
+  foreach ($result as $row) {
+    nodequeue_remove_subqueue($row->sqid);
   }
 }
 
@@ -283,20 +286,9 @@ function smartqueue_taxonomy_get_parents($tids) {
   if ($tids) {
     $top_level_tids = array();
     foreach ($tids as $tid) {
-      $result = db_query(db_rewrite_sql("SELECT t.tid, t.* FROM {term_data} t INNER JOIN {term_hierarchy} h ON h.parent = t.tid WHERE h.tid = %d ORDER BY weight, name", 't', 'tid'), $tid);
-      $parents = array();
-      // This will filter out some duplicates.
-      while ($parent = db_fetch_object($result)) {
-        $parents[$parent->tid] = $parent->tid;
-      }
-      if (count($parents)) {
-        $parent_tid = smartqueue_taxonomy_get_parents($parents);
-        $top_level_tids = array_merge($parent_tid, $top_level_tids);
-      }
-      // When there aren't any matches, hand back the original tids.
-      else {
-        $top_level_tids[] = $tid;
-      }
+      $parents = taxonomy_get_parents_all($tid);
+      $parent = array_pop($parents);
+      $top_level_tids[] = $parent->tid;
     }
     return array_unique($top_level_tids);
   }
-- 
1.7.5.4


From 6690682ecbe1d4bafe09e48de2b1e9e50b3a3fdf Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Fri, 1 Jul 2011 01:13:24 +0300
Subject: [PATCH 02/24] Issue #1168228 by zyxware: Follow-up - Prevent
 duplicate positions.

---
 nodequeue.module |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/nodequeue.module b/nodequeue.module
index b316625..9d1e530 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -1042,7 +1042,7 @@ function nodequeue_remove_subqueue($sqid) {
 function nodequeue_subqueue_add($queue, &$subqueue, $nid) {
   if (!empty($nid)) {
     db_query("INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES (:sqid, :qid, :nid, IFNULL((SELECT MAX(position)+1 FROM (SELECT * from {nodequeue_nodes} WHERE sqid = :sqid) as nn), 1), :time)", array(':sqid' => $subqueue->sqid, ':qid' => $queue->qid, ':nid' => $nid, ':time' => REQUEST_TIME));
-    $subqueue->count++;
+    $subqueue->count = db_query("SELECT COUNT(nid) FROM {nodequeue_nodes} WHERE sqid = :sqid", array(':sqid' => $subqueue->sqid))->fetchField();
     // If adding this would make the queue too big, pop the front node
     // (or nodes) out.
     if (!empty($queue->size)) {
-- 
1.7.5.4


From 9acc2dae03e84f6d2873c8974f6fde9336324d6a Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Wed, 6 Jul 2011 17:44:07 +0300
Subject: [PATCH 03/24] Issue #1191006 by amateescu: Malformed links in queues
 admin list.

---
 includes/nodequeue.admin.inc |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/includes/nodequeue.admin.inc b/includes/nodequeue.admin.inc
index ccb9ba3..b4cca62 100644
--- a/includes/nodequeue.admin.inc
+++ b/includes/nodequeue.admin.inc
@@ -291,12 +291,18 @@ function nodequeue_view_queues() {
 
   $rows = array();
   foreach ($queues as $queue) {
+    $operations = array();
     $sub_text = $queue->subqueues;
+
+    // If this queue has only one subqueue.
     if ($sub_text == 1) {
       $sub_text .= " (" . nodequeue_subqueue_size_text($queue->size, $queue->subqueue->count) . ")";
+      $operations[] = l(t('View'), "admin/structure/nodequeue/$queue->qid/view/" . $queue->subqueue->sqid);
+    }
+    else {
+      $operations[] = l(t('View'), "admin/structure/nodequeue/$queue->qid/view");
     }
 
-    $operations = array(l(t('View'), "admin/structure/nodequeue/$queue->qid/view"));
     if (user_access('administer nodequeue')) {
       $operations[] = l(t('Edit'), "admin/structure/nodequeue/$queue->qid/edit");
       $operations[] = l(t('Delete'), "admin/structure/nodequeue/$queue->qid/delete");
-- 
1.7.5.4


From a4ea38b556440aac83f743c311bb837ab441de43 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 10 Jul 2011 22:32:07 +0300
Subject: [PATCH 04/24] Issue #1208670 by paranojik: Smartqueues configuration
 should rely on field names not field ids.

---
 smartqueue.install |   22 ++++++++++++++++++++++
 smartqueue.module  |   33 +++++++++++++++------------------
 2 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/smartqueue.install b/smartqueue.install
index 0b9fa2d..defde08 100644
--- a/smartqueue.install
+++ b/smartqueue.install
@@ -68,3 +68,25 @@ function smartqueue_update_6003() {
       ->execute();
   }
 }
+
+/**
+ * Change reference field to rely on field names intead of field-ids.
+ */
+function smartqueue_update_7001() {
+  $results = db_select('nodequeue_queue', 'nq')
+              ->fields('nq', array('qid','reference'))
+              ->condition('owner', 'smartqueue_taxonomy', '=')
+              ->execute();
+  foreach ($results as $result) {
+    $field_names = array();
+    $field_ids = explode('-', $result->reference);
+    foreach ($field_ids as $field_id) {
+      $field = field_info_field_by_id($field_id);
+      $field_names[] = $field['field_name'];
+    }
+    db_update('nodequeue_queue')
+      ->fields(array('reference' => implode('-', $field_names)))
+      ->condition('qid', $result->qid)
+      ->execute();
+  }
+}
diff --git a/smartqueue.module b/smartqueue.module
index 93dce88..e3c134c 100644
--- a/smartqueue.module
+++ b/smartqueue.module
@@ -19,7 +19,7 @@ function smartqueue_taxonomy_nodequeue_form($queue, &$form) {
   $fields = field_info_fields();
   foreach ($fields as $field_name => $field) {
     if ($field['type'] == 'taxonomy_term_reference') {
-      $options[$field['id']] = t('Field %field-name, selecting terms from vocabulary %vocabulary.', array('%field-name' => $field_name, '%vocabulary' => $field['settings']['allowed_values'][0]['vocabulary']));
+      $options[$field_name] = t('Field %field-name, selecting terms from vocabulary %vocabulary.', array('%field-name' => $field_name, '%vocabulary' => $field['settings']['allowed_values'][0]['vocabulary']));
     }
   }
 
@@ -59,13 +59,13 @@ function smartqueue_taxonomy_nodequeue_form($queue, &$form) {
  */
 function smartqueue_taxonomy_nodequeue_form_validate($queue, &$form_state, &$form) {
   if (!isset($queue->qid)) {
-    $field_ids = array_keys(array_filter($form_state['values']['taxonomy_fields']));
-    if (empty($field_ids)) {
+    $field_names = array_keys(array_filter($form_state['values']['taxonomy_fields']));
+    if (empty($field_names)) {
       form_error($form['placeholder']['taxonomy_fields'], t('You must select at least one field.'));
     }
 
     // Convert this to our reference.
-    form_set_value($form['reference'], implode('-', $field_ids), $form_state);
+    form_set_value($form['reference'], implode('-', $field_names), $form_state);
   }
 }
 
@@ -106,26 +106,23 @@ function smartqueue_taxonomy_nodequeue_form_submit_finish($queue, $form_state) {
  * Returns list of references for subqueues that can host a given node.
  */
 function smartqueue_taxonomy_nodequeue_subqueues(&$queue, $node) {
-  $field_ids = array();
+  $field_names = array();
 
   // Check if at least one supported field exists in node and load
   // selected tids.
-  foreach (explode('-', $queue->reference) as $field_id) {
-    // Load field data.
-    $field = field_info_field_by_id($field_id);
-
+  foreach (explode('-', $queue->reference) as $field_name) {
     // Save tids.
-    if ($field_values = field_get_items('node', $node, $field['field_name'])) {
-      $field_ids[$field_id] = array();
+    if ($field_values = field_get_items('node', $node, $field_name)) {
+      $field_names[$field_name] = array();
       foreach ($field_values as $field_value) {
-        $field_ids[$field_id][] = $field_value['tid'];
+        $field_names[$field_name][] = $field_value['tid'];
       }
     }
   }
 
-  if (!empty($field_ids) && $queue->use_parents) {
+  if (!empty($field_names) && $queue->use_parents) {
     // Replace taxonomy IDs with their parents'.
-    foreach ($field_ids as $field_id => &$tids) {
+    foreach ($field_names as $field_name => &$tids) {
       $tids = smartqueue_taxonomy_get_parents($tids);
     }
   }
@@ -133,12 +130,12 @@ function smartqueue_taxonomy_nodequeue_subqueues(&$queue, $node) {
   // Forbid NO terms being set, but allow
   // various non-terms to be set.
   $empty = TRUE;
-  foreach ($field_ids as $field_id => $tids) {
+  foreach ($field_names as $field_name => $tids) {
     if (!empty($tids)) {
       $empty = FALSE;
     }
-    if (!count($field_ids[$field_id])) {
-      $field_ids[$field_id][] = 0;
+    if (!count($field_names[$field_name])) {
+      $field_names[$field_name][] = 0;
     }
   }
 
@@ -147,7 +144,7 @@ function smartqueue_taxonomy_nodequeue_subqueues(&$queue, $node) {
   }
 
   // Build reference strings for all subqueues.
-  $references = smartqueue_build_string(array_filter($field_ids));
+  $references = smartqueue_build_string(array_filter($field_names));
 
   // 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,
-- 
1.7.5.4


From 3e1df30720bc3e9028e053167075896b36c63e94 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 10 Jul 2011 22:45:32 +0300
Subject: [PATCH 05/24] Issue #1212876 by joachim: hook_nodequeue_sort_alter()
 is broken.

---
 includes/nodequeue.admin.inc |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/includes/nodequeue.admin.inc b/includes/nodequeue.admin.inc
index b4cca62..682da8b 100644
--- a/includes/nodequeue.admin.inc
+++ b/includes/nodequeue.admin.inc
@@ -963,7 +963,7 @@ function nodequeue_save_subqueue_order($nodes, $qid, $sqid) {
   $clean = array();
   $count = 1;
   ksort($nodes);
-  module_invoke_all('nodequeue_sort_alter', $sqid, $nodes);
+  drupal_alter('nodequeue_sort', $nodes, $sqid);
   foreach ($nodes as $pos => $node) {
     if (!is_numeric($node['nid']) || $node['nid'] < 1) {
       return array(NODEQUEUE_INVALID_NID, 'Invalid nid value. New subqueue order not saved.');
-- 
1.7.5.4


From a22351b2526ba5fc2c803b65d2f6b5a30ef94aa3 Mon Sep 17 00:00:00 2001
From: slashrsm <slashrsm@744628.no-reply.drupal.org>
Date: Thu, 21 Jul 2011 22:32:00 +0300
Subject: [PATCH 06/24] Issue #1222094 by slashrsm and amateescu: Port
 Nodequeue generate to D7.

---
 nodequeue_generate.drush.inc |  107 ++++++++++++++++++
 nodequeue_generate.module    |  255 ++++++++++++++++++++++++++----------------
 2 files changed, 264 insertions(+), 98 deletions(-)
 create mode 100644 nodequeue_generate.drush.inc

diff --git a/nodequeue_generate.drush.inc b/nodequeue_generate.drush.inc
new file mode 100644
index 0000000..bc54706
--- /dev/null
+++ b/nodequeue_generate.drush.inc
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * @file
+ *   Nodequeue generate drush integration.
+ */
+
+/**
+ * Implementation of hook_drush_command().
+ *
+ * @See drush_parse_command() for a list of recognized keys.
+ *
+ * @return
+ *   An associative array describing your command(s).
+ */
+function nodequeue_generate_drush_command() {
+  $items = array();
+
+  $items['nodequeue-generate'] = array(
+    'description' => "Re-populates specified nodequeues with random nodes.",
+    'drupal dependencies' => array('nodequeue_generate'),
+    'arguments' => array(
+      'queue' => 'Machine name of queue to be re-populated.',
+    ),
+    'aliases' => array('nqg'),
+  );
+  $items['nodequeue-generate-all'] = array(
+    'description' => "Re-populates nodequeues with random nodes.",
+    'drupal dependencies' => array('nodequeue_generate'),
+    'aliases' => array('nqga'),
+  );
+  $items['nodequeue-generate-rehash'] = array(
+    'description' => "Rehashes smartqueue subqueues for taxonomy smartqueue.",
+    'drupal dependencies' => array('nodequeue_generate', 'smartqueue'),
+    'aliases' => array('nqgr'),
+  );
+
+  return $items;
+}
+
+/**
+ * Implementation of hook_drush_help().
+ */
+function nodequeue_generate_drush_help($section) {
+  switch ($section) {
+    case 'drush:nodequeue-generate':
+      return dt("Re-populates specified nodequeues with random nodes.");
+    case 'drush:nodequeue-generate-all':
+      return dt("Re-populates all nodequeues with random nodes.");
+    case 'drush:nodequeue-generate-rehash':
+      return dt("Rehashes smartqueue subqueues for taxonomy smartqueue.");
+  }
+}
+
+/**
+ * Re-populates specified nodequeues with random nodes.
+ */
+function drush_nodequeue_generate() {
+  $args = func_get_args();
+
+  // At least one queue must be specified.
+  if (count($args) < 1) {
+    drush_set_error('error', dt('At least one queue must be specified.'));
+  }
+
+  // Get qids from machine names.
+  $qids = array();
+  foreach ($args as $queue) {
+
+    $qid = db_select('nodequeue_queue', 'nq')
+      ->fields('nq', array('qid'))
+      ->condition('name', $queue)
+      ->execute()
+      ->fetchField();
+
+    if ($qid) {
+      $qids[] = $qid;
+    }
+    else {
+      drush_set_error('error', dt('Queue @queue was not found.', array('@queue' => $queue)));
+    }
+
+  }
+
+  nodequeue_generate_rehash();
+  nodequeue_generate_repopulate_queues($qids);
+}
+
+/**
+ * Re-populates all nodequeues with random nodes.
+ */
+function drush_nodequeue_generate_all() {
+  $qids = db_select('nodequeue_queue', 'nq')
+    ->fields('nq', array('qid'))
+    ->execute()
+    ->fetchAll(PDO::FETCH_COLUMN, 'qid');
+
+  nodequeue_generate_rehash();
+  nodequeue_generate_repopulate_queues($qids);
+}
+
+/**
+ * Rehashes smartqueue subqueues for taxonomy smartqueue.
+ */
+function drush_nodequeue_generate_rehash() {
+  nodequeue_generate_rehash();
+}
diff --git a/nodequeue_generate.module b/nodequeue_generate.module
index 52dc7bf..95d3c20 100644
--- a/nodequeue_generate.module
+++ b/nodequeue_generate.module
@@ -1,124 +1,103 @@
 <?php
 
+/**
+ * Implements hook_menu().
+ */
 function nodequeue_generate_menu() {
-  $items['admin/content/generate_nodequeue'] = array(
+  $items['admin/structure/nodequeue/generate_nodequeue'] = array(
+    'title' => 'Generate queue assignments',
+    'description' => 'Bulk add nodes into queues',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('nodequeue_generate_form'),
-    'description' => 'Bulk add nodes into queues',
-    'title' => 'Generate queue assignments',
     'access callback' => 'user_access',
     'access arguments' => array('manipulate all queues'),
+    'type' => MENU_LOCAL_TASK,
   );
   return $items;
 }
 
+/**
+ * Menu callback; Returns the nodequeue generate form.
+ */
 function nodequeue_generate_form() {
-  $form['help'] = array('#value' => '<p>' . t('Select which queues shall be <strong>emptied</strong> and re-populated with new nodes.') . '</p>');
+  $form['help'] = array(
+    '#markup' => '<p>' . t('Select which queues shall be <strong>emptied</strong> and re-populated with new nodes.') . '</p>'
+  );
 
   $queues = nodequeue_load_queues(nodequeue_get_all_qids(25));
-  if (empty($queues)) {
-    form_set_error('', t('No queues exist.'));
-    return array();
-  }
 
-  $qids = array();
-  // For every queue that has exactly 1 subqueue,
+  // Tableselect header.
+  $header = array(
+    'name' => 'Queue name',
+    'max_nodes' => 'Max nodes',
+    'subqueues' => 'Subqueues',
+  );
+
+  // Tableselect data.
+  $data = array();
   foreach ($queues as $queue) {
-    if ($queue->subqueues == 1) {
-      $qids[] = $queue->qid;
-    }
+    $data[$queue->qid]['name'] = check_plain($queue->title);
+    $data[$queue->qid]['max_nodes'] = $queue->size == 0 ? t('Infinite') : $queue->size;
+    $data[$queue->qid]['subqueues'] = $queue->subqueues;
   }
 
-  $subqueues = nodequeue_load_subqueues_by_queue($qids);
-  // Relate all the subqueues we loaded back to our queues.
-  foreach ($subqueues as $subqueue) {
-    $queues[$subqueue->qid]->subqueue = $subqueue;
-  }
+  // Table select element.
+  $form['nodequeues'] = array(
+    '#type' => 'tableselect',
+    '#header' => $header,
+    '#options' => $data,
+    '#empty' => t('There are no queues.'),
+  );
 
-  foreach ($queues as $queue) {
-    $sub_text = $queue->subqueues;
-    if ($sub_text == 1) {
-      $sub_text .= " (" . nodequeue_subqueue_size_text($queue->size, $queue->subqueue->count) . ")";
-    }
-    $form['rows']['cb'][$queue->qid] = array('#type' => 'checkbox', '#default_value' => 0);
-    $form['rows'][$queue->qid]['nodequeue-title'] = array('#value' => check_plain($queue->title));
-    $form['rows'][$queue->qid]['nodequeue-max-nodes'] = array('#value' => $queue->size == 0 ? t('Infinite') : $queue->size);
-    $form['rows'][$queue->qid]['nodequeue-subqueues'] = array('#value' => $sub_text);
-    $form['rows'][$queue->qid]['limit'] = array('#type' => 'value', '#value' => ($queue->size == 0 || $queue->size > 20) ? 10 : $queue->size);
-  }
+  $form['nodequeue_generate_nodes_limit'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Nodes limit'),
+    '#description' => t('How many nodes to insert in a queue. This value is only taken into consideration for infinite queues.'),
+    '#size' => 3,
+    '#default_value' => 10,
+  );
 
-  $form['qids'] = array('#type' => 'value', '#value' => array_keys($queues));
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Generate'),
   );
-  $form['#tree'] = TRUE;
+
   return $form;
 }
 
+function nodequeue_generate_form_submit($form, &$form_state) {
+  // Get qids of all nodequeues that need to be re-populated and repopulate them.
+  $qids = array_keys(array_filter($form_state['values']['nodequeues']));
+  $nodes_limit = $form_state['values']['nodequeue_generate_nodes_limit'];
+  nodequeue_generate_rehash();
+  nodequeue_generate_repopulate_queues($qids, $nodes_limit);
+}
+
 /**
- * Implements hook_theme().
+ * Re-populates nodequeues with nodes.
  *
- * @return unknown
+ * @param $qids Array of queues, that need to be repopulated.
  */
-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']);
-  unset($children[array_search('cb', $children)]);
-  foreach ($children as $qid) {
-    $rows[] = array(
-      drupal_render($form['rows']['cb'][$qid]),
-      drupal_render($form['rows'][$qid]['nodequeue-title']),
-      drupal_render($form['rows'][$qid]['nodequeue-max-nodes']),
-      drupal_render($form['rows'][$qid]['nodequeue-subqueues']),
-    );
-  }
-  $header = array(theme('table_select_header_cell'), t('Title'), t('Max nodes'), t('Subqueues'));
-  $output .= theme('table', array('header' => $header, 'rows' => $rows));
-  $output .= theme('pager', array('tags' => NULL));
-  $output .= drupal_render($form);
-
-  return $output;
-}
-
-function nodequeue_generate_form_submit($form, &$form_state) {
-  $qids = array_keys(array_filter($form_state['values']['rows']['cb']));
+function nodequeue_generate_repopulate_queues($qids, $nodes_limit = 10) {
+  // Remove existing nodes from queues.
   db_query("DELETE FROM {nodequeue_nodes} WHERE qid IN (:qids)", array(':qids' => $qids));
 
+  // Load all queues and their subqueues.
   $queues = nodequeue_load_queues($qids);
   $subqueues = nodequeue_load_subqueues_by_queue($qids);
-  // TODO: handle non smart_taxonomy subqueues.
-  foreach ($subqueues as $subqueue) {
-    // dpr($queues[$subqueue->qid]);
-    // we don't know what kind of nodes to out in, so skip. is this a good idea?
-    if (empty($queues[$subqueue->qid]->types)) {
-      next;
-    }
 
-    $placeholders = implode(', ', array_fill(0, count($queues[$subqueue->qid]->types), '\'%s\''));
-    $args = $queues[$subqueue->qid]->types;
-    // 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_state['values']['rows'][$subqueue->qid]['limit']);
-      foreach ($result as $row) {
-        nodequeue_subqueue_add($subqueue, $subqueue, $row->nid);
-      }
-    }
-    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_state['values']['rows'][$subqueue->qid]['limit']);
-      foreach ($result as $row) {
-        nodequeue_subqueue_add($subqueue, $subqueue, $row->nid);
+  // Re-populate subqueues
+  foreach ($qids as $qid) {
+    $queue = nodequeue_load($qid);
+
+    // Skip nodequeues that do not belong to any node types.
+    if (!empty($queue->types)) {
+
+      $limit = $queue->size ? $queue->size : $nodes_limit;
+      $callback = $queue->owner . '_nodequeue_generate';
+
+      if (function_exists($callback)) {
+        $callback($queue, $limit);
       }
     }
   }
@@ -132,22 +111,102 @@ function nodequeue_generate_form_submit($form, &$form_state) {
  *
  * @param vids
  *   An array of vocabulary ids.
- **/
-function nodequeue_generate_rehash($vids) {
+ */
+function nodequeue_generate_rehash() {
   // Delete existing smartqueue taxonomy subqueues
   db_query("DELETE ns FROM nodequeue_subqueue ns INNER JOIN nodequeue_queue nq ON ns.qid=nq.qid WHERE nq.owner = 'smartqueue_taxonomy'");
 
-  // Re-add those subqueues
-  $node = new stdClass;
-  $tree = array();
-  foreach ($vids as $vid) {
-    $tree += taxonomy_get_tree($vid);
+  // Get all queues, owned by Smartqueue taxonomy.
+  $qids = db_select('nodequeue_queue', 'nq')
+    ->fields('nq', array('qid'))
+    ->condition('owner', 'smartqueue_taxonomy')
+    ->execute()
+    ->fetchAll();
+
+  foreach ($qids as $qid) {
+    $queue = nodequeue_load($qid->qid);
+    $fields = explode('-', $queue->reference);
+
+    $tids = array();
+    foreach ($fields as $field) {
+      // Get all possible tids from this field.
+      $query = db_select('field_data_' . $field, 'f');
+
+      $query
+        ->condition('f.entity_type', 'node')
+        ->condition('f.bundle', $queue->types, 'IN')
+        ->condition('f.deleted', FALSE)
+        ->addField('f', $field . '_tid', 'tid');
+      $query = $query->distinct();
+      $query = $query->execute();
+
+      $tids += $query->fetchAll();
+    }
+
+    // Rehash for each tid.
+    $nids = array();
+    foreach ($tids as $tid) {
+      foreach ($fields as $field) {
+        $query = db_select('field_data_' . $field, 'f')
+          ->condition('f.entity_type', 'node')
+          ->condition('f.bundle', $queue->types, 'IN')
+          ->condition('f.deleted', FALSE)
+          ->condition('f.' . $field . '_tid', $tid->tid)
+          ->fields('f', array('entity_id'))
+          ->range(0, 1)
+          ->execute();
+
+        $nids += $query->fetchAll();
+      }
+
+      foreach ($nids as $nid) {
+        $node = node_load($nid->entity_id);
+        nodequeue_api_subqueues($queue, $node);
+      }
+    }
   }
-  $node->taxonomy = $tree;
-  $queues = nodequeue_load_queues(nodequeue_get_all_qids(200));
-  foreach ($queues as $queue) {
-    if ($queue->owner == 'smartqueue_taxonomy') {
-      nodequeue_api_subqueues($queue, $node);
+}
+
+/**
+ * Implements hook_nodequeue_generate() for owner 'nodequeue'.
+ */
+function nodequeue_nodequeue_generate($queue, $limit) {
+  $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
+  foreach ($subqueues as $subqueue) {
+    $nodes = db_select('node', 'n')
+      ->condition('n.status', NODE_PUBLISHED)
+      ->condition('n.type', $queue->types, 'IN')
+      ->orderRandom()
+      ->fields('n', array('nid'))
+      ->range(0, $limit)
+      ->execute()
+      ->fetchAll();
+
+    foreach ($nodes as $node) {
+      nodequeue_subqueue_add($queue, $subqueue, $node->nid);
+    }
+  }
+}
+
+/**
+ * Implements hook_nodequeue_generate() for owner 'smartqueue_taxonomy'.
+ */
+function smartqueue_taxonomy_nodequeue_generate($queue, $limit) {
+  $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
+  foreach ($subqueues as $subqueue) {
+    $nodes = db_select('taxonomy_index', 'tn');
+    $nodes->join('node', 'n', 'n.nid=tn.nid');
+    $nodes->fields('n', array('nid'));
+    $nodes->condition('n.status', NODE_PUBLISHED);
+    $nodes->condition('n.type', $queue->types, 'IN');
+    $nodes->condition('tn.tid', $subqueue->reference);
+    $nodes->orderRandom();
+    $nodes->range(0, $limit);
+    $nodes = $nodes->execute();
+    $nodes = $nodes->fetchAll();
+
+    foreach ($nodes as $node) {
+      nodequeue_subqueue_add($queue, $subqueue, $node->nid);
     }
   }
 }
-- 
1.7.5.4


From 1b33daf52ea656a84a4ace1544fb2acc24090a5d Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sat, 13 Aug 2011 09:56:49 +0300
Subject: [PATCH 07/24] Issue #1241602 by sethfisher and amateescu: Nodequeue
 Generate Not Prepending Table Prefix.

---
 nodequeue_generate.module |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/nodequeue_generate.module b/nodequeue_generate.module
index 95d3c20..3a77722 100644
--- a/nodequeue_generate.module
+++ b/nodequeue_generate.module
@@ -114,7 +114,7 @@ function nodequeue_generate_repopulate_queues($qids, $nodes_limit = 10) {
  */
 function nodequeue_generate_rehash() {
   // Delete existing smartqueue taxonomy subqueues
-  db_query("DELETE ns FROM nodequeue_subqueue ns INNER JOIN nodequeue_queue nq ON ns.qid=nq.qid WHERE nq.owner = 'smartqueue_taxonomy'");
+  db_query("DELETE ns FROM {nodequeue_subqueue} ns INNER JOIN {nodequeue_queue} nq ON ns.qid = nq.qid WHERE nq.owner = 'smartqueue_taxonomy'");
 
   // Get all queues, owned by Smartqueue taxonomy.
   $qids = db_select('nodequeue_queue', 'nq')
-- 
1.7.5.4


From 2a8be38423acdefd1493157fd2cef4903f1ef794 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sat, 13 Aug 2011 10:27:37 +0300
Subject: [PATCH 08/24] Issue #1235690 by amateescu: Allow a user to add nodes
 from every content type if he didn't specify one.

---
 nodequeue.module |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/nodequeue.module b/nodequeue.module
index 9d1e530..e4388ad 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -1768,9 +1768,12 @@ function nodequeue_api_autocomplete($queue, $subqueue, $string) {
   $query = db_select('node', 'n')
     ->addTag('node_access')
     ->fields('n', array('nid', 'title'))
-    ->condition('n.type', $queue->types, 'IN')
     ->range(0, variable_get('nodequeue_autocomplete_limit', 10));
 
+  if (!empty($queue->types)) {
+    $query->condition('n.type', $queue->types, 'IN');
+  }
+
   $where_args = array();
   global $user;
   if (!user_access('administer nodes', $user)) {
-- 
1.7.5.4


From 52e999d4ed0cca6aa6ce4d4581360e3ae55aff23 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sat, 10 Sep 2011 22:57:50 +0300
Subject: [PATCH 09/24] Issue #1269802 by queenvictoria:
 nodequeue_subqueue_position() syntax needs updating.

---
 nodequeue.module |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/nodequeue.module b/nodequeue.module
index e4388ad..9da9c5d 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -1636,7 +1636,7 @@ function nodequeue_load_random_node($sqid) {
  * Get the position of a node in a subqueue, or FALSE if not found.
  */
 function nodequeue_subqueue_position($sqid, $nid) {
-  return db_query("SELECT position FROM {nodequeue_nodes} WHERE sqid = %d AND nid = %d", $sqid, $nid)->fetchField();
+  return db_query("SELECT position FROM {nodequeue_nodes} WHERE sqid = :sqid AND nid = :nid", array(':sqid' => $sqid, ':nid' => $nid))->fetchField();
 }
 
 /**
-- 
1.7.5.4


From 4edc806ccea946a5bf8daa671c9187143625b7d3 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 11 Sep 2011 00:17:06 +0300
Subject: [PATCH 10/24] Issue #1270652 by MrHaroldA: Undefined variable: sqid
 in nodequeue_queue_swap().

---
 nodequeue.module |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/nodequeue.module b/nodequeue.module
index 9da9c5d..1a21e7d 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -1202,7 +1202,7 @@ function nodequeue_queue_swap($subqueue, $pos1, $pos2) {
     ->execute();
 
   // notify other modules of the swap
-  module_invoke_all('nodequeue_swap', $sqid, $nid);
+  module_invoke_all('nodequeue_swap', $subqueue->sqid, $nid);
 
 }
 
-- 
1.7.5.4


From 0954c2ba47175c879d24da588f2fa94f326d0267 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 18 Sep 2011 17:17:24 +0300
Subject: [PATCH 11/24] Issue #1281578 by bellesmanieres: nodequeue.js uses
 deprecated Drupal.parseJson

---
 nodequeue.js |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/nodequeue.js b/nodequeue.js
index 194a96b..efa2c9d 100644
--- a/nodequeue.js
+++ b/nodequeue.js
@@ -385,10 +385,10 @@ Drupal.nodequeue.autoAttach = function() {
       data: { js: 1 },
       url: href,
       global: true,
+      dataType: 'json',
       success: function (data) {
         // Parse response
         $(a).removeClass('throbbing');
-        data = Drupal.parseJson(data);
         // Change text on success
         if (data.status) {
           // Change label back
-- 
1.7.5.4


From 4fd425bdfc506edeb81a6184f5b26aad72bcc852 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 18 Sep 2011 18:27:24 +0300
Subject: [PATCH 12/24] Issue #719426 by fuerst and amateescu: "Restricted
 node" message in the queue.

---
 nodequeue.module |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/nodequeue.module b/nodequeue.module
index 1a21e7d..cbf70a2 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -2066,6 +2066,11 @@ function nodequeue_nids_visible($sqid = -1, $account = NULL) {
     $query->condition(db_or()->condition('n.status', 1)->condition('n.uid', $account->uid));
   }
 
+  // Disable i18n_select for this query.
+  if (arg(0) == 'admin') {
+    $query->addTag('i18n_select');
+  }
+
   $query_restricted = $query->execute();
   foreach ($query_restricted as $result_restricted) {
     $nids_visible[$result_restricted->nid] = $result_restricted->nid;
-- 
1.7.5.4


From 36e4622da9792562d30650977416c6219949c3cc Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 18 Sep 2011 21:35:45 +0300
Subject: [PATCH 13/24] Issue #851616 by amateescu and netsensei: Translation:
 autocomplete on subqueue lists incorrect nodes.

---
 nodequeue.module |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/nodequeue.module b/nodequeue.module
index cbf70a2..46f7e2e 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -1767,7 +1767,7 @@ function nodequeue_api_autocomplete($queue, $subqueue, $string) {
 
   $query = db_select('node', 'n')
     ->addTag('node_access')
-    ->fields('n', array('nid', 'title'))
+    ->fields('n', array('nid', 'tnid', 'title'))
     ->range(0, variable_get('nodequeue_autocomplete_limit', 10));
 
   if (!empty($queue->types)) {
@@ -1805,7 +1805,8 @@ function nodequeue_api_autocomplete($queue, $subqueue, $string) {
     $result = $query->execute();
 
     foreach ($result as $node) {
-      $matches[$node->nid] = check_plain($node->title) . " [nid: $node->nid]";
+      $id = nodequeue_get_content_id($queue, $node);
+      $matches[$node->nid] = check_plain($node->title) . " [nid: $id]";
     }
   }
 
-- 
1.7.5.4


From be332ab6867fb855d88713bcdc1a89ff7d650955 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Tue, 20 Sep 2011 22:37:19 +0300
Subject: [PATCH 14/24] Issue #1284148 by seworthi: Missing form validation in
 nodequeue_generate.

---
 nodequeue_generate.module |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/nodequeue_generate.module b/nodequeue_generate.module
index 3a77722..6bc9061 100644
--- a/nodequeue_generate.module
+++ b/nodequeue_generate.module
@@ -65,6 +65,18 @@ function nodequeue_generate_form() {
   return $form;
 }
 
+/**
+ * Validate nodequeue generate form submission.
+ *
+ * Make sure that at least one queue was selected.
+ */
+function nodequeue_generate_form_validate($form, &$form_state) {
+  $qids = array_keys(array_filter($form_state['values']['nodequeues']));
+  if (count($qids) < 1) {
+    form_set_error('nodequeues', t('You must select a Queue.'));
+  }
+}
+
 function nodequeue_generate_form_submit($form, &$form_state) {
   // Get qids of all nodequeues that need to be re-populated and repopulate them.
   $qids = array_keys(array_filter($form_state['values']['nodequeues']));
-- 
1.7.5.4


From 9712bd4b625a956ad5347178fb06fab19b6ef955 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Tue, 20 Sep 2011 22:57:05 +0300
Subject: [PATCH 15/24] Issue #719426 by slip: Follow-up: Apply the fix from
 4fd425b to autocomplete too.

---
 nodequeue.module |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/nodequeue.module b/nodequeue.module
index 46f7e2e..5f84cd5 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -1802,6 +1802,7 @@ function nodequeue_api_autocomplete($queue, $subqueue, $string) {
     return $function($queue, $subqueue, $string, $where, $where_args);
   }
   else {
+    $query->addTag('i18n_select');
     $result = $query->execute();
 
     foreach ($result as $node) {
-- 
1.7.5.4


From 37c79ea2ec02211a61b0013d9222ada689d6ae58 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Wed, 21 Sep 2011 00:23:39 +0300
Subject: [PATCH 16/24] Issue #1274026 by fuerst: Remove lower case for page
 title in the Nodequeue edit form.

---
 includes/nodequeue.admin.inc |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/includes/nodequeue.admin.inc b/includes/nodequeue.admin.inc
index 682da8b..06fca99 100644
--- a/includes/nodequeue.admin.inc
+++ b/includes/nodequeue.admin.inc
@@ -363,7 +363,7 @@ function nodequeue_edit_queue_form($form, &$form_state, $queue) {
     if (!isset($info[$queue])) {
       return FALSE;
     }
-    drupal_set_title(t('Add @type', array('@type' => strtolower($info[$queue]['title']))), PASS_THROUGH);
+    drupal_set_title(t('Add @type', array('@type' => $info[$queue]['title'])), PASS_THROUGH);
     $queue = new nodequeue_queue($queue);
   }
   else {
-- 
1.7.5.4


From 136e46fd1c7a62210adb4170317bf6ac3e0b4918 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 16 Oct 2011 00:49:49 +0300
Subject: [PATCH 17/24] Issue #1281382 by cschaub: Nodequeue Generate doesn't
 create taxonomy smartqueues for each term.

---
 nodequeue_generate.module |   21 +++++++++++----------
 1 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/nodequeue_generate.module b/nodequeue_generate.module
index 6bc9061..3e5d788 100644
--- a/nodequeue_generate.module
+++ b/nodequeue_generate.module
@@ -140,6 +140,7 @@ function nodequeue_generate_rehash() {
     $fields = explode('-', $queue->reference);
 
     $tids = array();
+    $nids = array();
     foreach ($fields as $field) {
       // Get all possible tids from this field.
       $query = db_select('field_data_' . $field, 'f');
@@ -153,26 +154,26 @@ function nodequeue_generate_rehash() {
       $query = $query->execute();
 
       $tids += $query->fetchAll();
-    }
 
-    // Rehash for each tid.
-    $nids = array();
-    foreach ($tids as $tid) {
-      foreach ($fields as $field) {
-        $query = db_select('field_data_' . $field, 'f')
+      // Rehash for each tid.
+      foreach ($tids as $tid) {
+        $query = db_select('field_data_' . $field, 'f');
+        $query
           ->condition('f.entity_type', 'node')
           ->condition('f.bundle', $queue->types, 'IN')
           ->condition('f.deleted', FALSE)
           ->condition('f.' . $field . '_tid', $tid->tid)
           ->fields('f', array('entity_id'))
-          ->range(0, 1)
-          ->execute();
+          ->range(0, 1);
+        $query = $query->execute();
 
-        $nids += $query->fetchAll();
+        while($item = $query->fetchAssoc()) {
+          $nids[] = $item;
+        }
       }
 
       foreach ($nids as $nid) {
-        $node = node_load($nid->entity_id);
+        $node = node_load($nid['entity_id']);
         nodequeue_api_subqueues($queue, $node);
       }
     }
-- 
1.7.5.4


From a41c123724e93e80d9e13f73c5341bc04bce65b9 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 16 Oct 2011 01:38:40 +0300
Subject: [PATCH 18/24] Issue #1215994 by amateescu: Views filter 'In Queue'
 drops first node in the queue.

---
 .../views/nodequeue_handler_filter_in_queue.inc    |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/includes/views/nodequeue_handler_filter_in_queue.inc b/includes/views/nodequeue_handler_filter_in_queue.inc
index 2d2f502..108c32b 100644
--- a/includes/views/nodequeue_handler_filter_in_queue.inc
+++ b/includes/views/nodequeue_handler_filter_in_queue.inc
@@ -7,6 +7,6 @@
 class nodequeue_handler_filter_in_queue extends views_handler_filter_boolean_operator {
   function query() {
     $this->ensure_my_table();
-    $this->query->add_where($this->options['group'], $this->table_alias . ".nid", $this->value, ($this->value ? '!=' : 'IS NULL'));
+    $this->query->add_where($this->options['group'], $this->table_alias . ".nid", 0, ($this->value ? '!=' : 'IS NULL'));
   }
 }
-- 
1.7.5.4


From 19747f2c39fc86fc3a2a41667864b288e771d15f Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 16 Oct 2011 02:21:37 +0300
Subject: [PATCH 19/24] Issue #1199480 by amateescu: Errors generated by
 nodequeue when trying to update old data.

---
 .../nodequeue_handler_relationship_nodequeue.inc   |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/includes/views/nodequeue_handler_relationship_nodequeue.inc b/includes/views/nodequeue_handler_relationship_nodequeue.inc
index 768f612..c6981d9 100644
--- a/includes/views/nodequeue_handler_relationship_nodequeue.inc
+++ b/includes/views/nodequeue_handler_relationship_nodequeue.inc
@@ -16,7 +16,9 @@ class nodequeue_handler_relationship_nodequeue extends views_handler_relationshi
     if (!empty($options['qids'])) {
       $map = array_flip(nodequeue_get_qid_map());
       foreach ($options['qids'] as $key => $value) {
-        $this->options['names'][$map[$key]] = ($value) ? $map[$key] : 0;
+        if ($value) {
+          $this->options['names'][$map[$key]] = ($value) ? $map[$key] : 0;
+        }
       }
       unset($this->options['qids']);
     }
-- 
1.7.5.4


From 37a51225bbce68ecc949c72ca7dd0622122e54b8 Mon Sep 17 00:00:00 2001
From: Andrei Mateescu <andrei@xns.ro>
Date: Sun, 16 Oct 2011 02:57:26 +0300
Subject: [PATCH 20/24] Issue #1307306 by amateescu: Adding the "Nodequeue Add
 / Remove links" to a view causes an ajax error.

---
 includes/views/nodequeue_handler_field_links.inc |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/includes/views/nodequeue_handler_field_links.inc b/includes/views/nodequeue_handler_field_links.inc
index 66ce19a..864d31b 100644
--- a/includes/views/nodequeue_handler_field_links.inc
+++ b/includes/views/nodequeue_handler_field_links.inc
@@ -6,9 +6,8 @@
  */
 class nodequeue_handler_field_links extends views_handler_field_node_link {
   function render($values) {
-    if (user_access('manipulate queues') || user_access('manipulate all queues')) {
-      $nid = $values->{$this->aliases['nid']};
-      return theme('links', array('links' => nodequeue_node_links(node_load($nid))));
+    if ((user_access('manipulate queues') || user_access('manipulate all queues')) && $node = $this->get_value($values)) {
+      return theme('links', array('links' => nodequeue_node_links($node)));
     }
   }
 }
-- 
1.7.5.4


From d05516eee26b4da88302c60eaaac1d9a66564632 Mon Sep 17 00:00:00 2001
From: Lorenz Schori <lo@znerol.ch>
Date: Sat, 22 Oct 2011 14:22:00 +0200
Subject: [PATCH 21/24] Fix options in nodequeue field handler

* Implement new method option_definition() replacing method options()
* Fix copy paste typo (options['link_to_taxonomy'] instead of
  options['link_to_queue'])
* Use ctools #dependency instead of #states otherwise no controls are
  shown in field settings popup.
---
 .../views/nodequeue_handler_field_all_queues.inc   |   21 +++++++++----------
 1 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/includes/views/nodequeue_handler_field_all_queues.inc b/includes/views/nodequeue_handler_field_all_queues.inc
index 82d935e..8b87d1f 100644
--- a/includes/views/nodequeue_handler_field_all_queues.inc
+++ b/includes/views/nodequeue_handler_field_all_queues.inc
@@ -10,11 +10,14 @@ class nodequeue_handler_field_all_queues extends views_handler_field_prerender_l
   /**
    * Provide meaningful defaults.
    */
-  function options(&$options) {
-    parent::options($options);
-    $options['link_to_queue'] = TRUE;
-    $options['limit'] = FALSE;
-    $options['qids'] = array();
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['link_to_queue'] = array('default' => TRUE);
+    $options['limit'] = array('default' => FALSE);
+    $options['qids'] = array('default' => array());
+
+    return $options;
   }
 
   /**
@@ -25,7 +28,7 @@ class nodequeue_handler_field_all_queues extends views_handler_field_prerender_l
     $form['link_to_queue'] = array(
       '#title' => t('Link this field to queue arrange page'),
       '#type' => 'checkbox',
-      '#default_value' => !empty($this->options['link_to_taxonomy']),
+      '#default_value' => !empty($this->options['link_to_queue']),
     );
 
     $form['limit'] = array(
@@ -47,11 +50,7 @@ class nodequeue_handler_field_all_queues extends views_handler_field_prerender_l
       '#title' => t('Queues'),
       '#options' => $options,
       '#default_value' => $this->options['qids'],
-      '#states' => array(
-        'visible' => array(
-          ':input[name="options[limit]"]' => array('checked' => TRUE)
-        ),
-      ),
+      '#dependency' => array('edit-options-limit' => array(TRUE)),
     );
   }
 
-- 
1.7.5.4


From df5bd69792cf1671f2d9c4b76676aa74783bab5a Mon Sep 17 00:00:00 2001
From: Lorenz Schori <lo@znerol.ch>
Date: Sat, 22 Oct 2011 14:54:11 +0200
Subject: [PATCH 22/24] Use advanced rendering for creating links

Introduce method render() in order to trigger advanced rendering of
field contents (see views_handler_field.inc).
---
 .../views/nodequeue_handler_field_all_queues.inc   |   14 +++++++++-----
 .../nodequeue_handler_field_all_subqueues.inc      |   10 +++++-----
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/includes/views/nodequeue_handler_field_all_queues.inc b/includes/views/nodequeue_handler_field_all_queues.inc
index 8b87d1f..35a2251 100644
--- a/includes/views/nodequeue_handler_field_all_queues.inc
+++ b/includes/views/nodequeue_handler_field_all_queues.inc
@@ -69,13 +69,17 @@ class nodequeue_handler_field_all_queues extends views_handler_field_prerender_l
       $result = db_query("SELECT nn.nid, nn.qid, nq.title FROM {nodequeue_nodes} nn INNER JOIN {nodequeue_queue} nq ON nq.qid = nn.qid WHERE nn.nid IN (" . implode(', ', $nids) . ")$queue ORDER BY nq.title");
 
       foreach ($result as $queue) {
-        if (empty($this->options['link_to_queue'])) {
-          $this->items[$queue->nid][$queue->qid] = check_plain($queue->title);
-        }
-        else {
-          $this->items[$queue->nid][$queue->qid] = l($queue->title, "admin/structure/nodequeue/$queue->qid");
+        $this->items[$queue->nid][$queue->qid]['title'] = check_plain($queue->title);
+
+        if (!empty($this->options['link_to_queue'])) {
+          $this->items[$queue->nid][$queue->qid]['make_link'] = TRUE;
+          $this->items[$queue->nid][$queue->qid]['path'] = 'admin/structure/nodequeue/' . $queue->qid;
         }
       }
     }
   }
+
+  function render_item($count, $item) {
+    return $item['title'];
+  }
 }
diff --git a/includes/views/nodequeue_handler_field_all_subqueues.inc b/includes/views/nodequeue_handler_field_all_subqueues.inc
index 6fa29f5..2f63b56 100644
--- a/includes/views/nodequeue_handler_field_all_subqueues.inc
+++ b/includes/views/nodequeue_handler_field_all_subqueues.inc
@@ -24,11 +24,11 @@ class nodequeue_handler_field_all_subqueues extends nodequeue_handler_field_all_
 
         foreach ($result as $queue) {
           $title = empty($queue->subqueue_title) ? $queue->title : str_replace('%subqueue', $queue->title, $queue->subqueue_title);
-          if (empty($this->options['link_to_queue'])) {
-            $this->items[$queue->nid][$queue->sqid] = check_plain($title);
-          }
-          else {
-            $this->items[$queue->nid][$queue->sqid] = l($title, "admin/structure/nodequeue/$queue->qid/view/$queue->sqid");
+          $this->items[$queue->nid][$queue->sqid]['title'] = check_plain($title);
+
+          if (!empty($this->options['link_to_queue'])) {
+            $this->items[$queue->nid][$queue->sqid]['make_link'] = TRUE;
+            $this->items[$queue->nid][$queue->sqid]['path'] = 'admin/structure/nodequeue/' . $queue->qid . '/view/' . $queue->sqid;
           }
         }
       }
-- 
1.7.5.4


From 9c0cf9250f26f27e27b23fc40f6d7be7f0f51c7d Mon Sep 17 00:00:00 2001
From: Lorenz Schori <lo@znerol.ch>
Date: Sat, 22 Oct 2011 14:57:17 +0200
Subject: [PATCH 23/24] Convert database queries

---
 .../views/nodequeue_handler_field_all_queues.inc   |   15 ++++++++++-----
 .../nodequeue_handler_field_all_subqueues.inc      |   18 +++++++++++++-----
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/includes/views/nodequeue_handler_field_all_queues.inc b/includes/views/nodequeue_handler_field_all_queues.inc
index 35a2251..0415bcf 100644
--- a/includes/views/nodequeue_handler_field_all_queues.inc
+++ b/includes/views/nodequeue_handler_field_all_queues.inc
@@ -61,12 +61,17 @@ class nodequeue_handler_field_all_queues extends views_handler_field_prerender_l
     }
 
     if ($nids) {
-      $queue = '';
-      if (!empty($this->options['limit']) && !empty($this->options['qids'])) {
-        $queue = " AND nn.qid IN (" . implode(', ', array_keys(array_filter($this->options['qids']))) . ")";
+      $query = db_select('nodequeue_nodes', 'nn');
+      $query->innerJoin('nodequeue_queue', 'nq', 'nn.qid = nq.qid');
+      $query->fields('nn', array('nid', 'qid'));
+      $query->fields('nq', array('title'));
+      $query->orderby('nq.title');
+      $query->condition('nn.nid', $nids);
+      $qids = array_filter($this->options['qids']);
+      if (!empty($this->options['limit']) && !empty($qids)) {
+        $query->condition('nn.qid', $qids);
       }
-
-      $result = db_query("SELECT nn.nid, nn.qid, nq.title FROM {nodequeue_nodes} nn INNER JOIN {nodequeue_queue} nq ON nq.qid = nn.qid WHERE nn.nid IN (" . implode(', ', $nids) . ")$queue ORDER BY nq.title");
+      $result = $query->execute();
 
       foreach ($result as $queue) {
         $this->items[$queue->nid][$queue->qid]['title'] = check_plain($queue->title);
diff --git a/includes/views/nodequeue_handler_field_all_subqueues.inc b/includes/views/nodequeue_handler_field_all_subqueues.inc
index 2f63b56..9353f21 100644
--- a/includes/views/nodequeue_handler_field_all_subqueues.inc
+++ b/includes/views/nodequeue_handler_field_all_subqueues.inc
@@ -15,12 +15,20 @@ class nodequeue_handler_field_all_subqueues extends nodequeue_handler_field_all_
       }
 
       if ($nids) {
-        $queue = '';
-        if (!empty($this->options['limit']) && !empty($this->options['qids'])) {
-          $queue = " AND nn.qid IN (" . implode(', ', array_keys(array_filter($this->options['qids']))) . ")";
+        $query = db_select('nodequeue_nodes', 'nn');
+        $query->innerJoin('nodequeue_queue', 'nq', 'nn.qid = nq.qid');
+        $query->innerJoin('nodequeue_subqueue', 'ns', 'nn.sqid = ns.sqid');
+        $query->fields('nn', array('nid', 'sqid', 'qid'));
+        $query->fields('nq', array('subqueue_title'));
+        $query->fields('ns', array('title'));
+        $query->orderby('ns.title');
+        $query->orderby('nq.subqueue_title');
+        $query->condition('nn.nid', $nids);
+        $qids = array_filter($this->options['qids']);
+        if (!empty($this->options['limit']) && !empty($qids)) {
+          $query->condition('nn.qid', $qids);
         }
-
-        $result = db_query("SELECT nn.nid, nn.sqid, nn.qid, nq.subqueue_title, ns.title FROM {nodequeue_nodes} nn INNER JOIN {nodequeue_queue} nq ON nq.qid = nn.qid INNER JOIN {nodequeue_subqueue} ns on nn.sqid = ns.sqid WHERE nn.nid IN (" . implode(', ', $nids) . ")$queue ORDER BY ns.title, nq.subqueue_title");
+        $result = $query->execute();
 
         foreach ($result as $queue) {
           $title = empty($queue->subqueue_title) ? $queue->title : str_replace('%subqueue', $queue->title, $queue->subqueue_title);
-- 
1.7.5.4


From 2d4fd7db5f45da7a890d2a42847988285e980da3 Mon Sep 17 00:00:00 2001
From: kkuhnen <kkuhnen@highwire.org>
Date: Tue, 15 Nov 2011 10:56:53 -0800
Subject: [PATCH 24/24] adding visibility rules for panels

---
 nodequeue.module                           |    8 ++
 plugins/access/in_nodequeue.inc            |  113 ++++++++++++++++++++++++++++
 2 files changed, 121 insertions(+), 0 deletions(-)
 create mode 100644 nodequeue_add_panels_visibility_rule.patch
 create mode 100644 plugins/access/in_nodequeue.inc

diff --git a/nodequeue.module b/nodequeue.module
index 5f84cd5..71cb1ec 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -2181,3 +2181,11 @@ function theme_nodequeue_subqueue_full_text() {
 function theme_nodequeue_subqueue_count_text($variables) {
   return t('@count in queue', array('@count' => $variables['count']));
 }
+
+/**
+ * Implementation of hook_ctools_plugin_dierctory() to let the system know
+ * we implement plugins.
+ */
+function nodequeue_ctools_plugin_directory($module, $plugin) {
+  return 'plugins/' . $plugin;
+}
\ No newline at end of file
diff --git a/nodequeue_add_panels_visibility_rule.patch b/nodequeue_add_panels_visibility_rule.patch
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/access/in_nodequeue.inc b/plugins/access/in_nodequeue.inc
new file mode 100644
index 0000000..49a1bdd
--- /dev/null
+++ b/plugins/access/in_nodequeue.inc
@@ -0,0 +1,113 @@
+<?php
+
+$plugin = array(
+	'title' => t("Within Nodequeue"),
+	'description' => t('Only show if present in node queue.'),
+	'callback' => 'nodequeue_in_nodequeue_access',
+	'default' => array('rids' => array()),
+	'settings form' => 'nodequeue_in_nodequeue_access_settings',
+	'summary' => 'nodequeue_in_nodequeue_access_summary',
+	'required context' => new ctools_context_required(t('Node'), 'node'),
+);
+
+function nodequeue_in_nodequeue_access_settings(&$form, &$form_state, $conf) {
+		$queues = nodequeue_get_all_qids();
+		$queues = nodequeue_load_queues($queues);
+		$options = array();
+		foreach($queues as $queue) {
+		  $subqueues = nodequeue_load_subqueues_by_queue(array($queue->qid));
+		  $options[$queue->qid] = $queue->title;
+		  foreach($subqueues as $subqueue) {
+			  $options['sub-'.$subqueue->sqid] = '-'.$subqueue->title;
+		  }
+		}
+		
+		$form['settings']['nodequeue'] = array(
+       '#type' => 'select',
+       '#title' => t('Nodequeue'),
+       '#options' => $options,
+       '#default_value' => $conf['nodequeue'],
+       '#description' => t('Select a Nodequeue.'),
+   );
+   return $form;
+		
+}
+
+function nodequeue_in_nodequeue_access($conf, $context){
+	$queue = nodequeue_in_nodequeue_get_queue($conf);
+	$node = $context->data;
+	$pos = strpos($conf['nodequeue'], 'sub-');
+	$nids = array();
+	
+	if($pos === FALSE){
+	  $subqueues = nodequeue_load_subqueues_by_queue(array($conf['nodequeue'])); 
+	  $query =  db_select('nodequeue_nodes', 'n')
+	  ->fields('n', array('nid'));
+	  
+	  $or = db_or(); 
+ 
+	  foreach($subqueues as $sub){
+	  	$or->condition('n.sqid', $sub->sqid, '=');
+	  }
+	  
+	  $query->condition($or);
+	  $result =  $query->execute();
+	  
+	  while($record = $result->fetchAssoc()) {
+       $nids[] = $record['nid'];
+    }
+    	 
+	} else {
+		$query =  db_select('nodequeue_nodes', 'n')
+	  ->fields('n', array('nid'));
+	  $query->condition('n.sqid', $queue->sqid, '=');
+	  
+	  $result =  $query->execute();
+	  
+	  while($record = $result->fetchAssoc()) {
+       $nids[] = $record['nid'];
+    }
+	
+	}
+	
+	foreach($nids as $nid){
+		if($nid == $node->nid){
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+/**
+ * Provide a summary description based upon the checked roles.
+ */
+function nodequeue_in_nodequeue_access_summary($conf, $context) {
+	$queue = nodequeue_in_nodequeue_get_queue($conf);
+	return $queue->title;
+}
+
+
+function nodequeue_in_nodequeue_get_queue($conf){
+	$pos = strpos($conf['nodequeue'], 'sub-');
+	$queues = nodequeue_get_all_qids();
+	if($pos !== FALSE){
+		$sqid = str_replace('sub-', '', $conf['nodequeue']);
+	  $queues = nodequeue_load_queues($queues);
+	  foreach($queues as $queue) {
+
+			$subqueues = nodequeue_load_subqueues_by_queue(array($queue->qid));
+			foreach($subqueues as $sub){
+				if($sub->sqid == $sqid){
+					return $sub;
+				}
+			}
+		}
+	}
+	
+	$queue = nodequeue_load_queues(array($conf['nodequeue']));
+	return array_pop($queue);
+}  
+//nodequeue_load_nodes
+  // $queues = nodequeue_load_queues_by_type($node->type, 'links');
+	// $subqueues = nodequeue_get_subqueues_by_node($queues, $node);  
+	//	nodequeue_get_qids($type, $account = NULL, $bypass_cache = FALSE)
\ No newline at end of file
-- 
1.7.5.4

