? .DS_Store
? .patch
? dont_drupal_render_forms_0.patch
? drupal.hook-page-alter.patch
? drupal.hook-page-alter_0.patch
? head.db
? incremental_filter_access_control_29.patch
? incremental_filter_access_control_40.patch
? taxonomy_0.diff
? vertical_tabs-323112-24.patch
? vertical_tabs-323112-41.patch
? modules/.DS_Store
? sites/default/files
? sites/default/settings.php
Index: misc/vertical-tabs.css
===================================================================
RCS file: misc/vertical-tabs.css
diff -N misc/vertical-tabs.css
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ misc/vertical-tabs.css	13 Feb 2009 05:14:06 -0000
@@ -0,0 +1,100 @@
+/* $Id */
+
+.vertical-tabs-list .description {
+  display: block;
+}
+
+/* Border style of tabs and content */
+div.vertical-tabs-div,
+ul.vertical-tabs-list {
+  border: 1px solid #ccc;
+}
+
+/* Make space for the tabs on the side */
+.vertical-tabs {
+  margin-left: 180px;
+}
+
+/* Set the background image on the tabs and content */
+.vertical-tabs,
+.vertical-tabs ul.vertical-tabs-list {
+  background: #fff;
+}
+
+/* Position and layout of tabs container */
+.vertical-tabs ul.vertical-tabs-list { 
+  width: 179px;
+  float: left;
+  margin: 0 0 0 -180px;
+  border-right: 0px;
+  z-index: 1;
+  border-bottom: 0;
+  list-style-type: none;
+  list-style-image: none;
+  padding: 0;
+}
+
+
+/* Reset LIs which probably have awkward layout inherited from tabs */
+.vertical-tabs ul.vertical-tabs-list li {
+  float: none;
+  margin: 0;
+  padding: 0;
+  background-image: none;
+}
+
+/* Layout of each tab */
+.vertical-tabs ul.vertical-tabs-list a {
+  display: block;
+  margin: 0;
+  padding: .4em .3em .1em .6em;
+  background: #fafafa;
+  text-align: left;
+  font-weight: normal;
+  border-bottom: 1px solid #ccc;
+}
+
+.vertical-tabs ul.vertical-tabs-list a.vertical-tabs-nodescription {
+  padding-bottom: .4em;
+}
+
+.vertical-tabs ul.vertical-tabs-list .description {
+  padding: 0;
+  line-height: normal;
+  min-height: 0;
+  white-space: normal;
+}
+
+.vertical-tabs ul.vertical-tabs-list a {
+  border-right: 1px solid #ccc;
+}
+
+/* Hover state of tabs */
+.vertical-tabs ul.vertical-tabs-list a:hover {
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.vertical-tabs ul.vertical-tabs-list a:focus {
+  outline: none;
+}
+
+/* Selected tab */
+.vertical-tabs ul.vertical-tabs-list li.selected a {
+  background: transparent none;
+  color: black;
+  border-right: 0;
+}
+
+/* Reset some important elements of each panel */
+.vertical-tabs .vertical-tabs-div {
+  margin: 0;
+  padding: .5em;
+  margin-top: -1px;
+  margin-left: -1px;
+  background: transparent none;
+}
+
+.buttons {
+  clear: both;
+}
Index: misc/vertical-tabs.js
===================================================================
RCS file: misc/vertical-tabs.js
diff -N misc/vertical-tabs.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ misc/vertical-tabs.js	13 Feb 2009 05:14:06 -0000
@@ -0,0 +1,73 @@
+// $Id$
+
+/**
+ * Main vertical tabs behavior - create the vertical tabs.
+ */
+Drupal.behaviors.verticalTabs = function() {
+  // Make sure that the vertical tabs list hasn't already been constructed.
+  if (!$('.vertical-tabs-list').size()) {
+    // Create the first <div> and the <ul> in it.
+    var ul = $('<div class="vertical-tabs"><ul class="vertical-tabs-list"></ul></div>').find('ul');
+    // Iterate through each vertical tab that needs to be created, and create it.
+    $.each(Drupal.settings.verticalTabs, function(k, v) {
+      var description = '', cssClass = 'vertical-tabs-list-' + k;
+      // If there's a callback, that means there's a description, so add the <span>.
+      // However, we don't actually add the description, because verticalTabsReload already does it for us.
+      // Otherwise add the CSS class denoting there is no description, so we can style it potentially differently.
+      if (v.callback && Drupal.verticalTabs[v.callback]) {
+        description = ' <span class="description"></span>';
+      }
+      else {
+        cssClass += ' vertical-tabs-nodescription';
+      }
+      // Add the <li> itself.
+      ul.append($('<li><a href="#' + k + '" class="' + cssClass + '">'+ v.name + description +'</a></li>')
+          // Add the click action to the link.
+          .find('a')
+          .bind('click', function() {
+            // Add the "selected" class to the clicked tab, and remove it from the other tabs.
+            $(this).parent().addClass('selected').siblings().removeClass('selected');
+            // Show this tab and hide all the other tabs.
+            $('.vertical-tabs-' + k).show().siblings('.vertical-tabs-div').hide();
+            return false;
+          })
+          .end())
+        .end()
+        // Add the fieldset itself.
+        .append($('#' + k + ' > .fieldset-wrapper')
+          .addClass('vertical-tabs-' + k)
+          .addClass('vertical-tabs-div'));
+      $('#' + k).remove();
+    });
+    // Put the <ul> in, but before the buttons.
+    ul.end().insertBefore('.buttons');
+    // Calculate the hight of the highest thing.
+    var max = $('.vertical-tabs ul').height();
+    $('.vertical-tabs-div').each(function() {
+      max = Math.max(max, $(this).height());
+    });
+    $('.vertical-tabs-div').height(max).hide();
+    // Show and select the first tab.
+    $('.vertical-tabs-div:first').show();
+    $('.vertical-tabs ul li:first').addClass('selected');
+  }
+}
+
+/**
+ * Reload the vertical tab descriptions.
+ */
+Drupal.behaviors.verticalTabsReload = function() {
+  // Iterate through all the tabs.
+  $.each(Drupal.settings.verticalTabs, function(k, v) {
+    // If there is a callback, then call it and stick the result in .description.
+    if (v.callback && Drupal.verticalTabs[v.callback]) {
+      $('.vertical-tabs ul.vertical-tabs-list a.vertical-tabs-list-'+ k +' span.description').html(Drupal.verticalTabs[v.callback].apply(this, v.args));
+    }
+  });
+  // Recalculate heights.
+  var max = $('.vertical-tabs ul').height();
+  $('.vertical-tabs-div').each(function() {
+    max = Math.max(max, $(this).height());
+  });
+  $('.vertical-tabs-div').height(max);
+}
Index: modules/comment/comment-node-form.js
===================================================================
RCS file: modules/comment/comment-node-form.js
diff -N modules/comment/comment-node-form.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/comment/comment-node-form.js	13 Feb 2009 05:14:06 -0000
@@ -0,0 +1,13 @@
+// $Id$
+
+Drupal.verticalTabs.nodeFormComment = function() {
+  var input = $('.vertical-tabs-edit-comment-settings input[checked]');
+  console.log('hi');
+  if (!input.size()) {
+    console.log($('.vertical-tabs-edit-comment-settings input'));
+    input = $('.vertical-tabs-edit-comment-settings input')[Drupal.settings.nodeForm.comment];
+  }
+  else {
+    return $(input).parent().text().replace(/^\s*(.*)\s*$/, '$1');
+  }
+}
Index: modules/menu/menu.js
===================================================================
RCS file: modules/menu/menu.js
diff -N modules/menu/menu.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/menu/menu.js	13 Feb 2009 05:14:06 -0000
@@ -0,0 +1,10 @@
+// $Id$
+
+Drupal.verticalTabs.nodeFormMenu = function() {
+  if ($('#edit-menu-link-title').val()) {
+    return $('#edit-menu-link-title').val();
+  }
+  else {
+    return Drupal.t('Not in menu');
+  }
+}
Index: modules/node/node.js
===================================================================
RCS file: modules/node/node.js
diff -N modules/node/node.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/node/node.js	13 Feb 2009 05:14:06 -0000
@@ -0,0 +1,38 @@
+// $Id$
+
+Drupal.verticalTabs.nodeFormRevision = function() {
+  var val = $('#edit-revision').attr('checked');
+  if (val) {
+    return Drupal.t('Create new revision');
+  }
+  else {
+    return Drupal.t('Don\'t create new revision');
+  }
+}
+
+Drupal.verticalTabs.nodeFormAuthoring = function() {
+  var name = $('#edit-name').val(), date = $('#edit-date').val();
+  if (date) {
+    return Drupal.t('By @name on @date', { '@name': name, '@date': date });
+  }
+  else {
+    return Drupal.t('By @name', { '@name': name });
+  }
+}
+
+Drupal.verticalTabs.nodeFormPublishingOptions = function() {
+  var vals = [];
+  if ($('#edit-status').attr('checked')) {
+    vals.push(Drupal.t('Published'));
+  }
+  if ($('#edit-promote').attr('checked')) {
+    vals.push(Drupal.t('Promoted to front page'));
+  }
+  if ($('#edit-sticky').attr('checked')) {
+    vals.push(Drupal.t('Sticky on top of lists'));
+  }
+  if (vals.join(', ') == '') {
+    return Drupal.t('None');
+  }
+  return vals.join(', ');
+}
Index: modules/path/path.js
===================================================================
RCS file: modules/path/path.js
diff -N modules/path/path.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/path/path.js	13 Feb 2009 05:14:06 -0000
@@ -0,0 +1,12 @@
+// $Id$
+
+Drupal.verticalTabs.nodeFormPath = function() {
+  var path = $('#edit-path-1').val();
+
+  if (path) {
+    return Drupal.t('Alias: @alias', { '@alias': path });
+  }
+  else {
+    return Drupal.t('No alias');
+  }
+}
Index: modules/upload/upload.js
===================================================================
RCS file: modules/upload/upload.js
diff -N modules/upload/upload.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/upload/upload.js	13 Feb 2009 05:14:06 -0000
@@ -0,0 +1,11 @@
+// $Id$
+
+Drupal.verticalTabs.nodeFormAttachments = function() {
+  var size = $('#upload-attachments tbody tr').size();
+  if (size) {
+    return Drupal.formatPlural(size, '1 attachment', '@count attachments');
+  }
+  else {
+    return Drupal.t('No attachments');
+  }
+}
Index: modules/user/user.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.admin.inc,v
retrieving revision 1.37
diff -u -p -r1.37 user.admin.inc
--- modules/user/user.admin.inc	3 Feb 2009 18:55:32 -0000	1.37
+++ modules/user/user.admin.inc	13 Feb 2009 05:14:06 -0000
@@ -480,7 +480,7 @@ function user_admin_settings() {
     '#prefix' => '<div class="user-admin-picture-radios">',
     '#suffix' => '</div>',
   );
-  drupal_add_js(drupal_get_path('module', 'user') . '/user.js');
+  drupal_add_js(drupal_get_path('module', 'user') . '/user.admin.js');
   // If JS is enabled, and the radio is defaulting to off, hide all
   // the settings on page load via .css using the js-hide class so
   // that there's no flicker.
@@ -542,7 +542,7 @@ function user_admin_settings() {
  * @see theme_user_admin_perm()
  */
 function user_admin_perm($form_state, $rid = NULL) {
-
+  drupal_add_js(drupal_get_path('module', 'user') .'/user.admin.js');
   // Retrieve role names for columns.
   $role_names = user_roles();
   if (is_numeric($rid)) {
@@ -559,6 +559,7 @@ function user_admin_perm($form_state, $r
   // Render role/permission overview:
   $options = array();
   $hide_descriptions = !system_admin_compact_mode();
+  $index = 0;
   foreach (module_implements('perm') as $module) {
     if ($permissions = module_invoke($module, 'perm')) {
       $info = drupal_parse_info_file(drupal_get_path('module', $module) . "/$module.info");
@@ -571,6 +572,8 @@ function user_admin_perm($form_state, $r
           '#type' => 'item',
           '#markup' => $perm_item['title'],
           '#description' => $hide_descriptions ? $perm_item['description'] : NULL,
+          '#post_render' => array('user_admin_perm_post_render'),
+          '#index' => $index++,
         );
         foreach ($role_names as $rid => $name) {
           // Builds arrays for checked boxes for each role
@@ -592,6 +595,12 @@ function user_admin_perm($form_state, $r
   return $form;
 }
 
+function user_admin_perm_post_render($html, $form) {
+  $clean = trim(preg_replace('/\s+/', ' ', $html));
+  drupal_add_js(array('userPerm' => array($form['#index'] => array('stripped' => strtolower(strip_tags((string)$clean)), 'pieces' => preg_split('/(<[^>]+>)/', (string)$clean, -1, PREG_SPLIT_DELIM_CAPTURE |  PREG_SPLIT_OFFSET_CAPTURE)))), 'setting');
+  return $html;
+}
+
 /**
  * Save permissions selected on the administer permissions page.
  *
@@ -633,6 +642,7 @@ function theme_user_admin_perm($form) {
         $row[] = array(
           'data' => drupal_render($form['permission'][$key]),
           'class' => 'permission',
+          'id' => 'permission-' . $form['permission'][$key]['#index'],
         );
         foreach (element_children($form['checkboxes']) as $rid) {
           if (is_array($form['checkboxes'][$rid])) {
@@ -643,7 +653,7 @@ function theme_user_admin_perm($form) {
       $rows[] = $row;
     }
   }
-  $header[] = (t('Permission'));
+  $header[] = array('data' => t('Filter: '), 'class' => 'permission-header');
   foreach (element_children($form['role_names']) as $rid) {
     if (is_array($form['role_names'][$rid])) {
       $header[] = array('data' => drupal_render($form['role_names'][$rid]), 'class' => 'checkbox');
Index: modules/user/user.admin.js
===================================================================
RCS file: modules/user/user.admin.js
diff -N modules/user/user.admin.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/user/user.admin.js	13 Feb 2009 05:14:06 -0000
@@ -0,0 +1,197 @@
+// $Id$
+
+/**
+ * On the admin/user/settings page, conditionally show all of the
+ * picture-related form elements depending on the current value of the
+ * "Picture support" radio buttons.
+ */
+Drupal.behaviors.userSettings = {
+  attach: function(context) {
+    $('div.user-admin-picture-radios input[type=radio]:not(.userSettings-processed)', context).addClass('userSettings-processed').click(function () {
+      $('div.user-admin-picture-settings', context)[['hide', 'show'][this.value]]();
+    });
+  }
+};
+
+Drupal.behaviors.userPermissions = {
+  attach: function(context) {
+    var time = (new Date()).getTime(), newTime = (new Date()).getTime();
+    $('.permission-header:not(.userPermissions-processed)', context).addClass('.userPermissions-processed').append(' ').append(
+      $('<input class="form-text" type="text" size="40" maxlength="255"/>').bind('keyup mouseup', function() {
+  	    $('.permission-header > input.form-text').val($(this).val());
+        newTime = (new Date()).getTime();
+        if (time + 100 < newTime) {
+          Drupal.userPermissionSearch($(this).val());
+        }
+        time = newTime;
+      })
+    );
+  }
+};
+
+Drupal.userPermissionSearch = function(term) {
+  if (term) {
+    previousModule = false;
+    zebra = true;
+    isEmpty = true;
+    $('#permissions > tbody > tr').each(function() {
+      td = $(this).find('td:first');
+      if (td.is('.permission')) {
+        var index = td.attr('id').replace('permission-', '');
+        // If we have found the text in the stripped string, get the first character position
+        // of the found string.
+        var found_begin = Drupal.settings.userPerm[index].stripped.indexOf(term);
+        // If it was found, begin highlighting
+        if (found_begin !== -1) {
+          $(this).show().removeClass('even').removeClass('odd').addClass(zebra == false? 'odd' : 'even');
+          isEmpty = false;
+          previousModule = false;
+          zebra = !zebra;
+          // Length of the search string.
+          var search_length = term.length,
+            // The last character position of the search string in the stripped string. 
+            found_end = found_begin + search_length,
+            // The final, assembled string.
+            output = '',
+            // Whether the device is currently highlighting.
+            highlight = false,
+            // Whether the device has encountered the first chunk that contains the search string.
+            first_chunk = false,
+            // Whether the loop is about to encounter a tag.
+            tag = false,
+            // The offset, so far, between the string with HTML and string without HTML. Each
+            // time another chunk gets processed, if the chunk is a tag, the length of the chunk
+            // gets added to this string. Therefore, this is the difference between 
+            tag_length = 0;
+          // Iterate through the chunks.
+          for (var i = 0; i < Drupal.settings.userPerm[index].pieces.length; i++) {
+            // Get the current chunk.
+            var chunk = Drupal.settings.userPerm[index].pieces[i][0],
+              // Chunk length.
+              length_of_chunk = chunk.length;
+            // If we're in a tag, add the tag to the tag_length variable, and do nothing else.
+            if (tag) {
+              tag_length += length_of_chunk;
+            }
+            // This is where the magic begins.
+            else {
+              // Get the starting offset of the chunk.
+              var start_of_chunk = Drupal.settings.userPerm[index].pieces[i][1],
+                // Get the end offset of the chunk.
+                end_of_chunk = start_of_chunk + length_of_chunk,
+                // Starting offset, but in the stripped string.
+                start_of_chunk_in_stripped = start_of_chunk - tag_length,
+                // Ending offset, but in the stripped string.
+                end_of_chunk_in_stripped = end_of_chunk - tag_length;
+              // If the first character of the found string is within the chunk's offsets in the
+              // stripped string, then we have found the first chunk.
+              if (start_of_chunk_in_stripped <= found_begin && found_begin < end_of_chunk_in_stripped) {
+                highlight = true;
+                first_chunk = true;
+              }
+              if (highlight) {
+                // If it's the last chunk, that means that the end of the search string is before
+                // the end of the chunk.
+                var last_chunk = found_end <= end_of_chunk_in_stripped;
+                if (last_chunk) {
+                  // If that's true, then stop highlighting after this.
+                  highlight = false;
+                }
+                // The prefix before the chunk if it's the first chunk.
+                var prefix = '',
+                  // The postfix, after the chunk, if it's the last chunk.
+                  postfix = '',
+                  // The offset at which to start the highlighting
+                  start = 0,
+                  // The length to highlight.
+                  length = length_of_chunk,
+                  // Whether we need to run a substring or not.
+                  substr = false;
+                // If we're in the first chunk...
+                if (first_chunk) {
+                  // We need to run substring to generate a prefix.
+                  // Where to end the prefix, and start te highlight.
+                  start = found_begin - start_of_chunk_in_stripped;
+                  // Generate the prefix.
+                  prefix = chunk.substr(0, start);
+                  // We might as well set substring length to the full length of the search string -
+                  // in the worst case, it will go to a longer length than needed, and there's no breakage
+                  // that will happen.
+                  length = search_length;
+                  // Yes, we need a substring.
+                  substr = true;
+                }
+                // If we're in the last chunk, we need to find the postfix.
+                if (last_chunk) {
+                  // If we're not in the first chunk, the length is not the length of the search
+                  // search string, so calculate it.
+                  if (!first_chunk) {
+                    length = found_end - start_of_chunk_in_stripped;
+                  }
+                  // Get the postfix.
+                  postfix = chunk.substr(start + length, length_of_chunk);
+                  // And we need to substring.
+                  substr = true;
+                }
+                // The text to highlight.
+                var chunk_to_highlight;
+                // If we need a substring, get it.
+                if (substr) {
+                  chunk_to_highlight = chunk.substr(start, length);
+                }
+                // Otherwise, just get the chunk.
+                else {
+                  chunk_to_highlight = chunk;
+                }
+                // Slap it all together.
+                chunk = prefix + '<span class="highlight">' + chunk_to_highlight + '</span>' + postfix;
+                // We're not in the first chunk.
+                first_chunk = false;
+              }
+            }
+            // Add the chunk to the general output.
+            output += chunk;
+            // If we weren't in the tag, we are now, and vise-versa.
+            tag = !tag;
+          }
+        	td.html(output);
+        }
+        else {
+          // Text not found. Hide the row.
+          $(this).hide();
+        }
+      }
+      else {
+        if (previousModule != false) {
+          previousModule.hide();
+        }
+        previousModule = $(this);
+      }
+    });
+    if (previousModule != false) {
+      previousModule.hide();
+    }
+    if (isEmpty) {
+      $('#permissions > tbody > tr').hide().parent().append('<tr class="user-permissions-empty"><td>No permissions were found.</td></tr>');
+      $('#user-admin-perm > div > input#edit-submit').hide();
+    }
+    else {
+      $('#permissions > tbody > tr .user-permissions-empty').remove();
+      $('#user-admin-perm > div > input#edit-submit').show();
+    }
+  }
+  else {
+    $('#permissions > tbody > tr.user-permissions-empty').remove();
+    $('#user-admin-perm > div > input#edit-submit').show();
+    var zebra = false;
+    $('#permissions > tbody > tr').each(function() {
+      if (zebra) {
+        $(this).addClass('even').removeClass('odd');
+      }
+      else {
+        $(this).addClass('odd').removeClass('even');
+      }
+      zebra = !zebra;
+    }).show().find('.highlight').removeClass('highlight').end()
+  }
+}
Index: modules/user/user.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.css,v
retrieving revision 1.10
diff -u -p -r1.10 user.css
--- modules/user/user.css	9 Oct 2008 04:19:44 -0000	1.10
+++ modules/user/user.css	13 Feb 2009 05:14:06 -0000
@@ -9,6 +9,9 @@
 #permissions tr.odd .form-item, #permissions tr.even .form-item {
   white-space: normal;
 }
+#permissions td span.highlight {
+  background-color: #ff6;
+}
 #user-login-form {
   text-align: center;
 }
Index: modules/user/user.js
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.js,v
retrieving revision 1.9
diff -u -p -r1.9 user.js
--- modules/user/user.js	20 Nov 2008 06:56:17 -0000	1.9
+++ modules/user/user.js	13 Feb 2009 05:14:06 -0000
@@ -158,16 +158,3 @@ Drupal.evaluatePasswordStrength = functi
   msg = translate.hasWeaknesses + "<ul><li>" + msg.join("</li><li>") + "</li></ul>";
   return { strength: strength, message: msg };
 };
-
-/**
- * On the admin/user/settings page, conditionally show all of the
- * picture-related form elements depending on the current value of the
- * "Picture support" radio buttons.
- */
-Drupal.behaviors.userSettings = {
-  attach: function(context) {
-    $('div.user-admin-picture-radios input[type=radio]:not(.userSettings-processed)', context).addClass('userSettings-processed').click(function () {
-      $('div.user-admin-picture-settings', context)[['hide', 'show'][this.value]]();
-    });
-  }
-};
