Index: /trunk/admin/themes/default/template/intro.tpl
===================================================================
--- /trunk/admin/themes/default/template/intro.tpl	(revision 10537)
+++ /trunk/admin/themes/default/template/intro.tpl	(revision 10538)
@@ -2,11 +2,35 @@
 
 {footer_script require='jquery.cluetip'}
-jQuery().ready(function(){ldelim}
-	jQuery('.cluetip').cluetip({ldelim}
+var piwigo_need_update_msg = '<a href="admin.php?page=updates">{"A new version of Piwigo is available."|@translate|@escape:"javascript"}</a>';
+var ext_need_update_msg = '<a href="admin.php?page=updates&amp;tab=ext">{"Some upgrades are available for extensions."|@translate|@escape:"javascript"}</a>';
+
+{literal}
+jQuery().ready(function(){
+	jQuery('.cluetip').cluetip({
 		width: 300,
 		splitTitle: '|',
 		positionBy: 'bottomTop'
 	});
+  jQuery.ajax({
+    type: 'GET',
+    url: 'ws.php',
+    dataType: 'json',
+    data: { method: 'pwg.extensions.checkUpdates', format: 'json' },
+    timeout: 5000,
+    success: function (data) {
+      if (data['stat'] != 'ok')
+        return;
+      piwigo_update = data['result']['piwigo_need_update'];
+      ext_update = data['result']['ext_need_update']
+      if ((piwigo_update || ext_update) && !jQuery(".warnings").is('div'))
+        jQuery("#content").prepend('<div class="warnings"><ul></ul></div>');
+      if (piwigo_update)
+        jQuery(".warnings ul").append('<li>'+piwigo_need_update_msg+'</li>');
+      if (ext_update)
+        jQuery(".warnings ul").append('<li>'+ext_need_update_msg+'</li>');
+    }
+  });  
 });
+{/literal}
 {/footer_script}
 
Index: /trunk/admin/themes/default/template/updates_ext.tpl
===================================================================
--- /trunk/admin/themes/default/template/updates_ext.tpl	(revision 10537)
+++ /trunk/admin/themes/default/template/updates_ext.tpl	(revision 10538)
@@ -28,4 +28,11 @@
     });
   }
+};
+
+function ignoreAll() {
+  jQuery('.ignoreExtension').each( function() {
+    if (jQuery(this).parents('div').css('display') == 'block')
+      jQuery(this).click();
+  });
 };
 
@@ -40,4 +47,5 @@
         jQuery(".pluginBox, fieldset").show();
         jQuery("#update_all").show();
+        jQuery("#ignore_all").show();
         jQuery("#up_to_date").hide();
         jQuery("#reset_ignore").hide();
@@ -68,4 +76,5 @@
   if (total == 0) {
     jQuery("#update_all").hide();
+    jQuery("#ignore_all").hide();
     jQuery("#up_to_date").show();
   }
