? jplayer_d7.patch
Index: jplayer.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jplayer/jplayer.info,v
retrieving revision 1.2
diff -u -p -r1.2 jplayer.info
--- jplayer.info	4 Nov 2010 12:50:18 -0000	1.2
+++ jplayer.info	5 Nov 2010 19:58:43 -0000
@@ -2,5 +2,8 @@
 name = jPlayer
 description = Provides an HTML5-compatible with Flash-fallback audio player.
 package = User interface
-core = 6.x
-dependencies[] = filefield
\ No newline at end of file
+core = 7.x
+dependencies[] = file
+files[] = jplayer.module
+files[] = jplayer.theme.inc
+files[] = includes/jplayer_style_plugin.inc
Index: jplayer.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jplayer/jplayer.module,v
retrieving revision 1.4
diff -u -p -r1.4 jplayer.module
--- jplayer.module	4 Nov 2010 12:50:18 -0000	1.4
+++ jplayer.module	5 Nov 2010 19:58:43 -0000
@@ -15,7 +15,7 @@
 function jplayer_menu() {
   $items = array();
 
-  $items['admin/settings/jplayer'] = array(
+  $items['admin/config/media/jplayer'] = array(
     'title' => 'jPlayer settings',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('jplayer_settings_form'),
@@ -32,19 +32,13 @@ function jplayer_menu() {
  */
 function jplayer_theme() {
   return array(
-    'jplayer_formatter_jplayer_single' => array(
-      'arguments' => array('element' => NULL),
+    'jplayer' => array(
+      'variables' => array('items' => NULL, 'player_id' => NULL, 'mode' => NULL),
       'template' => 'theme/jplayer',
       'file' => 'includes/jplayer.theme.inc',
     ),
-    'jplayer_formatter_jplayer_playlist' => array(
-      'arguments' => array('element' => NULL),
-      'template' => 'theme/jplayer',
-      'file' => 'includes/jplayer.theme.inc',
-    ),
-    'jplayer_view_playlist' => array(
-      'arguments' => array('view' => NULL, 'items' => NULL),
-      'template' => 'theme/jplayer',
+    'jplayer_link' => array(
+      'variables' => array('file' => NULL, 'icon_directory' => NULL),
       'file' => 'includes/jplayer.theme.inc',
     ),
   );
@@ -56,7 +50,7 @@ function jplayer_theme() {
 function jplayer_views_api() {
   return array(
     'api' => 2,
-    'path' => drupal_get_path('module', 'jplayer') .'/includes',
+    'path' => drupal_get_path('module', 'jplayer') . '/includes',
   );
 }
 
@@ -67,20 +61,94 @@ function jplayer_field_formatter_info() 
   return array(
     'jplayer_single' => array(
       'label' => t('jPlayer player'),
-      'field types' => array('filefield', 'audiofield'),
-      'multiple values' => CONTENT_HANDLE_CORE,
+      'field types' => array('file', 'audiofield'),
       'description' => t('Display an audio file as an HTML5-compatible with Flash-fallback audio player.'),
     ),
     'jplayer_playlist' => array(
       'label' => t('jPlayer multifile playlist'),
-      'field types' => array('filefield', 'audiofield'),
-      'multiple values' => CONTENT_HANDLE_MULTIPLE,
+      'field types' => array('file', 'audiofield'),
       'description' => t('Display multi-value fields as an HTML5-compatible with Flash-fallback audio player.'),
     ),
+    'jplayer_link' => array(
+      'label' => t('jPlayer link'),
+      'field types' => array('file', 'audiofield'),
+      'description' => t('Display a link to the file that will play in the jPlayer block.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function jplayer_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  switch ($display['type']) {
+    case 'jplayer_single':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array(
+          '#theme' => 'jplayer',
+          '#mode' => 'single',
+          '#items' => $item,
+          '#player_id' => 'jplayer-' . $id . '-' . str_replace('_', '-', $instance['field_name']) . '-' . $delta,
+        );
+      }
+      break;
+
+    case 'jplayer_playlist':
+      $element = array(
+        '#theme' => 'jplayer',
+        '#mode' => 'playlist',
+        '#items' => $items,
+        '#player_id' => 'jplayer-' . $id . '-' . str_replace('_', '-', $instance['field_name']),
+      );
+      break;
+
+    case 'jplayer_link':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array(
+          '#theme' => 'jplayer_link',
+          '#file' => (object) $item,
+        );
+      }
+      break;
+  }
+  $element['#attached'] = jplayer_add(FALSE);
+
+  return $element;
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function jplayer_block_info() {
+  return array(
+    'jplayer' => array(
+      'info' => t('jPlayer'),
+    ),
   );
 }
 
 /**
+ * Implements hook_block_view().
+ */
+function jplayer_block_view($delta = '') {
+  if ($delta == 'jplayer') {
+    $block['subject'] = '';
+    $block['content'] = array(
+      '#theme' => 'jplayer',
+      '#mode' => 'playlist',
+      '#items' => array(),
+      '#player_id' => 'jplayer-block',
+      '#attached' => jplayer_add(FALSE),
+    );
+
+    return $block;
+  }
+}
+
+/**
  * Add the jPlayer library to the page.
  *
  * @param $add
@@ -102,10 +170,10 @@ function jplayer_add($add = TRUE) {
   }
 
   if (isset($filepath)) {
-    $jplayer_js = jplayer_get_file_path('jplayer.js');    
-    $jplayer_css = jplayer_get_file_path('jplayer.css'); 
+    $jplayer_js = jplayer_get_file_path('jplayer.js');
+    $jplayer_css = jplayer_get_file_path('jplayer.css');
     $settings = array('jPlayer' => array(
-      'swfPath' => base_path() . variable_get('jplayer_directory', 'sites/all/libraries/jplayer'),
+      'swfPath' => base_path() . $directory,
       'autoPlay' => (int) variable_get('jplayer_autoplay', ''),
     ));
     if ($add) {
@@ -113,7 +181,7 @@ function jplayer_add($add = TRUE) {
       drupal_add_js($jplayer_js);
       drupal_add_css($jplayer_css);
       if (!$added) {
-        drupal_add_js($settings, 'setting');
+        drupal_add_js($settings, array('type' => 'setting'));
         $added = TRUE;
       }
     }
@@ -133,7 +201,7 @@ function jplayer_add($add = TRUE) {
 }
 
 /**
- * Returns path to the most appropriate file 
+ * Returns path to the most appropriate file
  *
  * @param $filename
  *   Name of the file to find
@@ -143,12 +211,12 @@ function jplayer_add($add = TRUE) {
 function jplayer_get_file_path($filename, $required_files = array()) {
   global $theme;
   $theme_dir = drupal_get_path('theme', $theme) . '/jplayer/';
-  $found = false;
+  $found = FALSE;
   if (file_exists($path = $theme_dir . $filename)) {
-    $found = true;
+    $found = TRUE;
     foreach ($required_files as $key => $value) {
       if (!file_exists($theme_dir . $value)) {
-        $found = false;
+        $found = FALSE;
         break;
       }
     }
Index: includes/jplayer.theme.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jplayer/includes/jplayer.theme.inc,v
retrieving revision 1.3
diff -u -p -r1.3 jplayer.theme.inc
--- includes/jplayer.theme.inc	4 Nov 2010 12:50:18 -0000	1.3
+++ includes/jplayer.theme.inc	5 Nov 2010 19:58:43 -0000
@@ -8,78 +8,64 @@
 /**
  * Preprocess function for jplayer.tpl.php when doing a single item.
  */
-function template_preprocess_jplayer_formatter_jplayer_single(&$vars) {
-  if (!$vars['element']['#item']['fid'])
-    return;
-    
-  jplayer_add();
-
-  $vars['mode'] = 'single';
-  $vars['item'] = array(
-    'url' => file_create_url($vars['element']['#item']['filepath']),
-    'label' => !empty($vars['element']['#item']['data']['description']) ? $vars['element']['#item']['data']['description'] : $vars['element']['#item']['filename'],
-  );
-  $vars['player_id'] = 'jplayer-' . $vars['element']['#node']->nid . '-' . str_replace('_', '-', $vars['element']['#field_name']) . '-' . $vars['element']['#item']['#delta'];
-}
-
-/**
- * Preprocess function for jplayer.tpl.php when using a playlist.
- */
-function template_preprocess_jplayer_formatter_jplayer_playlist(&$vars) {
-  if (!$vars['element']['#item']['fid'])
-    return;
-    
-  jplayer_add();
-
-  $vars['mode'] = 'playlist';
-  $vars['items'] = array();
-  $children = element_children($vars['element']);
-  $count = count($children);
-  $number = 0;
-  foreach ($children as $key) {
-    $classes = array();
-    if ($number == 0) {
-      $classes[] = 'first';
-      $classes[] = 'jplayer_playlist_item_first';
-    }
-    if ($number == $count - 1) {
-      $classes[] = 'last';
-      $classes[] = 'jplayer_playlist_item_last';
+function template_preprocess_jplayer(&$vars) {
+  if ($vars['mode'] == 'single') {
+    $item = $vars['items'];
+    $vars['item']['url'] = file_create_url($item['uri']);
+    $vars['item']['label'] = $item['description'] ? $item['description'] : $item['filename'];
+  }
+  elseif ($vars['mode'] == 'playlist') {
+    $count = count($vars['items']);
+    $number = 0;
+    foreach ($vars['items'] as $delta => $item) {
+      $classes = array();
+      if ($number == 0) {
+        $classes[] = 'first';
+        $classes[] = 'jplayer_playlist_item_first';
+      }
+      if ($number == $count - 1) {
+        $classes[] = 'last';
+        $classes[] = 'jplayer_playlist_item_last';
+      }
+      $vars['items'][$delta]['url'] = file_create_url($item['uri']);
+      $vars['items'][$delta]['label'] = $item['description'] ? $item['description'] : $item['filename'];
+      $vars['items'][$delta]['class'] = implode(' ', $classes);
     }
-    $vars['items'][] = array(
-      'class' => implode(' ', $classes),
-      'url' => file_create_url($vars['element'][$key]['#item']['filepath']),
-      'label' => !empty($vars['element'][$key]['#item']['data']['description']) ? $vars['element'][$key]['#item']['data']['description'] : $vars['element'][$key]['#item']['filename'],
-    );
-    $number++;
   }
-  $vars['player_id'] = 'jplayer-' . $vars['element']['#node']->nid . '-' . str_replace('_', '-', $vars['element']['#field_name']);
 }
 
-
 /**
- * Preprocess function for jplayer.tpl.php when displaying a view as a playlist.
+ * Returns HTML for a link to a file to be played by the jPlayer in the jPlayer block.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - file: A file object to which the link will be created.
+ *
+ * @ingroup themeable
  */
-function template_preprocess_jplayer_view_playlist(&$vars) {
-  if (!$vars['element']['#item']['fid'])
-    return;
-    
-  jplayer_add();
-
-  $count = count($vars['items']);
-  foreach ($vars['items'] as $number => $item) {
-    $classes = array();
-    if ($number == 0) {
-      $classes[] = 'first';
-      $classes[] = 'jplayer_playlist_item_first';
-    }
-    if ($number == $count - 1) {
-      $classes[] = 'last';
-      $classes[] = 'jplayer_playlist_item_last';
-    }
-    $vars['items'][$number]['class'] = implode(' ', $classes);
+function theme_jplayer_link($variables) {
+  $file = $variables['file'];
+
+  $url = file_create_url($file->uri);
+
+  // Set options as per anchor format described at
+  // http://microformats.org/wiki/file-format-examples
+  $options = array(
+    'attributes' => array(
+      'type' => $file->filemime . '; length=' . $file->filesize,
+    ),
+  );
+
+  $options['attributes']['class'] = 'jp-file';
+
+  // Use the description as the link text if available.
+  if (empty($file->description)) {
+    $link_text = $file->filename;
+  }
+  else {
+    $link_text = $file->description;
+    $options['attributes']['title'] = check_plain($file->filename);
   }
 
-  $vars['mode'] = 'playlist';
-  $vars['player_id'] = 'jplayer-view-' . str_replace('_', '-', $vars['view']->name);
+  return l($link_text, $url, $options);
 }
Index: includes/jplayer.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jplayer/includes/jplayer.views.inc,v
retrieving revision 1.1
diff -u -p -r1.1 jplayer.views.inc
--- includes/jplayer.views.inc	1 May 2010 04:28:08 -0000	1.1
+++ includes/jplayer.views.inc	5 Nov 2010 19:58:43 -0000
@@ -5,7 +5,7 @@
  * @file
  * Views module hooks for the jPlayer module.
  */
- 
+
 /**
  * Implementation of hook_views_plugins().
  */
Index: includes/jplayer_style_plugin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jplayer/includes/jplayer_style_plugin.inc,v
retrieving revision 1.1
diff -u -p -r1.1 jplayer_style_plugin.inc
--- includes/jplayer_style_plugin.inc	1 May 2010 04:28:08 -0000	1.1
+++ includes/jplayer_style_plugin.inc	5 Nov 2010 19:58:44 -0000
@@ -93,39 +93,23 @@ class jplayer_style_plugin extends views
         }
 
         $this->view->row_index = $row_index;
-        $label = trim(strip_tags($this->row_plugin->render($row)));
-        if (empty($label)) {
-          $label = basename($filepath);
-        }
 
         $items[] = array(
-          'url' => file_create_url($filepath),
-          'label' => $label,
+          'uri' => $filepath,
+          'description' => trim(strip_tags($this->row_plugin->render($row))),
         );
       }
     }
 
-    $output = theme('jplayer_view_playlist', $view, $items);
-
-    // If doing a live preview, add the JavaScript directly to the output.
-    if (isset($view->live_preview) && $view->live_preview) {
-      $js = drupal_add_js();
-      $settings = array();
-      foreach ($js['setting'] as $js_settings) {
-        if (isset($js_settings['jPlayer'])) {
-          $settings = $js_settings['jPlayer'];
-          break;
-        }
-      }
-
-      $output .= "<script type=\"text/javascript\">\n";
-      $output .= "Drupal.settings.jPlayer = Drupal.settings.jPlayer || {};\n";
-      $output .= "jQuery.extend(Drupal.settings.jPlayer, ". drupal_to_js($settings) .");\n";
-      $output .= "</script>\n";
-    }
-
     unset($view->row_index);
-    return $output;
+    $view->rows = array(
+      '#theme' => 'jplayer',
+      '#items' => $items,
+      '#mode' => 'playlist',
+      '#player_id' => 'jplayer-view-' . str_replace('_', '-', $view->name),
+      '#attached' => jplayer_add(FALSE),
+    );
+    return drupal_render($view->rows);
   }
 
   // Because we don't provide templates, but Views may complain when visiting
Index: theme/jplayer.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jplayer/theme/jplayer.js,v
retrieving revision 1.3
diff -u -p -r1.3 jplayer.js
--- theme/jplayer.js	4 Nov 2010 12:50:18 -0000	1.3
+++ theme/jplayer.js	5 Nov 2010 19:58:44 -0000
@@ -9,101 +9,122 @@
 
 Drupal.jPlayer = Drupal.jPlayer || { active: false };
 
-Drupal.behaviors.jPlayer = function(context) {
-  $('.jplayer', context).each(function() {
-    var wrapper = $(this).parent().get(0);
-    var player = this;
-    var playerId = this.id;
-    var playerType = $(this).attr('rel') ? 'single' : 'playlist';
-    var playerPlayTime = $(wrapper).find('.jp-play-time').get(0);
-    var playerTotalTime = $(wrapper).find('.jp-total-time').get(0);
-    var active = 0; // The current playlist item.
-    var playlist = []; // An array of DOM element links.
-
-    // Multi-player specific code.
-    if (playerType == 'playlist') {
-
-      // Enable clicking links within the playlist.
-      $(wrapper).find('.jp-playlist li a').each(function(n) {
-        if ($(player).attr('rel') == '') {
-          $(player).attr('rel', this.href);
-        }
-        playlist.push(this);
-        $(this).click(function() {
-          active = n;
-          Drupal.jPlayer.setActive(wrapper, player, playlist, n);
+Drupal.behaviors.jPlayer = {
+  attach: function(context) {
+    $('.jplayer', context).each(function() {
+      var wrapper = $(this).parent().get(0);
+      var player = this;
+      var playerId = this.id;
+      var playerType = $(this).attr('rel') ? 'single' : 'playlist';
+      if ($(wrapper).has('.jp-playlist li a')) {
+        playerType = 'independent';
+      }
+      var playerPlayTime = $(wrapper).find('.jp-play-time').get(0);
+      var playerTotalTime = $(wrapper).find('.jp-total-time').get(0);
+      var active = 0; // The current playlist item.
+      var playlist = []; // An array of DOM element links.
+
+      // Multi-player specific code.
+      if (playerType == 'playlist') {
+
+        // Enable clicking links within the playlist.
+        $(wrapper).find('.jp-playlist li a').each(function(n) {
+          if ($(player).attr('rel') == '') {
+            $(player).attr('rel', this.href);
+          }
+          playlist.push(this);
+          $(this).click(function() {
+            active = n;
+            Drupal.jPlayer.setActive(wrapper, player, playlist, n);
+            Drupal.jPlayer.play(wrapper, player);
+            return false;
+          });
+        });
+
+        // Enable play, pause, and stop buttons.
+        $(wrapper).find('a.jp-play').click(function() {
           Drupal.jPlayer.play(wrapper, player);
           return false;
         });
-      });
+        $(wrapper).find('a.jp-pause').click(function() {
+          Drupal.jPlayer.pause(wrapper, player);
+          return false;
+        });
+        $(wrapper).find('a.jp-stop').click(function() {
+          Drupal.jPlayer.stop(wrapper, player);
+          return false;
+        });
 
-      // Enable play, pause, and stop buttons.
-      $(wrapper).find('a.jp-play').click(function() {
-        Drupal.jPlayer.play(wrapper, player);
-        return false;
-      });
-      $(wrapper).find('a.jp-pause').click(function() {
-        Drupal.jPlayer.pause(wrapper, player);
-        return false;
-      });
-      $(wrapper).find('a.jp-stop').click(function() {
-        Drupal.jPlayer.stop(wrapper, player);
-        return false;
-      });
+        // Enable next and previous buttons.
+        $(wrapper).find('a.jp-next').click(function() {
+          active = Drupal.jPlayer.next(wrapper, player, playlist, active);
+          Drupal.jPlayer.play(wrapper, player);
+          return false;
+        });
+        $(wrapper).find('a.jp-previous').click(function() {
+          active = Drupal.jPlayer.previous(wrapper, player, playlist, active);
+          Drupal.jPlayer.play(wrapper, player);
+          return false;
+        });
+      }
 
-      // Enable next and previous buttons.
-      $(wrapper).find('a.jp-next').click(function() {
-        active = Drupal.jPlayer.next(wrapper, player, playlist, active);
-        Drupal.jPlayer.play(wrapper, player);
-        return false;
-      });
-      $(wrapper).find('a.jp-previous').click(function() {
-        active = Drupal.jPlayer.previous(wrapper, player, playlist, active);
-        Drupal.jPlayer.play(wrapper, player);
-        return false;
-      });
-    }
+      // Multi-player specific code.
+      if (playerType == 'independent') {
+        $('a.jp-file').each(function(n) {
+          if ($(player).attr('rel') == '') {
+            $(player).attr('rel', this.href);
+          }
+          playlist.push(this);
+          $(this).click(function() {
+            active = n;
+            Drupal.jPlayer.setActive(wrapper, player, playlist, n);
+            Drupal.jPlayer.play(wrapper, player);
+            return false;
+          });
+        });
+      }
 
-    // Actually initialize the player.
-    $(player).jPlayer({
-      ready: function() { 
-        this.element.jPlayer('setFile', this.element.attr('rel'));
-        if (Drupal.settings.jPlayer.autoPlay && !Drupal.jPlayer.active) {
-          if (playerType == 'playlist') {
-            Drupal.jPlayer.setActive(wrapper, player, playlist, active);
+      // Actually initialize the player.
+      $(player).jPlayer({
+        ready: function() {
+          this.element.jPlayer('setFile', this.element.attr('rel'));
+          if (Drupal.settings.jPlayer.autoPlay && !Drupal.jPlayer.active) {
+            if (playerType == 'playlist') {
+              Drupal.jPlayer.setActive(wrapper, player, playlist, active);
+            }
+            Drupal.jPlayer.play(wrapper, player);
           }
-          Drupal.jPlayer.play(wrapper, player);
+        },
+        swfPath: Drupal.settings.jPlayer.swfPath,
+        volume: 50,
+        oggSupport: false,
+        nativeSupprt: true
+      })
+      // Set all our custom IDs.
+      .jPlayer('cssId', 'play', playerId + '-play')
+      .jPlayer('cssId', 'pause', playerId + '-pause')
+      .jPlayer('cssId', 'stop', playerId + '-stop')
+      .jPlayer('cssId', 'loadBar', playerId + '-load-bar')
+      .jPlayer('cssId', 'playBar', playerId + '-play-bar')
+      .jPlayer('cssId', 'volumeMin', playerId + '-volume-min')
+      .jPlayer('cssId', 'volumeMax', playerId + '-volume-max')
+      .jPlayer('cssId', 'volumeBar', playerId + '-volume-bar')
+      .jPlayer('cssId', 'volumeBarValue', playerId + '-volume-bar-value')
+      // Register progress functions.
+      .jPlayer('onProgressChange', function(loadPercent, playedPercentRelative, playedPercentAbsolute, playedTime, totalTime) {
+        $(playerPlayTime).text($.jPlayer.convertTime(playedTime));
+        if (totalTime != 0 && totalTime != Number.POSITIVE_INFINITY) {
+          $(playerTotalTime).text($.jPlayer.convertTime(totalTime));
         }
-      },
-      swfPath: Drupal.settings.jPlayer.swfPath,
-      volume: 50,
-      oggSupport: false,
-      nativeSupprt: true
-    })
-    // Set all our custom IDs.
-    .jPlayer('cssId', 'play', playerId + '-play')
-    .jPlayer('cssId', 'pause', playerId + '-pause')
-    .jPlayer('cssId', 'stop', playerId + '-stop')
-    .jPlayer('cssId', 'loadBar', playerId + '-load-bar')
-    .jPlayer('cssId', 'playBar', playerId + '-play-bar')
-    .jPlayer('cssId', 'volumeMin', playerId + '-volume-min')
-    .jPlayer('cssId', 'volumeMax', playerId + '-volume-max')
-    .jPlayer('cssId', 'volumeBar', playerId + '-volume-bar')
-    .jPlayer('cssId', 'volumeBarValue', playerId + '-volume-bar-value')
-    // Register progress functions.
-    .jPlayer('onProgressChange', function(loadPercent, playedPercentRelative, playedPercentAbsolute, playedTime, totalTime) {
-      $(playerPlayTime).text($.jPlayer.convertTime(playedTime));
-      if (totalTime != 0 && totalTime != Number.POSITIVE_INFINITY) {
-        $(playerTotalTime).text($.jPlayer.convertTime(totalTime));
-      }
-    })
-    .jPlayer('onSoundComplete', function() {
-      if (playerType == 'playlist') {
-        Drupal.jPlayer.next(wrapper, player, playlist, active);
-      }
+      })
+      .jPlayer('onSoundComplete', function() {
+        if (playerType == 'playlist') {
+          Drupal.jPlayer.next(wrapper, player, playlist, active);
+        }
+      });
+      $.jPlayer.timeFormat.showHour = true;
     });
-    $.jPlayer.timeFormat.showHour = true;
-  });
+  }
 };
 
 Drupal.jPlayer.setActive = function(wrapper, player, playlist, index) {
Index: theme/jplayer.tpl.php
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/jplayer/theme/jplayer.tpl.php,v
retrieving revision 1.3
diff -u -p -r1.3 jplayer.tpl.php
--- theme/jplayer.tpl.php	4 Nov 2010 12:50:18 -0000	1.3
+++ theme/jplayer.tpl.php	5 Nov 2010 19:58:44 -0000
@@ -45,7 +45,7 @@
         <?php foreach ($items as $number => $item): ?>
           <li<?php print $item['class'] ? ' class="' . $item['class'] . '"' : '' ?>><a href="<?php print $item['url']; ?>" title="<?php print check_plain($item['label']); ?>"><?php print check_plain($item['label']); ?></a></li>
         <?php endforeach; ?>
-      <?php else: ?>
+      <?php elseif (isset($item)): ?>
         <li><?php print check_plain($item['label']); ?></li>
       <?php endif; ?>
     </ul>
