? .DS_Store
? .svn
? bookmark_form_field.patch
? views_bookmark.js
Index: views_bookmark.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views_bookmark/views_bookmark.info,v
retrieving revision 1.2
diff -u -p -r1.2 views_bookmark.info
--- views_bookmark.info	18 Jun 2007 22:54:07 -0000	1.2
+++ views_bookmark.info	13 Jul 2007 03:21:42 -0000
@@ -1,4 +1,4 @@
-; $Id: views_bookmark.info,v 1.2 2007/06/18 22:54:07 dww Exp $
+; $Id: views_bookmark.info,v 1.1.2.1 2007/06/18 23:07:14 dww Exp $
 name = Views Bookmark
 description = Create customized bookmarks that individual users can set on nodes.
 package = Views
Index: views_bookmark.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views_bookmark/views_bookmark.install,v
retrieving revision 1.3
diff -u -p -r1.3 views_bookmark.install
--- views_bookmark.install	19 Jan 2007 00:58:16 -0000	1.3
+++ views_bookmark.install	13 Jul 2007 03:21:42 -0000
@@ -1,5 +1,5 @@
 <?php
-// $Id: views_bookmark.install,v 1.3 2007/01/19 00:58:16 merlinofchaos Exp $
+// $Id: views_bookmark.install,v 1.2.2.1 2007/01/19 00:53:00 merlinofchaos Exp $
 
 function views_bookmark_install() {
   switch ($GLOBALS['db_type']) {
@@ -15,6 +15,7 @@ function views_bookmark_install() {
                   roles varchar(255) default '',
                   global int(1) default 0,
                   teaser int(1) default 0,
+                  show_on_form int(1) default 0,
                   PRIMARY KEY (vbid)
                   ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
       db_query("CREATE TABLE {views_bookmark_nodes} (
@@ -36,7 +37,7 @@ function views_bookmark_install() {
                   ) /*!40100 DEFAULT CHARACTER SET utf8 */;");             
       // Insert a starting record.
 
-      $sql = "INSERT INTO {views_bookmarks} VALUES (1, 'bookmarks', 'bookmark this', 'Add this post to your bookmarks', 'unbookmark this', 'Remove this post from your bookmarks', '2', 0, 0)";
+      $sql = "INSERT INTO {views_bookmarks} VALUES (1, 'bookmarks', 'bookmark this', 'Add this post to your bookmarks', 'unbookmark this', 'Remove this post from your bookmarks', '2', 0, 0, 0)";
       db_query($sql);
 
       $sql = "INSERT INTO {views_bookmark_nodetypes} VALUES (1, 'story')";
@@ -121,4 +122,15 @@ function views_bookmark_update_3() {
       break;
   }
   return $ret;
+}
+
+function views_bookmark_update_4() {
+  $ret = array();
+  switch($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $result = update_sql('ALTER TABLE {views_bookmarks} ADD show_on_form int(1) default 0;');
+      break;
+  }
+  return $ret;
 }
\ No newline at end of file
Index: views_bookmark.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views_bookmark/views_bookmark.module,v
retrieving revision 1.6
diff -u -p -r1.6 views_bookmark.module
--- views_bookmark.module	10 Jan 2007 06:27:43 -0000	1.6
+++ views_bookmark.module	13 Jul 2007 03:21:42 -0000
@@ -56,6 +56,14 @@ function views_bookmark_perm() {
 }
 
 /**
+ * Helper function for adding the JavaScript behaviour.
+ */
+function views_bookmark_add_js($bookmark) {
+  drupal_add_js(drupal_get_path('module', 'views_bookmark') .'/views_bookmark.js');
+  drupal_add_js(array('viewsBookmark' => array($bookmark->vbid => array('mark' => check_plain($bookmark->mark), 'unmark' => check_plain($bookmark->unmark)))), 'setting');
+}
+
+/**
  * Implementation of hook_link
  */
 function views_bookmark_link($type, $node = NULL, $teaser = FALSE) {
@@ -68,7 +76,7 @@ function views_bookmark_link($type, $nod
   if (!$user || !$user->uid)
     return; 
 
-  $roles = array_keys($user->roles);
+  $roles = array_merge(array(DRUPAL_AUTHENTICATED_RID), array_keys($user->roles));
 
   // Get bookmark status for this node.
   $result = db_query("SELECT * FROM {views_bookmark_nodes} WHERE nid = %d AND (uid = %d OR uid = 0)", $node->nid, $user->uid);
@@ -79,7 +87,7 @@ function views_bookmark_link($type, $nod
   // Get all possible bookmarks for this node.
   $result = db_query("SELECT * FROM {views_bookmarks} vb LEFT JOIN {views_bookmark_nodetypes} vbn ON vbn.vbid = vb.vbid WHERE vbn.type = '%s'", $node->type);
   while ($bookmark = db_fetch_object($result)) {
-    $access = explode(', ', $bookmark->roles);
+    $access = explode(',', $bookmark->roles);
     if (!array_intersect($access, $roles)) {
       continue;
     }
@@ -92,21 +100,114 @@ function views_bookmark_link($type, $nod
       // already marked
       $links["links_bookmark_$bookmark->vbid"] = array(
         'title' => $bookmark->unmark,
-        'href' => "views_bookmark/unmark/$node->nid/$bookmark->vbid",
+        'href' => "views_bookmark/unmark/$node->nid/$bookmark->vbid", 
+        'query' => "destination=$_GET[q]",
         'attributes', array('title' => $bookmark->unmark_long),
       );
     } else {
       // not marked
       $links["links_bookmark_$bookmark->vbid"] = array(
         'title' => $bookmark->mark,
-        'href' => "views_bookmark/mark/$node->nid/$bookmark->vbid",
+        'href' => "views_bookmark/mark/$node->nid/$bookmark->vbid", 
+        'query' => "destination=$_GET[q]",
         'attributes', array('title' => $bookmark->mark_long),
       );
     }
+    // Add JS behaviour
+    views_bookmark_add_js($bookmark);
   }
+
   return $links;
 }
 
+function views_bookmark_form_alter($form_id, &$form) {
+  global $user;
+  if ($form_id == 'node_type_form') {
+    $result = db_query("SELECT * FROM {views_bookmarks} vb LEFT JOIN {views_bookmark_nodetypes} vbn ON vbn.vbid = vb.vbid WHERE vbn.type = '%s' AND vb.show_on_form = 1", $form['#node_type']->type);
+    while ($bookmark = db_fetch_object($result)) {
+      $var = 'views_bookmark_'. $bookmark->vbid .'_default';
+      $form['workflow']['views_bookmark'][$var] = array(
+        '#type' => 'checkbox',
+        '#title' => $bookmark->mark,
+        '#default_value' => variable_get($var .'_'. $form['#node_type']->type, 0),
+        '#return_value' => 1,
+        '#description' => $bookmark->mark_long,
+      );
+    }
+  }
+  elseif (($form_id == $form['type']['#value'] .'_node_form')) {
+    if (!$user || !$user->uid) {
+      return; 
+    }
+    $roles = array_merge(array(DRUPAL_AUTHENTICATED_RID), array_keys($user->roles));
+
+    if ($form_values['nid']) {
+      // Get bookmark status for this node.
+      $bookmarks = array();
+      $result = db_query("SELECT * FROM {views_bookmark_nodes} WHERE nid = %d AND (uid = %d OR uid = 0)", $node->nid, $user->uid);
+      while ($bookmark = db_fetch_object($result)) {
+        $bookmarks[$bookmark->vbid] = $bookmark;
+      }
+    } else {
+      $bookmarks = array();
+    }
+  	$result = db_query("SELECT * FROM {views_bookmarks} vb LEFT JOIN {views_bookmark_nodetypes} vbn ON vbn.vbid = vb.vbid WHERE vbn.type = '%s' AND vb.show_on_form = 1", $form['type']['#value']);
+    while ($bookmark = db_fetch_object($result)) {
+      $access = explode(',', $bookmark->roles);
+      if (!array_intersect($access, $roles)) {
+        continue;
+      }
+      $var = 'views_bookmark_'. $bookmark->vbid .'_default';
+      $form['workflow']['views_bookmark'][$vbid] = array(
+        '#type' => 'checkbox',
+        '#title' => $bookmark->mark,
+        '#description' => $bookmark->mark_long,
+        '#default_value' => empty($node->nid) ? variable_get($var .'_'. $form['type']['#value'], 0) : isset($bookmarks[$vbid]),
+        '#return_value' => 1,
+      );
+    }
+    if (isset($form['workflow']['views_bookmark'])) {
+      $form['workflow']['views_bookmark']['#type'] = 'fieldset';
+      $form['workflow']['views_bookmark']['#weight'] = 1;
+      $form['workflow']['views_bookmark']['#tree'] = 'TRUE';
+      $form['workflow']['views_bookmark']['#title'] = t('Bookmarks');
+      $form['workflow']['views_bookmark']['#collapsible'] = TRUE;
+    }
+  }
+}
+
+function views_bookmark_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
+  switch ($op) {
+    case 'update':
+    case 'insert':
+      if (!$user || !$user->uid) {
+        return; 
+      }
+      $roles = array_merge(array(DRUPAL_AUTHENTICATED_RID), array_keys($user->roles));
+
+    	$result = db_query("SELECT * FROM {views_bookmarks} vb LEFT JOIN {views_bookmark_nodetypes} vbn ON vbn.vbid = vb.vbid WHERE vbn.type = '%s' AND vb.show_on_form = 1", $node->type);
+      while ($bookmark = db_fetch_object($result)) {
+        $access = explode(',', $bookmark->roles);
+        if (!array_intersect($access, $roles)) {
+          continue;
+        }
+        if ($form_values['workflow']['views_bookmark'][$bookmark->vbid]) {
+          views_bookmark_page('mark', $node->nid, $bookmark->vbid);
+        }
+        else {
+          views_bookmark_page('unmark', $node->nid, $bookmark->vbid);
+        }
+      }
+      break;
+    case 'delete':
+    	$result = db_query("SELECT * FROM {views_bookmarks} vb LEFT JOIN {views_bookmark_nodetypes} vbn ON vbn.vbid = vb.vbid WHERE vbn.type = '%s'", $node->type);
+      while ($bookmark = db_fetch_object($result)) {
+        views_bookmark_page('unmark', $node->nid, $bookmark->vbid);
+      }
+      break;
+  }
+}
+
 // ---------------------------------------------------------------------------
 // Administrative pages
 
@@ -132,8 +233,8 @@ function views_bookmark_admin_page() {
 
   foreach ($marks as $mark) {
     $ops = theme('links', array(
-      'views_bookmarks_edit' =>  array('title' => t('edit'), 'href' => "admin/build/views_bookmark/edit/$mark->vbid"),
-      'views_bookmarks_delete' =>  array('title' => t('delete'), 'href' => "admin/build/views_bookmark/delete/$mark->vbid"),
+      'views_bookmarks_edit' =>  array('title' => t('Edit'), 'href' => "admin/build/views_bookmark/edit/$mark->vbid"),
+      'views_bookmarks_delete' =>  array('title' => t('Delete'), 'href' => "admin/build/views_bookmark/delete/$mark->vbid"),
     ));
     $markroles = array();
     foreach (explode(',', $mark->roles) as $rid) {
@@ -247,6 +348,13 @@ function views_bookmark_form($vbid = NUL
     '#default_value' => $bookmark->teaser,
     '#description' => t("If checked, the bookmark this link will appear on the node teasier; otherwise it will only appear on the full node view."),
   );  
+
+  $form['show_on_form'] = array(
+    '#type' => 'checkbox',
+    '#title' => t("Show on node edit form"),
+    '#default_value' => $bookmark->show_on_form,
+    '#description' => t("If checked, this bookmark will appear as a checkbox on the node editing form when new nodes are created."),
+  );  
   
   $form['submit'] = array(
     '#type' => 'submit',
@@ -263,12 +371,12 @@ function views_bookmark_form($vbid = NUL
 function views_bookmark_form_submit($formid, $form) {
   if ($form['vbid']) {
     $vbid = $form['vbid'];
-    db_query("UPDATE {views_bookmarks} SET title = '%s', mark = '%s', mark_long = '%s', unmark = '%s', unmark_long = '%s', roles = '%s', global = %d, teaser = %d WHERE vbid = %d", $form['title'], $form['mark'], $form['mark_long'], $form['unmark'], $form['unmark_long'], implode(',', array_filter($form['roles'])), $form['global'], $form['teaser'], $form['vbid']);
+    db_query("UPDATE {views_bookmarks} SET title = '%s', mark = '%s', mark_long = '%s', unmark = '%s', unmark_long = '%s', roles = '%s', global = %d, teaser = %d, show_on_form = %d WHERE vbid = %d", $form['title'], $form['mark'], $form['mark_long'], $form['unmark'], $form['unmark_long'], implode(',', array_filter($form['roles'])), $form['global'], $form['teaser'], $form['show_on_form'], $form['vbid']);
     db_query("DELETE FROM {views_bookmark_nodetypes} WHERE vbid = %d", $form['vbid']);
   }
   else {
     $vbid = db_next_id('views_bookmarks_vbid');
-    db_query("INSERT INTO {views_bookmarks} (vbid, title, mark, mark_long, unmark, unmark_long, roles, global, teaser) VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d)", $vbid, $form['title'], $form['mark'], $form['mark_long'], $form['unmark'], $form['unmark_long'], implode(',', array_filter($form['roles'])), $form['global'], $form['teaser']);
+    db_query("INSERT INTO {views_bookmarks} (vbid, title, mark, mark_long, unmark, unmark_long, roles, global, teaser) VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d)", $vbid, $form['title'], $form['mark'], $form['mark_long'], $form['unmark'], $form['unmark_long'], implode(',', array_filter($form['roles'])), $form['global'], $form['teaser'], $form['show_on_form']);
   }
 
   foreach ($form['nodetypes'] as $nodetype) {
@@ -276,8 +384,10 @@ function views_bookmark_form_submit($for
       db_query("INSERT INTO {views_bookmark_nodetypes} (vbid, type) VALUES (%d, '%s')", $vbid, $nodetype);
     }
   }
-  drupal_set_message("Bookmark '$form[title]' has been saved.");
-  drupal_goto('admin/build/views_bookmark');
+  drupal_set_message(t('Bookmark @bookmark has been saved.', array('@bookmark' => $form['title'])));
+  views_invalidate_cache();
+
+  return 'admin/build/views_bookmark';
 }
 
 /**
@@ -304,37 +414,42 @@ function views_bookmark_delete_confirm_s
     db_query("DELETE FROM {views_bookmarks} WHERE vbid = %d", $form['vbid']);
     db_query("DELETE FROM {views_bookmark_nodes} WHERE vbid = %d", $form['vbid']);
     db_query("DELETE FROM {views_bookmark_nodetypes} WHERE vbid = %d", $form['vbid']);
-    drupal_goto('admin/build/views_bookmark');
+    views_invalidate_cache();
   }
+  return 'admin/build/views_bookmark';
 }
 
 /**
- * bookmark a node
+ * Menu callback for (un)bookmarking a node.
+ *
+ * Used both for the regular callback as well as the JS version.
  */
-function views_bookmark_page($how = 'mark', $nid = '', $vbid = '') {
+function views_bookmark_page($how = 'mark', $nid = '', $vbid = '', $js = FALSE) {
+  $error = drupal_to_js(array('status' => FALSE));
+ 
   // anonymous users can't create bookmarks with this system.
   global $user;
   if (!$user || !$user->uid) {
-    return drupal_access_denied(); 
+    return $js ? $error : drupal_access_denied();
   }
 
-  $roles = array_keys($user->roles);
+  $roles = array_merge(array(DRUPAL_AUTHENTICATED_RID), array_keys($user->roles));
 
   if ($nid && $node = node_load($nid));
   if (!$node)  {
-    return drupal_access_denied(); 
+    return $js ? $error : drupal_access_denied();
   }
 
   $result = db_result(db_query("SELECT type FROM {views_bookmark_nodetypes} WHERE vbid = %d AND type = '%s'", $vbid, $node->type));
 
   if (!$result) {
-    return drupal_access_denied();
+    return $js ? $error : drupal_access_denied();
   }
 
   $bookmark = db_fetch_object(db_query("SELECT * FROM {views_bookmarks} WHERE vbid = %d", $vbid));
-  $access = explode(', ', $bookmark->roles);
+  $access = explode(',', $bookmark->roles);
   if (!array_intersect($access, $roles)) {
-    return drupal_access_denied();
+    return $js ? $error : drupal_access_denied();
   }
 
   // Finally! We have all our ducks in a row. Almost.
@@ -354,8 +469,14 @@ function views_bookmark_page($how = 'mar
   if (!db_affected_rows()) {
     db_query('INSERT INTO {views_bookmark_node_count} VALUES (%d, %d, %d)', $vbid, $nid, $count);
   }
-  
-  drupal_goto(referer_uri());
+
+  if ($js) {
+    print drupal_to_js(array('status' => TRUE));
+    exit;
+  }
+  else {
+    drupal_goto();
+  }
 }
 
 
@@ -373,7 +494,6 @@ function views_bookmark_views_tables() {
   while ($bookmark = db_fetch_object($result)) {
     $table = array(
       "name" => "views_bookmark_nodes", 
-      "provider" => "views_bookmark",
       "join" => array(
         "left" => array(
           "table" => "node",
@@ -499,12 +619,12 @@ function views_bookmark_ops_handler($fie
   if ($value) {
     $var = $table . "_unmark";
     $var_long = $var . "_long";
-    return l($data->$var, "views_bookmark/unmark/$data->nid/$vbid", array('title' => $data->$var_long, 'alt' => $data->$var_long));
+    return l($data->$var, "views_bookmark/unmark/$data->nid/$vbid", array('title' => $data->$var_long, 'alt' => $data->$var_long), "destination=$_GET[q]");
   }
   else {
     $var = $table . "_mark";
     $var_long = $var . "_long";
-    return l($data->$var, "views_bookmark/mark/$data->nid/$vbid", array('title' => $data->$var_long));
+    return l($data->$var, "views_bookmark/mark/$data->nid/$vbid", array('title' => $data->$var_long), "destination=$_GET[q]");
   }
 }
 
@@ -668,6 +788,7 @@ function views_bookmark_views_default_vi
 
     $view = new stdClass();
     $view->name = "bookmarks_$bookmark->vbid"; // 'title' isn't actually safe here
+    $view->access = array(DRUPAL_AUTHENTICATED_RID);
     $view->description = "View for bookmark: $bookmark->title";
     $view->page = TRUE;
     $view->page_title = "My $bookmark->title";