@@ -97,5 +106,5 @@
 
 function ignoreExtension(type, id) {
-  jQuery.ajax({
+  queuedManager.add({
     type: 'GET',
     url: 'ws.php',
@@ -138,8 +147,9 @@
 <br>
 <input type="submit" id="update_all" value="{'Update All'|@translate}" onClick="updateAll(); return false;">
+<input type="submit" id="ignore_all" value="{'Ignore All'|@translate}" onClick="ignoreAll(); return false;">
 <input type="submit" id="reset_ignore" value="{'Reset ignored updates'|@translate}" onClick="resetIgnored(); return false;" {if !$SHOW_RESET}style="display:none;"{/if}>
 </div>
 <div class="autoupdate_bar" style="display:none;">
-{'Update in progress... Please wait.'|@translate}<br><img src="admin/themes/default/images/ajax-loader-bar.gif">
+{'Please wait...'|@translate}<br><img src="admin/themes/default/images/ajax-loader-bar.gif">
 </div>
 
@@ -160,5 +170,5 @@
         <a href="#" onClick="updateExtension('plugins', '{$plugin.EXT_ID}', {$plugin.REVISION_ID});" class="updateExtension">{'Install'|@translate}</a>
         | <a href="{$plugin.URL_DOWNLOAD}">{'Download'|@translate}</a>
-        | <a href="#" onClick="ignoreExtension('plugins', '{$plugin.EXT_ID}'); return false;">{'Ignore this update'|@translate}</a>
+        | <a href="#" onClick="ignoreExtension('plugins', '{$plugin.EXT_ID}'); return false;" class="ignoreExtension">{'Ignore this update'|@translate}</a>
       </td>
     </tr>
@@ -202,5 +212,5 @@
         <a href="#" onClick="updateExtension('themes', '{$theme.EXT_ID}', {$theme.REVISION_ID});" class="updateExtension">{'Install'|@translate}</a>
         | <a href="{$theme.URL_DOWNLOAD}">{'Download'|@translate}</a>
-        | <a href="#" onClick="ignoreExtension('themes', '{$theme.EXT_ID}'); return false;">{'Ignore this update'|@translate}</a>
+        | <a href="#" onClick="ignoreExtension('themes', '{$theme.EXT_ID}'); return false;" class="ignoreExtension">{'Ignore this update'|@translate}</a>
       </td>
     </tr>
@@ -244,5 +254,5 @@
         <a href="#" onClick="updateExtension('languages', '{$language.EXT_ID}', {$language.REVISION_ID});" class="updateExtension">{'Install'|@translate}</a>
         | <a href="{$language.URL_DOWNLOAD}">{'Download'|@translate}</a>
-        | <a href="#" onClick="ignoreExtension('languages', '{$language.EXT_ID}'); return false;">{'Ignore this update'|@translate}</a>
+        | <a href="#" onClick="ignoreExtension('languages', '{$language.EXT_ID}'); return false;" class="ignoreExtension">{'Ignore this update'|@translate}</a>
       </td>
     </tr>
Index: /trunk/include/ws_functions.inc.php
===================================================================
--- /trunk/include/ws_functions.inc.php	(revision 10537)
+++ /trunk/include/ws_functions.inc.php	(revision 10538)
@@ -2846,4 +2846,5 @@
   $conf['updates_ignored'] = unserialize($conf['updates_ignored']);
 
+  // Reset ignored extension
   if ($params['reset'])
   {
@@ -2872,3 +2873,39 @@
   return true;
 }
+
+function ws_extensions_checkupdates($params, &$service)
+{
+  global $conf;
+
+  define('IN_ADMIN', true);
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+  include_once(PHPWG_ROOT_PATH.'admin/include/updates.class.php');
+  $update = new updates();
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  $result = array();
+
+  if (!isset($_SESSION['need_update']))
+    $update->check_piwigo_upgrade();
+
+  $result['piwigo_need_update'] = $_SESSION['need_update'];
+
+  $conf['updates_ignored'] = unserialize($conf['updates_ignored']);
+
+  if (!isset($_SESSION['extensions_need_update']))
+    $update->check_extensions();
+  else
+    $update->check_updated_extensions();
+
+  if (!is_array($_SESSION['extensions_need_update']))
+    $result['ext_need_update'] = null;
+  else
+    $result['ext_need_update'] = !empty($_SESSION['extensions_need_update']);
+
+  return $result;
+}
 ?>
Index: /trunk/language/en_UK/admin.lang.php
===================================================================
--- /trunk/language/en_UK/admin.lang.php	(revision 10537)
+++ /trunk/language/en_UK/admin.lang.php	(revision 10538)
@@ -823,3 +823,6 @@
 $lang['Unable to send template directory.'] = 'Unable to send template directory.';
 $lang['Unable to dump database.'] = 'Unable to dump database.';
+$lang['Some upgrades are available for extensions.'] = 'Some upgrades are available for extensions.';
+$lang['Please wait...'] = 'Please wait...';
+$lang['Ignore All'] = 'Ignore All';
 ?>
Index: /trunk/language/fr_FR/admin.lang.php
===================================================================
--- /trunk/language/fr_FR/admin.lang.php	(revision 10537)
+++ /trunk/language/fr_FR/admin.lang.php	(revision 10538)
@@ -834,3 +834,6 @@
 $lang['Unable to send template directory.'] = 'Impossible d\'envoyer le dossier template.';
 $lang['Unable to dump database.'] = 'Impossible de sauvegarder la base de données.';
+$lang['Some upgrades are available for extensions.'] = 'Des mises à jour sont disponibles pour les extensions.';
+$lang['Please wait...'] = 'Please wait...';
+$lang['Ignore All'] = 'Tout ignorer';
 ?>
Index: /trunk/ws.php
===================================================================
--- /trunk/ws.php	(revision 10537)
+++ /trunk/ws.php	(revision 10538)
@@ -446,4 +446,11 @@
 <br>If reset parameter is true, all ignored extensions will be reinitilized.'
   );
+
+  $service->addMethod(
+    'pwg.extensions.checkUpdates',
+    'ws_extensions_checkupdates',
+    array(),
+    'Check if piwigo or extensions are up to date.'
+  );
 }
 
