Index: includes/jcarousel.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jcarousel/includes/Attic/jcarousel.views.inc,v
retrieving revision 1.1.2.2.2.4
diff -u -r1.1.2.2.2.4 jcarousel.views.inc
--- includes/jcarousel.views.inc	20 Dec 2010 17:56:27 -0000	1.1.2.2.2.4
+++ includes/jcarousel.views.inc	6 Feb 2011 04:52:38 -0000
@@ -70,10 +70,9 @@
           $view->set_items_per_page($last - $first);
           $view->set_offset($first);
 
-          // TODO: $view->pager doesn't even exist in Views 3, yet it seems to
-          // fix  the Views 3 handling. Find the "official" approach here.
-          $view->pager['offset'] = $first;
-          $view->pager['items_per_page'] = $last - $first;
+          // Redundant but apparently needed.
+          $view->items_per_page = $last - $first;
+          $view->offset = $first;
         }
 
         // Reuse the same DOM id so it matches that in Drupal.settings.
@@ -95,7 +94,7 @@
     $messages = theme('status_messages');
     $object->messages = $messages ? '<div class="views-messages">' . $messages . '</div>' : '';
 
-    views_ajax_render($object);
+    drupal_json_output($object);
   }
 }
 
@@ -121,7 +120,7 @@
   $count_query = str_replace(array_keys($replacements), $replacements, $count_query);
   $result = db_query($count_query, $view->build_info['query_args']);
   $count = 0;
-  while ($row = db_fetch_array($result)) {
+  foreach ($result as $row) {
     $count++;
   }
 
@@ -135,31 +134,50 @@
   if ($view->use_ajax) {
     $options['ajax'] = TRUE;
 
-    $use_pager = $view->pager['use_pager'];
-    $view->pager['use_pager'] = TRUE;
-    $view->build($display_id);
-
-    $options['size'] = $count;
-    $view->pager['use_pager'] = $use_pager;
+    // Views 2:
+    if (isset($view->pager)) {
+      // Enable and adjust the pager to get the correct page.
+      $use_pager = $view->pager['use_pager'];
+      $view->pager['use_pager'] = TRUE;
+      $view->build($display_id);
+      $options['size'] = $count;
+      $view->pager['use_pager'] = $use_pager;
+
+      // Create generic variable names.
+      $pager_current_page = $view->pager['current_page'];
+      $pager_items_per_page = $view->pager['items_per_page'];
+      $pager_offset = $view->pager['offset'];
+    }
+    // Views 3:
+    else {
+      // Adjusting the query is not necessary.
+      $view->build($display_id);
+      $options['size'] = $count;
+
+      // Create generic variable names.
+      $pager_current_page = $view->current_page;
+      $pager_items_per_page = $view->items_per_page;
+      $pager_offset = $view->offset;
+    }
 
     // If starting in the middle of a view, initialize the carousel at that
     // position. Strangely the carousel must pre-load empty LI items all the way
     // up until the active item, making this inefficient for large lists.
-    if ($view->pager['use_pager'] && $view->pager['current_page']) {
+    if ($pager_current_page) {
       // TODO: Pagers and carousels do not work well together. jCarousel should
       // give items the class "jcarousel-item-[offset]", but instead it always
       // starts with "1", making it impossible to define a prepopulated list
       // as the middle of an AJAX view.
-      $options['start'] = ($view->pager['current_page'] * $view->pager['items_per_page']) + ($view->pager['offset'] + 1);
-      $options['offset'] = ($view->pager['current_page'] * $view->pager['items_per_page']) + ($view->pager['offset'] + 1);
+      $options['start'] = ($pager_current_page * $pager_items_per_page) + ($pager_offset + 1);
+      $options['offset'] = ($pager_current_page * $pager_items_per_page) + ($pager_offset + 1);
     }
-    elseif ($view->pager['offset']) {
-      $options['start'] = $view->pager['offset'] + 1;
-      $options['offset'] = $view->pager['offset'] + 1;
+    elseif ($pager_offset) {
+      $options['start'] = $pager_offset + 1;
+      $options['offset'] = $pager_offset + 1;
     }
   }
 
-  $identifier = views_css_safe('jcarousel_view__' . $view->name . '__' . $display_id);
+  $identifier = drupal_clean_css_identifier('jcarousel_view__' . $view->name . '__' . $display_id);
   return jcarousel_add($identifier, $options);
 }
 
@@ -174,16 +192,19 @@
   $options = $view->style_options;
   $variables['jcarousel_classes_array'] = array(
     'jcarousel',
-    views_css_safe('jcarousel-view--' . $view->name . '--' . $display_id),
+    drupal_clean_css_identifier('jcarousel-view--' . $view->name . '--' . $display_id),
   );
   if ($options['skin']) {
     $variables['jcarousel_classes_array'][] = 'jcarousel-skin-' . $options['skin'];
   }
   $variables['jcarousel_classes'] = implode(' ', $variables['jcarousel_classes_array']);
 
+  // Views 2/3 compatibility.
+  $pager_offset = isset($view->pager['offset']) ? $view->pager['offset'] : $view->offset;
+
   // Give each item a class to identify where in the carousel it belongs.
   foreach ($variables['rows'] as $id => $row) {
-    $variables['classes'][$id] = 'jcarousel-item-' . ($id + 1 + $view->pager['offset']);
+    $variables['classes'][$id] = 'jcarousel-item-' . ($id + 1 + $pager_offset);
   }
 
 }
Index: jcarousel.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jcarousel/Attic/jcarousel.info,v
retrieving revision 1.2.2.2.2.1
diff -u -r1.2.2.2.2.1 jcarousel.info
--- jcarousel.info	28 Nov 2010 00:04:15 -0000	1.2.2.2.2.1
+++ jcarousel.info	6 Feb 2011 04:52:38 -0000
@@ -3,3 +3,7 @@
 description = Create jQuery-based carousel rotators.
 package = User interface
 core = 7.x
+
+files[] = jcarousel.module
+files[] = includes/jcarousel.views.inc
+files[] = includes/jcarousel_style_plugin.inc
