Index: views.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/views/views.module,v
retrieving revision 1.332
diff -u -p -r1.332 views.module
--- views.module	8 Apr 2009 16:11:51 -0000	1.332
+++ views.module	17 Apr 2009 22:28:40 -0000
@@ -970,7 +970,7 @@ function views_exposed_form(&$form_state
 //  $form['#attributes']['class'] = array('views-exposed-form');
 
   // If using AJAX, we need the form plugin.
-  if ($view->use_ajax) {
+  if ($view->use_ajax['use_ajax']) {
     drupal_add_js('misc/jquery.form.js');
   }
   views_add_js('dependent');
Index: includes/view.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/views/includes/view.inc,v
retrieving revision 1.151
diff -u -p -r1.151 view.inc
--- includes/view.inc	18 Feb 2009 01:41:34 -0000	1.151
+++ includes/view.inc	17 Apr 2009 22:28:40 -0000
@@ -99,6 +99,13 @@ class view extends views_db_object {
   }
 
   /**
+   * The jQuery effect to use in transitions if use_ajax is on
+   */
+  function set_jquery_effect($jquery_effect) {
+    $this->use_ajax['jquery_effect'] = $jquery_effect;
+  }
+
+  /**
    * Whether or not the pager should be used.
    */
   function set_use_pager($use_pager) {
@@ -106,7 +113,7 @@ class view extends views_db_object {
   }
 
   /**
-   * The pager element id to use if use_apger is on
+   * The pager element id to use if use_pager is on
    */
   function set_pager_element($pager_element) {
     $this->pager['element'] = $pager_element;
@@ -126,7 +133,7 @@ class view extends views_db_object {
    * rather than a page refresh.
    */
   function set_use_ajax($use_ajax) {
-    $this->use_ajax = $use_ajax;
+    $this->use_ajax['use_ajax'] = $use_ajax;
   }
 
   /**
@@ -396,7 +403,7 @@ class view extends views_db_object {
       unset($form_state['rerender']);
     }
 
-    if (!empty($this->ajax)) {
+    if (!empty($this->use_ajax)) {
       $form_state['ajax'] = TRUE;
     }
 
Index: js/ajax_view.js
===================================================================
RCS file: /cvs/drupal/contributions/modules/views/js/ajax_view.js,v
retrieving revision 1.17
diff -u -p -r1.17 ajax_view.js
--- js/ajax_view.js	25 Mar 2009 00:11:25 -0000	1.17
+++ js/ajax_view.js	17 Apr 2009 22:28:40 -0000
@@ -28,6 +28,7 @@ Drupal.Views.Ajax.ajaxViewResponse = fun
     $view.replaceWith($newView);
     $view = $newView;
     Drupal.attachBehaviors($view.parent());
+    $view.find('.view-content').hide();
   }
  
   if (response.messages) {
@@ -37,6 +38,42 @@ Drupal.Views.Ajax.ajaxViewResponse = fun
 };
 
 /**
+ * jQuery effect for Views.
+ */
+Drupal.Views.Ajax.jQueryEffectHide = function(target, effect, callback) {
+  var $view = $(target + ' .view-content');
+  switch(effect) {
+    case 'hideshow':
+      $view.hide('slow', callback);
+      break;
+    case 'slide':
+      $view.slideUp('slow', callback);
+      break;
+    case 'fade':
+      $view.fadeOut('slow', callback);
+      break;
+  }
+};
+
+/**
+ * jQuery effect for Views.
+ */
+Drupal.Views.Ajax.jQueryEffectShow = function(target, effect) {
+  var $view = $(target + ' .view-content');
+  switch(effect) {
+    case 'hideshow':
+      $view.show('slow');
+      break;
+    case 'slide':
+      $view.slideDown('slow');
+      break;
+    case 'fade':
+      $view.fadeIn('slow');
+      break;
+  }
+};
+
+/**
  * Ajax behavior for views. 
  */
 Drupal.behaviors.ViewsAjaxView = function() {
@@ -75,6 +112,7 @@ Drupal.behaviors.ViewsAjaxView = functio
       .submit(function () {
         $('input[type=submit]', this).after('<span class="views-throbbing">&nbsp</span>');
         var object = this;
+        Drupal.Views.Ajax.jQueryEffectHide(view, settings.view_jquery_effect);
         $(this).ajaxSubmit({
           url: ajax_path,
           type: 'GET',
@@ -84,10 +122,15 @@ Drupal.behaviors.ViewsAjaxView = functio
               $.each(response.__callbacks, function(i, callback) {
                 eval(callback)(view, response);
               });
+              Drupal.Views.Ajax.jQueryEffectShow(view, settings.view_jquery_effect);
               $('.views-throbbing', object).remove();
             }
           },
-          error: function() { alert(Drupal.t("An error occurred at @path.", {'@path': ajax_path})); $('.views-throbbing', object).remove(); },
+          error: function() {
+            $('.views-throbbing', object).remove();
+            alert(Drupal.t("An error occurred at @path.", {'@path': ajax_path}));
+            Drupal.Views.Ajax.jQueryEffectShow(view, settings.view_jquery_effect);
+          },
           dataType: 'json'
         });
 
@@ -122,29 +165,36 @@ Drupal.behaviors.ViewsAjaxView = functio
               );
               $(this).click(function () {
                 $(this).addClass('views-throbbing');
-                $.ajax({
-                  url: ajax_path,
-                  type: 'GET',
-                  data: viewData,
-                  success: function(response) {
-                    $(this).removeClass('views-throbbing');
-                    // Scroll to the top of the view. This will allow users
-                    // to browse newly loaded content after e.g. clicking a pager
-                    // link.
-                    var offset = $(target).offset();
-                    // Only scroll upward
-                    if (offset.top - 10 < $(window).scrollTop()) {
-                      $('html,body').animate({scrollTop: (offset.top - 10)}, 500);
-                    }
-                    // Call all callbacks.
-                    if (response.__callbacks) {
-                      $.each(response.__callbacks, function(i, callback) {
-                        eval(callback)(target, response);
-                      });
-                    }
-                  },
-                  error: function() { $(this).removeClass('views-throbbing'); alert(Drupal.t("An error occurred at @path.", {'@path': ajax_path})); },
-                  dataType: 'json'
+                Drupal.Views.Ajax.jQueryEffectHide(view, settings.view_jquery_effect, function() {
+                  $.ajax({
+                    url: ajax_path,
+                    type: 'GET',
+                    data: viewData,
+                    success: function(response) {
+                      $(this).removeClass('views-throbbing');
+                      // Scroll to the top of the view. This will allow users
+                      // to browse newly loaded content after e.g. clicking a pager
+                      // link.
+                      var offset = $(target).offset();
+                      // Only scroll upward
+                      if (offset.top - 10 < $(window).scrollTop()) {
+                        $('html,body').animate({scrollTop: (offset.top - 10)}, 500);
+                      }
+                      // Call all callbacks.
+                      if (response.__callbacks) {
+                        $.each(response.__callbacks, function(i, callback) {
+                          eval(callback)(target, response);
+                        });
+                      }
+                      Drupal.Views.Ajax.jQueryEffectShow(view, settings.view_jquery_effect);
+                    },
+                    error: function() {
+                      $(this).removeClass('views-throbbing');
+                      alert(Drupal.t("An error occurred at @path.", {'@path': ajax_path}));
+                      Drupal.Views.Ajax.jQueryEffectShow(view, settings.view_jquery_effect);
+                    },
+                    dataType: 'json'
+                  });
                 });
 
                 return false;
Index: plugins/views_plugin_display.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/views/plugins/views_plugin_display.inc,v
retrieving revision 1.20
diff -u -p -r1.20 views_plugin_display.inc
--- plugins/views_plugin_display.inc	7 Apr 2009 22:48:04 -0000	1.20
+++ plugins/views_plugin_display.inc	17 Apr 2009 22:28:40 -0000
@@ -152,7 +152,7 @@ class views_plugin_display extends views
       'header' => array('header', 'header_format', 'header_empty'),
       'footer' => array('footer', 'footer_format', 'footer_empty'),
       'empty' => array('empty', 'empty_format'),
-      'use_ajax' => array('use_ajax'),
+      'use_ajax' => array('use_ajax', 'jquery_effect'),
       'items_per_page' => array('items_per_page', 'offset', 'use_pager', 'pager_element'),
       'use_pager' => array('items_per_page', 'offset', 'use_pager', 'pager_element'),
       'use_more' => array('use_more'),
@@ -223,6 +223,7 @@ class views_plugin_display extends views
           'empty_format' => TRUE,
 
           'use_ajax' => TRUE,
+          'jquery_effect' => TRUE,
           'items_per_page' => TRUE,
           'offset' => TRUE,
           'use_pager' => TRUE,
@@ -304,6 +305,9 @@ class views_plugin_display extends views
       'use_ajax' => array(
         'default' => FALSE,
       ),
+      'jquery_effect' => array(
+        'default' => 0,
+      ),
       'items_per_page' => array(
         'default' => 10,
       ),
@@ -803,6 +807,13 @@ class views_plugin_display extends views
           '#options' => array(1 => t('Yes'), 0 => t('No')),
           '#default_value' => $this->get_option('use_ajax') ? 1 : 0,
         );
+        $form['jquery_effect'] = array(
+          '#type' => 'radios',
+          '#title' => t('jQuery effect'),
+          '#options' => array('hideshow' => t('Hide/show'), 'slide' => t('Slide up/down'), 'fade' => t('Fade in/out'), 0 => t('None')),
+          '#description' => t("If AJAX is being used, you can select a jQuery effect to transition between changing content."),
+          '#default_value' => $this->get_option('jquery_effect'),
+        );
         break;
       case 'use_pager':
         $form['#title'] .= t('Use a pager for this view');
@@ -1310,6 +1321,7 @@ class views_plugin_display extends views
         break;
       case 'use_ajax':
         $this->set_option($section, (bool)$form_state['values'][$section]);
+        $this->set_option('jquery_effect', $form_state['values']['jquery_effect']);
         break;
       case 'use_pager':
         $this->set_option($section, $form_state['values'][$section]);
@@ -1588,6 +1600,7 @@ class views_plugin_display extends views
    */
   function pre_execute() {
     $this->view->set_use_ajax($this->use_ajax());
+    $this->view->set_jquery_effect($this->get_option('jquery_effect'));
     // Copy pager information from the display.
     $this->view->set_use_pager($this->use_pager());
     $this->view->set_pager_element($this->get_option('pager_element'));
Index: theme/theme.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/views/theme/theme.inc,v
retrieving revision 1.72
diff -u -p -r1.72 theme.inc
--- theme/theme.inc	8 Apr 2009 04:24:52 -0000	1.72
+++ theme/theme.inc	17 Apr 2009 22:28:40 -0000
@@ -128,7 +128,7 @@ function template_preprocess_views_view(
   $vars['dom_id'] = !empty($view->dom_id) ? $view->dom_id : $dom_id++;
 
   // If using AJAX, send identifying data about this view.
-  if ($view->use_ajax) {
+  if ($view->use_ajax['use_ajax']) {
     $settings = array(
       'views' => array(
         'ajax_path' => url('views/ajax'),
@@ -138,6 +138,8 @@ function template_preprocess_views_view(
             'view_display_id' => $view->current_display,
             'view_args' => implode('/', $view->args),
             'view_path' => $_GET['q'],
+            // jQuery effect for AJAX transitions
+            'view_jquery_effect' => $view->use_ajax['jquery_effect'],
             // Pass through URL to ensure we get e.g. language prefixes.
             'view_base_path' => isset($view->display['page']) ? substr(url($view->display['page']->display_options['path']), strlen($base_path)) : '',
             'view_dom_id' => $vars['dom_id'],
